/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.lang.psi.impl.statements.typedef; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClassType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiExpressionList; import com.intellij.psi.PsiIdentifier; import com.intellij.psi.PsiJavaCodeReferenceElement; import com.intellij.psi.PsiNewExpression; import gw.lang.parser.statements.IClassStatement; import gw.lang.reflect.IType; import gw.lang.reflect.gs.IGosuClass; import gw.plugin.ij.lang.parser.GosuCompositeElement; import gw.plugin.ij.lang.parser.GosuElementTypes; import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuAnonymousClassDefinition; import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuTypeDefinition; import gw.plugin.ij.lang.psi.impl.GosuBaseElementImpl; import gw.plugin.ij.lang.psi.impl.GosuElementVisitor; import gw.plugin.ij.lang.psi.stubs.GosuTypeDefinitionStub; import gw.plugin.ij.util.JavaPsiFacadeUtil; import org.jetbrains.annotations.NotNull; public class GosuAnonymousClassDefinitionImpl extends GosuTypeDefinitionImpl implements IGosuAnonymousClassDefinition { public GosuAnonymousClassDefinitionImpl(GosuCompositeElement node) { super(node); } public GosuAnonymousClassDefinitionImpl(final GosuTypeDefinitionStub stub) { super(stub, GosuElementTypes.ANONYMOUS_CLASS_DEFINITION); } @Override public boolean isAnonymous() { return true; } @Override public void accept(@NotNull PsiElementVisitor visitor) { if( visitor instanceof GosuElementVisitor) { ((GosuElementVisitor)visitor).visitAnonymousClassDefinition(this); } else { visitor.visitElement( this ); } } @NotNull public String[] getSuperClassNames() { // final GosuTypeDefinitionStub stub = getStub(); // if( stub != null ) // { // return stub.getSuperClassNames(); // } GosuBaseElementImpl parent = (GosuBaseElementImpl) getParent(); PsiIdentifier nameIdentifier = parent.getNameIdentifierImpl(); return new String[] {nameIdentifier.getText()}; } private IType getBaseType() { IClassStatement parsedElement = getParsedElement(); IGosuClass gosuClass = parsedElement.getGosuClass(); IType supertype = gosuClass.getSupertype(); if (supertype == null) { supertype = gosuClass.getInterfaces()[0]; } return supertype; } @Override public PsiExpressionList getArgumentList() { throw new UnsupportedOperationException("Not yet implemented, do it yourself!"); } @NotNull @Override public PsiJavaCodeReferenceElement getBaseClassReference() { final PsiElementFactory factory = JavaPsiFacadeUtil.getElementFactory(getProject()); return factory.createReferenceElementByType(getBaseClassType()); } @NotNull @Override public PsiClassType getBaseClassType() { IType baseType = getBaseType(); return (PsiClassType) createType(baseType); } @Override public boolean isInQualifiedNew() { final GosuTypeDefinitionStub stub = getStub(); if (stub != null) { return stub.isAnonymousInQualifiedNew(); } final PsiElement parent = getParent(); return parent instanceof PsiNewExpression && ((PsiNewExpression)parent).getQualifier() != null; } @Override public boolean isUnder(IGosuTypeDefinition psiClass) { PsiClass d = this; while (d != null) { if (d == psiClass) { return true; } d = d.getContainingClass(); } return false; } // public String getName() { // final GosuTypeDefinitionStub stub = getStub(); // if (stub != null) { // return stub.getName(); // } // IClassStatement classStatement = getParsedElement(); // return classStatement.getGosuClass().getRelativeName(); // } }