package jetbrains.mps.kernel.model; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.project.AbstractModule; import java.util.List; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.module.SearchScope; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.smodel.SModelOperations; /** * Utility to update imports of a module to respect imports of a given model. * * Methods of this class shall be invoked within command/model write lock */ public class MissingDependenciesFixer { private final SModel myModel; public MissingDependenciesFixer(@NotNull SModel modelDescriptor) { myModel = modelDescriptor; } /** * For each import of the model with module not in model's module dependencies, add a new one. */ public void fixModuleDependencies() { SRepository repository = myModel.getRepository(); assert repository != null; AbstractModule module = (AbstractModule) myModel.getModule(); assert module != null; List<SModelReference> existingImports = getExistingImports(); fixImports(module, existingImports); } private void fixImports(@NotNull AbstractModule module, List<SModelReference> importsToAdd) { SRepository repository = module.getRepository(); SearchScope moduleScope = module.getScope(); for (SModelReference modelImport : importsToAdd) { if (moduleScope.resolve(modelImport) != null) { continue; } SModel sm = modelImport.resolve(repository); if (sm == null) { continue; } SModule anotherModule = sm.getModule(); if (anotherModule == null || anotherModule == module) { continue; } module.addDependency(anotherModule.getModuleReference(), false); } } private List<SModelReference> getExistingImports() { return SModelOperations.getImportedModelUIDs(myModel); } }