Skip to content

Commit

Permalink
Merge branch 'part-3' into experimental-apex-parser
Browse files Browse the repository at this point in the history
Change-Id: Ibaef3a59307633647129b4971a382ee85a5c0d53
  • Loading branch information
aaronhurst-google committed Oct 20, 2022
2 parents 815b796 + 96d10a9 commit 828ccd1
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 71 deletions.
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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();
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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();
}
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 828ccd1

Please sign in to comment.