package jetbrains.mps.lang.structure.findUsages;
/*Generated by MPS */
import jetbrains.mps.ide.findusages.findalgorithm.finders.GeneratedFinder;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.module.SearchScope;
import java.util.List;
import org.jetbrains.mps.openapi.util.ProgressMonitor;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.ide.findusages.view.FindUtils;
import jetbrains.mps.internal.collections.runtime.Sequence;
import org.jetbrains.mps.openapi.model.SReference;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.model.SNodeReference;
public class LinkInstances_Finder extends GeneratedFinder {
public LinkInstances_Finder() {
}
@Override
public String getDescription() {
return "Link Instances";
}
@Override
public String getLongDescription() {
return "";
}
@Override
public SAbstractConcept getSConcept() {
return MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, "jetbrains.mps.lang.structure.structure.LinkDeclaration");
}
@Override
protected void doFind(SNode node, SearchScope scope, List<SNode> _results, ProgressMonitor monitor) {
try {
// collect roles
Set<String> roles = SetSequence.fromSet(new HashSet<String>());
SNode curNode = node;
do {
SetSequence.fromSet(roles).addElement(SPropertyOperations.getString(curNode, MetaAdapterFactory.getProperty(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, 0xf98052f333L, "role")));
curNode = SLinkOperations.getTarget(curNode, MetaAdapterFactory.getReferenceLink(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, 0xf98051c244L, "specializedLink"));
} while (curNode != null);
// find concept
SNode conceptDeclaration = SNodeOperations.getNodeAncestor(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), false, false);
if ((conceptDeclaration == null)) {
return;
}
boolean isChild = SPropertyOperations.hasValue(node, MetaAdapterFactory.getProperty(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979bd086aL, 0xf980556927L, "metaClass"), "aggregation", "reference");
// find instances and link examples
for (SNode instance : ListSequence.fromList(FindUtils.executeFinder("jetbrains.mps.lang.structure.findUsages.ConceptInstances_Finder", conceptDeclaration, scope, monitor))) {
for (String role : roles) {
if (isChild) {
for (SNode child : Sequence.fromIterable(instance.getChildren(role))) {
ListSequence.fromList(_results).addElement(child);
}
} else {
SReference reference = instance.getReference(role);
if (reference != null) {
ListSequence.fromList(_results).addElement(reference.getSourceNode());
}
}
}
}
} finally {
monitor.done();
}
}
@Override
public String getNodeCategory(SNode node) {
return "Link Instances";
}
@Nullable
@Override
public SNodeReference getDeclarationNode() {
return buildNodePointer(FindUsagesDescriptor.DECLARING_MODEL, "1201275992898");
}
}