package jetbrains.mps.console.ideCommands.util; /*Generated by MPS */ import jetbrains.mps.ide.messages.MessagesViewTool; import jetbrains.mps.console.tool.ConsoleStream; import jetbrains.mps.generator.ModelGenerationPlan; import jetbrains.mps.generator.runtime.TemplateModule; import java.util.Collection; import jetbrains.mps.generator.runtime.TemplateMappingPriorityRule; import jetbrains.mps.messages.Message; import jetbrains.mps.messages.MessageKind; import jetbrains.mps.generator.impl.plan.GenerationPlan; import java.util.List; import jetbrains.mps.generator.runtime.TemplateMappingConfiguration; import jetbrains.mps.util.Pair; import jetbrains.mps.generator.impl.plan.GenerationPartitioningUtil; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import org.jetbrains.mps.openapi.model.SModel; import java.util.ArrayList; import jetbrains.mps.generator.impl.plan.ConnectedComponentPartitioner; import org.jetbrains.mps.openapi.language.SLanguage; import jetbrains.mps.generator.impl.plan.Conflict; import java.util.Set; public class PartitioningHelper { private final MessagesViewTool messagesView; private final ConsoleStream console; private String delimiter = "================================="; public PartitioningHelper(MessagesViewTool viewTool, ConsoleStream console) { this.messagesView = viewTool; this.console = console; } public void show(ModelGenerationPlan plan) { // print all rules messageViewDelimiter(); for (TemplateModule generator : plan.getGenerators()) { Collection<TemplateMappingPriorityRule> rules = generator.getPriorities(); for (TemplateMappingPriorityRule r : rules) { Message msg = new Message(MessageKind.INFORMATION, r.toString()); msg.setHintObject(generator.getModuleReference()); messagesView.add(msg); } } messageViewDelimiter(); if (plan instanceof GenerationPlan) { GenerationPlan planImpl = (GenerationPlan) plan; if (planImpl.hasIgnoredPriorityRules()) { printPlanConflicts(planImpl.getIgnoredPriorityRules(), "Ignored mapping priority rules:"); } if (planImpl.hasConflictingPriorityRules()) { printPlanConflicts(planImpl.getConflicts(), "Conflicting mapping priority rules encountered:"); } } // show partitioning console.addText("--------------------- mappings partitioning -----------------------------------\n\n"); int stepCount = 1; for (ModelGenerationPlan.Step step : plan.getSteps()) { console.addText(" [ " + stepCount++ + " ]\n"); if (step instanceof ModelGenerationPlan.Checkpoint) { console.addText(" Checkpoint: " + ((ModelGenerationPlan.Checkpoint) step).getName()); console.addText("\n"); } else if (step instanceof ModelGenerationPlan.Transform) { List<TemplateMappingConfiguration> mappingSet = ((ModelGenerationPlan.Transform) step).getTransformations(); List<Pair<String, TemplateMappingConfiguration>> strings = GenerationPartitioningUtil.toStrings(mappingSet); for (Pair<String, TemplateMappingConfiguration> string : strings) { SNode node = SConceptOperations.createNewNode(MetaAdapterFactory.getConcept(0xa5e4de5346a344daL, 0xaab368fdf1c34ed0L, 0x360b134fc0467d73L, "jetbrains.mps.console.ideCommands.structure.ClickableGenerator")); SPropertyOperations.set(node, MetaAdapterFactory.getProperty(0xa5e4de5346a344daL, 0xaab368fdf1c34ed0L, 0x360b134fc0467d73L, 0x360b134fc0525d7fL, "moduleId"), PersistenceFacade.getInstance().asString(string.o2.getModel().getModule().getModuleReference().getModuleId())); SPropertyOperations.set(node, MetaAdapterFactory.getProperty(0xde1ad86d6e504a02L, 0xb306d4d17f64c375L, 0x2095ece53bb9f5b0L, 0x360b134fc047ce2aL, "text"), string.o1); console.addText(" "); console.addNode(node); console.addText("\n"); } } else { console.addText("Unknown step kind:" + step.getClass()); } console.addText("\n"); } console.addText("---------------------------------------------------------------------------------\n"); } public void printConnectedComponents(Iterable<SModel> models) { // other List<SNode> roots = new ArrayList<SNode>(); for (SModel md : models) { for (SNode root : md.getRootNodes()) { roots.add(root); } } ConnectedComponentPartitioner ccp = new ConnectedComponentPartitioner(roots); console.addText(ccp.toString()); // viewTool.append("---------- conflicts ------------\n"); // // Map<String, String> existing = new HashMap<String, String>(); // MPSModuleRepository repo = MPSModuleRepository.getInstance(); // for(Generator g : repo.getAllGenerators()) { // List<SModel> templateModels = g.getOwnTemplateModels(); // for (SModel templateModel : templateModels) { // SModel m = templateModel; // for(SNode root : m.getRoots()) { // for(SNode node : root.getDescendants(new IsInstanceCondition(MappingLabelDeclaration.concept))){ // MappingLabelDeclaration label = (MappingLabelDeclaration) node.getAdapter(); // String name = label.getName(); // String descr = "model = " + m.toString() + ", root =" + root.toString(); // if(existing.containsKey(name)) { // viewTool.append("conflict: name = " + name + ", " + descr + ": with + " + existing.get(name) + "\n"); // } else { // existing.put(name, descr); // } // } // } // } // } } public void printLanguages(Collection<SLanguage> languagesInUse) { console.addText("Model directly uses next languages (including explicitly engaged, if any):\n"); for (SLanguage l : languagesInUse) { console.addText(" "); console.addText(String.format("%s\n", l.getQualifiedName())); } consoleDelimiter(); } public void printToConsole(String header, Collection<String> lines) { console.addText(header); console.addText("\n"); for (String s : lines) { console.addText(s); console.addText("\n"); } consoleDelimiter(); } private void printPlanConflicts(List<Conflict> conflicts, String header) { messagesView.add(new Message(MessageKind.ERROR, PartitioningHelper.class, header)); console.addText(header); console.addText("\n\n"); for (Conflict c : conflicts) { Message msg = new Message(MessageKind.ERROR, PartitioningHelper.class, c.getText()); msg.setHintObject(c.getOrigin()); messagesView.add(msg); console.addText(String.format("%s\n", c.getText())); Set<TemplateMappingPriorityRule> rules = c.getRules(); if (!(rules.isEmpty())) { if (rules.size() == 1) { console.addText(String.format("\tRule: %s\n", rules.iterator().next())); } else { console.addText("\tRules:\n"); for (TemplateMappingPriorityRule r : rules) { console.addText(String.format("\t%s\n", r)); } } } } consoleDelimiter(); messageViewDelimiter(); } private void consoleDelimiter() { console.addText(delimiter); console.addText("\n"); } private void messageViewDelimiter() { messagesView.add(new Message(MessageKind.INFORMATION, delimiter)); } }