Skip to content

Commit 15eb83b

Browse files
committed
Complete implementation of typechecking arrays
1 parent 409f27a commit 15eb83b

26 files changed

+488
-239
lines changed

src/compiler/__tests__/output

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
true
2+
4
3+
167.5
4+
3.2
5+
16777215
6+
70000000000

src/types/ast/astExtractor/ast-extractor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { BaseJavaCstVisitorWithDefaults, CstNode, TypeDeclarationCtx } from 'java-parser'
22

33
import { NormalClassDeclaration } from '../types/classes'
4-
import { AST } from '../types/packages-and-modules'
4+
import { AST } from '../types'
55
import { ClassExtractor } from './class-extractor'
66

77
export class ASTExtractor extends BaseJavaCstVisitorWithDefaults {

src/types/ast/astExtractor/block-statement-extractor.ts

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import {
2-
ArrayInitializerCtx,
32
BaseJavaCstVisitorWithDefaults,
43
BlockStatementCstNode,
54
LocalVariableDeclarationCtx,
65
LocalVariableDeclarationStatementCtx,
76
LocalVariableTypeCtx,
87
VariableDeclaratorCtx,
98
VariableDeclaratorIdCtx,
10-
VariableDeclaratorListCtx,
11-
VariableInitializerCtx,
12-
VariableInitializerListCtx
9+
VariableDeclaratorListCtx
1310
} from 'java-parser'
1411
import {
1512
BlockStatement,
@@ -22,13 +19,13 @@ import { TypeExtractor } from './type-extractor'
2219

2320
export class BlockStatementExtractor extends BaseJavaCstVisitorWithDefaults {
2421
extract(cst: BlockStatementCstNode): BlockStatement {
25-
this.visit(cst)
2622
if (cst.children.localVariableDeclarationStatement) {
2723
return this.visit(cst.children.localVariableDeclarationStatement)
28-
} /* if (cst.children.statement) */ else {
24+
} else if (cst.children.statement) {
2925
const statementExtractor = new StatementExtractor()
30-
return statementExtractor.extract(cst.children.statement![0])
26+
return statementExtractor.extract(cst.children.statement[0])
3127
}
28+
throw new Error('not implemented')
3229
}
3330

3431
localVariableDeclarationStatement(
@@ -65,35 +62,16 @@ export class BlockStatementExtractor extends BaseJavaCstVisitorWithDefaults {
6562
}
6663

6764
variableDeclarator(ctx: VariableDeclaratorCtx): VariableDeclarator {
68-
return {
69-
kind: 'VariableDeclarator',
70-
variableDeclaratorId: this.visit(ctx.variableDeclaratorId),
71-
variableInitializer: ctx.variableInitializer ? this.visit(ctx.variableInitializer) : undefined
65+
const variableDeclarator: { [key: string]: any } = { kind: 'VariableDeclarator' }
66+
variableDeclarator.variableDeclaratorId = this.visit(ctx.variableDeclaratorId)
67+
if (ctx.variableInitializer) {
68+
const expressionExtractor = new ExpressionExtractor()
69+
variableDeclarator.variableInitializer = expressionExtractor.visit(ctx.variableInitializer)
7270
}
71+
return variableDeclarator as VariableDeclarator
7372
}
7473

7574
variableDeclaratorId(ctx: VariableDeclaratorIdCtx) {
7675
return ctx.Identifier[0].image
7776
}
78-
79-
variableInitializer(ctx: VariableInitializerCtx) {
80-
if (ctx.expression) {
81-
const expressionExtractor = new ExpressionExtractor()
82-
return expressionExtractor.extract(ctx.expression[0])
83-
} else if (ctx.arrayInitializer) {
84-
return this.visit(ctx.arrayInitializer)
85-
}
86-
}
87-
88-
arrayInitializer(ctx: ArrayInitializerCtx) {
89-
if (ctx.variableInitializerList) {
90-
return this.visit(ctx.variableInitializerList)
91-
}
92-
}
93-
94-
variableInitializerList(ctx: VariableInitializerListCtx) {
95-
return ctx.variableInitializer.map(variableInitializer => {
96-
return this.visit(variableInitializer)
97-
})
98-
}
9977
}

src/types/ast/astExtractor/constructor-extractor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
ConstructorDeclaration
2121
} from '../types/classes'
2222
import { BlockStatement, ExplicitConstructorInvocation } from '../types/blocks-and-statements'
23-
import { Location } from '../types/ast'
23+
import { Location } from '../types'
2424
import { BlockStatementExtractor } from './block-statement-extractor'
2525
import { TypeExtractor } from './type-extractor'
2626
import { ExpressionExtractor } from './expression-extractor'

src/types/ast/astExtractor/expression-extractor.ts

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import {
22
ArgumentListCtx,
33
ArrayAccessSuffixCtx,
4+
ArrayCreationDefaultInitSuffixCtx,
5+
ArrayCreationExplicitInitSuffixCtx,
6+
ArrayCreationExpressionCtx,
7+
ArrayInitializerCtx,
48
BaseJavaCstVisitorWithDefaults,
59
BinaryExpressionCtx,
610
BooleanLiteralCtx,
711
ClassOrInterfaceTypeToInstantiateCtx,
12+
DimExprCtx,
13+
DimExprsCtx,
14+
DimsCtx,
815
ExpressionCstNode,
916
ExpressionCtx,
1017
FloatingPointLiteralCtx,
@@ -25,21 +32,26 @@ import {
2532
TernaryExpressionCtx,
2633
UnaryExpressionCstNode,
2734
UnaryExpressionCtx,
28-
UnqualifiedClassInstanceCreationExpressionCtx
35+
UnqualifiedClassInstanceCreationExpressionCtx,
36+
VariableInitializerCtx,
37+
VariableInitializerListCtx
2938
} from 'java-parser'
3039
import {
3140
ArgumentList,
3241
ArrayAccess,
42+
ArrayCreationExpression,
3343
Assignment,
3444
BinaryExpression,
3545
ClassInstanceCreationExpression,
46+
DimensionExpression,
3647
Expression,
3748
ExpressionName,
3849
FieldAccess,
3950
Primary
4051
} from '../types/blocks-and-statements'
41-
import { Location } from '../types/ast'
52+
import { Location } from '../types'
4253
import { getLocation } from './utils'
54+
import { TypeExtractor } from './type-extractor'
4355

4456
export class ExpressionExtractor extends BaseJavaCstVisitorWithDefaults {
4557
private location: Location
@@ -272,7 +284,9 @@ export class ExpressionExtractor extends BaseJavaCstVisitorWithDefaults {
272284
}
273285

274286
newExpression(ctx: NewExpressionCtx) {
275-
if (ctx.unqualifiedClassInstanceCreationExpression) {
287+
if (ctx.arrayCreationExpression) {
288+
return this.visit(ctx.arrayCreationExpression)
289+
} else if (ctx.unqualifiedClassInstanceCreationExpression) {
276290
return this.visit(ctx.unqualifiedClassInstanceCreationExpression)
277291
}
278292
}
@@ -451,4 +465,70 @@ export class ExpressionExtractor extends BaseJavaCstVisitorWithDefaults {
451465
location: getLocation(ctx.LSquare[0])
452466
}
453467
}
468+
469+
arrayCreationExpression(ctx: ArrayCreationExpressionCtx): ArrayCreationExpression {
470+
const result: { [key: string]: any } = { kind: 'ArrayCreationExpression' }
471+
const typeExtractor = new TypeExtractor()
472+
if (ctx.classOrInterfaceType) result.type = typeExtractor.visit(ctx.classOrInterfaceType)
473+
else if (ctx.primitiveType) result.type = typeExtractor.visit(ctx.primitiveType)
474+
if (ctx.arrayCreationDefaultInitSuffix)
475+
result.dimensionExpressions = this.visit(ctx.arrayCreationDefaultInitSuffix)
476+
else if (ctx.arrayCreationExplicitInitSuffix) {
477+
const { arrayInitializer, dimensions } = this.visit(ctx.arrayCreationExplicitInitSuffix)
478+
result.arrayInitializer = arrayInitializer
479+
result.type += dimensions
480+
}
481+
result.location = getLocation(ctx.New[0])
482+
return result as ArrayCreationExpression
483+
}
484+
485+
arrayCreationDefaultInitSuffix(ctx: ArrayCreationDefaultInitSuffixCtx) {
486+
if (ctx.dims) throw new Error('not implemented')
487+
return this.visit(ctx.dimExprs)
488+
}
489+
490+
arrayCreationExplicitInitSuffix(ctx: ArrayCreationExplicitInitSuffixCtx) {
491+
return {
492+
arrayInitializer: this.visit(ctx.arrayInitializer),
493+
dimensions: this.visit(ctx.dims)
494+
}
495+
}
496+
497+
dims(ctx: DimsCtx) {
498+
return '[]'.repeat(ctx.LSquare.length)
499+
}
500+
501+
dimExprs(ctx: DimExprsCtx) {
502+
return ctx.dimExpr.map(dimExpr => this.visit(dimExpr))
503+
}
504+
505+
dimExpr(ctx: DimExprCtx): DimensionExpression {
506+
const expressionExtractor = new ExpressionExtractor()
507+
return {
508+
kind: 'DimensionExpression',
509+
expression: expressionExtractor.extract(ctx.expression[0]),
510+
location: getLocation(ctx.LSquare[0])
511+
}
512+
}
513+
514+
arrayInitializer(ctx: ArrayInitializerCtx) {
515+
if (ctx.variableInitializerList) {
516+
return this.visit(ctx.variableInitializerList)
517+
}
518+
}
519+
520+
variableInitializer(ctx: VariableInitializerCtx) {
521+
if (ctx.expression) {
522+
const expressionExtractor = new ExpressionExtractor()
523+
return expressionExtractor.extract(ctx.expression[0])
524+
} else if (ctx.arrayInitializer) {
525+
return this.visit(ctx.arrayInitializer)
526+
}
527+
}
528+
529+
variableInitializerList(ctx: VariableInitializerListCtx) {
530+
return ctx.variableInitializer.map(variableInitializer => {
531+
return this.visit(variableInitializer)
532+
})
533+
}
454534
}

src/types/ast/astExtractor/statement-extractor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ import {
4242
StatementExpression,
4343
VariableDeclarator
4444
} from '../types/blocks-and-statements'
45-
import { Location } from '../types/ast'
45+
import { Location } from '../types'
4646
import { ExpressionExtractor } from './expression-extractor'
4747
import { BlockStatementExtractor } from './block-statement-extractor'
4848
import { TypeExtractor } from './type-extractor'

src/types/ast/astExtractor/type-extractor.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
FloatingPointTypeCtx,
55
IntegralTypeCtx,
66
NumericTypeCtx,
7+
PrimitiveTypeCtx,
78
UnannClassOrInterfaceTypeCtx,
89
UnannClassTypeCtx,
910
UnannPrimitiveTypeCtx,
@@ -88,4 +89,10 @@ export class TypeExtractor extends BaseJavaCstVisitorWithDefaults {
8889
dims(ctx: DimsCtx) {
8990
return '[]'.repeat(ctx.LSquare.length)
9091
}
92+
93+
primitiveType(ctx: PrimitiveTypeCtx) {
94+
if (ctx.Boolean) return 'boolean'
95+
if (ctx.numericType) return this.visit(ctx.numericType)
96+
throw new Error('not implemented')
97+
}
9198
}

src/types/ast/astExtractor/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Location } from '../types/ast'
1+
import { Location } from '../types'
22

33
export const getLocation = (object: Location): Location => ({
44
startLine: object.startLine,

src/types/ast/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { parse as parseToCst } from 'java-parser'
22
import { ASTExtractor } from './astExtractor/ast-extractor'
3-
import { AST } from './types/packages-and-modules'
3+
import { AST } from './types'
44

55
/**
66
* Parse program string into Abstract Syntax Tree (AST).

src/types/ast/types/ast.ts

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)