package jetbrains.mps.console.base.util;
/*Generated by MPS */
import jetbrains.mps.scope.Scope;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
public abstract class SubconceptsScope extends Scope {
protected SAbstractConcept concept;
protected SModel model;
public SubconceptsScope(SAbstractConcept concept, SModel model) {
this.concept = concept;
this.model = model;
}
public abstract String getName(SNode child);
public Iterable<SNode> getAvailableElements(@Nullable final String prefix) {
Iterable<SNode> subConcepts = ListSequence.fromList(SConceptOperations.getAllSubConcepts(concept, model)).select(new ISelector<SAbstractConcept, SNode>() {
public SNode select(SAbstractConcept it) {
return SNodeOperations.asNode(it);
}
});
if (prefix == null || prefix.isEmpty()) {
return subConcepts;
}
return Sequence.fromIterable(subConcepts).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
String name = getName(it);
return name != null && name.startsWith(prefix);
}
});
}
@Nullable
public SNode resolve(SNode contextNode, @NotNull String refText) {
SNode result = null;
for (SNode n : Sequence.fromIterable(getAvailableElements(null))) {
String name = getName(n);
if (refText.equals(name)) {
if (result == null) {
result = n;
} else {
return null;
}
}
}
return result;
}
@Nullable
public String getReferenceText(SNode contextNode, @NotNull SNode node) {
if (!(SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"))) || !(SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(SNodeOperations.asSConcept(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration")))), SNodeOperations.asSConcept(concept)))) {
return null;
}
String result = getName(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration")));
for (SNode n : Sequence.fromIterable(getAvailableElements(null))) {
if (n == node) {
continue;
}
String name = getName(n);
if (name.equals(result)) {
// ambiguity
return null;
}
}
return result;
}
}