register extensions area and extension points for module; register some more components

This commit is contained in:
Dmitry Jemerov
2012-05-18 14:06:47 +02:00
parent bbca2280a9
commit 36c3ac8b98
9 changed files with 88 additions and 17 deletions
@@ -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";
}
@@ -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 <T> void registerComponentInstance(final MutablePicoContainer container, final Class<T> key, final T implementation) {
public static <T> void registerComponentInstance(final MutablePicoContainer container, final Class<T> key, final T implementation) {
container.unregisterComponent(key);
container.registerComponentInstance(key, implementation);
}
@@ -234,20 +235,20 @@ public class CoreEnvironment {
});
}
protected <T> void registerExtensionPoint(final ExtensionsArea area, final ExtensionPointName<T> extensionPointName,
final Class<? extends T> aClass) {
public static <T> void registerExtensionPoint(final ExtensionsArea area, final ExtensionPointName<T> extensionPointName,
final Class<? extends T> aClass) {
final String name = extensionPointName.getName();
registerExtensionPoint(area, name, aClass);
}
protected <T> void registerExtensionPoint(ExtensionsArea area, String name, Class<? extends T> aClass) {
public static <T> void registerExtensionPoint(ExtensionsArea area, String name, Class<? extends T> 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 <T> void registerProjectExtensionPoint(final ExtensionPointName<T> extensionPointName,
public <T> void registerProjectExtensionPoint(final ExtensionPointName<T> extensionPointName,
final Class<? extends T> aClass) {
registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass);
}
@@ -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() {
@@ -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);
@@ -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() {
@@ -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();
@@ -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);
}
}
@@ -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
@@ -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));
}
}