@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
package/dist/visitor.js
ADDED
|
@@ -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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"}
|