diff options
| author | Michael Williamson <mike@zwobble.org> | 2015-10-17 17:16:41 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2015-10-17 17:16:41 +0100 |
| commit | 4655cf0dc523484a05f4b648fd87ff9fdd0605ca (patch) | |
| tree | 1e5fc88072ec3af44568e62bff3d649a935ec16d /src/main | |
| parent | a97acb1a85c588a38a4a8a8b761beddb71cb960a (diff) | |
Java: read local variable declaration and reference
Diffstat (limited to 'src/main')
3 files changed, 42 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java index 6294e38..61fd9a3 100644 --- a/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java +++ b/src/main/java/org/zwobble/couscous/ast/LocalVariableDeclarationNode.java @@ -18,6 +18,14 @@ public class LocalVariableDeclarationNode implements VariableNode, StatementNode VariableDeclaration declaration; ExpressionNode initialValue; + + public String getName() { + return declaration.getName(); + } + + public TypeName getType() { + return declaration.getType(); + } @Override public <T> T accept(StatementNodeMapper<T> visitor) { diff --git a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java index 6fc00f6..a53d099 100644 --- a/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java +++ b/src/main/java/org/zwobble/couscous/ast/VariableReferenceNode.java @@ -5,7 +5,7 @@ import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import lombok.Value; -@Value +@Value(staticConstructor="reference") public class VariableReferenceNode implements AssignableExpressionNode { public static VariableReferenceNode reference(VariableNode variable) { return new VariableReferenceNode(variable.getDeclaration()); diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 26936ee..b8a3b62 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.core.dom.StringLiteral; import org.eclipse.jdt.core.dom.ThisExpression; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; +import org.eclipse.jdt.core.dom.VariableDeclarationStatement; import org.zwobble.couscous.ast.AssignableExpressionNode; import org.zwobble.couscous.ast.AssignmentNode; import org.zwobble.couscous.ast.ClassNode; @@ -46,6 +47,11 @@ import org.zwobble.couscous.ast.TypeName; import com.google.common.collect.Lists; +import static java.util.Arrays.asList; +import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; +import static org.zwobble.couscous.ast.VariableDeclaration.var; +import static org.zwobble.couscous.ast.VariableReferenceNode.reference; + import lombok.SneakyThrows; import lombok.val; @@ -97,18 +103,23 @@ public class JavaReader { true, builder -> { for (Object statement : method.getBody().statements()) { - builder.statement(readStatement((Statement)statement)); + for (StatementNode intermediateStatement : readStatement((Statement)statement)) { + builder.statement(intermediateStatement); + } + } return builder; }); } - private static StatementNode readStatement(Statement statement) { + private static List<StatementNode> readStatement(Statement statement) { switch (statement.getNodeType()) { case ASTNode.RETURN_STATEMENT: - return readReturnStatement((ReturnStatement)statement); + return asList(readReturnStatement((ReturnStatement)statement)); case ASTNode.EXPRESSION_STATEMENT: - return readExpressionStatement((ExpressionStatement)statement); + return asList(readExpressionStatement((ExpressionStatement)statement)); + case ASTNode.VARIABLE_DECLARATION_STATEMENT: + return readVariableDeclarationStatement((VariableDeclarationStatement)statement); default: throw new RuntimeException("Unsupported statement: " + statement.getClass()); } @@ -122,6 +133,18 @@ public class JavaReader { return new ExpressionStatementNode(readExpression(statement.getExpression())); } + private static List<StatementNode> readVariableDeclarationStatement(VariableDeclarationStatement statement) { + @SuppressWarnings("unchecked") + val fragments = (List<VariableDeclarationFragment>)statement.fragments(); + val type = typeOf(statement.getType().resolveBinding()); + return Lists.transform(fragments, fragment -> + localVariableDeclaration( + fragment.resolveBinding().getKey(), + fragment.getName().getIdentifier(), + type, + readExpression(fragment.getInitializer()))); + } + private static ExpressionNode readExpression(Expression expression) { switch (expression.getNodeType()) { case ASTNode.BOOLEAN_LITERAL: @@ -171,13 +194,17 @@ public class JavaReader { } private static ExpressionNode readVariableBinding(IVariableBinding binding) { + val type = typeOf(binding.getType()); if (binding.getDeclaringClass() == null) { - throw new RuntimeException("Cannot read variables"); + return reference(var( + binding.getKey(), + binding.getName(), + type)); } else { return FieldAccessNode.fieldAccess( ThisReferenceNode.thisReference(typeOf(binding.getDeclaringClass())), binding.getName(), - typeOf(binding.getType())); + type); } } |
