package jetbrains.mps.actions.runtime.impl; /*Generated by MPS */ import jetbrains.mps.openapi.editor.cells.EditorCell; import jetbrains.mps.nodeEditor.cellActions.SideTransformSubstituteInfo; import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import org.jetbrains.mps.openapi.model.SNode; import java.util.Set; import jetbrains.mps.nodeEditor.CellSide; import jetbrains.mps.smodel.IOperationContext; import org.jetbrains.mps.openapi.language.SEnumerationLiteral; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SEnumOperations; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.internal.collections.runtime.Sequence; import java.util.Collections; import org.jetbrains.mps.openapi.language.SLanguage; import jetbrains.mps.smodel.SLanguageHierarchy; import jetbrains.mps.smodel.language.LanguageRegistry; import jetbrains.mps.smodel.SModelOperations; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModuleOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import java.util.List; import jetbrains.mps.openapi.editor.cells.SubstituteAction; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.LinkedList; import org.jetbrains.mps.openapi.language.SAbstractConcept; import java.util.Iterator; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations; import jetbrains.mps.util.QueryMethodGenerated; import jetbrains.mps.smodel.behaviour.BHReflection; import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId; import jetbrains.mps.smodel.action.SideTransformPreconditionContext; import jetbrains.mps.smodel.action.RemoveSideTransformActionByConditionContext; import jetbrains.mps.smodel.action.SideTransformActionsBuilderContext; /** * * @deprecated this class purpose is to find and collect side-transform actions from te actions aspect. From version 2017.1 actions are attached to the editor cell via transformation menu inthe editor aspect. Use {@link jetbrains.mps.smodel.action.ModelActions#createSideTransformSubstituteActions(EditorCell, SideTransformSubstituteInfo.Side) } */ @Deprecated public class SideTransformUtil { private static final Logger LOG = LogManager.getLogger(SideTransformUtil.class); @Deprecated public SideTransformUtil() { } public static Iterable<SNode> getApplicableActionsBuilders(final SNode node, Set<String> stringTags, final CellSide cellSide, final IOperationContext context) { final Set<SEnumerationLiteral> tags = SetSequence.fromSetWithValues(new HashSet<SEnumerationLiteral>(), SetSequence.fromSet(stringTags).select(new ISelector<String, SEnumerationLiteral>() { public SEnumerationLiteral select(String it) { return SEnumOperations.getMemberForValue(it, 0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, "jetbrains.mps.lang.actions", 0x1099eb83606L, "SideTransformTag"); } })); if (SetSequence.fromSet(tags).isEmpty()) { SetSequence.fromSet(tags).addElement(SEnumOperations.getMember(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, "jetbrains.mps.lang.actions", 0x1099eb83606L, "SideTransformTag", 0x1099eb94002L, "default_RTransform")); } SRepository contextRepo = SNodeOperations.getModel(node).getRepository(); if (contextRepo == null) { return Sequence.fromIterable(Collections.emptyList()); } Iterable<SNode> result = Sequence.fromIterable(Collections.<SNode>emptyList()); for (SLanguage language : SetSequence.fromSet(new SLanguageHierarchy(LanguageRegistry.getInstance(contextRepo), SModelOperations.getAllLanguageImports(SNodeOperations.getModel(node))).getExtended())) { SModuleReference sourceModuleRef = language.getSourceModuleReference(); if (sourceModuleRef == null) { continue; } SModel actionsModelDescriptor = SModuleOperations.getAspect(sourceModuleRef.resolve(contextRepo), "actions"); if (actionsModelDescriptor == null) { continue; } result = Sequence.fromIterable(result).concat(Sequence.fromIterable(SLinkOperations.collectMany(jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.roots(actionsModelDescriptor, MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108fad1c116L, "jetbrains.mps.lang.actions.structure.SideTransformHintSubstituteActions")), MetaAdapterFactory.getContainmentLink(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108fad1c116L, 0x108fad1c117L, "actionsBuilder"))).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return (SNodeOperations.getNodeAncestor(it, MetaAdapterFactory.getConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x3dcc194340c24debL, "jetbrains.mps.lang.core.structure.BaseCommentAttribute"), true, false) == null) && isApplicable(node, tags, cellSide, it, context); } })); } return result; } public static List<SubstituteAction> createActions(SNode node, Set<String> stringTags, CellSide cellSide, IOperationContext context) { Set<SNode> conceptsToRemove = SetSequence.fromSet(new HashSet<SNode>()); List<SNode> removeByConditions = new ArrayList<SNode>(); List<SubstituteAction> result = ListSequence.fromList(new LinkedList<SubstituteAction>()); for (SNode actionBuilder : Sequence.fromIterable(getApplicableActionsBuilders(node, stringTags, cellSide, context))) { SetSequence.fromSet(conceptsToRemove).addSequence(Sequence.fromIterable(SLinkOperations.collect(SNodeOperations.getNodeDescendants(actionBuilder, MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x1122318438cL, "jetbrains.mps.lang.actions.structure.RemovePart"), false, new SAbstractConcept[]{}), MetaAdapterFactory.getReferenceLink(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x1122318438cL, 0x11223185f62L, "conceptToRemove")))); ListSequence.fromList(removeByConditions).addSequence(ListSequence.fromList(SNodeOperations.getNodeDescendants(actionBuilder, MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x116cddb8de5L, "jetbrains.mps.lang.actions.structure.RemoveSTByConditionPart"), false, new SAbstractConcept[]{}))); ListSequence.fromList(result).addSequence(ListSequence.fromList(invokeActionBuilder(actionBuilder, node, cellSide, context))); } // remove with conditions for (SNode removeByCondition : ListSequence.fromList(removeByConditions)) { invokeRemoveByCondition(removeByCondition, ListSequence.fromList(result).iterator(), node, context); } // remove with remove concept for (Iterator<SubstituteAction> it = ListSequence.fromList(result).iterator(); it.hasNext();) { SubstituteAction action = it.next(); SNode concept = SNodeOperations.cast(action.getOutputConcept(), MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration")); if (SetSequence.fromSet(conceptsToRemove).contains(concept)) { it.remove(); } } return result; } private static boolean isApplicable(SNode node, Set<SEnumerationLiteral> tags, CellSide cellSide, SNode actionsBuilder, IOperationContext context) { if (!(SetSequence.fromSet(tags).contains(SEnumOperations.getMemberForValue(SPropertyOperations.getString_def(actionsBuilder, MetaAdapterFactory.getProperty(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, 0x1099eb798f9L, "transformTag"), "default_RTransform"), 0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, "jetbrains.mps.lang.actions", 0x1099eb83606L, "SideTransformTag")))) { return false; } if ((cellSide == CellSide.LEFT ? SPropertyOperations.hasValue(actionsBuilder, MetaAdapterFactory.getProperty(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, 0x11b07b83602L, "side"), null, null) : SPropertyOperations.hasValue(actionsBuilder, MetaAdapterFactory.getProperty(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, 0x11b07b83602L, "side"), "left", null))) { return false; } if (!(SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(SNodeOperations.getConcept(node)), SNodeOperations.asSConcept(SLinkOperations.getTarget(actionsBuilder, MetaAdapterFactory.getReferenceLink(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, 0x108facec6d6L, "applicableConcept")))))) { return false; } SNode precondition = SLinkOperations.getTarget(actionsBuilder, MetaAdapterFactory.getContainmentLink(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, 0x10cd4e11b18L, "precondition")); if (precondition != null) { try { return (Boolean) QueryMethodGenerated.invoke(((String) BHReflection.invoke(actionsBuilder, SMethodTrimmedId.create("getPreconditionQueryMethodName", MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, "jetbrains.mps.lang.actions.structure.SideTransformHintSubstituteActionsBuilder"), "hKul9fn"))), context, new SideTransformPreconditionContext(node), SNodeOperations.getModel(actionsBuilder)); } catch (Exception e) { LOG.error(null, e); } } return true; } private static void invokeRemoveByCondition(SNode removeByCondition, Iterator<SubstituteAction> actions, SNode node, IOperationContext context) { try { QueryMethodGenerated.invoke(((String) BHReflection.invoke(removeByCondition, SMethodTrimmedId.create("getQueryMethodName", MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x116cddb8de5L, "jetbrains.mps.lang.actions.structure.RemoveSTByConditionPart"), "hKukL$h"))), context, new RemoveSideTransformActionByConditionContext(actions, node), SNodeOperations.getModel(removeByCondition)); } catch (Exception e) { LOG.error(null, e); } } private static List<SubstituteAction> invokeActionBuilder(SNode actionsBuilder, SNode node, CellSide cellSide, IOperationContext context) { try { return (List<SubstituteAction>) QueryMethodGenerated.invoke(((String) BHReflection.invoke(actionsBuilder, SMethodTrimmedId.create("getBuilderQueryMethodName", MetaAdapterFactory.getConcept(0xaee9cad2acd44608L, 0xaef20004f6a1cdbdL, 0x108facec6d2L, "jetbrains.mps.lang.actions.structure.SideTransformHintSubstituteActionsBuilder"), "hKujR2X"))), context, new SideTransformActionsBuilderContext(node, SNodeOperations.getModel(node), cellSide, null), SNodeOperations.getModel(actionsBuilder)); } catch (Exception e) { LOG.error(null, e); return Collections.emptyList(); } } }