@bscotch/gml-parser 1.14.2

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 (208) hide show
  1. package/LICENSE.md +29 -0
  2. package/README.md +151 -0
  3. package/assets/GmlSpec.xml +11419 -0
  4. package/dist/index.d.ts +16 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +13 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/jsdoc.d.ts +79 -0
  9. package/dist/jsdoc.d.ts.map +1 -0
  10. package/dist/jsdoc.feather.d.ts +23 -0
  11. package/dist/jsdoc.feather.d.ts.map +1 -0
  12. package/dist/jsdoc.feather.js +143 -0
  13. package/dist/jsdoc.feather.js.map +1 -0
  14. package/dist/jsdoc.js +468 -0
  15. package/dist/jsdoc.js.map +1 -0
  16. package/dist/jsdoc.test.d.ts +2 -0
  17. package/dist/jsdoc.test.d.ts.map +1 -0
  18. package/dist/jsdoc.test.js +185 -0
  19. package/dist/jsdoc.test.js.map +1 -0
  20. package/dist/lexer.d.ts +3 -0
  21. package/dist/lexer.d.ts.map +1 -0
  22. package/dist/lexer.js +14 -0
  23. package/dist/lexer.js.map +1 -0
  24. package/dist/lexer.test.d.ts +2 -0
  25. package/dist/lexer.test.d.ts.map +1 -0
  26. package/dist/lexer.test.js +78 -0
  27. package/dist/lexer.test.js.map +1 -0
  28. package/dist/lib.objects.d.ts +190 -0
  29. package/dist/lib.objects.d.ts.map +1 -0
  30. package/dist/lib.objects.js +242 -0
  31. package/dist/lib.objects.js.map +1 -0
  32. package/dist/logger.d.ts +13 -0
  33. package/dist/logger.d.ts.map +1 -0
  34. package/dist/logger.js +14 -0
  35. package/dist/logger.js.map +1 -0
  36. package/dist/modules.d.ts +19 -0
  37. package/dist/modules.d.ts.map +1 -0
  38. package/dist/modules.js +320 -0
  39. package/dist/modules.js.map +1 -0
  40. package/dist/modules.test.d.ts +2 -0
  41. package/dist/modules.test.d.ts.map +1 -0
  42. package/dist/modules.test.js +57 -0
  43. package/dist/modules.test.js.map +1 -0
  44. package/dist/modules.types.d.ts +78 -0
  45. package/dist/modules.types.d.ts.map +1 -0
  46. package/dist/modules.types.js +2 -0
  47. package/dist/modules.types.js.map +1 -0
  48. package/dist/modules.util.d.ts +5 -0
  49. package/dist/modules.util.d.ts.map +1 -0
  50. package/dist/modules.util.js +13 -0
  51. package/dist/modules.util.js.map +1 -0
  52. package/dist/parser.d.ts +121 -0
  53. package/dist/parser.d.ts.map +1 -0
  54. package/dist/parser.js +571 -0
  55. package/dist/parser.js.map +1 -0
  56. package/dist/parser.test.d.ts +2 -0
  57. package/dist/parser.test.d.ts.map +1 -0
  58. package/dist/parser.test.js +143 -0
  59. package/dist/parser.test.js.map +1 -0
  60. package/dist/parser.utility.d.ts +29 -0
  61. package/dist/parser.utility.d.ts.map +1 -0
  62. package/dist/parser.utility.js +125 -0
  63. package/dist/parser.utility.js.map +1 -0
  64. package/dist/project.asset.d.ts +115 -0
  65. package/dist/project.asset.d.ts.map +1 -0
  66. package/dist/project.asset.js +802 -0
  67. package/dist/project.asset.js.map +1 -0
  68. package/dist/project.code.d.ts +130 -0
  69. package/dist/project.code.d.ts.map +1 -0
  70. package/dist/project.code.js +570 -0
  71. package/dist/project.code.js.map +1 -0
  72. package/dist/project.d.ts +533 -0
  73. package/dist/project.d.ts.map +1 -0
  74. package/dist/project.diagnostics.d.ts +32 -0
  75. package/dist/project.diagnostics.d.ts.map +1 -0
  76. package/dist/project.diagnostics.js +23 -0
  77. package/dist/project.diagnostics.js.map +1 -0
  78. package/dist/project.js +1216 -0
  79. package/dist/project.js.map +1 -0
  80. package/dist/project.location.d.ts +133 -0
  81. package/dist/project.location.d.ts.map +1 -0
  82. package/dist/project.location.js +219 -0
  83. package/dist/project.location.js.map +1 -0
  84. package/dist/project.native.d.ts +26 -0
  85. package/dist/project.native.d.ts.map +1 -0
  86. package/dist/project.native.js +321 -0
  87. package/dist/project.native.js.map +1 -0
  88. package/dist/project.spec.d.ts +1298 -0
  89. package/dist/project.spec.d.ts.map +1 -0
  90. package/dist/project.spec.js +263 -0
  91. package/dist/project.spec.js.map +1 -0
  92. package/dist/project.test.d.ts +2 -0
  93. package/dist/project.test.d.ts.map +1 -0
  94. package/dist/project.test.js +633 -0
  95. package/dist/project.test.js.map +1 -0
  96. package/dist/shaderDefaults.d.ts +3 -0
  97. package/dist/shaderDefaults.d.ts.map +1 -0
  98. package/dist/shaderDefaults.js +32 -0
  99. package/dist/shaderDefaults.js.map +1 -0
  100. package/dist/signifiers.d.ts +54 -0
  101. package/dist/signifiers.d.ts.map +1 -0
  102. package/dist/signifiers.flags.d.ts +38 -0
  103. package/dist/signifiers.flags.d.ts.map +1 -0
  104. package/dist/signifiers.flags.js +131 -0
  105. package/dist/signifiers.flags.js.map +1 -0
  106. package/dist/signifiers.js +117 -0
  107. package/dist/signifiers.js.map +1 -0
  108. package/dist/spine.d.ts +28 -0
  109. package/dist/spine.d.ts.map +1 -0
  110. package/dist/spine.js +64 -0
  111. package/dist/spine.js.map +1 -0
  112. package/dist/spine.test.d.ts +2 -0
  113. package/dist/spine.test.d.ts.map +1 -0
  114. package/dist/spine.test.js +420 -0
  115. package/dist/spine.test.js.map +1 -0
  116. package/dist/spine.types.d.ts +89 -0
  117. package/dist/spine.types.d.ts.map +1 -0
  118. package/dist/spine.types.js +2 -0
  119. package/dist/spine.types.js.map +1 -0
  120. package/dist/test.lib.d.ts +3 -0
  121. package/dist/test.lib.d.ts.map +1 -0
  122. package/dist/test.lib.js +16 -0
  123. package/dist/test.lib.js.map +1 -0
  124. package/dist/tokens.categories.d.ts +22 -0
  125. package/dist/tokens.categories.d.ts.map +1 -0
  126. package/dist/tokens.categories.js +78 -0
  127. package/dist/tokens.categories.js.map +1 -0
  128. package/dist/tokens.code.d.ts +2 -0
  129. package/dist/tokens.code.d.ts.map +1 -0
  130. package/dist/tokens.code.js +523 -0
  131. package/dist/tokens.code.js.map +1 -0
  132. package/dist/tokens.d.ts +130 -0
  133. package/dist/tokens.d.ts.map +1 -0
  134. package/dist/tokens.js +13 -0
  135. package/dist/tokens.js.map +1 -0
  136. package/dist/tokens.lib.d.ts +15 -0
  137. package/dist/tokens.lib.d.ts.map +1 -0
  138. package/dist/tokens.lib.js +12 -0
  139. package/dist/tokens.lib.js.map +1 -0
  140. package/dist/tokens.shared.d.ts +4 -0
  141. package/dist/tokens.shared.d.ts.map +1 -0
  142. package/dist/tokens.shared.js +35 -0
  143. package/dist/tokens.shared.js.map +1 -0
  144. package/dist/tokens.strings.d.ts +5 -0
  145. package/dist/tokens.strings.d.ts.map +1 -0
  146. package/dist/tokens.strings.js +111 -0
  147. package/dist/tokens.strings.js.map +1 -0
  148. package/dist/types.checks.d.ts +50 -0
  149. package/dist/types.checks.d.ts.map +1 -0
  150. package/dist/types.checks.js +246 -0
  151. package/dist/types.checks.js.map +1 -0
  152. package/dist/types.d.ts +152 -0
  153. package/dist/types.d.ts.map +1 -0
  154. package/dist/types.feather.d.ts +21 -0
  155. package/dist/types.feather.d.ts.map +1 -0
  156. package/dist/types.feather.js +156 -0
  157. package/dist/types.feather.js.map +1 -0
  158. package/dist/types.hover.d.ts +4 -0
  159. package/dist/types.hover.d.ts.map +1 -0
  160. package/dist/types.hover.js +99 -0
  161. package/dist/types.hover.js.map +1 -0
  162. package/dist/types.js +457 -0
  163. package/dist/types.js.map +1 -0
  164. package/dist/types.primitives.d.ts +10 -0
  165. package/dist/types.primitives.d.ts.map +1 -0
  166. package/dist/types.primitives.js +88 -0
  167. package/dist/types.primitives.js.map +1 -0
  168. package/dist/types.sprites.d.ts +8 -0
  169. package/dist/types.sprites.d.ts.map +1 -0
  170. package/dist/types.sprites.js +417 -0
  171. package/dist/types.sprites.js.map +1 -0
  172. package/dist/types.test.d.ts +2 -0
  173. package/dist/types.test.d.ts.map +1 -0
  174. package/dist/types.test.js +62 -0
  175. package/dist/types.test.js.map +1 -0
  176. package/dist/util.d.ts +50 -0
  177. package/dist/util.d.ts.map +1 -0
  178. package/dist/util.js +168 -0
  179. package/dist/util.js.map +1 -0
  180. package/dist/util.test.d.ts +3 -0
  181. package/dist/util.test.d.ts.map +1 -0
  182. package/dist/util.test.js +63 -0
  183. package/dist/util.test.js.map +1 -0
  184. package/dist/visitor.assign.d.ts +24 -0
  185. package/dist/visitor.assign.d.ts.map +1 -0
  186. package/dist/visitor.assign.js +112 -0
  187. package/dist/visitor.assign.js.map +1 -0
  188. package/dist/visitor.d.ts +89 -0
  189. package/dist/visitor.d.ts.map +1 -0
  190. package/dist/visitor.functionExpression.d.ts +7 -0
  191. package/dist/visitor.functionExpression.d.ts.map +1 -0
  192. package/dist/visitor.functionExpression.js +216 -0
  193. package/dist/visitor.functionExpression.js.map +1 -0
  194. package/dist/visitor.globals.d.ts +59 -0
  195. package/dist/visitor.globals.d.ts.map +1 -0
  196. package/dist/visitor.globals.js +271 -0
  197. package/dist/visitor.globals.js.map +1 -0
  198. package/dist/visitor.identifierAccessor.d.ts +6 -0
  199. package/dist/visitor.identifierAccessor.d.ts.map +1 -0
  200. package/dist/visitor.identifierAccessor.js +381 -0
  201. package/dist/visitor.identifierAccessor.js.map +1 -0
  202. package/dist/visitor.js +605 -0
  203. package/dist/visitor.js.map +1 -0
  204. package/dist/visitor.processor.d.ts +66 -0
  205. package/dist/visitor.processor.d.ts.map +1 -0
  206. package/dist/visitor.processor.js +147 -0
  207. package/dist/visitor.processor.js.map +1 -0
  208. package/package.json +63 -0
@@ -0,0 +1,605 @@
1
+ // CST Visitor for creating an AST etc
2
+ import { arrayWrapped } from '@bscotch/utility';
3
+ import { gmlLinesByGroup, parseJsdoc } from './jsdoc.js';
4
+ import { logger } from './logger.js';
5
+ import { GmlVisitorBase, withCtxKind } from './parser.js';
6
+ import { functionFromRhs, identifierFrom, sortChildren, stringLiteralAsString, } from './parser.utility.js';
7
+ import { Position, Range, StructNewMemberRange, } from './project.location.js';
8
+ import { Signifier } from './signifiers.js';
9
+ import { getTypeOfKind, getTypes, normalizeType } from './types.checks.js';
10
+ import { typeFromParsedJsdocs } from './types.feather.js';
11
+ import { Type, } from './types.js';
12
+ import { withableTypes } from './types.primitives.js';
13
+ import { StitchParserError, assert } from './util.js';
14
+ import { assignVariable, ensureDefinitive } from './visitor.assign.js';
15
+ import { visitFunctionExpression } from './visitor.functionExpression.js';
16
+ import { visitIdentifierAccessor } from './visitor.identifierAccessor.js';
17
+ import { SignifierProcessor, diagnosticCollections, } from './visitor.processor.js';
18
+ export function registerSignifiers(file) {
19
+ try {
20
+ // Clear diagnostics managed by the processor
21
+ for (const group of diagnosticCollections) {
22
+ file.clearDiagnosticCollection(group);
23
+ }
24
+ const processor = new SignifierProcessor(file);
25
+ const visitor = new GmlSignifierVisitor(processor);
26
+ visitor.UPDATE_SIGNIFIERS(file.cst);
27
+ }
28
+ catch (parseErr) {
29
+ const err = new StitchParserError(`Error identifying locals in ${file.path}`);
30
+ err.cause = parseErr;
31
+ logger.error(err);
32
+ }
33
+ }
34
+ export class GmlSignifierVisitor extends GmlVisitorBase {
35
+ PROCESSOR;
36
+ static validated = false;
37
+ constructor(PROCESSOR) {
38
+ super();
39
+ this.PROCESSOR = PROCESSOR;
40
+ this.validateVisitor();
41
+ }
42
+ get FILE() {
43
+ return this.PROCESSOR.file;
44
+ }
45
+ get ASSET() {
46
+ return this.PROCESSOR.asset;
47
+ }
48
+ /** Entrypoint */
49
+ UPDATE_SIGNIFIERS(input) {
50
+ this.visit(input, { ctxKindStack: [] });
51
+ this.PROCESSOR.setLastScopeEnd(input.location);
52
+ return this.PROCESSOR;
53
+ }
54
+ visit(cstNode, ctx) {
55
+ return super.visit(cstNode, ctx);
56
+ }
57
+ FIND_ITEM_BY_NAME(name, options) {
58
+ const scope = this.PROCESSOR.fullScope;
59
+ // Find matches from all scopes, then return the first declared one.
60
+ // If none are declared, return the first found.
61
+ const matches = [
62
+ // Local scope
63
+ scope.local.getMember(name, false),
64
+ // Self scope
65
+ scope.selfIsGlobal
66
+ ? undefined
67
+ : scope.self.getMember(name, options?.excludeParents),
68
+ // Global scope
69
+ options?.excludeGlobal
70
+ ? undefined
71
+ : this.FIND_GLOBAL_BY_NAME(name, options),
72
+ ].filter((i) => i !== undefined);
73
+ return matches.find((i) => i.def) || matches[0];
74
+ }
75
+ FIND_GLOBAL_BY_NAME(name, options) {
76
+ const scope = this.PROCESSOR.fullScope;
77
+ const item = this.PROCESSOR.globalSelf.getMember(name, options?.excludeParents);
78
+ // If the current scope is an instance allow for instance variables
79
+ // (but skip `id` since we're doing special things with that).
80
+ // Otherwise instance variables should be skipped.
81
+ const isInstance = !scope.selfIsGlobal &&
82
+ (['Id.Instance', 'Asset.GMObject'].includes(scope.self.kind) ||
83
+ scope.self.signifier?.asset);
84
+ if (!isInstance && item?.instance) {
85
+ return undefined;
86
+ }
87
+ else if (isInstance && item?.instance && name === 'id') {
88
+ // Then this is a native "instance" variable. Ignore it
89
+ // to allow falling back on the self scope.
90
+ return undefined;
91
+ }
92
+ return item;
93
+ }
94
+ /** Given an identifier in the current scope, find the corresponding item. */
95
+ FIND_ITEM(children, options) {
96
+ const identifier = identifierFrom(children);
97
+ if (!identifier) {
98
+ return;
99
+ }
100
+ const scope = this.PROCESSOR.fullScope;
101
+ let item;
102
+ const range = this.PROCESSOR.range(identifier.token);
103
+ switch (identifier.type) {
104
+ case 'Global':
105
+ // Global is a special case, it's a keyword and also
106
+ // a globalvar.
107
+ item = scope.global;
108
+ break;
109
+ case 'Self':
110
+ // Then we're referencing our current self context
111
+ item = scope.self;
112
+ // If this self scope is also global, emit a diagnostic
113
+ // (should not use self to refer to global)
114
+ if (scope.selfIsGlobal) {
115
+ this.PROCESSOR.addDiagnostic('GLOBAL_SELF', children.Self[0], '`self` refers to the global scope here, which is probably unintentional.');
116
+ }
117
+ else {
118
+ item.signifier?.addRef(range);
119
+ }
120
+ break;
121
+ case 'Other':
122
+ // Then we're referencing the self-scope upstream of this one.
123
+ item = this.PROCESSOR.outerSelf;
124
+ // If this self scope is also global, emit a diagnostic
125
+ // (should not use self to refer to global)
126
+ if (this.PROCESSOR.outerSelf === scope.global) {
127
+ this.PROCESSOR.addDiagnostic('GLOBAL_SELF', children.Other[0], '`other` refers to the global scope here, which is probably unintentional.');
128
+ }
129
+ else {
130
+ item.signifier?.addRef(range);
131
+ }
132
+ break;
133
+ default:
134
+ const { name } = identifier;
135
+ item = this.FIND_ITEM_BY_NAME(name, options);
136
+ break;
137
+ }
138
+ if (item) {
139
+ return {
140
+ item,
141
+ range,
142
+ };
143
+ }
144
+ return;
145
+ }
146
+ get ANY() {
147
+ return new Type('Any');
148
+ }
149
+ get BOOLEAN() {
150
+ return new Type('Bool');
151
+ }
152
+ get REAL() {
153
+ return new Type('Real');
154
+ }
155
+ get UNDEFINED() {
156
+ return new Type('Undefined');
157
+ }
158
+ /**
159
+ * Given parsed JSDocs, convert into a Type and store
160
+ * it for use by the next symbol.
161
+ */
162
+ PREPARE_JSDOC(jsdoc) {
163
+ const type = typeFromParsedJsdocs(jsdoc, this.PROCESSOR.project.types, false);
164
+ this.PROCESSOR.unusedJsdoc = {
165
+ jsdoc,
166
+ type,
167
+ };
168
+ this.PROCESSOR.file.jsdocs.push(jsdoc);
169
+ // Add references to types where appropriate
170
+ for (const loc of jsdoc.typeRanges) {
171
+ const signifier = this.PROCESSOR.project.types.get(loc.content)
172
+ ?.signifier;
173
+ if (!signifier)
174
+ continue;
175
+ signifier.addRef(Range.from(this.PROCESSOR.file, loc));
176
+ }
177
+ // If we're documenting a variable, then we need to
178
+ // go ahead and consume the doc.
179
+ // globalvars should have already been handled and can be skipped
180
+ if (!['localvar', 'instancevar', 'globalvar'].includes(jsdoc.kind)) {
181
+ return;
182
+ }
183
+ const info = this.PROCESSOR.consumeJsdoc();
184
+ if (jsdoc.kind === 'globalvar') {
185
+ return;
186
+ }
187
+ const container = jsdoc.kind === 'localvar'
188
+ ? this.PROCESSOR.currentLocalScope
189
+ : this.PROCESSOR.currentSelf;
190
+ if (container === this.PROCESSOR.globalSelf) {
191
+ // Then this is being used improperly
192
+ this.PROCESSOR.addDiagnostic('GLOBAL_SELF', jsdoc.name, `Invalid variable documentation. Did you mean to use @globalvar?`, 'error');
193
+ return;
194
+ }
195
+ let signifier = container.getMember(jsdoc.name.content);
196
+ const nameRange = Range.from(this.PROCESSOR.file, jsdoc.name);
197
+ if (!signifier) {
198
+ signifier = new Signifier(container, jsdoc.name.content);
199
+ container.addMember(signifier);
200
+ if (container === this.PROCESSOR.currentDefinitiveSelf) {
201
+ signifier.definitive = true;
202
+ }
203
+ signifier.addRef(nameRange, true);
204
+ }
205
+ else {
206
+ const ref = signifier.addRef(nameRange);
207
+ ensureDefinitive(container, this.PROCESSOR.currentDefinitiveSelf, signifier, ref);
208
+ }
209
+ signifier.describe(jsdoc.description);
210
+ signifier.setType(info.type);
211
+ signifier.definedAt(nameRange);
212
+ if (jsdoc.kind === 'localvar') {
213
+ signifier.local = true;
214
+ }
215
+ else {
216
+ signifier.instance = true;
217
+ }
218
+ }
219
+ jsdocJs(children) {
220
+ this.PREPARE_JSDOC(parseJsdoc(children.JsdocJs[0]));
221
+ }
222
+ jsdocGml(children) {
223
+ // This *could* actually be several JSDocs,
224
+ const jsdocGroups = gmlLinesByGroup(children.JsdocGmlLine);
225
+ for (const group of jsdocGroups) {
226
+ const parsed = parseJsdoc(group);
227
+ this.PREPARE_JSDOC(parsed);
228
+ }
229
+ }
230
+ withStatement(children, context) {
231
+ const blockLocation = children.blockableStatement[0].location;
232
+ // With statements change the self scope to
233
+ // whatever their expression evaluates to.
234
+ // Evaluate the expression and try to use its type as the self scope
235
+ const docs = this.PROCESSOR.consumeJsdoc();
236
+ const contextExpression = this.expression(children.expression[0].children, withCtxKind(context, 'withCondition'));
237
+ const contextFromDocs = docs?.jsdoc.kind === 'self' ? docs.type[0] : undefined;
238
+ const self = getTypeOfKind(contextFromDocs, withableTypes) ||
239
+ getTypeOfKind(contextExpression, withableTypes) ||
240
+ this.PROCESSOR.createStruct(blockLocation);
241
+ this.PROCESSOR.scope.setEnd(children.expression[0].location, true);
242
+ this.PROCESSOR.pushSelfScope(blockLocation, self, false);
243
+ this.visit(children.blockableStatement, withCtxKind(context, 'withBody'));
244
+ this.PROCESSOR.scope.setEnd(blockLocation, true);
245
+ this.PROCESSOR.popSelfScope(blockLocation, true);
246
+ return;
247
+ }
248
+ catchStatement(children, ctx) {
249
+ // Catch statements are weird because they add a new variable
250
+ // the the current localscope, but only within themselves. We
251
+ // can get a reasonable approximation of this behavior by creating
252
+ // a new localscope that has the current localscope as a parent.
253
+ const catchLocal = Type.Struct;
254
+ catchLocal.extends = this.PROCESSOR.currentLocalScope;
255
+ this.PROCESSOR.pushLocalScope(children.Catch[0], true, catchLocal);
256
+ // Add the identifier to the new localscope
257
+ const identifier = identifierFrom(children);
258
+ if (identifier) {
259
+ const range = this.PROCESSOR.range(identifier.token);
260
+ const type = this.PROCESSOR.project.types.get('Struct.Exception')?.derive() ||
261
+ new Type('Any');
262
+ const signifier = this.PROCESSOR.currentLocalScope.addMember(identifier.name, { type });
263
+ signifier.addRef(range, true);
264
+ signifier.definedAt(range);
265
+ signifier.local = true;
266
+ }
267
+ this.visit(children.blockStatement, ctx);
268
+ this.PROCESSOR.popLocalScope(children.blockStatement[0].location, true);
269
+ }
270
+ functionStatement(children, ctx) {
271
+ this.functionExpression(children.functionExpression[0].children, withCtxKind(ctx, 'functionStatement'));
272
+ }
273
+ functionExpression(children, context) {
274
+ return visitFunctionExpression.call(this, children, context);
275
+ }
276
+ returnStatement(children, ctx) {
277
+ const returnType = children.assignmentRightHandSide
278
+ ? this.assignmentRightHandSide(children.assignmentRightHandSide[0].children, withCtxKind(ctx, 'functionReturn'))
279
+ : this.UNDEFINED;
280
+ ctx.returns?.push(...arrayWrapped(returnType));
281
+ return arrayWrapped(returnType);
282
+ }
283
+ /** Called on *naked* identifiers and those that have accessors/suffixes of various sorts. */
284
+ identifierAccessor(children, context) {
285
+ return arrayWrapped(visitIdentifierAccessor.call(this, children, context));
286
+ }
287
+ macroStatement(children, ctx) {
288
+ // Macros are just references to some expression, so set their
289
+ // type the the type of that expression.
290
+ // Macros are defined during global parsing, so we can assume
291
+ // that they exist.
292
+ const signifier = this.FIND_ITEM_BY_NAME(children.Identifier[0].image);
293
+ assert(signifier, 'Macro should exist');
294
+ // If the macro ends with a ';' then it's a statement, otherwise
295
+ // we can treat it like a variable.
296
+ const isStatement = children.expressionStatement?.[0]?.children.Semicolon;
297
+ const expression = children.expressionStatement?.[0]?.children.expression?.[0]?.children;
298
+ const expressionType = expression && this.expression(expression, ctx);
299
+ const inferredType = isStatement
300
+ ? Type.Undefined
301
+ : normalizeType(expressionType, this.PROCESSOR.project.types);
302
+ signifier.setType(inferredType);
303
+ }
304
+ /** Static params are unambiguously defined. */
305
+ staticVarDeclarations(children, ctx) {
306
+ // The same as a regular non-var assignment, except we
307
+ // need to indicate that it is static.
308
+ return this.variableAssignment(children, { ...ctx, isStatic: true });
309
+ }
310
+ globalVarDeclaration(children) {
311
+ // Allow overriding the type with JSDocs
312
+ const identity = identifierFrom(children);
313
+ const docs = this.PROCESSOR.consumeJsdoc();
314
+ if (!identity) {
315
+ return;
316
+ }
317
+ const signifier = this.PROCESSOR.globalSelf.getMember(identity.name);
318
+ assert(signifier, `Global var ${identity.name} should exist`);
319
+ // Get the reference added
320
+ const ref = signifier.addRef(this.PROCESSOR.range(identity.token), true);
321
+ // This signifier should already be registered via the global pass
322
+ // so we just need to update its type.
323
+ if (docs?.jsdoc.kind && ['type', 'description'].includes(docs.jsdoc.kind)) {
324
+ signifier.describe(docs.jsdoc.description);
325
+ signifier.setType(docs.type);
326
+ }
327
+ return {
328
+ item: signifier,
329
+ ref,
330
+ };
331
+ }
332
+ localVarDeclaration(children, ctx) {
333
+ const docs = this.PROCESSOR.consumeJsdoc();
334
+ const local = this.PROCESSOR.currentLocalScope;
335
+ const range = this.PROCESSOR.range(children.Identifier[0]);
336
+ const name = children.Identifier[0].image;
337
+ return assignVariable(this, { container: local, name, range }, children.assignmentRightHandSide, { ctx, docs, local: true });
338
+ }
339
+ variableAssignment(children, ctx) {
340
+ // Determine the args for ASSIGN
341
+ const name = children.Identifier[0].image;
342
+ const range = this.PROCESSOR.range(children.Identifier[0]);
343
+ const rhs = children.assignmentRightHandSide;
344
+ const docs = this.PROCESSOR.consumeJsdoc();
345
+ // Determine the container for this variable
346
+ const { isStatic } = ctx;
347
+ ctx.isStatic = false; // Reset to prevent downstream confusion
348
+ const assignedToFunction = !!functionFromRhs(rhs);
349
+ const excludeGlobal = !!(isStatic || assignedToFunction);
350
+ const excludeParents = !!(isStatic || assignedToFunction);
351
+ let container = this.FIND_ITEM(children, {
352
+ excludeGlobal,
353
+ excludeParents,
354
+ })?.item?.parent;
355
+ if (!container) {
356
+ const fullScope = this.PROCESSOR.fullScope;
357
+ // Add to the self-scope unless it's a static inside a non-constructor function, and if that scope is not global.
358
+ const outerFunction = fullScope.self.signifier?.getTypeByKind('Function');
359
+ container =
360
+ isStatic && !outerFunction?.isConstructor
361
+ ? fullScope.local
362
+ : fullScope.self;
363
+ }
364
+ return assignVariable(this, { name, range, container }, rhs, {
365
+ static: isStatic,
366
+ docs,
367
+ ctx,
368
+ });
369
+ }
370
+ structLiteral(children, ctx) {
371
+ // We may already have a struct type attached to a signfier,
372
+ // which should be updated instead of replaced.
373
+ const structFromDocs = ctx.docs?.type[0]?.kind === 'Struct'
374
+ ? ctx.docs?.type[0]
375
+ : getTypeOfKind(ctx.type, 'Struct')?.derive();
376
+ const struct = ctx.signifier?.getTypeByKind('Struct') ||
377
+ structFromDocs ||
378
+ this.PROCESSOR.createStruct(children.StartBrace[0], children.EndBrace[0]);
379
+ ctx.signifier?.setType(struct);
380
+ ctx.signifier = undefined;
381
+ ctx.docs = undefined;
382
+ // TODO
383
+ // // If we are creating a struct literal to match a doc-described
384
+ // // struct, we should *extend* that underlying struct so we don't
385
+ // // mutate the parent (and so we can differientiate between)
386
+ // if (structFromDocs) {
387
+ // struct = structFromDocs.derive();
388
+ // }
389
+ // Create the newMember ranges, to help with autocompletes
390
+ const sortedParts = sortChildren(children);
391
+ let nextRange;
392
+ for (let i = 0; i < sortedParts.length; i++) {
393
+ const part = sortedParts[i];
394
+ const isStart = 'image' in part && [',', '{'].includes(part.image);
395
+ if (isStart) {
396
+ // Then we're starting a range!
397
+ const startPosition = Position.fromCstEnd(this.PROCESSOR.file, part);
398
+ // Loop through the next parts until we find
399
+ nextRange = new StructNewMemberRange(struct, startPosition);
400
+ }
401
+ else if (nextRange) {
402
+ const endPosition = Position.fromCstStart(this.PROCESSOR.file, 'image' in part ? part : part.location);
403
+ nextRange.end = endPosition;
404
+ this.PROCESSOR.file.addStructNewMemberRange(nextRange);
405
+ nextRange = undefined;
406
+ }
407
+ }
408
+ // Manage the struct members
409
+ // The self-scope remains unchanged for struct literals!
410
+ for (const entry of children.structLiteralEntry || []) {
411
+ const parts = entry.children;
412
+ // Visit the JSDocs, if there are any
413
+ if (parts.jsdoc) {
414
+ this.visit(parts.jsdoc, ctx);
415
+ }
416
+ const docs = this.PROCESSOR.consumeJsdoc();
417
+ // The name is either a direct variable name or a string literal.
418
+ let name;
419
+ let range;
420
+ if (parts.Identifier) {
421
+ name = parts.Identifier[0].image;
422
+ range = this.PROCESSOR.range(parts.Identifier[0]);
423
+ }
424
+ else {
425
+ name = stringLiteralAsString(parts.stringLiteral[0].children);
426
+ range = this.PROCESSOR.range(parts.stringLiteral[0].children.StringStart[0], parts.stringLiteral[0].children.StringEnd[0]);
427
+ }
428
+ if (parts.assignmentRightHandSide) {
429
+ assignVariable(this, { name, range, container: struct }, parts.assignmentRightHandSide, {
430
+ docs,
431
+ ctx: { ...ctx, type: struct.getMember(name)?.type },
432
+ instance: true,
433
+ });
434
+ }
435
+ else {
436
+ // Then we're in short-hand mode, where the RHS has the same
437
+ // name but refers to a local variable.
438
+ const matchingVariable = this.FIND_ITEM_BY_NAME(name);
439
+ if (!matchingVariable) {
440
+ // Add an error message
441
+ this.PROCESSOR.addDiagnostic('INVALID_OPERATION', parts.Identifier[0], `Struct literal shorthand requires an existing variable named "${name}"`);
442
+ }
443
+ else {
444
+ struct.addMember(matchingVariable, { override: true });
445
+ matchingVariable.addRef(range);
446
+ }
447
+ }
448
+ }
449
+ return struct;
450
+ }
451
+ /**
452
+ * Fallback identifier handler. Figure out what a given
453
+ * identifier is referencing, and create appropriate references
454
+ * to make that work.*/
455
+ identifier(children) {
456
+ const item = this.FIND_ITEM(children);
457
+ if (item) {
458
+ const ref = item.item.addRef(item.range);
459
+ return {
460
+ item: item.item,
461
+ ref,
462
+ };
463
+ }
464
+ return;
465
+ }
466
+ //#region LITERALS and TYPES
467
+ assignmentRightHandSide(children, context) {
468
+ if (children.expression) {
469
+ return this.expression(children.expression[0].children, context);
470
+ }
471
+ else if (children.structLiteral) {
472
+ return [this.structLiteral(children.structLiteral[0].children, context)];
473
+ }
474
+ else if (children.functionExpression) {
475
+ return [
476
+ this.functionExpression(children.functionExpression[0].children, context) || this.ANY,
477
+ ];
478
+ }
479
+ return [this.ANY];
480
+ }
481
+ expression(children, context) {
482
+ const lhs = this.primaryExpression(children.primaryExpression[0].children, context);
483
+ if (children.binaryExpression) {
484
+ // TODO: Check the rhs type and the operator and emit a diagnostic if needed. For now just return the lhs since any operator shouldn't change the type.
485
+ this.assignmentRightHandSide(children.binaryExpression[0].children.assignmentRightHandSide[0]
486
+ .children, context);
487
+ const operator = children.binaryExpression[0].children.BinaryOperator[0].image;
488
+ const isNumeric = operator.match(/^([*/%^&|-]|<<|>>)$/);
489
+ const isBoolean = !isNumeric && operator.match(/^([><]=?|\|\||&&|!=|==)$/);
490
+ if (isNumeric) {
491
+ return [this.REAL];
492
+ }
493
+ else if (isBoolean) {
494
+ return [this.BOOLEAN];
495
+ }
496
+ else {
497
+ return lhs;
498
+ }
499
+ }
500
+ else if (children.ternaryExpression) {
501
+ // Get the types of the two expression and create a union
502
+ const ternary = children.ternaryExpression[0].children.assignmentRightHandSide;
503
+ const leftType = this.assignmentRightHandSide(ternary[0].children, context);
504
+ const rightType = this.assignmentRightHandSide(ternary[1].children, context);
505
+ return [...arrayWrapped(leftType), ...arrayWrapped(rightType)];
506
+ }
507
+ else if (children.assignment) {
508
+ // We shouldn't really end up here since well-formed code
509
+ // should have assignments that get caught by other rules.
510
+ return [this.ANY];
511
+ }
512
+ return lhs; // Shouldn't happpen unless the parser gets changed.
513
+ }
514
+ primaryExpression(children, context) {
515
+ let type;
516
+ if (children.BooleanLiteral) {
517
+ type = new Type('Bool');
518
+ }
519
+ else if (children.NumericLiteral) {
520
+ type = new Type('Real');
521
+ }
522
+ else if (children.NaN) {
523
+ type = new Type('Real');
524
+ }
525
+ else if (children.PointerLiteral) {
526
+ type = new Type('Pointer');
527
+ }
528
+ else if (children.Undefined) {
529
+ type = new Type('Undefined');
530
+ }
531
+ else if (children.arrayLiteral) {
532
+ type = this.arrayLiteral(children.arrayLiteral[0].children, context);
533
+ }
534
+ else if (children.identifierAccessor) {
535
+ type = this.identifierAccessor(children.identifierAccessor[0].children, context);
536
+ }
537
+ else if (children.stringLiteral) {
538
+ type = this.stringLiteral(children.stringLiteral[0].children, context);
539
+ }
540
+ else if (children.multilineDoubleStringLiteral) {
541
+ type = this.multilineDoubleStringLiteral(children.multilineDoubleStringLiteral[0].children, context);
542
+ }
543
+ else if (children.multilineSingleStringLiteral) {
544
+ type = this.multilineSingleStringLiteral(children.multilineSingleStringLiteral[0].children, context);
545
+ }
546
+ else if (children.templateLiteral) {
547
+ type = this.templateLiteral(children.templateLiteral[0].children, context);
548
+ }
549
+ else if (children.parenthesizedExpression) {
550
+ type = this.parenthesizedExpression(children.parenthesizedExpression[0].children, context);
551
+ }
552
+ if (!type) {
553
+ logger.warn('No type found for primary expression');
554
+ }
555
+ type ||= this.ANY;
556
+ // Override the type if we have a unary operator
557
+ const prefixOperator = children.UnaryPrefixOperator?.[0].image;
558
+ if (prefixOperator?.match(/^[~+-]|\+\+|--$/)) {
559
+ type = this.REAL;
560
+ }
561
+ else if (prefixOperator?.match(/^!$/)) {
562
+ type = this.BOOLEAN;
563
+ }
564
+ return arrayWrapped(type);
565
+ }
566
+ parenthesizedExpression(children, context) {
567
+ return this.expression(children.expression[0].children, context);
568
+ }
569
+ stringLiteral(children, context) {
570
+ return new Type('String');
571
+ }
572
+ multilineDoubleStringLiteral(children, context) {
573
+ return new Type('String');
574
+ }
575
+ multilineSingleStringLiteral(children, context) {
576
+ return new Type('String');
577
+ }
578
+ templateLiteral(children, context) {
579
+ // Make sure that the code content is still visited
580
+ for (const exp of children.expression || []) {
581
+ this.expression(exp.children, withCtxKind(context, 'template'));
582
+ }
583
+ return new Type('String');
584
+ }
585
+ arrayLiteral(children, ctx) {
586
+ // Infer the content type of the array
587
+ // Make sure that the content is visited
588
+ const types = [];
589
+ const arrayType = new Type('Array');
590
+ for (const item of children.assignmentRightHandSide || []) {
591
+ const itemTypes = this.assignmentRightHandSide(item.children, withCtxKind(ctx, 'arrayMember'));
592
+ for (const itemType of getTypes(itemTypes)) {
593
+ if (!types.find((t) => t.kind === itemType.kind && t.name === itemType.name)) {
594
+ types.push(itemType);
595
+ arrayType.addItemType(itemType);
596
+ }
597
+ }
598
+ }
599
+ if (ctx.signifier) {
600
+ ctx.signifier.setType(ctx.docs?.type || arrayType);
601
+ }
602
+ return arrayType;
603
+ }
604
+ }
605
+ //# sourceMappingURL=visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../src/visitor.ts"],"names":[],"mappings":"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"}