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