package jetbrains.mps.idea.java.psi.impl.blTypes;
/*Generated by MPS */
import jetbrains.mps.idea.core.psi.impl.MPSPsiNode;
import jetbrains.mps.idea.java.psi.impl.ComputesPsiType;
import com.intellij.psi.PsiClassType;
import org.jetbrains.mps.openapi.model.SNodeId;
import com.intellij.psi.PsiManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.PsiType;
import jetbrains.mps.idea.java.psi.impl.NonJavaMPSType;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiSubstitutor;
import com.intellij.psi.impl.source.PsiImmediateClassType;
/**
* User: danilla
*/
public abstract class MPSPsiCollectionType extends MPSPsiNode implements ComputesPsiType<PsiClassType> {
public MPSPsiCollectionType(SNodeId id, String concept, String containingRole, PsiManager manager) {
super(id, concept, containingRole, manager);
}
@Override
public PsiClassType getPsiType() {
Project project = getProject();
PsiClass claz = JavaPsiFacade.getInstance(project).findClass(getClassName(), GlobalSearchScope.allScope(project));
MPSPsiNode[] childTypeNodes = getChildTypeNodes();
PsiType[] psiChildTypes = new PsiType[childTypeNodes.length];
for (int i = 0; i < childTypeNodes.length; i++) {
MPSPsiNode typeNode = childTypeNodes[i];
PsiType psiType;
if (typeNode instanceof ComputesPsiType) {
psiType = ((ComputesPsiType) typeNode).getPsiType();
} else {
psiType = new NonJavaMPSType(PsiAnnotation.EMPTY_ARRAY);
}
psiChildTypes[i] = psiType;
}
PsiSubstitutor subst = PsiSubstitutor.EMPTY.putAll(claz, psiChildTypes);
return new PsiImmediateClassType(claz, subst);
}
protected abstract String getClassName();
protected abstract MPSPsiNode[] getChildTypeNodes();
}