/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang.parser;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.tree.IElementType;
import gw.lang.parser.IExpression;
import gw.lang.parser.expressions.ILocalVarDeclaration;
import gw.lang.parser.expressions.IVarStatement;
import gw.plugin.ij.lang.GosuElementType;
import gw.plugin.ij.lang.psi.impl.GosuFragmentFileImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuAnnotationExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuBeanMethodCallExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuBlockExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuDirectiveExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuExpressionListImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuFeatureLiteralExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuFieldAccessExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuIdentifierExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuMemberExpansionExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuMethodCallExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuNameInDeclarationImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuNewExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuParenthesizedExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuPropertyMemberAccessExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuStringLiteralImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeAsExpressionImpl;
import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeLiteralImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuAssignmentStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuDoWhileStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuFieldImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuFieldPropertyImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuForEachStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuIfStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuMemberAssignmentStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuModifierListImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuNotAStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuPackageDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuStatementListImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuSyntheticModifierListImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuUsesStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuUsesStatementListImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuUsingStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuVariableImpl;
import gw.plugin.ij.lang.psi.impl.statements.GosuWhileStatementImpl;
import gw.plugin.ij.lang.psi.impl.statements.params.GosuParameterImpl;
import gw.plugin.ij.lang.psi.impl.statements.params.GosuParameterListImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuAnnotationDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuAnonymousClassDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuClassDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuEnhancementDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuEnumConstantImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuEnumDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuExtendsClauseImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuImplementsClauseImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuInterfaceDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.GosuSyntheticClassDefinitionImpl;
import gw.plugin.ij.lang.psi.impl.statements.typedef.members.GosuMethodImpl;
import gw.plugin.ij.lang.psi.impl.types.GosuTypeParameterListImpl;
import gw.plugin.ij.lang.psi.impl.types.GosuTypeVariableExtendsListImpl;
import gw.plugin.ij.lang.psi.impl.types.GosuTypeVariableImpl;
import gw.plugin.ij.lang.psi.impl.types.GosuTypeVariableListImpl;
import org.jetbrains.annotations.NotNull;
import static gw.plugin.ij.lang.psi.impl.GosuFragmentFileImpl.FILE_NAME;
import static gw.plugin.ij.lang.psi.impl.GosuFragmentFileImpl.PSI_CONTEXT;
public class GosuPsiCreator extends GosuElementTypes {
/**
* Creates Gosu PSI element by given AST node
*
* @return Respective PSI element
*/
@NotNull
public static PsiElement createElement(final ASTNode rawNode) {
IElementType elem = rawNode.getElementType();
if (elem instanceof GosuFragmentFileImpl.FragmentElementType) {
PsiElement psi = PSI_CONTEXT.get(rawNode);
String name = FILE_NAME.get(rawNode);
GosuFragmentFileImpl psiFile = new GosuFragmentFileImpl( psi.getProject(), rawNode.getText(), name, psi );
return psiFile;
}
GosuCompositeElement node = null;
if (rawNode instanceof GosuCompositeElement) {
node = (GosuCompositeElement) rawNode;
}
if (elem == GosuElementTypes.ELEM_TYPE____UnhandledParsedElement) {
return new GosuRawPsiElement(node);
}
if (elem.equals(ELEM_TYPE_BlockExpression)) {
return new GosuBlockExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_NamespaceStatement)) {
return new GosuPackageDefinitionImpl(node);
}
if (elem.equals(ELEM_TYPE_UsesStatement)) {
return new GosuUsesStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_UsesStatementList)) {
return new GosuUsesStatementListImpl(node);
}
if (elem.equals(ENUM_CONSTANT)) {
return new GosuEnumConstantImpl(node);
}
if (elem.equals(FIELD)) {
return new GosuFieldImpl(node);
}
if (elem.equals(FIELD_PROPERTY)) {
return new GosuFieldPropertyImpl(node);
}
if (elem.equals(CLASS_DEFINITION)) {
if (node instanceof GosuSyntheticCompositeElement) {
return new GosuSyntheticClassDefinitionImpl((GosuSyntheticCompositeElement) node);
} else {
return new GosuClassDefinitionImpl(node);
}
}
if (elem.equals(ANONYMOUS_CLASS_DEFINITION)) {
return new GosuAnonymousClassDefinitionImpl(node);
}
if (elem.equals(INTERFACE_DEFINITION)) {
return new GosuInterfaceDefinitionImpl(node);
}
if (elem.equals(ENUM_DEFINITION)) {
return new GosuEnumDefinitionImpl(node);
}
if (elem.equals(ENHANCEMENT_DEFINITION)) {
return new GosuEnhancementDefinitionImpl(node);
}
if (elem.equals(ANNOTATION_DEFINITION)) {
return new GosuAnnotationDefinitionImpl(node);
}
if (elem.equals(IMPLEMENTS_CLAUSE)) {
return new GosuImplementsClauseImpl(node);
}
if (elem.equals(EXTENDS_CLAUSE)) {
return new GosuExtendsClauseImpl(node);
}
if (elem.equals(METHOD_DEFINITION)) {
return new GosuMethodImpl(node);
}
if (elem.equals(ELEM_TYPE_NameInDeclaration)) {
return new GosuNameInDeclarationImpl(node);
}
if (elem.equals(ELEM_TYPE_ParameterListClause)) {
return new GosuParameterListImpl(node);
}
if (elem.equals(ELEM_TYPE_ModifierListClause)) {
if( node instanceof GosuSyntheticCompositeElement) {
return new GosuSyntheticModifierListImpl( (GosuSyntheticCompositeElement)node );
}
return new GosuModifierListImpl(node);
}
if (elem.equals(ELEM_TYPE_ArgumentListClause)) {
return new GosuExpressionListImpl(node);
}
if (elem.equals(ELEM_TYPE_ParameterDeclaration)) {
return new GosuParameterImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeVariableDefinitionExpression)) {
return new GosuTypeVariableImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeVariableListClause)) {
return new GosuTypeVariableListImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeVariableExtendsListClause)) {
return new GosuTypeVariableExtendsListImpl(node);
}
if (elem.equals(ELEM_TYPE_ParenthesizedExpression)) {
return new GosuParenthesizedExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeAsExpression)) {
return new GosuTypeAsExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeLiteral)) {
return new GosuTypeLiteralImpl(node);
}
if (elem.equals(ELEM_TYPE_StringLiteral)) {
return new GosuStringLiteralImpl(node);
}
if (elem.equals(ELEM_TYPE_TypeParameterListClause)) {
return new GosuTypeParameterListImpl(node);
}
if (elem.equals(ELEM_TYPE_VarStatement)) {
return new GosuVariableImpl<IVarStatement>(node);
}
if (elem.equals(ELEM_TYPE_LocalVarDeclaration)) {
return new GosuVariableImpl<ILocalVarDeclaration>(node);
}
if (elem.equals(ELEM_TYPE_IdentifierExpression)) {
return new GosuIdentifierExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_BeanMethodCallExpression)) {
return new GosuBeanMethodCallExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_BeanMethodCallStatement)) {
return new GosuBeanMethodCallStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_FieldAccess)) {
return new GosuFieldAccessExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_MemberAccess)) {
return new GosuPropertyMemberAccessExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_MethodCallStatement)) {
return new GosuMethodCallStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_MethodCallExpression)) {
return new GosuMethodCallExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_MemberExpansionAccess)) {
return new GosuMemberExpansionExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_AnnotationExpression)) {
return new GosuAnnotationExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_NewExpression)) {
return new GosuNewExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_NewStatement)) {
return new GosuNewStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_DirectiveExpression)) {
return new GosuDirectiveExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_ClassDeclaration)) {
return new GosuNameInDeclarationImpl(node);
}
if (elem.equals(ELEM_TYPE_StatementList)) {
return new GosuStatementListImpl(node);
}
if (elem.equals(ELEM_TYPE_AssignmentStatement)) {
return new GosuAssignmentStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_MemberAssignmentStatement)) {
return new GosuMemberAssignmentStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_ForEachStatement)) {
return new GosuForEachStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_IfStatement)) {
return new GosuIfStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_WhileStatement)) {
return new GosuWhileStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_DoWhileStatement)) {
return new GosuDoWhileStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_UsingStatement)) {
return new GosuUsingStatementImpl(node);
}
if (elem.equals(ELEM_TYPE_FeatureLiteral)) {
return new GosuFeatureLiteralExpressionImpl(node);
}
if (elem.equals(ELEM_TYPE_BlockInvocation)) {
return new GosuBlockInvocationImpl(node);
}
if (elem.equals(ELEM_TYPE_NotAStatement)) {
return new GosuNotAStatementImpl(node);
}
if (elem instanceof GosuElementType &&
IExpression.class.isAssignableFrom(((GosuElementType) elem).getParsedElementType())) {
return new GosuRawExpression(node);
} else {
return new GosuRawPsiElement(node);
}
}
}