Skip to content

Commit

Permalink
Merge pull request #4171 from aaronhurst-google:experimental-apex-parser
Browse files Browse the repository at this point in the history
[apex] Summit-AST Apex module - Part 3 - initializers #4171
  • Loading branch information
adangel committed Nov 10, 2022
2 parents 815b796 + 828ccd1 commit b75c700
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 71 deletions.
Expand Up @@ -4,15 +4,19 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import java.util.Arrays;

public class ASTMapEntryNode extends AbstractApexNode.Single<Node> {
import com.google.summit.ast.expression.Expression;

@Deprecated
@InternalApi
public ASTMapEntryNode(Node mapEntryNode) {
super(mapEntryNode);
public class ASTMapEntryNode extends AbstractApexNode.Many<Expression> {

private final Expression key;
private final Expression value;

ASTMapEntryNode(Expression key, Expression value) {
super(Arrays.asList(key, value));
this.key = key;
this.value = value;
}

@Override
Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ConstructorInitializer;

public class ASTNewKeyValueObjectExpression extends AbstractApexNode.Single<Node> {
public class ASTNewKeyValueObjectExpression extends AbstractApexNode.Single<ConstructorInitializer> {

@Deprecated
@InternalApi
public ASTNewKeyValueObjectExpression(Node node) {
super(node);
ASTNewKeyValueObjectExpression(ConstructorInitializer constructorInitializer) {
super(constructorInitializer);
}

@Override
Expand All @@ -21,14 +18,10 @@ public Object jjtAccept(ApexParserVisitor visitor, Object data) {
}

public String getType() {
// return node.getTypeRef().getNames().get(0).getValue();
// TODO(b/239648780)
return null;
return node.getType().asCodeString();
}

public int getParameterCount() {
// return node.getParameters().size();
// TODO(b/239648780)
return 0;
return node.getArgs().size();
}
}
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.Initializer;

public class ASTNewListInitExpression extends AbstractApexNode.Single<Node> {
public class ASTNewListInitExpression extends AbstractApexNode.Single<Initializer> {

@Deprecated
@InternalApi
public ASTNewListInitExpression(Node newListInitExpression) {
super(newListInitExpression);
ASTNewListInitExpression(Initializer initializer) {
super(initializer);
}

@Override
Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ValuesInitializer;

public class ASTNewListLiteralExpression extends AbstractApexNode.Single<Node> {
public class ASTNewListLiteralExpression extends AbstractApexNode.Single<ValuesInitializer> {

@Deprecated
@InternalApi
public ASTNewListLiteralExpression(Node newListLiteralExpression) {
super(newListLiteralExpression);
ASTNewListLiteralExpression(ValuesInitializer valuesInitializer) {
super(valuesInitializer);
}

@Override
Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ConstructorInitializer;

public class ASTNewMapInitExpression extends AbstractApexNode.Single<Node> {
public class ASTNewMapInitExpression extends AbstractApexNode.Single<ConstructorInitializer> {

@Deprecated
@InternalApi
public ASTNewMapInitExpression(Node newMapInitExpression) {
super(newMapInitExpression);
ASTNewMapInitExpression(ConstructorInitializer constructorInitializer) {
super(constructorInitializer);
}

@Override
Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.Initializer;

public class ASTNewMapLiteralExpression extends AbstractApexNode.Single<Node> {
public class ASTNewMapLiteralExpression extends AbstractApexNode.Single<Initializer> {

@Deprecated
@InternalApi
public ASTNewMapLiteralExpression(Node newMapLiteralExpression) {
super(newMapLiteralExpression);
ASTNewMapLiteralExpression(Initializer initializer) {
super(initializer);
}

@Override
Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ConstructorInitializer;

public class ASTNewObjectExpression extends AbstractApexNode.Single<Node> {
public class ASTNewObjectExpression extends AbstractApexNode.Single<ConstructorInitializer> {

@Deprecated
@InternalApi
public ASTNewObjectExpression(Node newObjectExpression) {
super(newObjectExpression);
ASTNewObjectExpression(ConstructorInitializer constructorInitializer) {
super(constructorInitializer);
}

@Override
Expand All @@ -21,8 +18,6 @@ public Object jjtAccept(ApexParserVisitor visitor, Object data) {
}

public String getType() {
// return String.valueOf(node.getTypeRef());
// TODO(b/239648780)
return null;
return node.getType().asCodeString();
}
}
Expand Up @@ -4,14 +4,11 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ConstructorInitializer;

public class ASTNewSetInitExpression extends AbstractApexNode.Single<Node> {
public class ASTNewSetInitExpression extends AbstractApexNode.Single<ConstructorInitializer> {

@Deprecated
@InternalApi
public ASTNewSetInitExpression(Node newSetInitExpression) {
ASTNewSetInitExpression(ConstructorInitializer newSetInitExpression) {
super(newSetInitExpression);
}

Expand Down
Expand Up @@ -4,15 +4,12 @@

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

import com.google.summit.ast.Node;
import net.sourceforge.pmd.annotation.InternalApi;
import com.google.summit.ast.initializer.ValuesInitializer;

public class ASTNewSetLiteralExpression extends AbstractApexNode.Single<Node> {
public class ASTNewSetLiteralExpression extends AbstractApexNode.Single<ValuesInitializer> {

@Deprecated
@InternalApi
public ASTNewSetLiteralExpression(Node newSetLiteralExpression) {
super(newSetLiteralExpression);
ASTNewSetLiteralExpression(ValuesInitializer valuesInitializer) {
super(valuesInitializer);
}

@Override
Expand Down
Expand Up @@ -30,12 +30,17 @@ import com.google.summit.ast.expression.CastExpression
import com.google.summit.ast.expression.Expression
import com.google.summit.ast.expression.FieldExpression
import com.google.summit.ast.expression.LiteralExpression
import com.google.summit.ast.expression.NewExpression
import com.google.summit.ast.expression.SuperExpression
import com.google.summit.ast.expression.TernaryExpression
import com.google.summit.ast.expression.ThisExpression
import com.google.summit.ast.expression.TypeRefExpression
import com.google.summit.ast.expression.UnaryExpression
import com.google.summit.ast.expression.VariableExpression
import com.google.summit.ast.initializer.ConstructorInitializer
import com.google.summit.ast.initializer.MapInitializer
import com.google.summit.ast.initializer.SizedArrayInitializer
import com.google.summit.ast.initializer.ValuesInitializer
import com.google.summit.ast.modifier.KeywordModifier
import com.google.summit.ast.modifier.KeywordModifier.Keyword
import com.google.summit.ast.modifier.Modifier
Expand Down Expand Up @@ -107,6 +112,11 @@ class ApexTreeBuilder(val sourceCode: String, val parserOptions: ApexParserOptio
is VariableExpression -> buildVariableExpression(node)
is CallExpression -> buildCallExpression(node)
is TernaryExpression -> buildTernaryExpression(node)
is NewExpression -> build(node.initializer, parent)
is ConstructorInitializer -> buildConstructorInitializer(node)
is ValuesInitializer -> buildValuesInitializer(node)
is MapInitializer -> buildMapInitializer(node)
is SizedArrayInitializer -> buildSizedArrayInitializer(node)
is Identifier,
is KeywordModifier,
is TypeRef -> null
Expand Down Expand Up @@ -363,6 +373,57 @@ class ApexTreeBuilder(val sourceCode: String, val parserOptions: ApexParserOptio
buildChildren(node, parent = this, exclude = { it == node.condition })
}

/**
* Builds an [ASTNewListInitExpression], [ASTNewMapInitExpression], [ASTNewSetInitExpression],
* [ASTNewKeyValueObjectExpression], or [ASTNewObjectExpression] wrapper for the
* [ConstructorInitializer].
*/
private fun buildConstructorInitializer(node: ConstructorInitializer) =
when (node.type.components.first().id.string.lowercase()) {
"list" -> ASTNewListInitExpression(node)
"map" -> ASTNewMapInitExpression(node)
"set" -> ASTNewSetInitExpression(node)
else -> {
// Object initializer
if (node.args.isNotEmpty() && node.args.first() is AssignExpression) {
// Named arguments
ASTNewKeyValueObjectExpression(node)
} else {
// Unnamed arguments
ASTNewObjectExpression(node)
}
}
}.apply { buildChildren(node, parent = this) }

/**
* Builds an [ASTNewListLiteralExpression], [ASTNewMapLiteralExpression], or
* [ASTNewSetLiteralExpression] wrapper for the [ValuesInitializer].
*/
private fun buildValuesInitializer(node: ValuesInitializer) =
when (node.type.components.first().id.string.lowercase()) {
"list" -> ASTNewListLiteralExpression(node)
"map" -> ASTNewMapLiteralExpression(node)
"set" -> ASTNewSetLiteralExpression(node)
else -> ASTNewListLiteralExpression(node) // Array
}.apply { buildChildren(node, parent = this) }

/** Builds an [ASTNewMapLiteralExpression] wrapper for the [MapInitializer]. */
private fun buildMapInitializer(node: MapInitializer) =
ASTNewMapLiteralExpression(node).apply {
/** Builds an [ASTMapEntryNode] for the [map entry][entry]. */
fun buildMapEntry(entry: Pair<Expression, Expression>) =
ASTMapEntryNode(entry.first, entry.second).apply {
buildAndSetParent(entry.first, parent = this)
buildAndSetParent(entry.second, parent = this)
}

node.pairs.forEach { pair -> buildMapEntry(pair).also { it.setParent(this) } }
}

/** Builds an [ASTNewListInitExpression] wrapper for the [SizedArrayInitializer]. */
private fun buildSizedArrayInitializer(node: SizedArrayInitializer) =
ASTNewListInitExpression(node).apply { buildChildren(node, parent = this) }

/** Builds an [ASTStandardCondition] wrapper for the [condition]. */
private fun buildCondition(condition: Node?) =
ASTStandardCondition(condition).apply { buildAndSetParent(condition, this) }
Expand Down

0 comments on commit b75c700

Please sign in to comment.