From 36c3ac8b980fcf82298990f1effa6ad0cba3875d Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 18 May 2012 14:06:47 +0200 Subject: [PATCH] register extensions area and extension points for module; register some more components --- .../openapi/components/ExtensionAreas.java | 26 +++++++++++++++++++ .../com/intellij/core/CoreEnvironment.java | 13 +++++----- .../src/com/intellij/mock/MockProject.java | 3 ++- .../openapi/module/impl/ModuleImpl.java | 3 ++- .../intellij/ide/plugins/PluginManager.java | 9 +++---- .../openapi/project/impl/ProjectImpl.java | 3 ++- .../intellij/core/CoreModuleManagerTest.java | 6 ++++- .../src/com/intellij/core/CoreModule.java | 24 +++++++++++++++++ .../core/ProjectModelEnvironment.java | 18 +++++++++++-- 9 files changed, 88 insertions(+), 17 deletions(-) create mode 100644 platform/core-api/src/com/intellij/openapi/components/ExtensionAreas.java diff --git a/platform/core-api/src/com/intellij/openapi/components/ExtensionAreas.java b/platform/core-api/src/com/intellij/openapi/components/ExtensionAreas.java new file mode 100644 index 000000000000..f539a84ae79a --- /dev/null +++ b/platform/core-api/src/com/intellij/openapi/components/ExtensionAreas.java @@ -0,0 +1,26 @@ +/* + * Copyright 2000-2012 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 com.intellij.openapi.components; + +import org.jetbrains.annotations.NonNls; + +/** + * @author yole + */ +public class ExtensionAreas { + @NonNls public static final String IDEA_PROJECT = "IDEA_PROJECT"; + @NonNls public static final String IDEA_MODULE = "IDEA_MODULE"; +} diff --git a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java index b103821ea144..c8855ac881b8 100644 --- a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreEnvironment.java @@ -21,6 +21,7 @@ import com.intellij.mock.*; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.impl.DocumentImpl; import com.intellij.openapi.extensions.ExtensionPoint; @@ -97,7 +98,7 @@ public class CoreEnvironment { myLocalFileSystem = new CoreLocalFileSystem(); myJarFileSystem = new CoreJarFileSystem(); - Extensions.registerAreaClass("IDEA_PROJECT", null); + Extensions.registerAreaClass(ExtensionAreas.IDEA_PROJECT, null); myProject = new MockProject(myApplication.getPicoContainer(), myParentDisposable); final MutablePicoContainer appContainer = myApplication.getPicoContainer(); @@ -198,7 +199,7 @@ public class CoreEnvironment { addExplicitExtension(LanguageParserDefinitions.INSTANCE, definition.getFileNodeType().getLanguage(), definition); } - protected void registerComponentInstance(final MutablePicoContainer container, final Class key, final T implementation) { + public static void registerComponentInstance(final MutablePicoContainer container, final Class key, final T implementation) { container.unregisterComponent(key); container.registerComponentInstance(key, implementation); } @@ -234,20 +235,20 @@ public class CoreEnvironment { }); } - protected void registerExtensionPoint(final ExtensionsArea area, final ExtensionPointName extensionPointName, - final Class aClass) { + public static void registerExtensionPoint(final ExtensionsArea area, final ExtensionPointName extensionPointName, + final Class aClass) { final String name = extensionPointName.getName(); registerExtensionPoint(area, name, aClass); } - protected void registerExtensionPoint(ExtensionsArea area, String name, Class aClass) { + public static void registerExtensionPoint(ExtensionsArea area, String name, Class aClass) { if (!area.hasExtensionPoint(name)) { ExtensionPoint.Kind kind = aClass.isInterface() || (aClass.getModifiers() & Modifier.ABSTRACT) != 0 ? ExtensionPoint.Kind.INTERFACE : ExtensionPoint.Kind.BEAN_CLASS; area.registerExtensionPoint(name, aClass.getName(), kind); } } - protected void registerProjectExtensionPoint(final ExtensionPointName extensionPointName, + public void registerProjectExtensionPoint(final ExtensionPointName extensionPointName, final Class aClass) { registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass); } diff --git a/platform/core-impl/src/com/intellij/mock/MockProject.java b/platform/core-impl/src/com/intellij/mock/MockProject.java index 5810005314b4..7ca777d7229b 100644 --- a/platform/core-impl/src/com/intellij/mock/MockProject.java +++ b/platform/core-impl/src/com/intellij/mock/MockProject.java @@ -16,6 +16,7 @@ package com.intellij.mock; import com.intellij.openapi.Disposable; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; @@ -35,7 +36,7 @@ public class MockProject extends MockComponentManager implements Project { public MockProject(PicoContainer parent, @NotNull Disposable parentDisposable) { super(parent, parentDisposable); - Extensions.instantiateArea("IDEA_PROJECT", this, null); + Extensions.instantiateArea(ExtensionAreas.IDEA_PROJECT, this, null); Disposer.register(parentDisposable, new Disposable() { @Override public void dispose() { diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java index 9931d53c3dc3..dc377069df0a 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java @@ -20,6 +20,7 @@ import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManager; import com.intellij.openapi.application.impl.ApplicationInfoImpl; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.components.impl.ComponentManagerImpl; import com.intellij.openapi.components.impl.ModulePathMacroManager; import com.intellij.openapi.components.impl.stores.IComponentStore; @@ -85,7 +86,7 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { } protected void bootstrapPicoContainer() { - Extensions.instantiateArea(PluginManager.AREA_IDEA_MODULE, this, (AreaInstance)getParentComponentManager()); + Extensions.instantiateArea(ExtensionAreas.IDEA_MODULE, this, (AreaInstance)getParentComponentManager()); super.bootstrapPicoContainer(); getPicoContainer().registerComponentImplementation(IComponentStore.class, ModuleStoreImpl.class); getPicoContainer().registerComponentImplementation(ModulePathMacroManager.class); diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManager.java b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManager.java index 9f2c57e529c6..b93eb4736d10 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/PluginManager.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/PluginManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2011 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -28,6 +28,7 @@ import com.intellij.notification.Notifications; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.extensions.LogProvider; @@ -74,8 +75,6 @@ import java.util.zip.ZipInputStream; @SuppressWarnings({"UseOfSystemOutOrSystemErr", "CallToPrintStackTrace"}) // No logger is loaded at this time so we have to use these. public class PluginManager { - @NonNls public static final String AREA_IDEA_PROJECT = "IDEA_PROJECT"; - @NonNls public static final String AREA_IDEA_MODULE = "IDEA_MODULE"; @NonNls private static final String PROPERTY_PLUGIN_PATH = "plugin.path"; private static final Object PLUGIN_CLASSES_LOCK = new Object(); private static String myPluginError = null; @@ -318,8 +317,8 @@ public class PluginManager { private static void configureExtensions() { Extensions.setLogProvider(new IdeaLogProvider()); - Extensions.registerAreaClass(AREA_IDEA_PROJECT, null); - Extensions.registerAreaClass(AREA_IDEA_MODULE, AREA_IDEA_PROJECT); + Extensions.registerAreaClass(ExtensionAreas.IDEA_PROJECT, null); + Extensions.registerAreaClass(ExtensionAreas.IDEA_MODULE, ExtensionAreas.IDEA_PROJECT); } private static boolean shouldLoadPlugins() { diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index 57507f41f83c..8052dec5cd3d 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -26,6 +26,7 @@ import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.application.impl.ApplicationInfoImpl; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.components.StorageScheme; import com.intellij.openapi.components.TrackingPathMacroSubstitutor; @@ -131,7 +132,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { @Override protected void bootstrapPicoContainer() { - Extensions.instantiateArea(PluginManager.AREA_IDEA_PROJECT, this, null); + Extensions.instantiateArea(ExtensionAreas.IDEA_PROJECT, this, null); super.bootstrapPicoContainer(); final MutablePicoContainer picoContainer = getPicoContainer(); diff --git a/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java b/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java index 3e3e6e7eea6e..ee9aa2126b95 100644 --- a/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java @@ -18,6 +18,8 @@ package com.intellij.core; import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.UsefulTestCase; @@ -39,6 +41,8 @@ public class CoreModuleManagerTest extends UsefulTestCase { final Module[] modules = moduleManager.getModules(); assertEquals(1, modules.length); - // + ModuleRootManager rootManager = ModuleRootManager.getInstance(modules[0]); + final ContentEntry[] contentEntries = rootManager.getContentEntries(); + assertEquals(1, contentEntries.length); } } diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java index 544d79398992..df90be24e440 100644 --- a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java +++ b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java @@ -17,9 +17,18 @@ package com.intellij.core; import com.intellij.mock.MockComponentManager; import com.intellij.openapi.Disposable; +import com.intellij.openapi.components.ExtensionAreas; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.impl.ModuleEx; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleExtension; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.impl.DirectoryIndex; +import com.intellij.openapi.roots.impl.ModuleRootManagerImpl; +import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; @@ -34,6 +43,21 @@ public class CoreModule extends MockComponentManager implements ModuleEx { super(project.getPicoContainer(), parentDisposable); myProject = project; myPath = moduleFilePath; + + Extensions.instantiateArea(ExtensionAreas.IDEA_MODULE, this, null); + CoreEnvironment.registerExtensionPoint(Extensions.getArea(this), ModuleExtension.EP_NAME, ModuleExtension.class); + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + Extensions.disposeArea(CoreModule.this); + } + }); + + ModuleRootManagerImpl moduleRootManager = new ModuleRootManagerImpl(this, + DirectoryIndex.getInstance(project), + ProjectRootManagerImpl.getInstanceImpl(project), + VirtualFilePointerManager.getInstance()); + CoreEnvironment.registerComponentInstance(getPicoContainer(), ModuleRootManager.class, moduleRootManager); } @Override diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java index 1c477a07814f..e56bb9becdd3 100644 --- a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java +++ b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java @@ -16,19 +16,33 @@ package com.intellij.core; import com.intellij.application.options.PathMacrosImpl; +import com.intellij.mock.MockProject; import com.intellij.openapi.application.PathMacros; +import com.intellij.openapi.components.ExtensionAreas; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.components.impl.ProjectPathMacroManager; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.impl.DirectoryIndex; +import com.intellij.openapi.roots.impl.DirectoryIndexExcludePolicy; +import com.intellij.openapi.roots.impl.DirectoryIndexImpl; +import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; /** * @author yole */ public class ProjectModelEnvironment { public static void register(CoreEnvironment env) { + Extensions.registerAreaClass(ExtensionAreas.IDEA_MODULE, null); PathMacrosImpl pathMacros = new PathMacrosImpl(); env.registerApplicationComponent(PathMacros.class, pathMacros); - env.registerProjectComponent(ModuleManager.class, new CoreModuleManager(env.getProject(), env.getParentDisposable())); - env.registerProjectComponent(PathMacroManager.class, new ProjectPathMacroManager(pathMacros, env.getProject())); + final MockProject project = env.getProject(); + env.registerProjectComponent(ModuleManager.class, new CoreModuleManager(project, env.getParentDisposable())); + env.registerProjectComponent(PathMacroManager.class, new ProjectPathMacroManager(pathMacros, project)); + env.registerProjectExtensionPoint(DirectoryIndexExcludePolicy.EP_NAME, DirectoryIndexExcludePolicy.class); + DirectoryIndex index = new DirectoryIndexImpl(project); + env.registerProjectComponent(DirectoryIndex.class, index); + env.registerProjectComponent(ProjectRootManager.class, new ProjectRootManagerImpl(project, index)); } }