package jetbrains.mps.build.mps.util; /*Generated by MPS */ import org.apache.log4j.Logger; import org.apache.log4j.LogManager; import java.util.List; import org.jetbrains.mps.openapi.model.SNode; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.util.Queue; import jetbrains.mps.internal.collections.runtime.QueueSequence; import java.util.LinkedList; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.internal.collections.runtime.ListSequence; import org.jetbrains.mps.openapi.language.SAbstractConcept; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import org.apache.log4j.Level; import org.jetbrains.mps.openapi.language.SLanguage; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.model.SModelReference; public class VisibleModules { private static final Logger LOG = LogManager.getLogger(VisibleModules.class); private List<SNode> allModules = new ArrayList<SNode>(); private Map<String, SNode> moduleByName = new HashMap<String, SNode>(); private Map<String, SNode> moduleById = new HashMap<String, SNode>(); private SNode project; public VisibleModules(SNode project) { this.project = project; } public void collect() { Queue<SNode> queue = QueueSequence.fromQueue(new LinkedList<SNode>()); QueueSequence.fromQueue(queue).addLastElement(project); Set<SNode> seen = SetSequence.fromSet(new HashSet<SNode>()); while (QueueSequence.fromQueue(queue).isNotEmpty()) { SNode project = QueueSequence.fromQueue(queue).removeFirstElement(); for (SNode dep : SLinkOperations.getChildren(project, MetaAdapterFactory.getContainmentLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, 0x4df58c6f18f84a25L, "dependencies"))) { SNode projectDependency = SNodeOperations.as(dep, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, "jetbrains.mps.build.structure.BuildProjectDependency")); if (projectDependency == null) { continue; } SNode depproj = SLinkOperations.getTarget(projectDependency, MetaAdapterFactory.getReferenceLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, 0x4df58c6f18f84a24L, "script")); if ((depproj == null)) { SReference ref = SNodeOperations.getReference(projectDependency, MetaAdapterFactory.getReferenceLink(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x454b730dd908c220L, 0x4df58c6f18f84a24L, "script")); report("cannot find dependency build script " + SLinkOperations.getResolveInfo(ref) + " in model " + check_xuwpka_a0a1a4a1a3a5(ref.getTargetSModelReference()), projectDependency); } if (depproj != null && seen.add(depproj)) { QueueSequence.fromQueue(queue).addLastElement(depproj); } } ListSequence.fromList(allModules).addSequence(ListSequence.fromList(SNodeOperations.getNodeDescendants(project, MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, "jetbrains.mps.build.mps.structure.BuildMps_AbstractModule"), false, new SAbstractConcept[]{}))); } for (SNode module : allModules) { SNode currProj = SNodeOperations.getNodeAncestor(module, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false); if (moduleById.containsKey(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")))) { SNode other = moduleById.get(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid"))); SNode otherProj = SNodeOperations.getNodeAncestor(other, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false); report("found two modules with the same id: " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + ". First module " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + " from project " + currProj + ", second module " + SPropertyOperations.getString(other, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + " from project " + otherProj, module); } moduleById.put(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")), module); if (moduleByName.containsKey(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")))) { SNode other = moduleByName.get(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"))); SNode otherProj = SNodeOperations.getNodeAncestor(other, MetaAdapterFactory.getConcept(0x798100da4f0a421aL, 0xb99171f8c50ce5d2L, 0x4df58c6f18f84a13L, "jetbrains.mps.build.structure.BuildProject"), false, false); report("found two modules with the same name: " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + ". First module " + SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + " from project " + currProj + ", second module " + SPropertyOperations.getString(other, MetaAdapterFactory.getProperty(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4780308f5d333ebL, 0x4780308f5d3868bL, "uuid")) + " from project " + otherProj, other); } moduleByName.put(SPropertyOperations.getString(module, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")), module); } } protected void report(String message, SNode anchor) { // FIXME use (share) reported interface from ModuleChecker to report directly to gencontext, if available if (LOG.isEnabledFor(Level.ERROR)) { LOG.error(message); } } public SNode resolve(SLanguage language) { return resolve(language.getQualifiedName(), null); } public SNode resolve(SModuleReference moduleRef) { String targetName = moduleRef.getModuleName(); return this.resolve(targetName, moduleRef.getModuleId().toString()); } public SNode resolveLanguage(SModuleReference moduleRef) { return SNodeOperations.as(resolve(moduleRef), MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x2c446791464290f8L, "jetbrains.mps.build.mps.structure.BuildMps_Language")); } public SNode resolveGenerator(SModuleReference moduleRef) { return SNodeOperations.as(resolve(moduleRef), MetaAdapterFactory.getConcept(0xcf935df46994e9cL, 0xa132fa109541cba3L, 0x4c6db07d2e56a8b4L, "jetbrains.mps.build.mps.structure.BuildMps_Generator")); } public SNode resolve(String moduleName, String moduleId) { SNode result = null; if (moduleId != null) { result = moduleById.get(moduleId); } if (result == null && moduleName != null) { result = moduleByName.get(moduleName); } return result; } private static String check_xuwpka_a0a1a4a1a3a5(SModelReference checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getModelName(); } return null; } }