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; } }