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() {
}
}
}