/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.core; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.ModuleListener; import com.intellij.openapi.project.Project; import gw.lang.reflect.TypeSystem; import gw.lang.reflect.module.Dependency; import gw.lang.reflect.module.IExecutionEnvironment; import gw.lang.reflect.module.IModule; import gw.plugin.ij.lang.psi.impl.GosuClassParseDataCache; import gw.plugin.ij.util.GosuModuleUtil; import gw.plugin.ij.util.UIUtil; import org.jetbrains.annotations.NotNull; import java.util.List; public class ModuleRefreshListener implements ModuleListener { private void createModule(@NotNull Module ijModule) { final IModule gsModule = TypeSystemStarter.instance(ijModule.getProject()).defineModule(ijModule); final IExecutionEnvironment env = gsModule.getExecutionEnvironment(); // Add implicit JRE module dependency final IModule jreModule = env.getJreModule(); gsModule.addDependency(new Dependency(jreModule, true)); // Add to the execution environment env.addModule(gsModule); } private void deleteModule(@NotNull IModule gsModule) { final IExecutionEnvironment env = gsModule.getExecutionEnvironment(); if (gsModule != env.getJreModule()) { TypeSystem.refresh(gsModule); env.removeModule(gsModule); for (IModule module : env.getModules()) { removeDependency(module, gsModule); } } } private void removeDependency(IModule module, IModule deleted) { for (Dependency dep : module.getDependencies()) { if (dep.getModule() == deleted) { module.removeDependency(dep); break; } } } // ModuleListener public void moduleAdded(Project project, Module ijModule) { createModule(ijModule); } public void beforeModuleRemoved(Project project, Module ijModule) { final IModule gsModule = GosuModuleUtil.getModule(ijModule); UIUtil.closeAllGosuEditors(project, gsModule); GosuClassParseDataCache.clear(gsModule); deleteModule(gsModule); } public void moduleRemoved(Project project, Module module) { // Nothing to do } public void modulesRenamed(Project project, List<Module> ijModules) { for (Module ijModule : ijModules) { for (IModule gsModule : GosuModuleUtil.getModules(project)) { if (gsModule.getNativeModule() == ijModule) { TypeSystem.getExecutionEnvironment().renameModule(gsModule, ijModule.getName()); } } } } }