/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.java.util;
import java.util.List;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.BooleanLiteral;
import org.eclipse.jdt.core.dom.CastExpression;
import org.eclipse.jdt.core.dom.CharacterLiteral;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.DoStatement;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.FieldAccess;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.ForStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.NullLiteral;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.PackageDeclaration;
import org.eclipse.jdt.core.dom.PostfixExpression;
import org.eclipse.jdt.core.dom.PrefixExpression;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.SimpleType;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.StringLiteral;
import org.eclipse.jdt.core.dom.SuperFieldAccess;
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
import org.eclipse.jdt.core.dom.ThisExpression;
import org.eclipse.jdt.core.dom.ThrowStatement;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.TypeLiteral;
import org.eclipse.jdt.core.dom.VariableDeclarationExpression;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jdt.core.dom.WhileStatement;
import org.whole.lang.builders.ModelBuilder;
import org.whole.lang.java.builders.IJavaBuilder;
import org.whole.lang.java.builders.JavaSpecificBuilderAdapter;
import org.whole.lang.java.parsers.JavaDataTypePersistenceParser;
import org.whole.lang.java.reflect.JavaEntityDescriptorEnum;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.EntityDescriptor;
/**
* @author Riccardo Solmi
*/
public class JDT2JavaBuilder extends ASTVisitor {
private IJavaBuilder builder;
public JDT2JavaBuilder(IJavaBuilder builder) {
this.builder = builder;
}
public static void transform(ASTNode model, IJavaBuilder builder) {
JDT2JavaBuilder transformer = new JDT2JavaBuilder(builder);
model.accept(transformer);
}
public static IEntity transform(ASTNode model) {
JavaSpecificBuilderAdapter builder = new JavaSpecificBuilderAdapter(new ModelBuilder());
transform(model, builder);
return builder.wGetResult();
}
protected boolean acceptChild(ASTNode child) {
if (child == null) {
builder.wDefault();
return false;
}
child.accept(this);
return true;
}
protected void acceptChildren(List children) {
for (int i=0; i<children.size(); i++)
((ASTNode) children.get(i)).accept(this);
}
protected void acceptChildren(List children, EntityDescriptor entityDesc) {
builder.wEntity_(entityDesc);
for (int i=0; i<children.size(); i++)
((ASTNode) children.get(i)).accept(this);
builder._wEntity(entityDesc);
}
public boolean visit(CompilationUnit node) {
builder.CompilationUnit_();
acceptChild(node.getPackage());
acceptChildren(node.imports(), JavaEntityDescriptorEnum.ImportDeclarations);
acceptChildren(node.types(), JavaEntityDescriptorEnum.TypeDeclarations);
builder._CompilationUnit();
return false;
}
public boolean visit(PackageDeclaration node) {
builder.PackageDeclaration_();
return true;
}
public void endVisit(PackageDeclaration node) {
builder._PackageDeclaration();
}
public boolean visit(SimpleName node) {
builder.SimpleName(node.getIdentifier());
return false;
}
public boolean visit(QualifiedName node) {
builder.QualifiedName(node.getFullyQualifiedName());
return false;
}
public boolean visit(SimpleType node) {
builder.SimpleType(node.getName().getFullyQualifiedName());
return false;
}
public boolean visit(PrimitiveType node) {
builder.PrimitiveType(node.getPrimitiveTypeCode().toString());
return false;
}
public boolean visit(NumberLiteral node) {
String token = node.getToken();
try {
builder.IntLiteral(Integer.parseInt(token));
} catch (NumberFormatException e) {
try {
builder.LongLiteral(Long.parseLong(token));
} catch (NumberFormatException g) {
try {
builder.FloatLiteral(Float.parseFloat(token));
} catch (NumberFormatException h) {
try {
builder.DoubleLiteral(Double.parseDouble(token));
} catch (NumberFormatException m) {
try {
builder.ByteLiteral(Byte.parseByte(token));
} catch (NumberFormatException n) {
builder.ShortLiteral(Short.parseShort(token));
}
}
}
}
}
return false;
}
public boolean visit(NullLiteral node) {
builder.NullLiteral();
return false;
}
public boolean visit(BooleanLiteral node) {
builder.BooleanLiteral(node.booleanValue());
return false;
}
public boolean visit(CharacterLiteral node) {
builder.CharLiteral(node.charValue());
return false;
}
public boolean visit(StringLiteral node) {
builder.StringLiteral(node.getLiteralValue());
return false;
}
public boolean visit(ImportDeclaration node) {
builder.ImportDeclaration_();
return true;
}
public void endVisit(ImportDeclaration node) {
builder._ImportDeclaration();
}
public boolean visit(TypeDeclaration node) {
if (node.isInterface()) {
builder.InterfaceDeclaration_();
acceptChild(node.getName());
acceptChildren(node.typeParameters(), JavaEntityDescriptorEnum.TypeParameters);
acceptChild(node.getSuperclassType());
builder.wDefault();
acceptChildren(node.superInterfaceTypes(), JavaEntityDescriptorEnum.Types);
acceptChildren(node.bodyDeclarations(), JavaEntityDescriptorEnum.BodyDeclarations);
builder._InterfaceDeclaration();
} else {
builder.ClassDeclaration_();
acceptChild(node.getName());
acceptChildren(node.typeParameters(), JavaEntityDescriptorEnum.TypeParameters);
acceptChild(node.getSuperclassType());
builder.wDefault();
acceptChildren(node.superInterfaceTypes(), JavaEntityDescriptorEnum.Types);
acceptChildren(node.bodyDeclarations(), JavaEntityDescriptorEnum.BodyDeclarations);
builder._ClassDeclaration();
}
return false;
}
public boolean visit(FieldDeclaration node) {
builder.FieldDeclaration_();
acceptChild(node.getType());
acceptChildren(node.fragments(), JavaEntityDescriptorEnum.VariableDeclarationFragments);
builder._FieldDeclaration();
return false;
}
public boolean visit(MethodDeclaration node) {
if (node.isConstructor()) {
builder.ConstructorDeclaration_();
builder.wDefault();
acceptChild(node.getReturnType2());
builder.wDefault();
acceptChild(node.getName());
acceptChildren(node.parameters(), JavaEntityDescriptorEnum.Parameters);
builder.wDefault();
acceptChild(node.getBody());
builder._ConstructorDeclaration();
} else {
builder.MethodDeclaration_();
builder.wDefault();
acceptChild(node.getReturnType2());
builder.wDefault();
acceptChild(node.getName());
acceptChildren(node.parameters(), JavaEntityDescriptorEnum.Parameters);
builder.wDefault();
acceptChild(node.getBody());
builder._MethodDeclaration();
}
return false;
}
public boolean visit(SingleVariableDeclaration node) {
builder.SingleVariableDeclaration_();
return true;
}
public void endVisit(SingleVariableDeclaration node) {
builder._SingleVariableDeclaration();
}
public boolean visit(Block node) {
acceptChildren(node.statements(), JavaEntityDescriptorEnum.Block);
return false;
}
public boolean visit(IfStatement node) {
builder.IfStatement_();
return true;
}
public void endVisit(IfStatement node) {
builder._IfStatement();
}
public boolean visit(WhileStatement node) {
builder.WhileStatement_();
return true;
}
public void endVisit(WhileStatement node) {
builder._WhileStatement();
}
public boolean visit(DoStatement node) {
builder.DoStatement_();
return true;
}
public void endVisit(DoStatement node) {
builder._DoStatement();
}
public boolean visit(ForStatement node) {
builder.ForStatement_();
acceptChildren(node.initializers(), JavaEntityDescriptorEnum.Expressions);
acceptChild(node.getExpression());
acceptChildren(node.updaters(), JavaEntityDescriptorEnum.Expressions);
acceptChild(node.getBody());
builder._ForStatement();
return false;
}
public boolean visit(ReturnStatement node) {
builder.ReturnStatement_();
return true;
}
public void endVisit(ReturnStatement node) {
builder._ReturnStatement();
}
public boolean visit(ThrowStatement node) {
builder.ThrowStatement_();
return true;
}
public void endVisit(ThrowStatement node) {
builder._ThrowStatement();
}
public boolean visit(ExpressionStatement node) {
builder.ExpressionStatement_();
return true;
}
public void endVisit(ExpressionStatement node) {
builder._ExpressionStatement();
}
public boolean visit(Assignment node) {
builder.Assignment_();
acceptChild(node.getLeftHandSide());
builder.AssignmentOperator(JavaDataTypePersistenceParser.parseAssignmentOperator(node.getOperator().toString()));
acceptChild(node.getRightHandSide());
builder._Assignment();
return false;
}
public boolean visit(InfixExpression node) {
builder.InfixExpression_();
acceptChild(node.getLeftOperand());
builder.InfixOperator(JavaDataTypePersistenceParser.parseInfixOperator(node.getOperator().toString()));
acceptChild(node.getRightOperand());
acceptChildren(node.extendedOperands(), JavaEntityDescriptorEnum.Expressions);
builder._InfixExpression();
return false;
}
public boolean visit(PostfixExpression node) {
builder.PostfixExpression_();
acceptChild(node.getOperand());
builder.PostfixOperator(JavaDataTypePersistenceParser.parsePostfixOperator(node.getOperator().toString()));
builder._PostfixExpression();
return false;
}
public boolean visit(PrefixExpression node) {
builder.PrefixExpression_();
acceptChild(node.getOperand());
builder.PrefixOperator(JavaDataTypePersistenceParser.parsePrefixOperator(node.getOperator().toString()));
builder._PrefixExpression();
return false;
}
public boolean visit(MethodInvocation node) {
builder.MethodInvocation_();
builder.wDefault();
acceptChild(node.getExpression());
acceptChild(node.getName());
acceptChildren(node.arguments(), JavaEntityDescriptorEnum.Arguments);
builder._MethodInvocation();
return false;
}
public boolean visit(SuperMethodInvocation node) {
builder.SuperMethodInvocation_();
acceptChild(node.getQualifier());
builder.wDefault();
acceptChild(node.getName());
acceptChildren(node.arguments(), JavaEntityDescriptorEnum.Arguments);
builder._SuperMethodInvocation();
return false;
}
public boolean visit(ClassInstanceCreation node) {
builder.ClassInstanceCreation_();
acceptChild(node.getExpression());
builder.wDefault();
builder.wDefault();
acceptChild(node.getType());
acceptChildren(node.arguments(), JavaEntityDescriptorEnum.Arguments);
acceptChild(node.getAnonymousClassDeclaration());
builder._ClassInstanceCreation();
return false;
}
public boolean visit(CastExpression node) {
builder.CastExpression_();
return true;
}
public void endVisit(CastExpression node) {
builder._CastExpression();
}
public boolean visit(TypeLiteral node) {
builder.TypeLiteral_();
return true;
}
public void endVisit(TypeLiteral node) {
builder._TypeLiteral();
}
public boolean visit(ThisExpression node) {
builder.ThisExpression_();
return true;
}
public void endVisit(ThisExpression node) {
builder._ThisExpression();
}
public boolean visit(SuperFieldAccess node) {
builder.SuperFieldAccess_();
return true;
}
public void endVisit(SuperFieldAccess node) {
builder._SuperFieldAccess();
}
public boolean visit(FieldAccess node) {
builder.FieldAccess_();
return true;
}
public void endVisit(FieldAccess node) {
builder._FieldAccess();
}
public boolean visit(VariableDeclarationExpression node) {
builder.VariableDeclarationExpression_();
acceptChild(node.getType());
acceptChildren(node.fragments(), JavaEntityDescriptorEnum.VariableDeclarationFragments);
builder._VariableDeclarationExpression();
return false;
}
public boolean visit(VariableDeclarationStatement node) {
builder.VariableDeclarationStatement_();
acceptChild(node.getType());
acceptChildren(node.fragments(), JavaEntityDescriptorEnum.VariableDeclarationFragments);
builder._VariableDeclarationStatement();
return false;
}
public boolean visit(VariableDeclarationFragment node) {
builder.VariableDeclarationFragment_();
return true;
}
public void endVisit(VariableDeclarationFragment node) {
builder._VariableDeclarationFragment();
}
}