@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,381 @@
1
+ import { arrayWrapped } from '@bscotch/utility';
2
+ import { withCtxKind } from './parser.js';
3
+ import { identifierFrom, isEmpty, rhsFrom, sortedAccessorSuffixes, sortedFunctionCallParts, } from './parser.utility.js';
4
+ import { FunctionArgRange, Position, Range, fixITokenLocation, } from './project.location.js';
5
+ import { getTypeOfKind, getTypeStoreOrType, getTypes, getTypesOfKind, isTypeOfKind, normalizeType, replaceGenerics, updateGenericsMap, } from './types.checks.js';
6
+ import { withableTypes } from './types.primitives.js';
7
+ import { assignVariable } from './visitor.assign.js';
8
+ export function visitIdentifierAccessor(children, ctx) {
9
+ const docs = this.PROCESSOR.consumeJsdoc();
10
+ const suffixes = sortedAccessorSuffixes(children.accessorSuffixes);
11
+ // Compute useful metadata
12
+ /** If true, then the `new` keyword prefixes this. */
13
+ const usesNew = !!children.New?.length;
14
+ /** If not `undefined`, this is the assignment node */
15
+ const rhs = rhsFrom(children.assignment);
16
+ const scope = this.PROCESSOR.fullScope;
17
+ // Use the starting identifier to construct the initial `lastAccessed` object
18
+ const identifierName = identifierFrom(children.identifier[0].children)?.name;
19
+ let lastAccessed = {
20
+ name: identifierName,
21
+ range: Range.fromCst(this.PROCESSOR.file, children.identifier[0].location),
22
+ usesNew,
23
+ ctx,
24
+ };
25
+ // Early exit if we don't have a name, since that should only
26
+ // happen in a broken state (e.g. during editing)
27
+ if (!lastAccessed.name)
28
+ return [this.ANY];
29
+ // See if this is a known identifier. If not, create it in an
30
+ // "undeclared" state.
31
+ let item = this.FIND_ITEM(children.identifier[0].children)?.item;
32
+ if (!item && scope.self === scope.global) {
33
+ // Then this is being treated as a global variable but it has
34
+ // not been declared anywhere
35
+ const autoDeclarePrefixes = this.PROCESSOR.project.options?.settings?.autoDeclareGlobalsPrefixes ||
36
+ [];
37
+ const isAutoDeclared = autoDeclarePrefixes.some((prefix) => lastAccessed.name?.startsWith(prefix));
38
+ if (!isAutoDeclared) {
39
+ this.PROCESSOR.addDiagnostic('UNDECLARED_GLOBAL_REFERENCE', lastAccessed.range, `${lastAccessed.name} looks like a global but is not declared anywhere.`);
40
+ }
41
+ // Just set the last accessed type to ANY so that we can
42
+ // continue processing.
43
+ lastAccessed.types = [this.ANY];
44
+ }
45
+ else if (!item) {
46
+ // Then this is a signifier that we have not seen declared yet,
47
+ // but might be declared later. So add it to the self scope but
48
+ // without setting where it's defined. Diagnostics should be added
49
+ // later.
50
+ item = scope.self.addMember(lastAccessed.name);
51
+ if (item) {
52
+ item.instance = true;
53
+ }
54
+ }
55
+ // Update lastAccessed with the signifier info
56
+ if (item?.$tag === 'Sym') {
57
+ lastAccessed.signifier = item;
58
+ lastAccessed.types = arrayWrapped(getTypeStoreOrType(item));
59
+ // Add a reference! But if this is an assignment that'll be
60
+ // handled later.
61
+ const refAddedLater = rhs && !item.def;
62
+ if (!refAddedLater) {
63
+ item.addRef(lastAccessed.range);
64
+ }
65
+ }
66
+ else if (item?.$tag === 'Type') {
67
+ lastAccessed.signifier = item.signifier;
68
+ lastAccessed.types = [item];
69
+ }
70
+ // Now that we have the initial "lastAccessed" content,
71
+ // we can iterate over the accessors.
72
+ for (let i = 0; i < suffixes.length; i++) {
73
+ // If this is the final suffix, we need to pass additional
74
+ // info that is applicable to it.
75
+ if (i === suffixes.length - 1) {
76
+ lastAccessed.rhs = rhs;
77
+ lastAccessed.docs = docs;
78
+ }
79
+ lastAccessed = processNextAccessor(this, lastAccessed, suffixes[i], suffixes[i + 1]);
80
+ }
81
+ return lastAccessed.types || [this.ANY];
82
+ }
83
+ /**
84
+ * @param nextAccessor If there is another accessor after this one, having it as a lookahead is useful in some cases. */
85
+ function processNextAccessor(visitor, lastAccessed, accessor, nextAccessor) {
86
+ // For example, `hello[expression]`
87
+ if ('expression' in accessor.children) {
88
+ visitor.visit(accessor.children.expression, lastAccessed.ctx);
89
+ }
90
+ let nextAccessed; // Many suffix cases include an expression we need to evaluate.
91
+ switch (accessor.name) {
92
+ case 'arrayMutationAccessorSuffix':
93
+ case 'arrayAccessSuffix':
94
+ case 'mapAccessSuffix':
95
+ case 'gridAccessSuffix':
96
+ case 'listAccessSuffix':
97
+ case 'structAccessSuffix':
98
+ // All of the above are container types, so we need to
99
+ // return the type of the items in the container. First
100
+ // restrict the incoming types to those that are supported
101
+ // by the accessor type.
102
+ const allowedTypes = getTypesOfKind(lastAccessed.types, accessor.name.startsWith('array')
103
+ ? 'Array'
104
+ : accessor.name === 'mapAccessSuffix'
105
+ ? 'Id.DsMap'
106
+ : accessor.name === 'gridAccessSuffix'
107
+ ? 'Id.DsGrid'
108
+ : accessor.name === 'listAccessSuffix'
109
+ ? 'Id.DsList'
110
+ : accessor.name === 'structAccessSuffix'
111
+ ? 'Struct'
112
+ : 'Any');
113
+ nextAccessed = {
114
+ range: Range.fromCst(visitor.PROCESSOR.file, accessor.location),
115
+ ctx: lastAccessed.ctx,
116
+ };
117
+ nextAccessed.types = allowedTypes
118
+ .map((t) => t.items)
119
+ .filter((t) => !!t);
120
+ // If there is a RHS, we can't create a variable from it but
121
+ // do need to process it!
122
+ if (lastAccessed.rhs) {
123
+ visitor.assignmentRightHandSide(lastAccessed.rhs, lastAccessed.ctx);
124
+ }
125
+ break;
126
+ case 'dotAccessSuffix':
127
+ nextAccessed = processDotAccessor(visitor, lastAccessed, accessor, nextAccessor);
128
+ break;
129
+ case 'functionArguments':
130
+ nextAccessed = processFunctionArguments(visitor, lastAccessed, accessor);
131
+ break;
132
+ }
133
+ return nextAccessed;
134
+ }
135
+ function processFunctionArguments(visitor, lastAccessed, suffix) {
136
+ const nextAccessed = {
137
+ range: Range.fromCst(visitor.PROCESSOR.file, suffix.location),
138
+ ctx: lastAccessed.ctx,
139
+ };
140
+ // Get the first function type from the lastAccessed types
141
+ const functionType = getTypeOfKind(lastAccessed.types, 'Function');
142
+ // If this is a mixin call, then we need to ensure that the context
143
+ // includes the variables created by the mixin function.
144
+ if ((lastAccessed.signifier?.mixin || functionType?.signifier?.mixin) &&
145
+ functionType?.self) {
146
+ const variables = functionType.self;
147
+ for (const member of variables.listMembers()) {
148
+ if (!member.def)
149
+ continue;
150
+ member.override = true; // Ensure it's set as an override variable
151
+ const currentMember = visitor.PROCESSOR.currentSelf.getMember(member.name);
152
+ if (currentMember?.native)
153
+ continue;
154
+ visitor.PROCESSOR.currentSelf.addMember(member);
155
+ }
156
+ }
157
+ /**
158
+ * The native `method` function has the unique property
159
+ * of causing its first argument to be used as the scope
160
+ * for the second argument.
161
+ */
162
+ const isMethodCall = functionType?.signifier ===
163
+ visitor.PROCESSOR.project.self.getMember('method');
164
+ let methodSelf;
165
+ /** If this is a `method()` call, the 2nd argument is the return type */
166
+ let methodReturns;
167
+ // Create the argumentRanges between the parens and each comma
168
+ const argsAndSeps = sortedFunctionCallParts(suffix);
169
+ let argIdx = 0;
170
+ let lastDelimiter;
171
+ let lastTokenWasDelimiter = true;
172
+ const ranges = [];
173
+ const generics = new Map();
174
+ for (let i = 0; i < argsAndSeps.length; i++) {
175
+ const token = argsAndSeps[i];
176
+ const isSep = 'image' in token;
177
+ if (isSep) {
178
+ fixITokenLocation(token);
179
+ if (token.image === '(') {
180
+ lastDelimiter = token;
181
+ continue;
182
+ }
183
+ // Otherwise create the range
184
+ // For some reason the end position is the same
185
+ // as the start position for the commas and parens
186
+ // Start on the RIGHT side of the first delimiter
187
+ if (functionType) {
188
+ const start = Position.fromCstEnd(visitor.PROCESSOR.file, lastDelimiter);
189
+ // end on the LEFT side of the second delimiter
190
+ const end = Position.fromCstStart(visitor.PROCESSOR.file, token);
191
+ const funcRange = new FunctionArgRange(functionType, argIdx, start, end);
192
+ if (!lastTokenWasDelimiter) {
193
+ funcRange.hasExpression = true;
194
+ }
195
+ visitor.PROCESSOR.file.addFunctionArgRange(funcRange);
196
+ ranges.push(funcRange);
197
+ }
198
+ // Increment the argument idx for the next one
199
+ lastDelimiter = token;
200
+ lastTokenWasDelimiter = true;
201
+ argIdx++;
202
+ }
203
+ else {
204
+ lastTokenWasDelimiter = false;
205
+ const functionCtx = withCtxKind(lastAccessed.ctx, 'functionArg');
206
+ if (isMethodCall && argIdx === 1 && methodSelf) {
207
+ functionCtx.self = methodSelf;
208
+ }
209
+ const expectedType = functionType?.getParameter(argIdx);
210
+ if (expectedType) {
211
+ functionCtx.type = expectedType.type;
212
+ }
213
+ if (token.children.jsdoc) {
214
+ visitor.jsdoc(token.children.jsdoc[0].children, functionCtx);
215
+ }
216
+ const inferredType = normalizeType(visitor.assignmentRightHandSide(token.children.assignmentRightHandSide[0].children, functionCtx), visitor.PROCESSOR.project.types);
217
+ if (isMethodCall && argIdx === 1) {
218
+ // Then the inferred argument type is the return type
219
+ methodReturns = getTypeOfKind(inferredType, ['Function']);
220
+ }
221
+ if (expectedType) {
222
+ updateGenericsMap(expectedType, inferredType, visitor.PROCESSOR.project.types, generics);
223
+ }
224
+ if (isMethodCall && argIdx === 0) {
225
+ methodSelf = getTypeOfKind(inferredType, [
226
+ 'Id.Instance',
227
+ 'Struct',
228
+ 'Asset.GMObject',
229
+ ]);
230
+ }
231
+ }
232
+ }
233
+ // The returntype of this function may be used in another accessor
234
+ const returnType = normalizeType(replaceGenerics((lastAccessed.usesNew
235
+ ? functionType?.self
236
+ : isMethodCall
237
+ ? methodReturns
238
+ : functionType?.returns) || visitor.ANY, visitor.PROCESSOR.project.types, generics), visitor.PROCESSOR.project.types);
239
+ nextAccessed.types = [returnType];
240
+ // Add the function call to the file for diagnostics
241
+ if (ranges.length) {
242
+ visitor.PROCESSOR.file.addFunctionCall(ranges);
243
+ }
244
+ return nextAccessed;
245
+ }
246
+ function processDotAccessor(visitor, lastAccessed, accessor, nextAccessor) {
247
+ const nextAccessed = {
248
+ range: Range.fromCst(visitor.PROCESSOR.file, accessor.location),
249
+ ctx: lastAccessed.ctx,
250
+ };
251
+ // Reduce the available types from lastAccessed to those that
252
+ // are dot-accessible
253
+ const dottableTypes = getTypesOfKind(lastAccessed.types, [
254
+ ...withableTypes,
255
+ 'Enum',
256
+ ]);
257
+ if (!dottableTypes.length) {
258
+ // Early return. Just set the type to ANY and move along.
259
+ nextAccessed.types = [visitor.ANY];
260
+ const allTypes = getTypes(lastAccessed.types);
261
+ const isDotAccessible = !allTypes.length || getTypeOfKind(allTypes, ['Any', 'Unknown', 'Mixed']);
262
+ if (!isDotAccessible) {
263
+ visitor.PROCESSOR.addDiagnostic('INVALID_OPERATION', accessor.location, `Type does not allow dot accessors.`);
264
+ }
265
+ lastAccessed.rhs &&
266
+ visitor.assignmentRightHandSide(lastAccessed.rhs, lastAccessed.ctx);
267
+ return nextAccessed;
268
+ }
269
+ let dottableType = dottableTypes[0];
270
+ if (dottableTypes.length > 1) {
271
+ // We may have a union of valid types, so it's helpful to know
272
+ // the subsequent accessor (if there is one) -- we can use it
273
+ // to narrow down which type is likely intended.
274
+ const nextAccessorName = nextAccessor?.name === 'dotAccessSuffix'
275
+ ? identifierFrom(nextAccessor.children.identifier)?.name
276
+ : undefined;
277
+ if (nextAccessorName) {
278
+ dottableType =
279
+ dottableTypes.find((t) => t.getMember(nextAccessorName)) ||
280
+ dottableType;
281
+ }
282
+ }
283
+ // Then we need to change self-scope to be inside
284
+ // the prior dot-accessible.
285
+ const dotAccessor = accessor.children;
286
+ const dot = fixITokenLocation(dotAccessor.Dot[0]);
287
+ // Set the self-scope starting right after the dot operator
288
+ visitor.PROCESSOR.scope.setEnd(dot);
289
+ visitor.PROCESSOR.pushSelfScope(dot, dottableType, true, {
290
+ accessorScope: true,
291
+ });
292
+ let scopeIsPopped = false;
293
+ const popSelfScope = (on = propertyNameLocation) => {
294
+ if (scopeIsPopped)
295
+ return;
296
+ visitor.PROCESSOR.scope.setEnd(on, true);
297
+ visitor.PROCESSOR.popSelfScope(on, true);
298
+ scopeIsPopped = true;
299
+ };
300
+ // While editing a user will dot into something
301
+ // prior to actually adding the new identifier.
302
+ // To provide autocomplete options, we need to
303
+ // still add a scopeRange for the dot.
304
+ const hasIdentifier = !isEmpty(dotAccessor.identifier[0].children);
305
+ if (!hasIdentifier) {
306
+ popSelfScope(dot);
307
+ nextAccessed.types = [visitor.ANY];
308
+ return nextAccessed;
309
+ }
310
+ // Then we've got an identifier! Get its info.
311
+ const propertyIdentifier = identifierFrom(dotAccessor);
312
+ const propertyNameLocation = dotAccessor.identifier[0].location;
313
+ const propertyNameRange = visitor.PROCESSOR.range(propertyNameLocation);
314
+ nextAccessed.range = propertyNameRange;
315
+ nextAccessed.name = propertyIdentifier.name;
316
+ // If we have an existing property, we just need to add
317
+ // a ref and update the nextAccessed info. If not, we'll
318
+ // need to first create that property.
319
+ let property = dottableType.getMember(propertyIdentifier.name);
320
+ if (property) {
321
+ // If there's an assignment and this isn't an enum, then
322
+ // handle then offload to the assignment logic
323
+ if (lastAccessed.rhs && !isTypeOfKind(dottableType, 'Enum')) {
324
+ // Pop the self-scope so the RHS is in the right place!
325
+ popSelfScope();
326
+ property =
327
+ assignVariable(visitor, {
328
+ name: propertyIdentifier.name,
329
+ container: dottableType,
330
+ range: propertyNameRange,
331
+ }, lastAccessed.rhs, {
332
+ ctx: lastAccessed.ctx,
333
+ docs: lastAccessed.docs,
334
+ instance: true,
335
+ })?.item || property;
336
+ }
337
+ else {
338
+ // Otherwise we'll need to manually add the reference
339
+ property.addRef(propertyNameRange);
340
+ }
341
+ }
342
+ else if (dottableType.kind === 'Enum') {
343
+ // Then we're trying to get an enum member that doesn't exist!
344
+ visitor.PROCESSOR.addDiagnostic('INVALID_OPERATION', accessor.location, `Undefined enum member.`);
345
+ }
346
+ else if (lastAccessed.rhs) {
347
+ // Then this variable is not yet defined on this struct,
348
+ // but we have an assignment operation to use to define it.
349
+ // We need to pop the scope first so that the RHS is evaluated
350
+ // in the correct scope!
351
+ popSelfScope();
352
+ property = assignVariable(visitor, {
353
+ name: propertyIdentifier.name,
354
+ container: dottableType,
355
+ range: propertyNameRange,
356
+ }, lastAccessed.rhs, {
357
+ ctx: lastAccessed.ctx,
358
+ docs: lastAccessed.docs,
359
+ instance: true,
360
+ })?.item;
361
+ }
362
+ else {
363
+ // Then this variable is not yet defined on this struct.
364
+ // We need to add it! If this is an assignment operation, then
365
+ // we can use the central assignment logic. Otherwise we just
366
+ // need to add an "undeclared" variable to the current type.
367
+ property = dottableType.addMember(propertyIdentifier.name);
368
+ if (property) {
369
+ property.instance = true;
370
+ property.addRef(propertyNameRange);
371
+ }
372
+ else {
373
+ visitor.PROCESSOR.addDiagnostic('INVALID_OPERATION', accessor.location, `Unknown property.`);
374
+ }
375
+ }
376
+ popSelfScope();
377
+ nextAccessed.signifier = property;
378
+ nextAccessed.types = arrayWrapped(property?.type || visitor.ANY);
379
+ return nextAccessed;
380
+ }
381
+ //# sourceMappingURL=visitor.identifierAccessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visitor.identifierAccessor.js","sourceRoot":"","sources":["../src/visitor.identifierAccessor.ts"],"names":[],"mappings":"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"}