package jetbrains.mps.baseLanguage.scopes; /*Generated by MPS */ import java.util.Stack; import org.jetbrains.mps.openapi.model.SNode; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import jetbrains.mps.baseLanguage.behavior.IClassifierType__BehaviorDescriptor; import jetbrains.mps.internal.collections.runtime.Sequence; import java.util.Iterator; import jetbrains.mps.baseLanguage.behavior.IClassifier__BehaviorDescriptor; import jetbrains.mps.internal.collections.runtime.MapSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.util.JavaNameUtil; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import java.util.Collections; public class MembersPopulatingContext { private Stack<SNode> classifiers = new Stack<SNode>(); private boolean isPackageProtectedAvailable = true; private final List<SNode> members = new ArrayList<SNode>(); private final Map<Signature, SNode> addedSignatures = new HashMap<Signature, SNode>(); private Map<SNode, SNode> typeByTypeVariable = new HashMap<SNode, SNode>(); private Map<Object, Object> userObjects = new HashMap<Object, Object>(); public MembersPopulatingContext() { // java collections for speed } public void hideMembers(Signature signature) { if (!(addedSignatures.containsKey(signature))) { addedSignatures.put(signature, getCurrentClassifier()); } } public void addMember(SNode member, Signature signature) { SNode contextClassifier = addedSignatures.get(signature); if (contextClassifier == null || contextClassifier == getCurrentClassifier()) { // exposing all members using following condition: // 1. member was not "masked" by a member from sub-classifier // 2. showing all members with same signatures if they are defined in the same classifier members.add(member); } } public Iterable<SNode> getMembers() { List<SNode> members = new ArrayList<SNode>(); members.addAll(this.members); return members; } public void putUserObject(Object key, Object value) { userObjects.put(key, value); } public Object getUserObject(Object key) { return userObjects.get(key); } public boolean containsUserObject(Object key) { return userObjects.containsKey(key); } public boolean enterClassifierInternal(SNode classifierType) { SNode classifier = IClassifierType__BehaviorDescriptor.getClassifier_id6r77ob2URY9.invoke(classifierType); // recursion preventing if (classifiers.contains(classifier)) { return false; } classifiers.add(classifier); // set types variables Iterable<SNode> typeParams = IClassifierType__BehaviorDescriptor.getTypeParameters_id6r77ob2URYe.invoke(classifierType); if (Sequence.fromIterable(typeParams).isNotEmpty()) { Iterator<SNode> typeVars = Sequence.fromIterable(IClassifier__BehaviorDescriptor.getTypeVariables_id6r77ob2URXZ.invoke(classifier)).iterator(); for (SNode typeParm : typeParams) { if (!(typeVars.hasNext())) { break; } SNode typeVar = typeVars.next(); MapSequence.fromMap(typeByTypeVariable).put(typeVar, typeParm); } } // recalc is package protected available isPackageProtectedAvailable = true; String contextClassifierPackage = retrievePackageName(SNodeOperations.getModel(classifiers.get(0))); for (SNode inheritedClassifier : classifiers) { if (!(retrievePackageName(SNodeOperations.getModel(inheritedClassifier)).equals(contextClassifierPackage))) { isPackageProtectedAvailable = false; break; } } return true; } private String retrievePackageName(SModel model) { return (model != null ? JavaNameUtil.packageName(model) : ""); } public void exitClassifierInternal(SNode classifier) { assert classifiers.pop() == IClassifierType__BehaviorDescriptor.getClassifier_id6r77ob2URY9.invoke(classifier); } private SNode getCurrentClassifier() { return classifiers.lastElement(); } public boolean isPackageProtectedVisible() { return isPackageProtectedAvailable; } public boolean isPrivateVisible() { return classifiers.size() == 1; } public boolean isElementVisible(SNode element) { if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(element, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112670d273fL, 0x112670d886aL, "visibility")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10af9586f0cL, "jetbrains.mps.baseLanguage.structure.PrivateVisibility"))) { return isPrivateVisible(); } if ((SLinkOperations.getTarget(element, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x112670d273fL, 0x112670d886aL, "visibility")) == null)) { return isPackageProtectedVisible(); } return true; } public Map<SNode, SNode> getTypeByTypeVariableMapping() { return Collections.unmodifiableMap(typeByTypeVariable); } }