11import {
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'
3039import {
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'
4253import { getLocation } from './utils'
54+ import { TypeExtractor } from './type-extractor'
4355
4456export 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}
0 commit comments