package jetbrains.mps.ide.findusages.findalgorithm.finders.specific; /*Generated by MPS */ import jetbrains.mps.ide.findusages.findalgorithm.finders.BaseFinder; import jetbrains.mps.ide.findusages.findalgorithm.finders.Finder; import jetbrains.mps.ide.findusages.model.SearchResults; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.ide.findusages.model.SearchQuery; import org.jetbrains.mps.openapi.util.ProgressMonitor; import java.util.List; import org.jetbrains.mps.openapi.model.SModel; import java.util.ArrayList; import jetbrains.mps.smodel.SModelStereotype; import org.jetbrains.mps.openapi.model.SNodeUtil; import org.jetbrains.mps.openapi.language.SProperty; import jetbrains.mps.ide.findusages.model.SearchResult; import jetbrains.mps.ide.findusages.model.holders.IHolder; import org.jetbrains.annotations.NotNull; import org.jdom.Element; import jetbrains.mps.project.Project; import jetbrains.mps.ide.findusages.CantLoadSomethingException; import jetbrains.mps.ide.findusages.CantSaveSomethingException; public class AspectMethodsFinder extends BaseFinder implements Finder { public AspectMethodsFinder() { } @Override public SearchResults<SNode> find(SearchQuery query, ProgressMonitor monitor) { // I've got no idea what aspect methods it looks for. MPS Integration plugin in Idea takes PsiMethod and pass here package statement and method name final AspectMethodsFinder.AspectMethodQueryData data = (AspectMethodsFinder.AspectMethodQueryData) query.getObjectHolder().getObject(); final List<SModel> applicableModelDescriptors = new ArrayList<SModel>(); for (SModel model : query.getScope().getModels()) { if (data.myModelName.equals(model.getName().getLongName()) && !(SModelStereotype.isStubModel(model))) { applicableModelDescriptors.add(model); } } SearchResults<SNode> res = new SearchResults<SNode>(); res.getSearchedNodes().add(data.myModelName + '#' + data.myMethodName); for (SModel model : applicableModelDescriptors) { for (SNode node : SNodeUtil.getDescendants(model)) { for (SProperty prop : node.getProperties()) { String value = node.getProperty(prop); if (data.myMethodName.endsWith(value)) { res.getSearchResults().add(new SearchResult<SNode>(node, "Aspect methods")); break; } } } } return res; } public String getDescription() { return "Aspect Methods"; } public static class AspectMethodsHolder implements IHolder<AspectMethodsFinder.AspectMethodQueryData> { private static final String METHOD_NAME = "method_name"; private static final String MODEL_NAME = "model_name"; private AspectMethodsFinder.AspectMethodQueryData myData = new AspectMethodsFinder.AspectMethodQueryData(); public AspectMethodsHolder() { } public AspectMethodsHolder(String modelName, String methodName) { myData.myModelName = modelName; myData.myMethodName = methodName; } @Override public AspectMethodsFinder.AspectMethodQueryData getObject() { return myData; } @NotNull @Override public String getCaption() { return myData.myMethodName + " in " + myData.myModelName; } @Override public void read(Element element, Project project) throws CantLoadSomethingException { myData.myModelName = element.getAttributeValue(MODEL_NAME); myData.myMethodName = element.getAttributeValue(METHOD_NAME); } @Override public void write(Element element, Project project) throws CantSaveSomethingException { element.setAttribute(MODEL_NAME, myData.myModelName); element.setAttribute(METHOD_NAME, myData.myMethodName); } } public static class AspectMethodQueryData { public String myModelName = ""; public String myMethodName = ""; public AspectMethodQueryData() { } } }