package jetbrains.mps.ide.devkit.actions;
/*Generated by MPS */
import jetbrains.mps.plugins.relations.RelationDescriptor;
import javax.swing.Icon;
import jetbrains.mps.icons.MPSIcons;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import org.jetbrains.mps.openapi.language.SConcept;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.AttributeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.IAttributeDescriptor;
import org.jetbrains.mps.openapi.language.SLanguage;
import jetbrains.mps.smodel.SModelOperations;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import com.intellij.ide.DataManager;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.kernel.model.SModelUtil;
import java.util.ArrayList;
import jetbrains.mps.ide.dialogs.project.creation.NewGeneratorDialog;
import org.jetbrains.mps.openapi.model.EditableSModel;
import jetbrains.mps.project.SModuleOperations;
import jetbrains.mps.smodel.SModelStereotype;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations;
import jetbrains.mps.ide.actions.MappingDialog;
import jetbrains.mps.kernel.language.ConceptAspectsHelper;
import jetbrains.mps.smodel.action.SNodeFactoryOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
public class Generator_TabDescriptor extends RelationDescriptor {
private static final Icon ICON = MPSIcons.Nodes.Reduction;
public Generator_TabDescriptor() {
}
public String getTitle() {
return "Generator";
}
public Character getShortcutChar() {
return 'G';
}
public int compareTo(RelationDescriptor descriptor) {
return new Generator_Order().compare(this, descriptor);
}
public void startListening() {
}
public SNode getBaseNode(SNode node) {
return ConceptEditorOpenHelper.getBaseNode(node);
}
public boolean isApplicable(SNode node) {
return SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"));
}
@Nullable
public Icon getIcon() {
return ICON;
}
public List<SNode> getNodes(SNode node) {
Set<SNode> nodes = SetSequence.fromSet(new HashSet<SNode>());
SetSequence.fromSet(nodes).addSequence(ListSequence.fromList(((List<SNode>) BHReflection.invoke(node, SMethodTrimmedId.create("findGeneratorFragments", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), "5zMz2aJEI4B")))));
return SetSequence.fromSet(nodes).toListSequence();
}
public boolean isSingle() {
return false;
}
public Iterable<SConcept> getAspectConcepts(final SNode node) {
List<SConcept> result = ConceptEditorHelper.getAvailableConceptAspects(MetaAdapterFactory.getLanguage(0xb401a68083254110L, 0x8fd384331ff25befL, "jetbrains.mps.lang.generator"), node);
ListSequence.fromList(result).addElement(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x112103dd1e8L, "jetbrains.mps.lang.generator.structure.InlineTemplate_RuleConsequence"));
ListSequence.fromList(result).addElement(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x7b85dded0be53d6cL, "jetbrains.mps.lang.generator.structure.InlineTemplateWithContext_RuleConsequence"));
boolean rootable = SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979ba0450L, "jetbrains.mps.lang.structure.structure.ConceptDeclaration")) && SPropertyOperations.getBoolean((SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979ba0450L, "jetbrains.mps.lang.structure.structure.ConceptDeclaration"))), MetaAdapterFactory.getProperty(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0xf979ba0450L, 0xff49c1d648L, "rootable"));
boolean isInterface = SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103556dcafL, "jetbrains.mps.lang.structure.structure.InterfaceConceptDeclaration"));
if (rootable || isInterface) {
boolean isNeedRootTemplate = true;
for (SNode genFragment : ((List<SNode>) BHReflection.invoke(node, SMethodTrimmedId.create("findGeneratorFragments", MetaAdapterFactory.getConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x1103553c5ffL, "jetbrains.mps.lang.structure.structure.AbstractConceptDeclaration"), "5zMz2aJEI4B")))) {
if ((AttributeOperations.getAttribute(genFragment, new IAttributeDescriptor.NodeAttribute(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x11017244494L, "jetbrains.mps.lang.generator.structure.RootTemplateAnnotation"))) != null)) {
isNeedRootTemplate = false;
break;
}
}
if (isNeedRootTemplate) {
for (SLanguage lang : SModelOperations.getAllLanguageImports(SNodeOperations.getModel(node))) {
for (SAbstractConcept importedConcept : lang.getConcepts()) {
if (importedConcept.isAbstract()) {
continue;
}
if (!((importedConcept instanceof SConcept))) {
continue;
}
if (((SConcept) importedConcept).isRootable()) {
ListSequence.fromList(result).addElement(((SConcept) importedConcept));
}
}
}
}
}
return result;
}
public boolean commandOnCreate() {
return false;
}
public SNode createAspect(final SNode node, final SConcept concept) {
MPSProject mpsProject = MPSCommonDataKeys.MPS_PROJECT.getData(DataManager.getInstance().getDataContext());
final Wrappers._T<Language> language = new Wrappers._T<Language>();
final Wrappers._T<List<Generator>> genList = new Wrappers._T<List<Generator>>();
mpsProject.getModelAccess().runReadAction(new Runnable() {
public void run() {
language.value = SModelUtil.getDeclaringLanguage(node);
assert language.value != null : "Language shouldn't be null for " + node;
genList.value = ListSequence.fromListWithValues(new ArrayList<Generator>(), language.value.getGenerators());
}
});
if (ListSequence.fromList(genList.value).isEmpty()) {
NewGeneratorDialog dialog = new NewGeneratorDialog(mpsProject, language.value);
dialog.show();
Generator createdGenerator = dialog.getResult();
if (createdGenerator == null) {
return null;
}
ListSequence.fromList(genList.value).addElement(createdGenerator);
} else {
mpsProject.getModelAccess().executeCommand(new Runnable() {
public void run() {
for (Generator generator : genList.value) {
if (generator.getOwnTemplateModels().isEmpty()) {
continue;
}
return;
}
// this means there are generators, but no template models
Generator firstGen = ListSequence.fromList(genList.value).first();
EditableSModel templateModelDescriptor = SModuleOperations.createModelWithAdjustments(language.value.getModuleName() + ".generator.template.main@" + SModelStereotype.GENERATOR, firstGen.getModelRoots().iterator().next());
templateModelDescriptor.save();
language.value.save();
}
});
}
final List<SNode> mappings = new ArrayList<SNode>();
mpsProject.getModelAccess().runReadAction(new Runnable() {
public void run() {
for (Generator generator : genList.value) {
for (SModel gm : generator.getOwnTemplateModels()) {
ListSequence.fromList(mappings).addSequence(ListSequence.fromList(jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.roots(gm, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"))));
}
}
}
});
if (ListSequence.fromList(mappings).isEmpty()) {
// generator is present - this means we don't have template models or mappings
mpsProject.getModelAccess().executeCommand(new Runnable() {
public void run() {
SModel model = null;
for (Generator generator : genList.value) {
if (generator.getOwnTemplateModels().isEmpty()) {
continue;
}
model = generator.getOwnTemplateModels().get(0);
}
assert model != null : "model should have been already created";
SNode node = SConceptOperations.createNewNode(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"));
SPropertyOperations.set(node, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), "main");
jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.addRootNode(model, node);
ListSequence.fromList(mappings).addElement(node);
}
});
}
final Wrappers._T<SNode> mapping = new Wrappers._T<SNode>();
if (ListSequence.fromList(mappings).count() > 1) {
MappingDialog configurationDialog = new MappingDialog(mpsProject, language.value);
configurationDialog.show();
mapping.value = configurationDialog.getResult();
} else {
mapping.value = ListSequence.fromList(mappings).first();
}
final Wrappers._T<SNode> result = new Wrappers._T<SNode>();
mpsProject.getModelAccess().executeCommand(new Runnable() {
public void run() {
SModel model = SNodeOperations.getModel(mapping.value);
if (SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(concept), MetaAdapterFactory.getInterfaceConcept(0xc72da2b97cce4447L, 0x8389f407dc1158b7L, 0x24614259e94f0c84L, "jetbrains.mps.lang.structure.structure.IConceptAspect"))) {
result.value = ConceptAspectsHelper.attachNewConceptAspect(node, SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(((SAbstractConcept) concept)), null), model);
BHReflection.invoke(mapping.value, SMethodTrimmedId.create("addMember", MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"), "2JKPiG_HmQX"), result.value);
} else if (SConceptOperations.isSubConceptOf(SNodeOperations.asSConcept(concept), MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x112103dd1e8L, "jetbrains.mps.lang.generator.structure.InlineTemplate_RuleConsequence")) || SNodeOperations.isInstanceOf(result.value, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x7b85dded0be53d6cL, "jetbrains.mps.lang.generator.structure.InlineTemplateWithContext_RuleConsequence"))) {
SNode mappingRule = SLinkOperations.addNewChild(mapping.value, MetaAdapterFactory.getContainmentLink(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, 0x10fca310cd5L, "reductionMappingRule"), MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x10fca296532L, "jetbrains.mps.lang.generator.structure.Reduction_MappingRule"));
SLinkOperations.setTarget(mappingRule, MetaAdapterFactory.getReferenceLink(0xb401a68083254110L, 0x8fd384331ff25befL, 0x10fc0b64647L, 0x10fc0b6e730L, "applicableConcept"), node);
SLinkOperations.setTarget(mappingRule, MetaAdapterFactory.getContainmentLink(0xb401a68083254110L, 0x8fd384331ff25befL, 0x10fca296532L, 0x11055ee07edL, "ruleConsequence"), SNodeOperations.cast(result.value, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x110138ccc4bL, "jetbrains.mps.lang.generator.structure.RuleConsequence")));
} else {
result.value = SNodeFactoryOperations.createNewNode(SNodeFactoryOperations.asInstanceConcept(concept), null);
SNode rootTemplateNode = jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.createNewNode(model, null, MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x11017244494L, "jetbrains.mps.lang.generator.structure.RootTemplateAnnotation"));
SLinkOperations.setTarget(rootTemplateNode, MetaAdapterFactory.getReferenceLink(0xb401a68083254110L, 0x8fd384331ff25befL, 0x11017244494L, 0x11017255ccfL, "applicableConcept"), node);
AttributeOperations.setAttribute(result.value, new IAttributeDescriptor.NodeAttribute(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0x11017244494L, "jetbrains.mps.lang.generator.structure.RootTemplateAnnotation")), rootTemplateNode);
SPropertyOperations.set(SNodeOperations.cast(result.value, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"), SPropertyOperations.getString(node, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")));
jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations.addRootNode(model, result.value);
BHReflection.invoke(mapping.value, SMethodTrimmedId.create("addMember", MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xff0bea0475L, "jetbrains.mps.lang.generator.structure.MappingConfiguration"), "2JKPiG_HmQX"), result.value);
}
}
});
return result.value;
}
}