package jetbrains.mps.scope;
/*Generated by MPS */
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import java.util.Set;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SNodeUtil;
import jetbrains.mps.util.SNodeOperations;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.smodel.SModelOperations;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.ArrayList;
import jetbrains.mps.internal.collections.runtime.ListSequence;
public class ModelsScope extends Scope {
private final boolean myRootsOnly;
private final SAbstractConcept myTargetConcept;
private final Set<SModel> myModels;
public ModelsScope(Iterable<SModel> models, boolean rootsOnly, SAbstractConcept targetConcept) {
myModels = SetSequence.fromSetWithValues(new HashSet<SModel>(), models);
myRootsOnly = rootsOnly;
myTargetConcept = targetConcept;
}
@Override
public boolean contains(SNode node) {
if (myTargetConcept == null) {
return false;
}
return SNodeUtil.isInstanceOf(node, myTargetConcept) && (!(myRootsOnly) || SNodeOperations.isRoot(node)) && SetSequence.fromSet(myModels).contains(node.getModel());
}
@Override
public SNode resolve(SNode contextNode, @NotNull String refText) {
SNode result = null;
for (SModel model : myModels) {
if (model == null) {
continue;
}
Iterable<SNode> nodes;
SAbstractConcept conceptToCheck;
if (myRootsOnly) {
nodes = model.getRootNodes();
conceptToCheck = myTargetConcept;
} else if (myTargetConcept != null) {
nodes = SModelOperations.getNodes(model, myTargetConcept);
conceptToCheck = null;
} else {
nodes = SNodeUtil.getDescendants(model);
conceptToCheck = null;
}
for (SNode node : nodes) {
if (conceptToCheck != null && !(node.isInstanceOfConcept(conceptToCheck))) {
continue;
}
String nodeRefText = getReferenceText(null, node);
if (!(refText.equals(nodeRefText))) {
continue;
}
if (result == null) {
result = node;
} else {
// ambiguity
return null;
}
}
}
return result;
}
@Override
public Iterable<SNode> getAvailableElements(@Nullable String prefix) {
List<SNode> result = new ArrayList<SNode>();
for (SModel model : myModels) {
if (model == null) {
continue;
}
Iterable<SNode> nodes;
SAbstractConcept conceptToCheck;
if (myRootsOnly) {
nodes = model.getRootNodes();
conceptToCheck = myTargetConcept;
} else if (myTargetConcept != null) {
nodes = SModelOperations.getNodes(model, myTargetConcept);
conceptToCheck = null;
} else {
nodes = SNodeUtil.getDescendants(model);
conceptToCheck = null;
}
for (SNode node : nodes) {
if (conceptToCheck != null && !(node.isInstanceOfConcept(conceptToCheck))) {
continue;
}
if ((prefix != null && prefix.length() > 0)) {
String refText = getReferenceText(null, node);
if (refText == null || !(refText.startsWith(prefix))) {
continue;
}
}
ListSequence.fromList(result).addElement(node);
}
}
return result;
}
@Override
public String getReferenceText(SNode contextNode, SNode node) {
String resolveInfo = SNodeOperations.getResolveInfo(node);
if ((resolveInfo != null && resolveInfo.length() > 0)) {
return resolveInfo;
}
return node.getPresentation();
}
public Iterable<SModel> getModels() {
return myModels;
}
}