/* * Copyright 2003-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.mps.idea.core.project.module; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import jetbrains.mps.extapi.module.SRepositoryExt; import jetbrains.mps.extapi.persistence.FileBasedModelRoot; import jetbrains.mps.ide.messages.MessagesViewTool; import jetbrains.mps.ide.project.ProjectHelper; import jetbrains.mps.idea.core.MPSBundle; import jetbrains.mps.idea.core.project.SolutionIdea; import jetbrains.mps.messages.MessageKind; import jetbrains.mps.persistence.DefaultModelRoot; import jetbrains.mps.persistence.MementoImpl; import jetbrains.mps.persistence.PersistenceRegistry; import jetbrains.mps.project.ModuleId; import jetbrains.mps.project.Solution; import jetbrains.mps.project.structure.model.ModelRootDescriptor; import jetbrains.mps.project.structure.modules.SolutionDescriptor; import org.jetbrains.annotations.NonNls; import org.jetbrains.mps.openapi.module.SRepository; import org.jetbrains.mps.openapi.persistence.Memento; import java.io.File; /** * Created by danilla on 26/10/15. */ public class SingleModuleMPSSupport extends ModuleMPSSupport { @NonNls private static final String SOURCE_GEN = "src_gen"; private Solution mySolution; @Override public boolean isMPSEnabled(Module module) { return true; } @Override public Solution getSolution(Module module) { return mySolution; } @Override public void init(final Project project) { Module[] modules = ModuleManager.getInstance(project).getModules(); assert modules.length == 1; final Module singleModule = modules[0]; final jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(project); if (mpsProject == null) { return; } final SRepository repository = mpsProject.getRepository(); repository.getModelAccess().runWriteAction(() -> { SolutionDescriptor solutionDescriptor = makeDescriptor(singleModule); Solution solution = new SolutionIdea(singleModule, solutionDescriptor); if (repository.getModule(solution.getModuleId()) != null) { MessagesViewTool.log(project, MessageKind.ERROR, MPSBundle.message("facet.cannot.load.second.module", solutionDescriptor.getNamespace())); return; } ((SRepositoryExt) repository).registerModule(solution, mpsProject); mpsProject.addModule(solution); mySolution = solution; }); } private SolutionDescriptor makeDescriptor(Module module) { VirtualFile moduleContentRoot = ModuleRootManager.getInstance(module).getContentRoots()[0]; String outputPath = moduleContentRoot.getPath() + File.separator + SOURCE_GEN; SolutionDescriptor descriptor = new SolutionDescriptor(); descriptor.setId(ModuleId.foreign(module.getName())); descriptor.setOutputPath(outputPath); descriptor.setCompileInMPS(false); FileBasedModelRoot root = new DefaultModelRoot(); root.setContentRoot(moduleContentRoot.getPath()); for (VirtualFile sourceRoot : ModuleRootManager.getInstance(module).getSourceRoots()) { if (!VfsUtilCore.isAncestor(moduleContentRoot, sourceRoot, true)) { continue; } root.addFile(FileBasedModelRoot.SOURCE_ROOTS, sourceRoot.getPath()); } root.addFile(FileBasedModelRoot.SOURCE_ROOTS, moduleContentRoot.getPath()); Memento m = new MementoImpl(); root.save(m); ModelRootDescriptor modelRootDesc = new ModelRootDescriptor(PersistenceRegistry.DEFAULT_MODEL_ROOT, m); descriptor.getModelRootDescriptors().add(modelRootDesc); return descriptor; } }