@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.
- package/LICENSE.md +29 -0
- package/README.md +151 -0
- package/assets/GmlSpec.xml +11419 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/jsdoc.d.ts +79 -0
- package/dist/jsdoc.d.ts.map +1 -0
- package/dist/jsdoc.feather.d.ts +23 -0
- package/dist/jsdoc.feather.d.ts.map +1 -0
- package/dist/jsdoc.feather.js +143 -0
- package/dist/jsdoc.feather.js.map +1 -0
- package/dist/jsdoc.js +468 -0
- package/dist/jsdoc.js.map +1 -0
- package/dist/jsdoc.test.d.ts +2 -0
- package/dist/jsdoc.test.d.ts.map +1 -0
- package/dist/jsdoc.test.js +185 -0
- package/dist/jsdoc.test.js.map +1 -0
- package/dist/lexer.d.ts +3 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +14 -0
- package/dist/lexer.js.map +1 -0
- package/dist/lexer.test.d.ts +2 -0
- package/dist/lexer.test.d.ts.map +1 -0
- package/dist/lexer.test.js +78 -0
- package/dist/lexer.test.js.map +1 -0
- package/dist/lib.objects.d.ts +190 -0
- package/dist/lib.objects.d.ts.map +1 -0
- package/dist/lib.objects.js +242 -0
- package/dist/lib.objects.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -0
- package/dist/modules.d.ts +19 -0
- package/dist/modules.d.ts.map +1 -0
- package/dist/modules.js +320 -0
- package/dist/modules.js.map +1 -0
- package/dist/modules.test.d.ts +2 -0
- package/dist/modules.test.d.ts.map +1 -0
- package/dist/modules.test.js +57 -0
- package/dist/modules.test.js.map +1 -0
- package/dist/modules.types.d.ts +78 -0
- package/dist/modules.types.d.ts.map +1 -0
- package/dist/modules.types.js +2 -0
- package/dist/modules.types.js.map +1 -0
- package/dist/modules.util.d.ts +5 -0
- package/dist/modules.util.d.ts.map +1 -0
- package/dist/modules.util.js +13 -0
- package/dist/modules.util.js.map +1 -0
- package/dist/parser.d.ts +121 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +571 -0
- package/dist/parser.js.map +1 -0
- package/dist/parser.test.d.ts +2 -0
- package/dist/parser.test.d.ts.map +1 -0
- package/dist/parser.test.js +143 -0
- package/dist/parser.test.js.map +1 -0
- package/dist/parser.utility.d.ts +29 -0
- package/dist/parser.utility.d.ts.map +1 -0
- package/dist/parser.utility.js +125 -0
- package/dist/parser.utility.js.map +1 -0
- package/dist/project.asset.d.ts +115 -0
- package/dist/project.asset.d.ts.map +1 -0
- package/dist/project.asset.js +802 -0
- package/dist/project.asset.js.map +1 -0
- package/dist/project.code.d.ts +130 -0
- package/dist/project.code.d.ts.map +1 -0
- package/dist/project.code.js +570 -0
- package/dist/project.code.js.map +1 -0
- package/dist/project.d.ts +533 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.diagnostics.d.ts +32 -0
- package/dist/project.diagnostics.d.ts.map +1 -0
- package/dist/project.diagnostics.js +23 -0
- package/dist/project.diagnostics.js.map +1 -0
- package/dist/project.js +1216 -0
- package/dist/project.js.map +1 -0
- package/dist/project.location.d.ts +133 -0
- package/dist/project.location.d.ts.map +1 -0
- package/dist/project.location.js +219 -0
- package/dist/project.location.js.map +1 -0
- package/dist/project.native.d.ts +26 -0
- package/dist/project.native.d.ts.map +1 -0
- package/dist/project.native.js +321 -0
- package/dist/project.native.js.map +1 -0
- package/dist/project.spec.d.ts +1298 -0
- package/dist/project.spec.d.ts.map +1 -0
- package/dist/project.spec.js +263 -0
- package/dist/project.spec.js.map +1 -0
- package/dist/project.test.d.ts +2 -0
- package/dist/project.test.d.ts.map +1 -0
- package/dist/project.test.js +633 -0
- package/dist/project.test.js.map +1 -0
- package/dist/shaderDefaults.d.ts +3 -0
- package/dist/shaderDefaults.d.ts.map +1 -0
- package/dist/shaderDefaults.js +32 -0
- package/dist/shaderDefaults.js.map +1 -0
- package/dist/signifiers.d.ts +54 -0
- package/dist/signifiers.d.ts.map +1 -0
- package/dist/signifiers.flags.d.ts +38 -0
- package/dist/signifiers.flags.d.ts.map +1 -0
- package/dist/signifiers.flags.js +131 -0
- package/dist/signifiers.flags.js.map +1 -0
- package/dist/signifiers.js +117 -0
- package/dist/signifiers.js.map +1 -0
- package/dist/spine.d.ts +28 -0
- package/dist/spine.d.ts.map +1 -0
- package/dist/spine.js +64 -0
- package/dist/spine.js.map +1 -0
- package/dist/spine.test.d.ts +2 -0
- package/dist/spine.test.d.ts.map +1 -0
- package/dist/spine.test.js +420 -0
- package/dist/spine.test.js.map +1 -0
- package/dist/spine.types.d.ts +89 -0
- package/dist/spine.types.d.ts.map +1 -0
- package/dist/spine.types.js +2 -0
- package/dist/spine.types.js.map +1 -0
- package/dist/test.lib.d.ts +3 -0
- package/dist/test.lib.d.ts.map +1 -0
- package/dist/test.lib.js +16 -0
- package/dist/test.lib.js.map +1 -0
- package/dist/tokens.categories.d.ts +22 -0
- package/dist/tokens.categories.d.ts.map +1 -0
- package/dist/tokens.categories.js +78 -0
- package/dist/tokens.categories.js.map +1 -0
- package/dist/tokens.code.d.ts +2 -0
- package/dist/tokens.code.d.ts.map +1 -0
- package/dist/tokens.code.js +523 -0
- package/dist/tokens.code.js.map +1 -0
- package/dist/tokens.d.ts +130 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +13 -0
- package/dist/tokens.js.map +1 -0
- package/dist/tokens.lib.d.ts +15 -0
- package/dist/tokens.lib.d.ts.map +1 -0
- package/dist/tokens.lib.js +12 -0
- package/dist/tokens.lib.js.map +1 -0
- package/dist/tokens.shared.d.ts +4 -0
- package/dist/tokens.shared.d.ts.map +1 -0
- package/dist/tokens.shared.js +35 -0
- package/dist/tokens.shared.js.map +1 -0
- package/dist/tokens.strings.d.ts +5 -0
- package/dist/tokens.strings.d.ts.map +1 -0
- package/dist/tokens.strings.js +111 -0
- package/dist/tokens.strings.js.map +1 -0
- package/dist/types.checks.d.ts +50 -0
- package/dist/types.checks.d.ts.map +1 -0
- package/dist/types.checks.js +246 -0
- package/dist/types.checks.js.map +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.feather.d.ts +21 -0
- package/dist/types.feather.d.ts.map +1 -0
- package/dist/types.feather.js +156 -0
- package/dist/types.feather.js.map +1 -0
- package/dist/types.hover.d.ts +4 -0
- package/dist/types.hover.d.ts.map +1 -0
- package/dist/types.hover.js +99 -0
- package/dist/types.hover.js.map +1 -0
- package/dist/types.js +457 -0
- package/dist/types.js.map +1 -0
- package/dist/types.primitives.d.ts +10 -0
- package/dist/types.primitives.d.ts.map +1 -0
- package/dist/types.primitives.js +88 -0
- package/dist/types.primitives.js.map +1 -0
- package/dist/types.sprites.d.ts +8 -0
- package/dist/types.sprites.d.ts.map +1 -0
- package/dist/types.sprites.js +417 -0
- package/dist/types.sprites.js.map +1 -0
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +62 -0
- package/dist/types.test.js.map +1 -0
- package/dist/util.d.ts +50 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +168 -0
- package/dist/util.js.map +1 -0
- package/dist/util.test.d.ts +3 -0
- package/dist/util.test.d.ts.map +1 -0
- package/dist/util.test.js +63 -0
- package/dist/util.test.js.map +1 -0
- package/dist/visitor.assign.d.ts +24 -0
- package/dist/visitor.assign.d.ts.map +1 -0
- package/dist/visitor.assign.js +112 -0
- package/dist/visitor.assign.js.map +1 -0
- package/dist/visitor.d.ts +89 -0
- package/dist/visitor.d.ts.map +1 -0
- package/dist/visitor.functionExpression.d.ts +7 -0
- package/dist/visitor.functionExpression.d.ts.map +1 -0
- package/dist/visitor.functionExpression.js +216 -0
- package/dist/visitor.functionExpression.js.map +1 -0
- package/dist/visitor.globals.d.ts +59 -0
- package/dist/visitor.globals.d.ts.map +1 -0
- package/dist/visitor.globals.js +271 -0
- package/dist/visitor.globals.js.map +1 -0
- package/dist/visitor.identifierAccessor.d.ts +6 -0
- package/dist/visitor.identifierAccessor.d.ts.map +1 -0
- package/dist/visitor.identifierAccessor.js +381 -0
- package/dist/visitor.identifierAccessor.js.map +1 -0
- package/dist/visitor.js +605 -0
- package/dist/visitor.js.map +1 -0
- package/dist/visitor.processor.d.ts +66 -0
- package/dist/visitor.processor.d.ts.map +1 -0
- package/dist/visitor.processor.js +147 -0
- package/dist/visitor.processor.js.map +1 -0
- 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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"}
|