package jetbrains.mps.lang.editor.behavior;
/*Generated by MPS */
import jetbrains.mps.scope.FilteringScope;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.scope.ModelsScope;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.internal.collections.runtime.Sequence;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.project.dependency.GlobalModuleDependenciesManager;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import org.jetbrains.mps.openapi.module.SRepository;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import org.jetbrains.mps.openapi.module.SModuleReference;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations;
import jetbrains.mps.lang.structure.behavior.IConceptAspect__BehaviorDescriptor;
public class EditorCellIdScope extends FilteringScope {
private SAbstractConcept myConceptDeclaration;
public EditorCellIdScope(SModel model, SNode conceptDeclaration) {
super(new ModelsScope(getModels(model), false, MetaAdapterFactory.getConcept(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0x3c0028bb846a5817L, "jetbrains.mps.lang.editor.structure.EditorCellId")));
myConceptDeclaration = SNodeOperations.asSConcept(conceptDeclaration);
}
private static Iterable<SModel> getModels(SModel model) {
Iterable<Language> depLanguages = Sequence.fromIterable(((Iterable<SModule>) new GlobalModuleDependenciesManager(model.getModule()).getModules(GlobalModuleDependenciesManager.Deptype.VISIBLE))).ofType(Language.class);
return Sequence.fromIterable(withExtendedLanguages(depLanguages, model.getRepository())).select(new ISelector<Language, SModel>() {
public SModel select(Language it) {
return SModuleOperations.getAspect(it, "editor");
}
}).where(new IWhereFilter<SModel>() {
public boolean accept(SModel it) {
return it != null;
}
});
}
private static Iterable<Language> withExtendedLanguages(Iterable<Language> languages, SRepository repository) {
Set<Language> result = SetSequence.fromSet(new HashSet<Language>());
for (Language language : Sequence.fromIterable(languages)) {
SetSequence.fromSet(result).addElement(language);
for (SModuleReference extendedLangRef : SetSequence.fromSet(language.getExtendedLanguageRefs())) {
SModule extendedLang = extendedLangRef.resolve(repository);
if (extendedLang instanceof Language) {
SetSequence.fromSet(result).addElement(((Language) extendedLang));
}
}
}
return result;
}
@Override
public String getReferenceText(SNode contextNode, SNode node) {
if (isExcluded(node)) {
return null;
}
return SPropertyOperations.getString(SNodeOperations.as(node, MetaAdapterFactory.getConcept(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0x3c0028bb846a5817L, "jetbrains.mps.lang.editor.structure.EditorCellId")), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"));
}
@Override
public boolean isExcluded(SNode node) {
SNode editorCellId = SNodeOperations.as(node, MetaAdapterFactory.getConcept(0x18bc659203a64e29L, 0xa83a7ff23bde13baL, 0x3c0028bb846a5817L, "jetbrains.mps.lang.editor.structure.EditorCellId"));
if (editorCellId == null) {
return true;
}
SNode conceptAspect = SNodeOperations.getNodeAncestor(editorCellId, MetaAdapterFactory.getInterfaceConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x24614259e94f0c84L, "jetbrains.mps.lang.structure.structure.IConceptAspect"), false, false);
return conceptAspect == null || !(SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(myConceptDeclaration), SNodeOperations.asSConcept(SNodeOperations.asSConcept(IConceptAspect__BehaviorDescriptor.getBaseConcept_id2hxg_BDjKM8.invoke(conceptAspect)))));
}
}