Skip to content

Commit b75c700

Browse files
committed
Merge pull request #4171 from aaronhurst-google:experimental-apex-parser
[apex] Summit-AST Apex module - Part 3 - initializers #4171
2 parents 815b796 + 828ccd1 commit b75c700

10 files changed

+106
-71
lines changed

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTMapEntryNode.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import java.util.Arrays;
98

10-
public class ASTMapEntryNode extends AbstractApexNode.Single<Node> {
9+
import com.google.summit.ast.expression.Expression;
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTMapEntryNode(Node mapEntryNode) {
15-
super(mapEntryNode);
11+
public class ASTMapEntryNode extends AbstractApexNode.Many<Expression> {
12+
13+
private final Expression key;
14+
private final Expression value;
15+
16+
ASTMapEntryNode(Expression key, Expression value) {
17+
super(Arrays.asList(key, value));
18+
this.key = key;
19+
this.value = value;
1620
}
1721

1822
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewKeyValueObjectExpression.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ConstructorInitializer;
98

10-
public class ASTNewKeyValueObjectExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewKeyValueObjectExpression extends AbstractApexNode.Single<ConstructorInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewKeyValueObjectExpression(Node node) {
15-
super(node);
11+
ASTNewKeyValueObjectExpression(ConstructorInitializer constructorInitializer) {
12+
super(constructorInitializer);
1613
}
1714

1815
@Override
@@ -21,14 +18,10 @@ public Object jjtAccept(ApexParserVisitor visitor, Object data) {
2118
}
2219

2320
public String getType() {
24-
// return node.getTypeRef().getNames().get(0).getValue();
25-
// TODO(b/239648780)
26-
return null;
21+
return node.getType().asCodeString();
2722
}
2823

2924
public int getParameterCount() {
30-
// return node.getParameters().size();
31-
// TODO(b/239648780)
32-
return 0;
25+
return node.getArgs().size();
3326
}
3427
}

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewListInitExpression.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.Initializer;
98

10-
public class ASTNewListInitExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewListInitExpression extends AbstractApexNode.Single<Initializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewListInitExpression(Node newListInitExpression) {
15-
super(newListInitExpression);
11+
ASTNewListInitExpression(Initializer initializer) {
12+
super(initializer);
1613
}
1714

1815
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewListLiteralExpression.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ValuesInitializer;
98

10-
public class ASTNewListLiteralExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewListLiteralExpression extends AbstractApexNode.Single<ValuesInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewListLiteralExpression(Node newListLiteralExpression) {
15-
super(newListLiteralExpression);
11+
ASTNewListLiteralExpression(ValuesInitializer valuesInitializer) {
12+
super(valuesInitializer);
1613
}
1714

1815
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewMapInitExpression.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ConstructorInitializer;
98

10-
public class ASTNewMapInitExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewMapInitExpression extends AbstractApexNode.Single<ConstructorInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewMapInitExpression(Node newMapInitExpression) {
15-
super(newMapInitExpression);
11+
ASTNewMapInitExpression(ConstructorInitializer constructorInitializer) {
12+
super(constructorInitializer);
1613
}
1714

1815
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewMapLiteralExpression.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.Initializer;
98

10-
public class ASTNewMapLiteralExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewMapLiteralExpression extends AbstractApexNode.Single<Initializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewMapLiteralExpression(Node newMapLiteralExpression) {
15-
super(newMapLiteralExpression);
11+
ASTNewMapLiteralExpression(Initializer initializer) {
12+
super(initializer);
1613
}
1714

1815
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewObjectExpression.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ConstructorInitializer;
98

10-
public class ASTNewObjectExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewObjectExpression extends AbstractApexNode.Single<ConstructorInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewObjectExpression(Node newObjectExpression) {
15-
super(newObjectExpression);
11+
ASTNewObjectExpression(ConstructorInitializer constructorInitializer) {
12+
super(constructorInitializer);
1613
}
1714

1815
@Override
@@ -21,8 +18,6 @@ public Object jjtAccept(ApexParserVisitor visitor, Object data) {
2118
}
2219

2320
public String getType() {
24-
// return String.valueOf(node.getTypeRef());
25-
// TODO(b/239648780)
26-
return null;
21+
return node.getType().asCodeString();
2722
}
2823
}

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewSetInitExpression.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ConstructorInitializer;
98

10-
public class ASTNewSetInitExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewSetInitExpression extends AbstractApexNode.Single<ConstructorInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewSetInitExpression(Node newSetInitExpression) {
11+
ASTNewSetInitExpression(ConstructorInitializer newSetInitExpression) {
1512
super(newSetInitExpression);
1613
}
1714

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ASTNewSetLiteralExpression.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44

55
package net.sourceforge.pmd.lang.apex.ast;
66

7-
import com.google.summit.ast.Node;
8-
import net.sourceforge.pmd.annotation.InternalApi;
7+
import com.google.summit.ast.initializer.ValuesInitializer;
98

10-
public class ASTNewSetLiteralExpression extends AbstractApexNode.Single<Node> {
9+
public class ASTNewSetLiteralExpression extends AbstractApexNode.Single<ValuesInitializer> {
1110

12-
@Deprecated
13-
@InternalApi
14-
public ASTNewSetLiteralExpression(Node newSetLiteralExpression) {
15-
super(newSetLiteralExpression);
11+
ASTNewSetLiteralExpression(ValuesInitializer valuesInitializer) {
12+
super(valuesInitializer);
1613
}
1714

1815
@Override

pmd-apex/src/main/java/net/sourceforge/pmd/lang/apex/ast/ApexTreeBuilder.kt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ import com.google.summit.ast.expression.CastExpression
3030
import com.google.summit.ast.expression.Expression
3131
import com.google.summit.ast.expression.FieldExpression
3232
import com.google.summit.ast.expression.LiteralExpression
33+
import com.google.summit.ast.expression.NewExpression
3334
import com.google.summit.ast.expression.SuperExpression
3435
import com.google.summit.ast.expression.TernaryExpression
3536
import com.google.summit.ast.expression.ThisExpression
3637
import com.google.summit.ast.expression.TypeRefExpression
3738
import com.google.summit.ast.expression.UnaryExpression
3839
import com.google.summit.ast.expression.VariableExpression
40+
import com.google.summit.ast.initializer.ConstructorInitializer
41+
import com.google.summit.ast.initializer.MapInitializer
42+
import com.google.summit.ast.initializer.SizedArrayInitializer
43+
import com.google.summit.ast.initializer.ValuesInitializer
3944
import com.google.summit.ast.modifier.KeywordModifier
4045
import com.google.summit.ast.modifier.KeywordModifier.Keyword
4146
import com.google.summit.ast.modifier.Modifier
@@ -107,6 +112,11 @@ class ApexTreeBuilder(val sourceCode: String, val parserOptions: ApexParserOptio
107112
is VariableExpression -> buildVariableExpression(node)
108113
is CallExpression -> buildCallExpression(node)
109114
is TernaryExpression -> buildTernaryExpression(node)
115+
is NewExpression -> build(node.initializer, parent)
116+
is ConstructorInitializer -> buildConstructorInitializer(node)
117+
is ValuesInitializer -> buildValuesInitializer(node)
118+
is MapInitializer -> buildMapInitializer(node)
119+
is SizedArrayInitializer -> buildSizedArrayInitializer(node)
110120
is Identifier,
111121
is KeywordModifier,
112122
is TypeRef -> null
@@ -363,6 +373,57 @@ class ApexTreeBuilder(val sourceCode: String, val parserOptions: ApexParserOptio
363373
buildChildren(node, parent = this, exclude = { it == node.condition })
364374
}
365375

376+
/**
377+
* Builds an [ASTNewListInitExpression], [ASTNewMapInitExpression], [ASTNewSetInitExpression],
378+
* [ASTNewKeyValueObjectExpression], or [ASTNewObjectExpression] wrapper for the
379+
* [ConstructorInitializer].
380+
*/
381+
private fun buildConstructorInitializer(node: ConstructorInitializer) =
382+
when (node.type.components.first().id.string.lowercase()) {
383+
"list" -> ASTNewListInitExpression(node)
384+
"map" -> ASTNewMapInitExpression(node)
385+
"set" -> ASTNewSetInitExpression(node)
386+
else -> {
387+
// Object initializer
388+
if (node.args.isNotEmpty() && node.args.first() is AssignExpression) {
389+
// Named arguments
390+
ASTNewKeyValueObjectExpression(node)
391+
} else {
392+
// Unnamed arguments
393+
ASTNewObjectExpression(node)
394+
}
395+
}
396+
}.apply { buildChildren(node, parent = this) }
397+
398+
/**
399+
* Builds an [ASTNewListLiteralExpression], [ASTNewMapLiteralExpression], or
400+
* [ASTNewSetLiteralExpression] wrapper for the [ValuesInitializer].
401+
*/
402+
private fun buildValuesInitializer(node: ValuesInitializer) =
403+
when (node.type.components.first().id.string.lowercase()) {
404+
"list" -> ASTNewListLiteralExpression(node)
405+
"map" -> ASTNewMapLiteralExpression(node)
406+
"set" -> ASTNewSetLiteralExpression(node)
407+
else -> ASTNewListLiteralExpression(node) // Array
408+
}.apply { buildChildren(node, parent = this) }
409+
410+
/** Builds an [ASTNewMapLiteralExpression] wrapper for the [MapInitializer]. */
411+
private fun buildMapInitializer(node: MapInitializer) =
412+
ASTNewMapLiteralExpression(node).apply {
413+
/** Builds an [ASTMapEntryNode] for the [map entry][entry]. */
414+
fun buildMapEntry(entry: Pair<Expression, Expression>) =
415+
ASTMapEntryNode(entry.first, entry.second).apply {
416+
buildAndSetParent(entry.first, parent = this)
417+
buildAndSetParent(entry.second, parent = this)
418+
}
419+
420+
node.pairs.forEach { pair -> buildMapEntry(pair).also { it.setParent(this) } }
421+
}
422+
423+
/** Builds an [ASTNewListInitExpression] wrapper for the [SizedArrayInitializer]. */
424+
private fun buildSizedArrayInitializer(node: SizedArrayInitializer) =
425+
ASTNewListInitExpression(node).apply { buildChildren(node, parent = this) }
426+
366427
/** Builds an [ASTStandardCondition] wrapper for the [condition]. */
367428
private fun buildCondition(condition: Node?) =
368429
ASTStandardCondition(condition).apply { buildAndSetParent(condition, this) }

0 commit comments

Comments
 (0)