@profile-psl/psl-parser 0.1.0
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/CHANGELOG.md +58 -0
- package/LICENSE +9 -0
- package/README.md +34 -0
- package/config.d.ts +29 -0
- package/config.js +51 -0
- package/index.d.ts +6 -0
- package/index.js +7 -0
- package/package.json +35 -0
- package/parser.d.ts +155 -0
- package/parser.js +707 -0
- package/statementParser.d.ts +93 -0
- package/statementParser.js +739 -0
- package/tokenizer.d.ts +139 -0
- package/tokenizer.js +535 -0
- package/utilities.d.ts +43 -0
- package/utilities.js +427 -0
package/parser.js
ADDED
|
@@ -0,0 +1,707 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { StatementParser } from "./statementParser";
|
|
3
|
+
import { getTokens, Token } from "./tokenizer";
|
|
4
|
+
import { getLineAfter } from "./utilities";
|
|
5
|
+
/**
|
|
6
|
+
* Used for checking the type of Member at runtime
|
|
7
|
+
*/
|
|
8
|
+
export var MemberClass;
|
|
9
|
+
(function (MemberClass) {
|
|
10
|
+
MemberClass[MemberClass["method"] = 1] = "method";
|
|
11
|
+
MemberClass[MemberClass["parameter"] = 2] = "parameter";
|
|
12
|
+
MemberClass[MemberClass["property"] = 3] = "property";
|
|
13
|
+
MemberClass[MemberClass["declaration"] = 4] = "declaration";
|
|
14
|
+
MemberClass[MemberClass["column"] = 5] = "column";
|
|
15
|
+
MemberClass[MemberClass["table"] = 6] = "table";
|
|
16
|
+
MemberClass[MemberClass["proc"] = 7] = "proc";
|
|
17
|
+
})(MemberClass || (MemberClass = {}));
|
|
18
|
+
// tslint:disable-next-line:class-name
|
|
19
|
+
class _Method {
|
|
20
|
+
closeParen;
|
|
21
|
+
id;
|
|
22
|
+
types;
|
|
23
|
+
modifiers;
|
|
24
|
+
parameters;
|
|
25
|
+
declarations;
|
|
26
|
+
line;
|
|
27
|
+
endLine;
|
|
28
|
+
batch;
|
|
29
|
+
memberClass;
|
|
30
|
+
documentation;
|
|
31
|
+
statements;
|
|
32
|
+
constructor() {
|
|
33
|
+
this.types = [];
|
|
34
|
+
this.modifiers = [];
|
|
35
|
+
this.parameters = [];
|
|
36
|
+
this.line = -1;
|
|
37
|
+
this.declarations = [];
|
|
38
|
+
this.endLine = -1;
|
|
39
|
+
this.memberClass = MemberClass.method;
|
|
40
|
+
this.documentation = "";
|
|
41
|
+
this.statements = [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// tslint:disable-next-line:class-name
|
|
45
|
+
class _Parameter {
|
|
46
|
+
types;
|
|
47
|
+
req;
|
|
48
|
+
ret;
|
|
49
|
+
literal;
|
|
50
|
+
id;
|
|
51
|
+
memberClass;
|
|
52
|
+
comment;
|
|
53
|
+
modifiers;
|
|
54
|
+
constructor() {
|
|
55
|
+
this.modifiers = [];
|
|
56
|
+
this.req = false;
|
|
57
|
+
this.ret = false;
|
|
58
|
+
this.literal = false;
|
|
59
|
+
this.memberClass = MemberClass.parameter;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const NON_METHOD_KEYWORDS = [
|
|
63
|
+
"do", "d", "set", "s", "if", "i", "for", "f", "while", "w",
|
|
64
|
+
];
|
|
65
|
+
export const NON_TYPE_MODIFIERS = [
|
|
66
|
+
"public", "static", "private",
|
|
67
|
+
];
|
|
68
|
+
export function parseText(sourceText) {
|
|
69
|
+
const parser = new Parser();
|
|
70
|
+
return parser.parseDocument(sourceText);
|
|
71
|
+
}
|
|
72
|
+
export function parseFile(sourcePath) {
|
|
73
|
+
return new Promise((resolve, reject) => {
|
|
74
|
+
fs.readFile(sourcePath, (err, data) => {
|
|
75
|
+
if (err) {
|
|
76
|
+
reject(err);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const parser = new Parser();
|
|
80
|
+
resolve(parser.parseDocument(data.toString()));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
class Parser {
|
|
86
|
+
tokenizer;
|
|
87
|
+
activeToken;
|
|
88
|
+
methods;
|
|
89
|
+
properties;
|
|
90
|
+
declarations;
|
|
91
|
+
activeMethod;
|
|
92
|
+
activeProperty;
|
|
93
|
+
tokens;
|
|
94
|
+
extending;
|
|
95
|
+
pslPackage;
|
|
96
|
+
comments;
|
|
97
|
+
constructor(tokenizer) {
|
|
98
|
+
this.methods = [];
|
|
99
|
+
this.properties = [];
|
|
100
|
+
this.declarations = [];
|
|
101
|
+
this.tokens = [];
|
|
102
|
+
this.comments = [];
|
|
103
|
+
if (tokenizer)
|
|
104
|
+
this.tokenizer = tokenizer;
|
|
105
|
+
}
|
|
106
|
+
parseDocument(documentText) {
|
|
107
|
+
this.tokenizer = getTokens(documentText);
|
|
108
|
+
while (this.next()) {
|
|
109
|
+
if (this.activeToken.isAlphanumeric() || this.activeToken.isMinusSign()) {
|
|
110
|
+
const method = this.parseMethod();
|
|
111
|
+
if (!method)
|
|
112
|
+
continue;
|
|
113
|
+
this.methods.push(method);
|
|
114
|
+
this.activeMethod = method;
|
|
115
|
+
}
|
|
116
|
+
else if (this.activeToken.isTab() || this.activeToken.isSpace()) {
|
|
117
|
+
const lineNumber = this.activeToken.position.line;
|
|
118
|
+
const tokenBuffer = this.loadTokenBuffer();
|
|
119
|
+
const propertyDef = this.lookForPropertyDef(tokenBuffer);
|
|
120
|
+
if (propertyDef) {
|
|
121
|
+
if (propertyDef.id)
|
|
122
|
+
this.properties.push(propertyDef);
|
|
123
|
+
this.activeProperty = propertyDef;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const typeDec = this.lookForTypeDeclaration(tokenBuffer);
|
|
127
|
+
if (typeDec.length > 0) {
|
|
128
|
+
const activeDeclarations = this.activeMethod
|
|
129
|
+
? this.activeMethod.declarations
|
|
130
|
+
: this.declarations;
|
|
131
|
+
for (const dec of typeDec)
|
|
132
|
+
activeDeclarations.push(dec);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const extending = this.checkForExtends(tokenBuffer);
|
|
136
|
+
if (extending)
|
|
137
|
+
this.extending = extending;
|
|
138
|
+
const pslPackage = this.checkForPSLPackage(tokenBuffer);
|
|
139
|
+
if (pslPackage)
|
|
140
|
+
this.pslPackage = pslPackage;
|
|
141
|
+
if (this.activeMethod &&
|
|
142
|
+
this.activeMethod.batch &&
|
|
143
|
+
this.activeMethod.id.value === "REVHIST")
|
|
144
|
+
continue;
|
|
145
|
+
const statements = this.parseStatementsOnLine(tokenBuffer);
|
|
146
|
+
if (statements && this.activeMethod) {
|
|
147
|
+
this.activeMethod.statements =
|
|
148
|
+
this.activeMethod.statements.concat(statements);
|
|
149
|
+
}
|
|
150
|
+
if (this.activeProperty &&
|
|
151
|
+
this.activeProperty.id.position.line + 1 === lineNumber) {
|
|
152
|
+
const documentation = this.checkForDocumentation(tokenBuffer);
|
|
153
|
+
if (documentation)
|
|
154
|
+
this.activeProperty.documentation = documentation;
|
|
155
|
+
}
|
|
156
|
+
else if (this.activeMethod &&
|
|
157
|
+
getLineAfter(this.activeMethod) === lineNumber) {
|
|
158
|
+
const documentation = this.checkForDocumentation(tokenBuffer);
|
|
159
|
+
if (documentation)
|
|
160
|
+
this.activeMethod.documentation = documentation;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (!this.activeToken.isNewLine()) {
|
|
164
|
+
this.throwAwayTokensTil(13 /* Type.NewLine */);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
comments: this.comments,
|
|
169
|
+
declarations: this.declarations,
|
|
170
|
+
extending: this.extending,
|
|
171
|
+
methods: this.methods,
|
|
172
|
+
properties: this.properties,
|
|
173
|
+
pslPackage: this.pslPackage,
|
|
174
|
+
tokens: this.tokens,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
next() {
|
|
178
|
+
this.activeToken = this.tokenizer.next().value;
|
|
179
|
+
if (this.activeToken) {
|
|
180
|
+
this.tokens.push(this.activeToken);
|
|
181
|
+
if (this.activeToken.isLineComment() || this.activeToken.isBlockComment()) {
|
|
182
|
+
this.comments.push(this.activeToken);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return this.activeToken !== undefined;
|
|
186
|
+
}
|
|
187
|
+
checkForDocumentation(tokenBuffer) {
|
|
188
|
+
let i = 0;
|
|
189
|
+
while (i < tokenBuffer.length) {
|
|
190
|
+
const token = tokenBuffer[i];
|
|
191
|
+
if (token.isTab() || token.isSpace()) {
|
|
192
|
+
i++;
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (token.isBlockCommentInit() &&
|
|
196
|
+
tokenBuffer[i + 1] &&
|
|
197
|
+
tokenBuffer[i + 1].isBlockComment()) {
|
|
198
|
+
return tokenBuffer[i + 1].value;
|
|
199
|
+
}
|
|
200
|
+
return "";
|
|
201
|
+
}
|
|
202
|
+
return "";
|
|
203
|
+
}
|
|
204
|
+
lookForTypeDeclaration(tokenBuffer) {
|
|
205
|
+
let i = 0;
|
|
206
|
+
const tokens = [];
|
|
207
|
+
while (i < tokenBuffer.length) {
|
|
208
|
+
const token = tokenBuffer[i];
|
|
209
|
+
if (token.isTab() || token.isSpace()) {
|
|
210
|
+
i++;
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
if (token.isAlphanumeric() && token.value === "type") {
|
|
214
|
+
for (let j = i + 1; j < tokenBuffer.length; j++) {
|
|
215
|
+
const loadToken = tokenBuffer[j];
|
|
216
|
+
if (loadToken.isSpace() || loadToken.isTab())
|
|
217
|
+
continue;
|
|
218
|
+
// if (loadToken.isEqualSign()) break;
|
|
219
|
+
tokens.push(loadToken);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (token.isAlphanumeric() && token.value === "catch") {
|
|
223
|
+
for (let j = i + 1; j < tokenBuffer.length; j++) {
|
|
224
|
+
const loadToken = tokenBuffer[j];
|
|
225
|
+
if (loadToken.isSpace() || loadToken.isTab())
|
|
226
|
+
continue;
|
|
227
|
+
// if (loadToken.isEqualSign()) break;
|
|
228
|
+
tokens.push(new Token(1 /* Type.Alphanumeric */, "Error", { character: 0, line: 0 }));
|
|
229
|
+
tokens.push(loadToken);
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
const memberClass = MemberClass.declaration;
|
|
236
|
+
const declarations = [];
|
|
237
|
+
let type;
|
|
238
|
+
let tokenIndex = 0;
|
|
239
|
+
let id;
|
|
240
|
+
let hasType;
|
|
241
|
+
const modifiers = [];
|
|
242
|
+
while (tokenIndex < tokens.length) {
|
|
243
|
+
const token = tokens[tokenIndex];
|
|
244
|
+
tokenIndex++;
|
|
245
|
+
if (this.isDeclarationKeyword(token)) {
|
|
246
|
+
modifiers.push(token);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
if (!hasType) {
|
|
250
|
+
if (token.type !== 1 /* Type.Alphanumeric */)
|
|
251
|
+
break;
|
|
252
|
+
if (token.value === "static") {
|
|
253
|
+
modifiers.push(token);
|
|
254
|
+
hasType = true;
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
type = token;
|
|
258
|
+
hasType = true;
|
|
259
|
+
}
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
else if (token.isAlphanumeric()) {
|
|
263
|
+
id = token;
|
|
264
|
+
if (hasType && !type)
|
|
265
|
+
type = token;
|
|
266
|
+
// declarations.push({types: [type], identifier});
|
|
267
|
+
}
|
|
268
|
+
else if (token.isEqualSign()) {
|
|
269
|
+
tokenIndex = this.skipToNextDeclaration(tokens, tokenIndex);
|
|
270
|
+
if (id && type) {
|
|
271
|
+
declarations.push({ types: [type], id, memberClass, modifiers });
|
|
272
|
+
}
|
|
273
|
+
id = undefined;
|
|
274
|
+
}
|
|
275
|
+
else if (token.isOpenParen()) {
|
|
276
|
+
const types = [];
|
|
277
|
+
const myIdentifier = tokens[tokenIndex - 2];
|
|
278
|
+
while (tokenIndex < tokens.length) {
|
|
279
|
+
const arrayTypeToken = tokens[tokenIndex];
|
|
280
|
+
tokenIndex++;
|
|
281
|
+
if (arrayTypeToken.isOpenParen())
|
|
282
|
+
continue;
|
|
283
|
+
else if (arrayTypeToken.isAlphanumeric()) {
|
|
284
|
+
types.push(arrayTypeToken);
|
|
285
|
+
}
|
|
286
|
+
else if (arrayTypeToken.isComma()) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
else if (arrayTypeToken.isCloseParen()) {
|
|
290
|
+
if (type) {
|
|
291
|
+
declarations.push({
|
|
292
|
+
id: myIdentifier,
|
|
293
|
+
types: [type].concat(types),
|
|
294
|
+
memberClass,
|
|
295
|
+
modifiers
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
id = undefined;
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Cheating!!
|
|
304
|
+
// else if (token.isPercentSign()) continue;
|
|
305
|
+
else if (token.isComma()) {
|
|
306
|
+
if (id && type) {
|
|
307
|
+
declarations.push({ types: [type], id, memberClass, modifiers });
|
|
308
|
+
}
|
|
309
|
+
id = undefined;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
else if (token.value === "\r")
|
|
313
|
+
continue;
|
|
314
|
+
else if (token.isBlockComment())
|
|
315
|
+
continue;
|
|
316
|
+
else if (token.isBlockCommentInit())
|
|
317
|
+
continue;
|
|
318
|
+
else if (token.isBlockCommentTerm())
|
|
319
|
+
continue;
|
|
320
|
+
else if (token.isNewLine()) {
|
|
321
|
+
if (id && type) {
|
|
322
|
+
declarations.push({ types: [type], id, memberClass, modifiers });
|
|
323
|
+
}
|
|
324
|
+
id = undefined;
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
else
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
if (id && type)
|
|
331
|
+
declarations.push({ types: [type], id, memberClass, modifiers });
|
|
332
|
+
return declarations;
|
|
333
|
+
}
|
|
334
|
+
checkForExtends(tokenBuffer) {
|
|
335
|
+
let i = 0;
|
|
336
|
+
let classDef = false;
|
|
337
|
+
let extending = false;
|
|
338
|
+
let equals = false;
|
|
339
|
+
while (i < tokenBuffer.length) {
|
|
340
|
+
const token = tokenBuffer[i];
|
|
341
|
+
if (token.isTab() || token.isSpace()) {
|
|
342
|
+
i++;
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
else if (token.isNumberSign() && !classDef) {
|
|
346
|
+
const nextToken = tokenBuffer[i + 1];
|
|
347
|
+
if (!nextToken)
|
|
348
|
+
return null;
|
|
349
|
+
if (nextToken.value === "CLASSDEF") {
|
|
350
|
+
classDef = true;
|
|
351
|
+
i += 2;
|
|
352
|
+
}
|
|
353
|
+
else
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
else if (token.value === "extends" && !extending) {
|
|
357
|
+
extending = true;
|
|
358
|
+
i++;
|
|
359
|
+
}
|
|
360
|
+
else if (token.isEqualSign() && !equals) {
|
|
361
|
+
equals = true;
|
|
362
|
+
i++;
|
|
363
|
+
}
|
|
364
|
+
else if (token.isAlphanumeric() && classDef && extending && equals) {
|
|
365
|
+
return token;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
i++;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
checkForPSLPackage(tokenBuffer) {
|
|
374
|
+
let i = 0;
|
|
375
|
+
let foundPackageToken = false;
|
|
376
|
+
let fullPackage = "";
|
|
377
|
+
while (i < tokenBuffer.length) {
|
|
378
|
+
const token = tokenBuffer[i];
|
|
379
|
+
if (token.isTab() || token.isSpace()) {
|
|
380
|
+
i++;
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
else if (token.isNumberSign() && !foundPackageToken) {
|
|
384
|
+
const nextToken = tokenBuffer[i + 1];
|
|
385
|
+
if (!nextToken)
|
|
386
|
+
return "";
|
|
387
|
+
if (nextToken.value === "PACKAGE") {
|
|
388
|
+
foundPackageToken = true;
|
|
389
|
+
i += 2;
|
|
390
|
+
}
|
|
391
|
+
else
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
else if (token.isAlphanumeric() && foundPackageToken) {
|
|
395
|
+
// TODO: Maybe this should return an ordered list of tokens?
|
|
396
|
+
if (fullPackage === "") {
|
|
397
|
+
fullPackage = token.value;
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
fullPackage += ("." + token.value);
|
|
401
|
+
}
|
|
402
|
+
i++;
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
i++;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (fullPackage !== "") {
|
|
409
|
+
return fullPackage;
|
|
410
|
+
}
|
|
411
|
+
return "";
|
|
412
|
+
}
|
|
413
|
+
skipToNextDeclaration(identifiers, tokenIndex) {
|
|
414
|
+
let parenStack = 0;
|
|
415
|
+
while (tokenIndex < identifiers.length) {
|
|
416
|
+
const token = identifiers[tokenIndex];
|
|
417
|
+
tokenIndex++;
|
|
418
|
+
if (token.isOpenParen()) {
|
|
419
|
+
parenStack++;
|
|
420
|
+
}
|
|
421
|
+
else if (token.isCloseParen()) {
|
|
422
|
+
parenStack--;
|
|
423
|
+
}
|
|
424
|
+
else if (token.isComma() && parenStack === 0) {
|
|
425
|
+
break;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return tokenIndex;
|
|
429
|
+
}
|
|
430
|
+
isDeclarationKeyword(token) {
|
|
431
|
+
if (token.type !== 1 /* Type.Alphanumeric */)
|
|
432
|
+
return false;
|
|
433
|
+
const keywords = ["public", "private", "new", "literal"];
|
|
434
|
+
return keywords.indexOf(token.value) !== -1;
|
|
435
|
+
}
|
|
436
|
+
throwAwayTokensTil(type) {
|
|
437
|
+
while (this.next()) {
|
|
438
|
+
if (this.activeToken.type === type)
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
loadTokenBuffer() {
|
|
443
|
+
const tokenBuffer = [];
|
|
444
|
+
while (this.next() && this.activeToken.type !== 13 /* Type.NewLine */) {
|
|
445
|
+
tokenBuffer.push(this.activeToken);
|
|
446
|
+
}
|
|
447
|
+
return tokenBuffer;
|
|
448
|
+
}
|
|
449
|
+
lookForPropertyDef(tokenBuffer) {
|
|
450
|
+
let i = 0;
|
|
451
|
+
// TODO better loop
|
|
452
|
+
while (i < tokenBuffer.length) {
|
|
453
|
+
let token = tokenBuffer[i];
|
|
454
|
+
if (token.isTab() || token.isSpace()) {
|
|
455
|
+
i++;
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
if (token.isNumberSign()) {
|
|
459
|
+
token = tokenBuffer[i + 1];
|
|
460
|
+
if (token && token.value === "PROPERTYDEF") {
|
|
461
|
+
const tokens = tokenBuffer.filter(t => {
|
|
462
|
+
if (t.isNumberSign())
|
|
463
|
+
return false;
|
|
464
|
+
if (t.value === "PROPERTYDEF")
|
|
465
|
+
return false;
|
|
466
|
+
return t.type !== 32 /* Type.Space */ && t.type !== 11 /* Type.Tab */;
|
|
467
|
+
});
|
|
468
|
+
const classTypes = [];
|
|
469
|
+
const classIndex = tokens.findIndex(t => t.value === "class");
|
|
470
|
+
if (tokens[classIndex + 1]
|
|
471
|
+
&& tokens[classIndex + 1].value === "="
|
|
472
|
+
&& tokens[classIndex + 2]
|
|
473
|
+
&& tokens[classIndex + 2].isAlphanumeric()) {
|
|
474
|
+
classTypes.push(tokens[classIndex + 2]);
|
|
475
|
+
}
|
|
476
|
+
return {
|
|
477
|
+
id: tokens[0],
|
|
478
|
+
memberClass: MemberClass.property,
|
|
479
|
+
modifiers: this.findPropertyModifiers(tokens.slice(1)),
|
|
480
|
+
types: classTypes,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
break;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
findPropertyModifiers(tokens) {
|
|
494
|
+
return tokens.filter(t => {
|
|
495
|
+
return (t.value === "private" ||
|
|
496
|
+
t.value === "literal" ||
|
|
497
|
+
t.value === "public");
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
parseMethod() {
|
|
501
|
+
let batchLabel = false;
|
|
502
|
+
const method = new _Method();
|
|
503
|
+
do {
|
|
504
|
+
if (!this.activeToken)
|
|
505
|
+
continue;
|
|
506
|
+
if (this.activeToken.isTab() || this.activeToken.isSpace())
|
|
507
|
+
continue;
|
|
508
|
+
else if (this.activeToken.isNewLine())
|
|
509
|
+
break;
|
|
510
|
+
else if (this.activeToken.isOpenParen()) {
|
|
511
|
+
const processed = this.processParameters(method);
|
|
512
|
+
if (!processed)
|
|
513
|
+
return undefined;
|
|
514
|
+
method.parameters = processed;
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
else if (this.activeToken.isAlphanumeric() ||
|
|
518
|
+
this.activeToken.isNumeric()) {
|
|
519
|
+
if (batchLabel) {
|
|
520
|
+
method.modifiers.push(this.activeToken);
|
|
521
|
+
method.batch = true;
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
if (method.line === -1) {
|
|
525
|
+
method.line = this.activeToken.position.line;
|
|
526
|
+
}
|
|
527
|
+
method.modifiers.push(this.activeToken);
|
|
528
|
+
}
|
|
529
|
+
else if (this.activeToken.isMinusSign()) {
|
|
530
|
+
batchLabel = true;
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
else if (this.activeToken.isLineCommentInit()
|
|
534
|
+
|| this.activeToken.isLineComment()
|
|
535
|
+
|| this.activeToken.isBlockCommentInit()
|
|
536
|
+
|| this.activeToken.isBlockComment()
|
|
537
|
+
|| this.activeToken.isBlockCommentTerm()) {
|
|
538
|
+
continue;
|
|
539
|
+
}
|
|
540
|
+
else if (this.activeToken.value === "\r")
|
|
541
|
+
continue;
|
|
542
|
+
else if (this.activeToken.isCloseParen()) {
|
|
543
|
+
if (!method.closeParen) {
|
|
544
|
+
method.closeParen = this.activeToken;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
this.throwAwayTokensTil(13 /* Type.NewLine */);
|
|
549
|
+
if (method.modifiers.length > 1) {
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
return undefined;
|
|
553
|
+
}
|
|
554
|
+
} while (this.next());
|
|
555
|
+
return this.finalizeMethod(method);
|
|
556
|
+
}
|
|
557
|
+
finalizeMethod(method) {
|
|
558
|
+
for (const keyword of NON_METHOD_KEYWORDS) {
|
|
559
|
+
const index = method.modifiers
|
|
560
|
+
.map(i => i.value.toLowerCase())
|
|
561
|
+
.indexOf(keyword.toLowerCase());
|
|
562
|
+
if (index > -1 && index <= method.modifiers.length - 1) {
|
|
563
|
+
method.modifiers = [method.modifiers[0]];
|
|
564
|
+
method.parameters = [];
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
// better way...
|
|
569
|
+
method.id = method.modifiers.pop();
|
|
570
|
+
if (this.activeMethod) {
|
|
571
|
+
this.activeMethod.endLine = method.id.position.line - 1;
|
|
572
|
+
}
|
|
573
|
+
const lastModifier = method.modifiers[method.modifiers.length - 1];
|
|
574
|
+
if (lastModifier && NON_TYPE_MODIFIERS.indexOf(lastModifier.value) < 0) {
|
|
575
|
+
method.types = [method.modifiers.pop()];
|
|
576
|
+
}
|
|
577
|
+
this.activeMethod = method;
|
|
578
|
+
return method;
|
|
579
|
+
}
|
|
580
|
+
processParameters(method) {
|
|
581
|
+
const args = [];
|
|
582
|
+
let param;
|
|
583
|
+
let open = false;
|
|
584
|
+
while (this.next()) {
|
|
585
|
+
if (this.activeToken.isTab() ||
|
|
586
|
+
this.activeToken.isSpace() ||
|
|
587
|
+
this.activeToken.isNewLine()) {
|
|
588
|
+
continue;
|
|
589
|
+
}
|
|
590
|
+
else if (this.activeToken.isOpenParen()) {
|
|
591
|
+
open = true;
|
|
592
|
+
if (!param)
|
|
593
|
+
return undefined;
|
|
594
|
+
if (param.types.length === 1 && !param.id) {
|
|
595
|
+
param.id = param.types[0];
|
|
596
|
+
param.types[0] = this.getDummy();
|
|
597
|
+
}
|
|
598
|
+
const objectArgs = this.processObjectArgs();
|
|
599
|
+
if (!objectArgs)
|
|
600
|
+
return undefined;
|
|
601
|
+
param.types = param.types.concat(objectArgs);
|
|
602
|
+
continue;
|
|
603
|
+
}
|
|
604
|
+
else if (this.activeToken.isCloseParen()) {
|
|
605
|
+
open = false;
|
|
606
|
+
method.closeParen = this.activeToken;
|
|
607
|
+
if (!param)
|
|
608
|
+
break;
|
|
609
|
+
if (param.types.length === 1 && !param.id) {
|
|
610
|
+
param.id = param.types[0];
|
|
611
|
+
param.types[0] = this.getDummy();
|
|
612
|
+
}
|
|
613
|
+
args.push(param);
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
616
|
+
else if (this.activeToken.isAlphanumeric()) {
|
|
617
|
+
if (!param)
|
|
618
|
+
param = new _Parameter();
|
|
619
|
+
// let value = this.activeToken.value;
|
|
620
|
+
if (this.activeToken.value === "req") {
|
|
621
|
+
param.modifiers.push(this.activeToken);
|
|
622
|
+
param.req = true;
|
|
623
|
+
}
|
|
624
|
+
else if (this.activeToken.value === "ret") {
|
|
625
|
+
param.modifiers.push(this.activeToken);
|
|
626
|
+
param.ret = true;
|
|
627
|
+
}
|
|
628
|
+
else if (this.activeToken.value === "literal") {
|
|
629
|
+
param.modifiers.push(this.activeToken);
|
|
630
|
+
param.literal = true;
|
|
631
|
+
}
|
|
632
|
+
else if (!param.types)
|
|
633
|
+
param.types = [this.activeToken];
|
|
634
|
+
else {
|
|
635
|
+
param.id = this.activeToken;
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
else if (this.activeToken.isLineComment()) {
|
|
639
|
+
if (param) {
|
|
640
|
+
param.comment = this.activeToken;
|
|
641
|
+
}
|
|
642
|
+
else if (args.length >= 1) {
|
|
643
|
+
args[args.length - 1].comment = this.activeToken;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
else if (this.activeToken.isComma()) {
|
|
647
|
+
if (!param)
|
|
648
|
+
return undefined;
|
|
649
|
+
if (param.types.length === 1 && !param.id) {
|
|
650
|
+
param.id = param.types[0];
|
|
651
|
+
param.types[0] = this.getDummy();
|
|
652
|
+
}
|
|
653
|
+
args.push(param);
|
|
654
|
+
param = undefined;
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
if (open)
|
|
658
|
+
return undefined;
|
|
659
|
+
return args;
|
|
660
|
+
}
|
|
661
|
+
processObjectArgs() {
|
|
662
|
+
const types = [];
|
|
663
|
+
let found = false;
|
|
664
|
+
while (this.next()) {
|
|
665
|
+
const dummy = this.getDummy();
|
|
666
|
+
if (this.activeToken.isTab() || this.activeToken.isSpace())
|
|
667
|
+
continue;
|
|
668
|
+
else if (this.activeToken.isCloseParen()) {
|
|
669
|
+
if (types.length === 0)
|
|
670
|
+
types.push(dummy);
|
|
671
|
+
return types;
|
|
672
|
+
}
|
|
673
|
+
else if (this.activeToken.isAlphanumeric()) {
|
|
674
|
+
if (!found) {
|
|
675
|
+
types.push(this.activeToken);
|
|
676
|
+
found = true;
|
|
677
|
+
}
|
|
678
|
+
else
|
|
679
|
+
return null;
|
|
680
|
+
}
|
|
681
|
+
else if (this.activeToken.isComma()) {
|
|
682
|
+
if (!found) {
|
|
683
|
+
if (types.length === 0) {
|
|
684
|
+
types.push(dummy);
|
|
685
|
+
}
|
|
686
|
+
types.push(dummy);
|
|
687
|
+
}
|
|
688
|
+
found = false;
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
return null;
|
|
693
|
+
}
|
|
694
|
+
parseStatementsOnLine(tokenBuffer) {
|
|
695
|
+
const statementParser = new StatementParser(tokenBuffer);
|
|
696
|
+
try {
|
|
697
|
+
return statementParser.parseLine();
|
|
698
|
+
}
|
|
699
|
+
catch {
|
|
700
|
+
return [];
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
getDummy() {
|
|
704
|
+
return new Token(-1 /* Type.Undefined */, "", this.activeToken.position);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVEsTUFBTSxhQUFhLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFdBUVg7QUFSRCxXQUFZLFdBQVc7SUFDdEIsaURBQVUsQ0FBQTtJQUNWLHVEQUFhLENBQUE7SUFDYixxREFBWSxDQUFBO0lBQ1osMkRBQWUsQ0FBQTtJQUNmLGlEQUFVLENBQUE7SUFDViwrQ0FBUyxDQUFBO0lBQ1QsNkNBQVEsQ0FBQTtBQUNULENBQUMsRUFSVyxXQUFXLEtBQVgsV0FBVyxRQVF0QjtBQThLRCxzQ0FBc0M7QUFDdEMsTUFBTSxPQUFPO0lBRVosVUFBVSxDQUFRO0lBQ2xCLEVBQUUsQ0FBUTtJQUNWLEtBQUssQ0FBVTtJQUNmLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQWU7SUFDekIsWUFBWSxDQUFnQjtJQUM1QixJQUFJLENBQVM7SUFDYixPQUFPLENBQVM7SUFDaEIsS0FBSyxDQUFVO0lBQ2YsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBUztJQUN0QixVQUFVLENBQWM7SUFFeEI7UUFDQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8s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
|