|
1 | 1 | import { |
2 | | - ArrayInitializerCtx, |
3 | 2 | BaseJavaCstVisitorWithDefaults, |
4 | 3 | BlockStatementCstNode, |
5 | | - LocalVariableDeclarationCtx, |
6 | | - LocalVariableDeclarationStatementCtx, |
7 | 4 | LocalVariableTypeCtx, |
8 | | - VariableDeclaratorCtx, |
9 | 5 | VariableDeclaratorIdCtx, |
10 | | - VariableDeclaratorListCtx, |
11 | 6 | VariableInitializerCtx, |
12 | | - VariableInitializerListCtx, |
13 | 7 | } from "java-parser"; |
14 | 8 | import { |
15 | 9 | BlockStatement, |
16 | | - LocalVariableDeclarationStatement, |
| 10 | + Expression, |
17 | 11 | VariableDeclarator, |
18 | 12 | } from "../types/blocks-and-statements"; |
| 13 | +import { Identifier, UnannType } from "../types/classes"; |
19 | 14 | import { ExpressionExtractor } from "./expression-extractor"; |
20 | 15 | import { StatementExtractor } from "./statement-extractor"; |
21 | 16 | import { TypeExtractor } from "./type-extractor"; |
22 | 17 |
|
23 | 18 | export class BlockStatementExtractor extends BaseJavaCstVisitorWithDefaults { |
| 19 | + private type: UnannType; |
| 20 | + private identifier: Identifier[] = []; |
| 21 | + private value: Expression[] = []; |
| 22 | + |
24 | 23 | extract(cst: BlockStatementCstNode): BlockStatement { |
25 | 24 | this.visit(cst); |
26 | 25 | if (cst.children.localVariableDeclarationStatement) { |
27 | | - return this.visit(cst.children.localVariableDeclarationStatement); |
| 26 | + const variableDeclaratorList = this.identifier.map( |
| 27 | + (identifier, index): VariableDeclarator => ({ |
| 28 | + kind: "VariableDeclarator", |
| 29 | + variableDeclaratorId: identifier, |
| 30 | + variableInitializer: this.value[index], |
| 31 | + }) |
| 32 | + ); |
| 33 | + return { |
| 34 | + kind: "LocalVariableDeclarationStatement", |
| 35 | + localVariableType: this.type, |
| 36 | + variableDeclaratorList, |
| 37 | + location: cst.location, |
| 38 | + }; |
28 | 39 | } /* if (cst.children.statement) */ else { |
29 | 40 | const statementExtractor = new StatementExtractor(); |
30 | 41 | return statementExtractor.extract(cst.children.statement![0]); |
31 | 42 | } |
32 | 43 | } |
33 | 44 |
|
34 | | - localVariableDeclarationStatement( |
35 | | - ctx: LocalVariableDeclarationStatementCtx |
36 | | - ): LocalVariableDeclarationStatement { |
37 | | - return { |
38 | | - kind: "LocalVariableDeclarationStatement", |
39 | | - ...this.visit(ctx.localVariableDeclaration), |
40 | | - }; |
41 | | - } |
42 | | - |
43 | | - localVariableDeclaration( |
44 | | - ctx: LocalVariableDeclarationCtx |
45 | | - ): Omit<LocalVariableDeclarationStatement, "kind"> { |
46 | | - return { |
47 | | - localVariableType: this.visit(ctx.localVariableType), |
48 | | - variableDeclaratorList: this.visit(ctx.variableDeclaratorList), |
49 | | - }; |
50 | | - } |
51 | | - |
52 | 45 | localVariableType(ctx: LocalVariableTypeCtx) { |
53 | 46 | const typeExtractor = new TypeExtractor(); |
54 | 47 | if (ctx.unannType) { |
55 | | - return typeExtractor.extract(ctx.unannType[0]); |
56 | | - } else if (ctx.Var) { |
57 | | - throw new Error("Not implemented"); |
| 48 | + this.type = typeExtractor.extract(ctx.unannType[0]); |
58 | 49 | } |
59 | 50 | } |
60 | 51 |
|
61 | | - variableDeclaratorList(ctx: VariableDeclaratorListCtx) { |
62 | | - return ctx.variableDeclarator.map((variableDeclarator) => { |
63 | | - return this.visit(variableDeclarator); |
64 | | - }); |
65 | | - } |
66 | | - |
67 | | - variableDeclarator(ctx: VariableDeclaratorCtx): VariableDeclarator { |
68 | | - return { |
69 | | - kind: "VariableDeclarator", |
70 | | - variableDeclaratorId: this.visit(ctx.variableDeclaratorId), |
71 | | - variableInitializer: ctx.variableInitializer |
72 | | - ? this.visit(ctx.variableInitializer) |
73 | | - : undefined, |
74 | | - }; |
75 | | - } |
76 | | - |
77 | 52 | variableDeclaratorId(ctx: VariableDeclaratorIdCtx) { |
78 | | - return ctx.Identifier[0].image; |
| 53 | + this.identifier.push(ctx.Identifier[0].image); |
79 | 54 | } |
80 | 55 |
|
81 | 56 | variableInitializer(ctx: VariableInitializerCtx) { |
82 | 57 | if (ctx.expression) { |
83 | 58 | const expressionExtractor = new ExpressionExtractor(); |
84 | | - return expressionExtractor.extract(ctx.expression[0]); |
85 | | - } else if (ctx.arrayInitializer) { |
86 | | - return this.visit(ctx.arrayInitializer); |
| 59 | + ctx.expression.forEach((expression) => { |
| 60 | + this.value.push(expressionExtractor.extract(expression)); |
| 61 | + }); |
87 | 62 | } |
88 | 63 | } |
89 | | - |
90 | | - arrayInitializer(ctx: ArrayInitializerCtx) { |
91 | | - if (ctx.variableInitializerList) { |
92 | | - return this.visit(ctx.variableInitializerList); |
93 | | - } |
94 | | - } |
95 | | - |
96 | | - variableInitializerList(ctx: VariableInitializerListCtx) { |
97 | | - return ctx.variableInitializer.map((variableInitializer) => { |
98 | | - return this.visit(variableInitializer); |
99 | | - }); |
100 | | - } |
101 | 64 | } |
0 commit comments