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)); } }