@lcap/nasl-language-server-core 4.5.0-beta.3 → 4.5.0-beta.5

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.
Files changed (46) hide show
  1. package/out/checker.d.ts.map +1 -1
  2. package/out/checker.js +19 -4
  3. package/out/checker.js.map +1 -1
  4. package/out/reference-manager/def-key-helpers.d.ts.map +1 -1
  5. package/out/reference-manager/def-key-helpers.js +8 -0
  6. package/out/reference-manager/def-key-helpers.js.map +1 -1
  7. package/out/reference-manager/helper.d.ts.map +1 -1
  8. package/out/reference-manager/helper.js +2 -0
  9. package/out/reference-manager/helper.js.map +1 -1
  10. package/out/reference-manager/reference-manager.d.ts.map +1 -1
  11. package/out/reference-manager/reference-manager.js +27 -10
  12. package/out/reference-manager/reference-manager.js.map +1 -1
  13. package/out/typer/dispatch-call.d.ts.map +1 -1
  14. package/out/typer/dispatch-call.js +3 -2
  15. package/out/typer/dispatch-call.js.map +1 -1
  16. package/out/typer/dispatch-expr.d.ts.map +1 -1
  17. package/out/typer/dispatch-expr.js +10 -0
  18. package/out/typer/dispatch-expr.js.map +1 -1
  19. package/out/typer/dispatch-stmt.d.ts.map +1 -1
  20. package/out/typer/dispatch-stmt.js +4 -1
  21. package/out/typer/dispatch-stmt.js.map +1 -1
  22. package/out/typer/dispatch-view.js +2 -2
  23. package/out/typer/dispatch-view.js.map +1 -1
  24. package/out/typer/incremental-update.d.ts.map +1 -1
  25. package/out/typer/incremental-update.js +14 -1
  26. package/out/typer/incremental-update.js.map +1 -1
  27. package/out/typer/solver.d.ts.map +1 -1
  28. package/out/typer/solver.js +17 -27
  29. package/out/typer/solver.js.map +1 -1
  30. package/out/typer/type-manager.js +1 -1
  31. package/out/typer/type-manager.js.map +1 -1
  32. package/out/typer/type-predicate.js +1 -1
  33. package/out/typer/type-predicate.js.map +1 -1
  34. package/out/typer/typer.d.ts +4 -2
  35. package/out/typer/typer.d.ts.map +1 -1
  36. package/out/typer/typer.js +73 -5
  37. package/out/typer/typer.js.map +1 -1
  38. package/out/typer/unifier.d.ts +11 -0
  39. package/out/typer/unifier.d.ts.map +1 -1
  40. package/out/typer/unifier.js +63 -19
  41. package/out/typer/unifier.js.map +1 -1
  42. package/out/utils/bind-expression-hack.d.ts +15 -1
  43. package/out/utils/bind-expression-hack.d.ts.map +1 -1
  44. package/out/utils/bind-expression-hack.js +125 -3
  45. package/out/utils/bind-expression-hack.js.map +1 -1
  46. package/package.json +5 -5
@@ -23,20 +23,142 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.inferStaticValueTypeAsLiteral = void 0;
26
+ exports.inferStaticValueTypeAsLiteral = exports.tryParseJson5AsStructuredType = exports.inferTypeFromJsonValue = void 0;
27
27
  const nasl_concepts_1 = require("@lcap/nasl-concepts");
28
28
  const json5 = __importStar(require("json5"));
29
29
  const typer_1 = require("../typer");
30
- function inferStaticValueTypeAsLiteral(staticValue) {
30
+ /**
31
+ * 从 List 类型的 hint 中提取元素类型 hint。
32
+ * 仅在 hint 为 List<T> 时返回 T,否则返回 undefined。
33
+ */
34
+ function extractListElemHint(hint) {
35
+ if (hint?.typeName === 'List' && hint.typeArguments?.length) {
36
+ return hint.typeArguments[0];
37
+ }
38
+ return undefined;
39
+ }
40
+ /**
41
+ * 从 anonymousStructure 类型的 hint 中提取指定属性名的类型 hint。
42
+ */
43
+ function extractPropHint(hint, key) {
44
+ if (hint?.typeKind === 'anonymousStructure') {
45
+ return hint.properties?.find((p) => p.name === key)?.typeAnnotation;
46
+ }
47
+ return undefined;
48
+ }
49
+ /**
50
+ * 将解析后的 JSON 值递归推断为对应的 TypeAnnotation。
51
+ * - 原始值:直接返回对应基础类型
52
+ * - 数组:取所有元素属性的并集,推断为 List<AnonymousStructure>
53
+ * - 对象:推断为 AnonymousStructure,不在所有元素中出现的属性标记为 optional
54
+ * - 嵌套超过 depth 限制时返回 naslAnyTy,防止无限递归
55
+ * @param hint 同层级的目标类型,用于在歧义情况下收窄推断结果(如整数提升为 Decimal)
56
+ */
57
+ function inferTypeFromJsonValue(val, depth = 0, hint) {
58
+ if (depth > 8)
59
+ return typer_1.naslAnyTy;
60
+ if (val === null || val === undefined)
61
+ return typer_1.naslAnyTy;
62
+ if (typeof val === 'string')
63
+ return typer_1.naslStringTy;
64
+ if (typeof val === 'boolean')
65
+ return typer_1.naslBooleanTy;
66
+ if (typeof val === 'number') {
67
+ if (Number.isInteger(val)) {
68
+ // 整数赋给 Decimal 字段是合法的,按 hint 提升;其他类型 hint 对不上则忽略
69
+ if (hint?.typeName === 'Decimal' && hint?.typeKind === 'primitive') {
70
+ return typer_1.naslDecimalTy;
71
+ }
72
+ return typer_1.naslLongTy;
73
+ }
74
+ return typer_1.naslDecimalTy;
75
+ }
76
+ if (Array.isArray(val)) {
77
+ if (val.length === 0) {
78
+ return nasl_concepts_1.TypeAnnotation.createGeneric('List', { typeArguments: [typer_1.naslAnyTy] });
79
+ }
80
+ const elemHint = extractListElemHint(hint);
81
+ const elemTy = inferObjectArrayElementType(val, depth, elemHint);
82
+ return nasl_concepts_1.TypeAnnotation.createGeneric('List', { typeArguments: [elemTy] });
83
+ }
84
+ if (typeof val === 'object') {
85
+ return inferObjectType(val, depth, hint);
86
+ }
87
+ return typer_1.naslAnyTy;
88
+ }
89
+ exports.inferTypeFromJsonValue = inferTypeFromJsonValue;
90
+ /**
91
+ * 推断对象数组的元素类型:
92
+ * 收集所有元素所有 key,若某 key 不在全部元素中出现则标记为 optional
93
+ */
94
+ function inferObjectArrayElementType(arr, depth, elemHint) {
95
+ const allObjects = arr.filter((item) => item !== null && typeof item === 'object' && !Array.isArray(item));
96
+ if (allObjects.length === 0) {
97
+ return inferTypeFromJsonValue(arr[0], depth + 1, elemHint);
98
+ }
99
+ // 收集所有 key 及其出现次数
100
+ const keyCount = new Map();
101
+ for (const obj of allObjects) {
102
+ for (const key of Object.keys(obj)) {
103
+ keyCount.set(key, (keyCount.get(key) ?? 0) + 1);
104
+ }
105
+ }
106
+ // 合并各 key 的类型(取第一个非 null 值推断),不在所有元素中出现的 key 标记为 optional
107
+ const properties = Array.from(keyCount.entries()).map(([key, count]) => {
108
+ const sampleVal = allObjects.find((obj) => key in obj)?.[key];
109
+ const propTy = inferTypeFromJsonValue(sampleVal, depth + 1, extractPropHint(elemHint, key));
110
+ const prop = nasl_concepts_1.StructureProperty.from({ name: key, typeAnnotation: propTy });
111
+ if (count < allObjects.length) {
112
+ prop.typeAnnotation.optional = true;
113
+ }
114
+ return prop;
115
+ });
116
+ return nasl_concepts_1.TypeAnnotation.createTypeAnonymousStructure(properties);
117
+ }
118
+ /**
119
+ * 推断单个对象的类型为 AnonymousStructure
120
+ */
121
+ function inferObjectType(obj, depth, hint) {
122
+ const properties = Object.entries(obj).map(([key, value]) => {
123
+ const propTy = inferTypeFromJsonValue(value, depth + 1, extractPropHint(hint, key));
124
+ return nasl_concepts_1.StructureProperty.from({ name: key, typeAnnotation: propTy });
125
+ });
126
+ return nasl_concepts_1.TypeAnnotation.createTypeAnonymousStructure(properties);
127
+ }
128
+ /**
129
+ * 尝试将字符串作为 JSON5 解析,若结果为对象/数组则推断其结构类型。
130
+ * 解析失败或结果为原始值时返回 undefined。
131
+ */
132
+ function tryParseJson5AsStructuredType(code, hint) {
133
+ try {
134
+ const val = json5.parse(code.trim());
135
+ if (val !== null && typeof val === 'object') {
136
+ return inferTypeFromJsonValue(val, 0, hint);
137
+ }
138
+ }
139
+ catch {
140
+ // 不是合法的 JSON5,或结果为原始值,忽略
141
+ }
142
+ return undefined;
143
+ }
144
+ exports.tryParseJson5AsStructuredType = tryParseJson5AsStructuredType;
145
+ function inferStaticValueTypeAsLiteral(staticValue, tgtTy) {
31
146
  if (typeof staticValue !== 'string') {
32
147
  return nasl_concepts_1.TypeAnnotation.createLiteral(staticValue);
33
148
  }
34
149
  const formattedValue = staticValue.trim();
150
+ const structuredTy = tryParseJson5AsStructuredType(formattedValue, tgtTy);
151
+ if (structuredTy)
152
+ return structuredTy;
35
153
  try {
36
154
  const val = json5.parse(formattedValue);
155
+ // 对于数字类型,传入 tgtTy 作为 hint 以收窄推断(如整数提升为 Decimal)
156
+ if (typeof val === 'number') {
157
+ return inferTypeFromJsonValue(val, 0, tgtTy);
158
+ }
37
159
  return nasl_concepts_1.TypeAnnotation.createLiteral(val);
38
160
  }
39
- catch (error) {
161
+ catch {
40
162
  return typer_1.naslAnyTy;
41
163
  }
42
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bind-expression-hack.js","sourceRoot":"","sources":["../../src/utils/bind-expression-hack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAqD;AACrD,6CAA+B;AAC/B,oCAAqC;AAErC,SAAgB,6BAA6B,CAAC,WAAsC;IAClF,IAAG,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,8BAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,cAAwB,CAAC,CAAC;QAClD,OAAO,8BAAc,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,iBAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAXD,sEAWC"}
1
+ {"version":3,"file":"bind-expression-hack.js","sourceRoot":"","sources":["../../src/utils/bind-expression-hack.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lcap/nasl-language-server-core",
3
3
  "description": "NetEase Application Specific Language",
4
- "version": "4.5.0-beta.3",
4
+ "version": "4.5.0-beta.5",
5
5
  "main": "./out",
6
6
  "types": "./out",
7
7
  "source": "./src",
@@ -16,9 +16,9 @@
16
16
  "json5": "2.2.3",
17
17
  "lodash": "4.17.21",
18
18
  "mnemonist": "^0.40.3",
19
- "@lcap/nasl-concepts": "4.5.0-beta.3",
20
- "@lcap/nasl-utils": "4.5.0-beta.3",
21
- "@lcap/nasl-types": "4.5.0-beta.3"
19
+ "@lcap/nasl-concepts": "4.5.0-beta.5",
20
+ "@lcap/nasl-types": "4.5.0-beta.5",
21
+ "@lcap/nasl-utils": "4.5.0-beta.5"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/lodash": "4.17.0",
@@ -35,8 +35,8 @@
35
35
  "typescript": "5.4.4",
36
36
  "vite": "6.3.5",
37
37
  "vitest": "3.2.4",
38
+ "@lcap/nasl-translator": "4.5.0-beta.5",
38
39
  "@lcap/nasl-test-toolkit": "1.0.0",
39
- "@lcap/nasl-translator": "4.5.0-beta.3",
40
40
  "@lcap/nasl-tsconfig": "1.0.1"
41
41
  },
42
42
  "scripts": {