/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.lang.psi.stubs.impl; import com.intellij.psi.PsiClassType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementFactory; import com.intellij.psi.PsiJavaCodeReferenceElement; import com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.stubs.StubBase; import com.intellij.psi.stubs.StubElement; import com.intellij.util.IncorrectOperationException; import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuReferenceList; import gw.plugin.ij.lang.psi.stubs.GosuReferenceListStub; import gw.plugin.ij.util.JavaPsiFacadeUtil; public class GosuReferenceListStubImpl extends StubBase<IGosuReferenceList> implements GosuReferenceListStub { private final String[] myNames; private PsiClassType[] myTypes; public GosuReferenceListStubImpl(final StubElement parentStub, IStubElementType elemtType, final String[] refNames) { super(parentStub, elemtType); myNames = refNames; } public String[] getBaseClasses() { return myNames; } @Override public PsiClassType[] getReferencedTypes() { if (myTypes != null) return myTypes; if (myNames.length == 0) { myTypes = PsiClassType.EMPTY_ARRAY; return myTypes; } PsiClassType[] types = new PsiClassType[myNames.length]; final PsiElementFactory factory = JavaPsiFacadeUtil.getElementFactory(getProject()); int nullCount = 0; final IGosuReferenceList psi = getPsi(); for (int i = 0; i < types.length; i++) { PsiElement context = psi; //TODO-dp there is magic here, maybe ? // if (getParentStub() instanceof PsiClassStub) { // context = ((PsiClassImpl)getParentStub().getPsi()).calcBasesResolveContext(PsiNameHelper.getShortClassName(myNames[i]), psi); // } try { final PsiJavaCodeReferenceElement ref = factory.createReferenceFromText(myNames[i], context); ((PsiJavaCodeReferenceElementImpl)ref).setKindWhenDummy(PsiJavaCodeReferenceElementImpl.CLASS_NAME_KIND); types[i] = factory.createType(ref); } catch (IncorrectOperationException e) { types[i] = null; nullCount++; } } if (nullCount > 0) { PsiClassType[] newTypes = new PsiClassType[types.length - nullCount]; int cnt = 0; for (PsiClassType type : types) { if (type != null) newTypes[cnt++] = type; } types = newTypes; } myTypes = types; return types; } }