package jetbrains.mps.idea.java.fastFind;
/*Generated by MPS */
import jetbrains.mps.idea.core.psi.MPS2PsiMapper;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.persistence.java.library.JavaClassStubModelDescriptor;
import com.intellij.psi.PsiElement;
import org.jetbrains.mps.openapi.model.SNode;
import com.intellij.openapi.project.Project;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.search.GlobalSearchScope;
public class ClassStubPsiMapper implements MPS2PsiMapper {
public boolean hasCorrespondingPsi(SModel model) {
return model instanceof JavaClassStubModelDescriptor;
}
public PsiElement getPsiElement(SNode nodeParam, Project project) {
SRepository repository = ProjectHelper.getProjectRepository(project);
assert repository.getModelAccess().canRead();
SNode node = nodeParam;
if (!(hasCorrespondingPsi(SNodeOperations.getModel(node)))) {
return null;
}
// just in case: anonynous classes shouldn't appear here, as they shouldn't in stubs
if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier"))) {
return findPsiClass(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier")), project);
} else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca68L, "jetbrains.mps.baseLanguage.structure.FieldDeclaration"))) {
PsiClass psiClass = findPsiClass(SNodeOperations.getNodeAncestor(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca68L, "jetbrains.mps.baseLanguage.structure.FieldDeclaration")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101d9d3ca30L, "jetbrains.mps.baseLanguage.structure.Classifier"), false, false), project);
if (psiClass == null) {
return null;
}
PsiField[] fields = psiClass.getFields();
String expectedName = SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca68L, "jetbrains.mps.baseLanguage.structure.FieldDeclaration")), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"));
for (PsiField field : fields) {
if (expectedName.equals(field.getName())) {
return field;
}
}
} else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b1fcL, "jetbrains.mps.baseLanguage.structure.BaseMethodDeclaration"))) {
// TODO to properly handle methods we have to build node ids in the same way as class stubs do
// (based on asm class file parser output)
}
return null;
}
private PsiClass findPsiClass(SNode claz, Project project) {
String classFqName = ((String) BHReflection.invoke(claz, SMethodTrimmedId.create("getFqName", null, "hEwIO9y")));
return JavaPsiFacade.getInstance(project).findClass(classFqName, GlobalSearchScope.allScope(project));
}
}