@lcap/nasl-language-server-core 4.4.0-beta.7 → 4.4.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAC4C,QAAQ,EAC5B,IAAI,EAQ+E,GAAG,EAMxH,QAAQ,EAET,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACgE,cAAc,EAGpF,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWpE,oBAAY,QAAQ;IAClB,IAAI,YAAY;IAChB,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAEnE,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAMrE,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAqBF,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,yBAAyB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AA6OF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe;oCA2hJpB,OAAO;sDAPW,gBAAgB,EAAE;;;;sBAhBjD,UAAU,GAAG,SAAS;;;8BA4Df,UAAU;2BAyBb,UAAU;;;iBAW3B,MAAM;kBACL,MAAM;kBACN,MAAM;qBACH,MAAM;;kBA7iJF,UAAU,WAAW,MAAM,YAAY,YAAY;sCA+qD/B,IAAI,GAAG,QAAQ;2CA+5FxC,UAAU,gBACV,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,gBAC/C,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,KACzC,kBAAkB,GAAG,IAAI;EAgD7B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,mBAAmB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CAC1C;AAMD,eAAO,MAAM,6BAA6B,aAC9B,UAAU,+DAGnB,MAAM,gBAAgB,CAyCxB,CAAC;AAMF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../src/checker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EAC4C,QAAQ,EAC5B,IAAI,EAQ+E,GAAG,EAMxH,QAAQ,EAET,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACgE,cAAc,EAGpF,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAK5C,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWpE,oBAAY,QAAQ;IAClB,IAAI,YAAY;IAChB,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAEnE,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAMrE,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAqBF,KAAK,eAAe,GAAG;IACrB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,yBAAyB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/C,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AA6OF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe;oCA4lJpB,OAAO;sDAPW,gBAAgB,EAAE;;;;sBAhBjD,UAAU,GAAG,SAAS;;;8BA4Df,UAAU;2BAyBb,UAAU;;;iBAW3B,MAAM;kBACL,MAAM;kBACN,MAAM;qBACH,MAAM;;kBA9mJF,UAAU,WAAW,MAAM,YAAY,YAAY;sCA+qD/B,IAAI,GAAG,QAAQ;2CAg+FxC,UAAU,gBACV,CAAC,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,gBAC/C,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,KACzC,kBAAkB,GAAG,IAAI;EAgD7B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IAEX,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,mBAAmB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,qBAAqB,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CAC1C;AAMD,eAAO,MAAM,6BAA6B,aAC9B,UAAU,+DAGnB,MAAM,gBAAgB,CAyCxB,CAAC;AAMF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
package/out/checker.js CHANGED
@@ -3775,6 +3775,66 @@ function createErrorDiagnoser(context) {
3775
3775
  }
3776
3776
  return env.getType(node);
3777
3777
  }
3778
+ /**
3779
+ * 递归检查赋值类型不兼容问题
3780
+ * 检查左侧类型(Decimal/Long)是否与右侧联合类型(Union<Decimal, Long>)不兼容
3781
+ * @param leftType 左侧类型
3782
+ * @param rightType 右侧类型
3783
+ * @param context 上下文信息,用于生成错误消息
3784
+ * @returns 所有类型不兼容的错误信息数组
3785
+ */
3786
+ function checkAssignmentTypeIncompatibility(leftType, rightType, context = {}) {
3787
+ if (!leftType || !rightType)
3788
+ return [];
3789
+ const errors = [];
3790
+ // 1. 检查普通类型:Decimal/Long vs Union<Decimal, Long>
3791
+ const isLeftDecimalOrLong = (leftType.typeKind === 'primitive' && leftType.typeName === 'Decimal') ||
3792
+ (leftType.typeKind === 'primitive' && leftType.typeName === 'Long');
3793
+ if (isLeftDecimalOrLong && (0, type_predicate_1.isDecimalUnionLongTy)(rightType)) {
3794
+ const prefix = context.prefix || '赋值';
3795
+ const fieldInfo = context.fieldName ? `字段 ${context.fieldName} ` : '';
3796
+ errors.push(`${prefix}:${fieldInfo}类型不匹配,不能将 ${(0, type_manager_1.showUserLevelType)(rightType)} 赋值给 ${(0, type_manager_1.showUserLevelType)(leftType)} 类型。`);
3797
+ return errors; // 找到基本类型错误后直接返回,不再检查嵌套
3798
+ }
3799
+ // 2. 检查 List 类型(包括嵌套):List<T> vs List<Union<...>>
3800
+ if (leftType.typeKind === 'generic' &&
3801
+ leftType.typeName === 'List' &&
3802
+ rightType.typeKind === 'generic' &&
3803
+ rightType.typeName === 'List' &&
3804
+ leftType.typeArguments?.[0] &&
3805
+ rightType.typeArguments?.[0]) {
3806
+ // 递归检查 List 的元素类型
3807
+ return checkAssignmentTypeIncompatibility(leftType.typeArguments[0], rightType.typeArguments[0], { ...context, prefix: context.prefix || '赋值' });
3808
+ }
3809
+ // 3. 检查 Map 类型(包括嵌套):Map<K, V> vs Map<K, Union<...>>
3810
+ if (leftType.typeKind === 'generic' &&
3811
+ leftType.typeName === 'Map' &&
3812
+ rightType.typeKind === 'generic' &&
3813
+ rightType.typeName === 'Map' &&
3814
+ leftType.typeArguments?.length === 2 &&
3815
+ rightType.typeArguments?.length === 2) {
3816
+ // 递归检查 Map 的值类型(第二个类型参数)
3817
+ const valueTypeErrors = checkAssignmentTypeIncompatibility(leftType.typeArguments[1], rightType.typeArguments[1], { ...context, prefix: context.prefix || '赋值' });
3818
+ errors.push(...valueTypeErrors);
3819
+ // 也检查键类型(第一个类型参数)
3820
+ const keyTypeErrors = checkAssignmentTypeIncompatibility(leftType.typeArguments[0], rightType.typeArguments[0], { ...context, prefix: context.prefix || '赋值' });
3821
+ errors.push(...keyTypeErrors);
3822
+ return errors;
3823
+ }
3824
+ // 4. 检查匿名结构体:递归检查每个字段,收集所有字段的错误
3825
+ if ((0, type_predicate_1.isAnonymousTy)(leftType) && (0, type_predicate_1.isAnonymousTy)(rightType)) {
3826
+ const leftProps = leftType.properties ?? [];
3827
+ const rightProps = rightType.properties ?? [];
3828
+ for (const leftProp of leftProps) {
3829
+ const rightProp = rightProps.find(p => p.name === leftProp.name);
3830
+ if (rightProp && leftProp.typeAnnotation && rightProp.typeAnnotation) {
3831
+ const fieldErrors = checkAssignmentTypeIncompatibility(leftProp.typeAnnotation, rightProp.typeAnnotation, { prefix: context.prefix || '赋值', fieldName: leftProp.name });
3832
+ errors.push(...fieldErrors); // 收集所有字段的错误,不提前返回
3833
+ }
3834
+ }
3835
+ }
3836
+ return errors;
3837
+ }
3778
3838
  /**
3779
3839
  * 检查 赋值语句
3780
3840
  * @param node
@@ -3786,37 +3846,14 @@ function createErrorDiagnoser(context) {
3786
3846
  if (ensureNodeKeyExists(node, 'right')) {
3787
3847
  yield* checkNode(node.right);
3788
3848
  }
3789
- // 检查左侧为 Decimal,右侧为 Union<Decimal, Integer> 的情况
3849
+ // 使用统一的类型兼容性检查
3790
3850
  const leftType = env.getType(node.left);
3791
3851
  const rightType = env.getType(node.right);
3792
- // 检查左右两侧同为匿名结构体时,对每个字段,都增加 Decimal 和 Union<Decimal, Long> 的检查
3793
- if (leftType && rightType && (0, type_predicate_1.isAnonymousTy)(leftType) && (0, type_predicate_1.isAnonymousTy)(rightType)) {
3794
- const leftProps = leftType.properties ?? [];
3795
- const rightProps = rightType.properties ?? [];
3796
- for (const leftProp of leftProps) {
3797
- const rightProp = rightProps.find(p => p.name === leftProp.name);
3798
- if (rightProp) {
3799
- if (leftProp.typeAnnotation && rightProp.typeAnnotation) {
3800
- if ((0, type_predicate_1.isDecimalTy)(leftProp.typeAnnotation) && (0, type_predicate_1.isDecimalUnionLongTy)(rightProp.typeAnnotation)) {
3801
- error(node, `赋值:字段 ${leftProp.name} 类型不匹配,不能将 ${(0, type_manager_1.showUserLevelType)(rightProp.typeAnnotation)} 赋值给 ${(0, type_manager_1.showUserLevelType)(leftProp.typeAnnotation)} 类型。`);
3802
- }
3803
- }
3804
- }
3805
- }
3806
- }
3807
- if (leftType && rightType) {
3808
- // 检查左侧是否为 Decimal
3809
- const isLeftDecimal = leftType.typeKind === 'primitive' && leftType.typeName === 'Decimal';
3810
- // 检查右侧是否为 Union<Decimal, Long> 或 Union<Long, Decimal>
3811
- if (isLeftDecimal && rightType.typeKind === 'union' && rightType.typeArguments) {
3812
- const typeArgs = rightType.typeArguments;
3813
- const hasDecimal = typeArgs.some((arg) => arg.typeKind === 'primitive' && arg.typeName === 'Decimal');
3814
- const hasLong = typeArgs.some((arg) => arg.typeKind === 'primitive' && arg.typeName === 'Long');
3815
- if (hasDecimal && hasLong && typeArgs.length === 2) {
3816
- error(node, `赋值:类型不匹配,不能将联合类型 ${(0, type_manager_1.showUserLevelType)(rightType)} 赋值给 ${(0, type_manager_1.showUserLevelType)(leftType)} 类型。`);
3817
- }
3818
- }
3819
- }
3852
+ const errorMessages = checkAssignmentTypeIncompatibility(leftType, rightType);
3853
+ // 报告所有错误
3854
+ errorMessages.forEach(errorMessage => {
3855
+ error(node, errorMessage);
3856
+ });
3820
3857
  }
3821
3858
  /**
3822
3859
  * 检查 批量赋值语句