package jetbrains.mps.lang.smodel.generator.smodelAdapter;
/*Generated by MPS */
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import java.util.List;
import java.util.Collections;
import jetbrains.mps.kernel.model.SModelUtil;
import java.util.ArrayList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.smodel.SLanguageHierarchy;
import jetbrains.mps.smodel.SModelOperations;
import org.jetbrains.mps.openapi.language.SConcept;
import java.util.Set;
import org.jetbrains.mps.openapi.language.SLanguage;
import jetbrains.mps.smodel.ConceptDescendantsCache;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import org.jetbrains.mps.openapi.model.SNode;
public final class SConceptOperations {
private SConceptOperations() {
}
public static boolean isExactly(SAbstractConcept concept1, SAbstractConcept concept2) {
if (concept1 == null) {
return false;
}
return concept1.equals(concept2);
}
public static boolean isSuperConceptOf(SAbstractConcept superConcept, SAbstractConcept subConcept) {
if (superConcept == null || subConcept == null) {
return false;
}
return subConcept.isSubConceptOf(superConcept);
}
public static boolean isSubConceptOf(SAbstractConcept subConcept, SAbstractConcept superConcept) {
if (subConcept == null || superConcept == null) {
return false;
}
return subConcept.isSubConceptOf(superConcept);
}
public static List<SAbstractConcept> getDirectSuperConcepts(SAbstractConcept concept, boolean inclusion) {
if (concept == null) {
return Collections.<SAbstractConcept>emptyList();
}
List<SAbstractConcept> result = SModelUtil.getDirectSuperConcepts(concept);
if (inclusion) {
result = new ArrayList<SAbstractConcept>(result);
result.add(0, concept);
}
return Collections.unmodifiableList(result);
}
public static List<SAbstractConcept> getAllSuperConcepts(SAbstractConcept concept, boolean inclusion) {
if (concept == null) {
return Collections.<SAbstractConcept>emptyList();
}
List<SAbstractConcept> result = SModelUtil.getConceptAndAllSuperConcepts(concept);
if (!(inclusion)) {
result = new ArrayList<SAbstractConcept>(result);
result.remove(concept);
}
return Collections.unmodifiableList(result);
}
/**
* Find all concepts that extend supplied one, and are declared in a language either imported directly in to the model,
* or the language extended by those imported.
* Intention is to get possible concepts which instances, added to model, would not require any dependency change.
*/
@NotNull
public static List<SAbstractConcept> getAllSubConcepts(SAbstractConcept concept, SModel model) {
return getAllSubConcepts(concept, new SLanguageHierarchy(SModelOperations.getAllLanguageImports(model)).getExtended());
}
/**
* Alternative {@link jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations#getAllSubConcepts(SAbstractConcept, SModel) }, tailored for non-interface concepts
*/
@NotNull
public static List<SConcept> getAllSubConcepts2(SConcept concept, SModel model) {
List<SAbstractConcept> allSubConcepts = getAllSubConcepts(concept, new SLanguageHierarchy(SModelOperations.getAllLanguageImports(model)).getExtended());
ArrayList<SConcept> rv = new ArrayList<SConcept>(allSubConcepts.size());
for (SAbstractConcept ac : allSubConcepts) {
if (ac instanceof SConcept) {
rv.add((SConcept) ac);
} else {
assert false : "SConcept hierarchy could not contain interfaces:" + ac.getQualifiedName();
}
}
return rv;
}
public static List<SAbstractConcept> getAllSubConcepts(SAbstractConcept concept, Set<SLanguage> availableLanguages) {
if (concept == null) {
return new ArrayList<SAbstractConcept>();
}
Set<SAbstractConcept> descendants = ConceptDescendantsCache.getInstance().getDescendants(concept);
List<SAbstractConcept> result = new ArrayList<SAbstractConcept>();
for (SAbstractConcept descendant : descendants) {
SLanguage lang = descendant.getLanguage();
if (SetSequence.fromSet(availableLanguages).contains(lang)) {
result.add(descendant);
}
}
return result;
}
public static SNode createNewNode(SConcept concept) {
return jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.createNewNode(null, null, concept);
}
public static String conceptAlias(SAbstractConcept concept) {
if (concept == null) {
return null;
}
return concept.getConceptAlias();
}
public static String shortDescription(SAbstractConcept concept) {
if (concept == null) {
return null;
}
return concept.getShortDescription();
}
}