From e14db279963cb76de2a4280af84cb1bd3c6d2f4c Mon Sep 17 00:00:00 2001 From: Evgeny Pasynkov Date: Wed, 23 May 2012 14:37:32 +0200 Subject: [PATCH 01/21] prevent NRE --- .../openapi/vfs/local/CoreLocalVirtualFile.java | 12 ++++++++---- .../com/intellij/core/ProjectModelEnvironment.java | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index f7c8749da965..35076321c4b6 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -84,11 +84,15 @@ public class CoreLocalVirtualFile extends VirtualFile { if (answer == null) { List result = new ArrayList(); final File[] files = myIoFile.listFiles(); - for (File file : files) { - result.add(new CoreLocalVirtualFile(myFileSystem, file)); + if (files == null) { + answer = EMPTY_ARRAY; + } + else { + for (File file : files) { + result.add(new CoreLocalVirtualFile(myFileSystem, file)); + } + answer = result.toArray(new VirtualFile[result.size()]); } - answer = result.toArray(new VirtualFile[result.size()]); - myChildren = answer; } return answer; diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java index 5fd165a41f17..4019e1033fc2 100644 --- a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java +++ b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java @@ -55,7 +55,8 @@ public class ProjectModelEnvironment { 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(DirectoryIndex.class, index); + project.registerService(DirectoryIndex.class, index); env.registerProjectComponent(ProjectRootManager.class, new ProjectRootManagerImpl(project, index)); project.registerService(ProjectLibraryTable.class, new ProjectLibraryTable()); project.registerService(ProjectFileIndex.class, new ProjectFileIndexImpl(project, index, FileTypeRegistry.getInstance())); From 9ee45ddefe9c11aa5b2e93510c62ec5b1da843c0 Mon Sep 17 00:00:00 2001 From: Evgeny Pasynkov Date: Wed, 23 May 2012 15:48:47 +0200 Subject: [PATCH 02/21] split CoreEnvironment to CoreApplicationEnvironment and CoreProjectEnvironment --- ...va => JavaCoreApplicationEnvironment.java} | 42 +------- .../core/JavaCoreProjectEnvironment.java | 78 ++++++++++++++ .../impl/source/resolve/JavaResolveCache.java | 2 +- ...t.java => CoreApplicationEnvironment.java} | 52 +-------- .../intellij/core/CoreProjectEnvironment.java | 100 ++++++++++++++++++ .../intellij/core/CoreModuleManagerTest.java | 12 ++- .../src/com/intellij/core/CoreModule.java | 2 +- .../core/ProjectModelEnvironment.java | 13 ++- 8 files changed, 203 insertions(+), 98 deletions(-) rename java/java-psi-impl/src/com/intellij/core/{JavaCoreEnvironment.java => JavaCoreApplicationEnvironment.java} (63%) create mode 100644 java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java rename platform/core-impl/src/com/intellij/core/{CoreEnvironment.java => CoreApplicationEnvironment.java} (79%) create mode 100644 platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java diff --git a/java/java-psi-impl/src/com/intellij/core/JavaCoreEnvironment.java b/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java similarity index 63% rename from java/java-psi-impl/src/com/intellij/core/JavaCoreEnvironment.java rename to java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java index bd47461fcaa6..3bc4c3d7d287 100644 --- a/java/java-psi-impl/src/com/intellij/core/JavaCoreEnvironment.java +++ b/java/java-psi-impl/src/com/intellij/core/JavaCoreApplicationEnvironment.java @@ -47,10 +47,8 @@ import java.io.File; /** * @author yole */ -public class JavaCoreEnvironment extends CoreEnvironment { - private final CoreJavaFileManager myFileManager; - - public JavaCoreEnvironment(Disposable parentDisposable) { +public class JavaCoreApplicationEnvironment extends CoreApplicationEnvironment { + public JavaCoreApplicationEnvironment(Disposable parentDisposable) { super(parentDisposable); registerFileType(JavaClassFileType.INSTANCE, "class"); @@ -62,7 +60,6 @@ public class JavaCoreEnvironment extends CoreEnvironment { addExplicitExtension(LanguageParserDefinitions.INSTANCE, JavaLanguage.INSTANCE, new JavaParserDefinition()); addExplicitExtension(LanguageConstantExpressionEvaluator.INSTANCE, JavaLanguage.INSTANCE, new PsiExpressionEvaluator()); - registerProjectExtensionPoint(PsiElementFinder.EP_NAME, PsiElementFinder.class); registerExtensionPoint(Extensions.getRootArea(), ClsStubBuilderFactory.EP_NAME, ClsStubBuilderFactory.class); registerExtensionPoint(Extensions.getRootArea(), PsiAugmentProvider.EP_NAME, PsiAugmentProvider.class); registerExtensionPoint(Extensions.getRootArea(), JavaMainMethodProvider.EP_NAME, JavaMainMethodProvider.class); @@ -70,43 +67,8 @@ public class JavaCoreEnvironment extends CoreEnvironment { myApplication.registerService(PsiPackageImplementationHelper.class, new CorePsiPackageImplementationHelper()); - myFileManager = createCoreFileManager(); - myProject.registerService(PsiElementFactory.class, new PsiElementFactoryImpl(myPsiManager)); - myProject.registerService(JavaPsiImplementationHelper.class, new CoreJavaPsiImplementationHelper()); - myProject.registerService(PsiResolveHelper.class, new PsiResolveHelperImpl(myPsiManager)); - myProject.registerService(LanguageLevelProjectExtension.class, new CoreLanguageLevelProjectExtension()); - myProject.registerService(PackageIndex.class, myFileManager); - myProject.registerService(JavaResolveCache.class, new JavaResolveCache(myMessageBus)); - myProject.registerService(JavaCodeStyleSettingsFacade.class, new CoreJavaCodeStyleSettingsFacade()); - myProject.registerService(JavaCodeStyleManager.class, new CoreJavaCodeStyleManager()); - - JavaPsiFacadeImpl javaPsiFacade = new JavaPsiFacadeImpl(myProject, myPsiManager, myFileManager, myMessageBus); - myProject.registerService(CoreJavaFileManager.class, myFileManager); - registerComponentInstance(myProject.getPicoContainer(), - JavaPsiFacade.class, - javaPsiFacade); - myProject.registerService(JavaPsiFacade.class, javaPsiFacade); - myApplication.registerService(EmptySubstitutor.class, new EmptySubstitutorImpl()); myApplication.registerService(JavaDirectoryService.class, new CoreJavaDirectoryService()); myApplication.registerService(JavaVersionService.class, new JavaVersionService()); } - - protected CoreJavaFileManager createCoreFileManager() { - return new CoreJavaFileManager(myPsiManager, getLocalFileSystem(), myJarFileSystem); - } - - public void addToClasspath(File path) { - final VirtualFile root = path.isFile() - ? myJarFileSystem.findFileByPath(path + "!/") - : getLocalFileSystem().findFileByPath(path.getPath()); - - if (root != null) { - myFileManager.addToClasspath(path); - myFileIndexFacade.addLibraryRoot(root); - } - else { - throw new IllegalArgumentException("trying to add non-existing file to classpath: " + path); - } - } } diff --git a/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java b/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java new file mode 100644 index 000000000000..52889658c3e3 --- /dev/null +++ b/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java @@ -0,0 +1,78 @@ +/* + * 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.core; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.roots.LanguageLevelProjectExtension; +import com.intellij.openapi.roots.PackageIndex; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiElementFactory; +import com.intellij.psi.PsiElementFinder; +import com.intellij.psi.PsiResolveHelper; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.JavaCodeStyleSettingsFacade; +import com.intellij.psi.impl.JavaPsiFacadeImpl; +import com.intellij.psi.impl.JavaPsiImplementationHelper; +import com.intellij.psi.impl.PsiElementFactoryImpl; +import com.intellij.psi.impl.source.resolve.JavaResolveCache; +import com.intellij.psi.impl.source.resolve.PsiResolveHelperImpl; + +import java.io.File; + +public class JavaCoreProjectEnvironment extends CoreProjectEnvironment { + private final CoreJavaFileManager myFileManager; + + public JavaCoreProjectEnvironment(Disposable parentDisposable, CoreApplicationEnvironment applicationEnvironment) { + super(parentDisposable, applicationEnvironment); + + myFileManager = createCoreFileManager(); + myProject.registerService(PsiElementFactory.class, new PsiElementFactoryImpl(myPsiManager)); + myProject.registerService(JavaPsiImplementationHelper.class, new CoreJavaPsiImplementationHelper()); + myProject.registerService(PsiResolveHelper.class, new PsiResolveHelperImpl(myPsiManager)); + myProject.registerService(LanguageLevelProjectExtension.class, new CoreLanguageLevelProjectExtension()); + myProject.registerService(PackageIndex.class, myFileManager); + myProject.registerService(JavaResolveCache.class, new JavaResolveCache(myMessageBus)); + myProject.registerService(JavaCodeStyleSettingsFacade.class, new CoreJavaCodeStyleSettingsFacade()); + myProject.registerService(JavaCodeStyleManager.class, new CoreJavaCodeStyleManager()); + + registerProjectExtensionPoint(PsiElementFinder.EP_NAME, PsiElementFinder.class); + + JavaPsiFacadeImpl javaPsiFacade = new JavaPsiFacadeImpl(myProject, myPsiManager, myFileManager, myMessageBus); + myProject.registerService(CoreJavaFileManager.class, myFileManager); + registerProjectComponent(JavaPsiFacade.class, javaPsiFacade); + myProject.registerService(JavaPsiFacade.class, javaPsiFacade); + } + + protected CoreJavaFileManager createCoreFileManager() { + return new CoreJavaFileManager(myPsiManager, getEnvironment().getLocalFileSystem(), getEnvironment().getJarFileSystem()); + } + + public void addToClasspath(File path) { + final VirtualFile root = path.isFile() + ? getEnvironment().getJarFileSystem().findFileByPath(path + "!/") + : getEnvironment().getLocalFileSystem().findFileByPath(path.getPath()); + + if (root != null) { + myFileManager.addToClasspath(path); + myFileIndexFacade.addLibraryRoot(root); + } + else { + throw new IllegalArgumentException("trying to add non-existing file to classpath: " + path); + } + } + +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java index d51c377556a3..2d8c0be99a17 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/JavaResolveCache.java @@ -62,7 +62,7 @@ public class JavaResolveCache { private static final Object NULL = Key.create("NULL"); - public JavaResolveCache(@Nullable("can be null in com.intellij.core.JavaCoreEnvironment.JavaCoreEnvironment") MessageBus messageBus) { + public JavaResolveCache(@Nullable("can be null in com.intellij.core.JavaCoreApplicationEnvironment.JavaCoreApplicationEnvironment") MessageBus messageBus) { if (messageBus != null) { messageBus.connect().subscribe(PsiManagerImpl.ANY_PSI_CHANGE_TOPIC, new AnyPsiChangeListener() { @Override diff --git a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java similarity index 79% rename from platform/core-impl/src/com/intellij/core/CoreEnvironment.java rename to platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java index dc2f5f2859da..0719e39c2efb 100644 --- a/platform/core-impl/src/com/intellij/core/CoreEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java @@ -73,19 +73,15 @@ import java.lang.reflect.Modifier; /** * @author yole */ -public class CoreEnvironment { +public class CoreApplicationEnvironment { private final CoreFileTypeRegistry myFileTypeRegistry; private final CoreEncodingRegistry myEncodingRegistry; protected final MockApplication myApplication; - protected MockProject myProject; private final CoreLocalFileSystem myLocalFileSystem; protected final CoreJarFileSystem myJarFileSystem; - protected final MockFileIndexFacade myFileIndexFacade; - protected final PsiManagerImpl myPsiManager; private final Disposable myParentDisposable; - protected final MessageBusImpl myMessageBus; - public CoreEnvironment(Disposable parentDisposable) { + public CoreApplicationEnvironment(Disposable parentDisposable) { myParentDisposable = parentDisposable; Extensions.cleanRootArea(myParentDisposable); @@ -101,7 +97,6 @@ public class CoreEnvironment { myJarFileSystem = new CoreJarFileSystem(); Extensions.registerAreaClass(ExtensionAreas.IDEA_PROJECT, null); - myProject = new MockProject(myApplication.getPicoContainer(), myParentDisposable); final MutablePicoContainer appContainer = myApplication.getPicoContainer(); registerComponentInstance(appContainer, FileDocumentManager.class, new MockFileDocumentManagerImpl(new Function() { @@ -137,26 +132,6 @@ public class CoreEnvironment { registerApplicationExtensionPoint(ContentBasedFileSubstitutor.EP_NAME, ContentBasedFileSubstitutor.class); registerExtensionPoint(Extensions.getRootArea(), BinaryFileStubBuilders.EP_NAME, FileTypeExtensionPoint.class); - myFileIndexFacade = new MockFileIndexFacade(myProject); - myMessageBus = new MessageBusImpl(); - - PsiModificationTrackerImpl modificationTracker = new PsiModificationTrackerImpl(myProject); - myProject.registerService(PsiModificationTracker.class, modificationTracker); - myProject.registerService(FileIndexFacade.class, myFileIndexFacade); - myProject.registerService(ResolveScopeManager.class, new MockResolveScopeManager(myProject)); - myProject.registerService(ResolveCache.class, new ResolveCache(myMessageBus)); - - registerProjectExtensionPoint(PsiTreeChangePreprocessor.EP_NAME, PsiTreeChangePreprocessor.class); - myPsiManager = new PsiManagerImpl(myProject, null, null, myFileIndexFacade, myMessageBus, modificationTracker); - ((FileManagerImpl) myPsiManager.getFileManager()).markInitialized(); - registerProjectComponent(PsiManager.class, myPsiManager); - - myProject.registerService(PsiFileFactory.class, new PsiFileFactoryImpl(myPsiManager)); - myProject.registerService(CachedValuesManager.class, new CachedValuesManagerImpl(myProject, new PsiCachedValuesFactory(myPsiManager))); - myProject.registerService(PsiDirectoryFactory.class, new PsiDirectoryFactoryImpl(myPsiManager)); - myProject.registerService(ProjectScopeBuilder.class, new CoreProjectScopeBuilder(myProject, myFileIndexFacade)); - myProject.registerService(DumbService.class, new MockDumbService(myProject)); - ProgressIndicatorProvider.ourInstance = new ProgressIndicatorProvider() { @Override public ProgressIndicator getProgressIndicator() { @@ -190,14 +165,6 @@ public class CoreEnvironment { registerComponentInstance(myApplication.getPicoContainer(), interfaceClass, implementation); } - public void registerProjectComponent(final Class interfaceClass, final T implementation) { - registerComponentInstance(myProject.getPicoContainer(), interfaceClass, implementation); - } - - public MockProject getProject() { - return myProject; - } - public void registerFileType(FileType fileType, String extension) { myFileTypeRegistry.registerFileType(fileType, extension); } @@ -213,7 +180,7 @@ public class CoreEnvironment { protected void addExplicitExtension(final LanguageExtension instance, final Language language, final T object) { instance.addExplicitExtension(language, object); - Disposer.register(myProject, new Disposable() { + Disposer.register(myParentDisposable, new Disposable() { @Override public void dispose() { instance.removeExplicitExtension(language, object); @@ -223,7 +190,7 @@ public class CoreEnvironment { protected void addExplicitExtension(final FileTypeExtension instance, final FileType fileType, final T object) { instance.addExplicitExtension(fileType, object); - Disposer.register(myProject, new Disposable() { + Disposer.register(myParentDisposable, new Disposable() { @Override public void dispose() { instance.removeExplicitExtension(fileType, object); @@ -234,7 +201,7 @@ public class CoreEnvironment { protected void addExtension(ExtensionPointName name, final T extension) { final ExtensionPoint extensionPoint = Extensions.getRootArea().getExtensionPoint(name); extensionPoint.registerExtension(extension); - Disposer.register(myProject, new Disposable() { + Disposer.register(myParentDisposable, new Disposable() { @Override public void dispose() { extensionPoint.unregisterExtension(extension); @@ -260,11 +227,6 @@ public class CoreEnvironment { registerExtensionPoint(Extensions.getRootArea(), name, aClass); } - public void registerProjectExtensionPoint(final ExtensionPointName extensionPointName, - final Class aClass) { - registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass); - } - public CoreLocalFileSystem getLocalFileSystem() { return myLocalFileSystem; } @@ -272,8 +234,4 @@ public class CoreEnvironment { public CoreJarFileSystem getJarFileSystem() { return myJarFileSystem; } - - public void addLibraryRoot(VirtualFile file) { - myFileIndexFacade.addLibraryRoot(file); - } } diff --git a/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java new file mode 100644 index 000000000000..832a2265c53a --- /dev/null +++ b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java @@ -0,0 +1,100 @@ +/* + * 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.core; + +import com.intellij.mock.MockDumbService; +import com.intellij.mock.MockFileIndexFacade; +import com.intellij.mock.MockProject; +import com.intellij.mock.MockResolveScopeManager; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.roots.FileIndexFacade; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.PsiManager; +import com.intellij.psi.impl.*; +import com.intellij.psi.impl.file.PsiDirectoryFactory; +import com.intellij.psi.impl.file.PsiDirectoryFactoryImpl; +import com.intellij.psi.impl.file.impl.FileManagerImpl; +import com.intellij.psi.impl.source.resolve.ResolveCache; +import com.intellij.psi.search.ProjectScopeBuilder; +import com.intellij.psi.util.CachedValuesManager; +import com.intellij.psi.util.PsiModificationTracker; +import com.intellij.util.CachedValuesManagerImpl; +import com.intellij.util.messages.impl.MessageBusImpl; + +public class CoreProjectEnvironment { + private final Disposable myParentDisposable; + private final CoreApplicationEnvironment myEnvironment; + + protected final MockFileIndexFacade myFileIndexFacade; + protected final PsiManagerImpl myPsiManager; + protected final MockProject myProject; + protected final MessageBusImpl myMessageBus; + + public CoreProjectEnvironment(Disposable parentDisposable, CoreApplicationEnvironment applicationEnvironment) { + myParentDisposable = parentDisposable; + myEnvironment = applicationEnvironment; + myProject = new MockProject(myEnvironment.getApplication().getPicoContainer(), myParentDisposable); + + myFileIndexFacade = new MockFileIndexFacade(myProject); + myMessageBus = new MessageBusImpl(); + + PsiModificationTrackerImpl modificationTracker = new PsiModificationTrackerImpl(myProject); + myProject.registerService(PsiModificationTracker.class, modificationTracker); + myProject.registerService(FileIndexFacade.class, myFileIndexFacade); + myProject.registerService(ResolveScopeManager.class, new MockResolveScopeManager(myProject)); + myProject.registerService(ResolveCache.class, new ResolveCache(myMessageBus)); + + registerProjectExtensionPoint(PsiTreeChangePreprocessor.EP_NAME, PsiTreeChangePreprocessor.class); + myPsiManager = new PsiManagerImpl(myProject, null, null, myFileIndexFacade, myMessageBus, modificationTracker); + ((FileManagerImpl) myPsiManager.getFileManager()).markInitialized(); + registerProjectComponent(PsiManager.class, myPsiManager); + + myProject.registerService(PsiFileFactory.class, new PsiFileFactoryImpl(myPsiManager)); + myProject.registerService(CachedValuesManager.class, new CachedValuesManagerImpl(myProject, new PsiCachedValuesFactory(myPsiManager))); + myProject.registerService(PsiDirectoryFactory.class, new PsiDirectoryFactoryImpl(myPsiManager)); + myProject.registerService(ProjectScopeBuilder.class, new CoreProjectScopeBuilder(myProject, myFileIndexFacade)); + myProject.registerService(DumbService.class, new MockDumbService(myProject)); + } + + public void registerProjectExtensionPoint(final ExtensionPointName extensionPointName, + final Class aClass) { + CoreApplicationEnvironment.registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass); + } + + public void addLibraryRoot(VirtualFile file) { + myFileIndexFacade.addLibraryRoot(file); + } + + public void registerProjectComponent(final Class interfaceClass, final T implementation) { + CoreApplicationEnvironment.registerComponentInstance(myProject.getPicoContainer(), interfaceClass, implementation); + } + + public Disposable getParentDisposable() { + return myParentDisposable; + } + + public CoreApplicationEnvironment getEnvironment() { + return myEnvironment; + } + + public MockProject getProject() { + return myProject; + } +} diff --git a/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java b/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java index 07b3e10b0f49..fb21d36b0fc1 100644 --- a/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/core/CoreModuleManagerTest.java @@ -34,12 +34,16 @@ import java.io.IOException; */ public class CoreModuleManagerTest extends UsefulTestCase { public void _testLoadingModules() throws IOException, JDOMException { - CoreEnvironment env = new CoreEnvironment(getTestRootDisposable()); - ProjectModelEnvironment.register(env); + CoreApplicationEnvironment appEnv = new CoreApplicationEnvironment(getTestRootDisposable()); + ProjectModelEnvironment.registerApplicationEnvironment(appEnv); + + CoreProjectEnvironment prjEnv = new CoreProjectEnvironment(getTestRootDisposable(), appEnv); + ProjectModelEnvironment.registerProjectEnvironment(prjEnv); + final String projectPath = PathManagerEx.getTestDataPath("/core/loadingTest"); VirtualFile vFile = StandardFileSystems.local().findFileByPath(projectPath); - CoreProjectLoader.loadProject(env.getProject(), vFile); - final ModuleManager moduleManager = ModuleManager.getInstance(env.getProject()); + CoreProjectLoader.loadProject(prjEnv.getProject(), vFile); + final ModuleManager moduleManager = ModuleManager.getInstance(prjEnv.getProject()); final Module[] modules = moduleManager.getModules(); assertEquals(1, modules.length); diff --git a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java index 1b5e7bac4bda..7ea28dc354a4 100644 --- a/platform/projectModel-impl/src/com/intellij/core/CoreModule.java +++ b/platform/projectModel-impl/src/com/intellij/core/CoreModule.java @@ -50,7 +50,7 @@ public class CoreModule extends MockComponentManager implements ModuleEx { myPath = moduleFilePath; Extensions.instantiateArea(ExtensionAreas.IDEA_MODULE, this, null); - CoreEnvironment.registerExtensionPoint(Extensions.getArea(this), ModuleExtension.EP_NAME, ModuleExtension.class); + CoreApplicationEnvironment.registerExtensionPoint(Extensions.getArea(this), ModuleExtension.EP_NAME, ModuleExtension.class); Disposer.register(parentDisposable, new Disposable() { @Override public void dispose() { diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java index 4019e1033fc2..9890d582cca4 100644 --- a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java +++ b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java @@ -25,6 +25,7 @@ import com.intellij.openapi.components.impl.ProjectPathMacroManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.ProjectFileIndex; @@ -39,20 +40,22 @@ import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; * @author yole */ public class ProjectModelEnvironment { - public static void register(CoreEnvironment env) { + public static void registerApplicationEnvironment(CoreApplicationEnvironment env) { Extensions.registerAreaClass(ExtensionAreas.IDEA_MODULE, null); PathMacrosImpl pathMacros = new PathMacrosImpl(); env.registerApplicationComponent(PathMacros.class, pathMacros); - CoreEnvironment.registerApplicationExtensionPoint(OrderRootType.EP_NAME, OrderRootType.class); - CoreEnvironment.registerApplicationExtensionPoint(SdkFinder.EP_NAME, SdkFinder.class); - CoreEnvironment.registerApplicationExtensionPoint(PathMacroFilter.EP_NAME, PathMacroFilter.class); + CoreApplicationEnvironment.registerApplicationExtensionPoint(OrderRootType.EP_NAME, OrderRootType.class); + CoreApplicationEnvironment.registerApplicationExtensionPoint(SdkFinder.EP_NAME, SdkFinder.class); + CoreApplicationEnvironment.registerApplicationExtensionPoint(PathMacroFilter.EP_NAME, PathMacroFilter.class); env.getApplication().registerService(ProjectJdkTable.class, new CoreProjectJdkTable()); env.getApplication().registerService(ApplicationLibraryTable.class, new ApplicationLibraryTable()); env.getApplication().registerService(LibraryTablesRegistrar.class, new LibraryTablesRegistrarImpl()); + } + public static void registerProjectEnvironment(CoreProjectEnvironment env) { final MockProject project = env.getProject(); env.registerProjectComponent(ModuleManager.class, new CoreModuleManager(project, env.getParentDisposable())); - env.registerProjectComponent(PathMacroManager.class, new ProjectPathMacroManager(pathMacros, project)); + env.registerProjectComponent(PathMacroManager.class, new ProjectPathMacroManager(PathMacros.getInstance(), project)); env.registerProjectExtensionPoint(DirectoryIndexExcludePolicy.EP_NAME, DirectoryIndexExcludePolicy.class); DirectoryIndex index = new DirectoryIndexImpl(project); //env.registerProjectComponent(DirectoryIndex.class, index); From d386de4d02b98c5eb570c7832dacd240247d4409 Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Wed, 23 May 2012 20:34:26 +0200 Subject: [PATCH 03/21] Copyright --- .../com/intellij/psi/impl/java/stubs/JavaClassElementType.java | 2 +- platform/lang-api/src/com/intellij/psi/stubs/StubIndex.java | 2 +- .../indexing/CustomImplementationFileBasedIndexExtension.java | 2 +- .../lang-impl/src/com/intellij/util/indexing/IndexStorage.java | 2 +- .../src/com/intellij/util/indexing/UpdatableIndex.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java index 40c50a568557..3a73ad1cd809 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/JavaClassElementType.java @@ -108,7 +108,7 @@ public abstract class JavaClassElementType extends JavaStubElementType Date: Thu, 24 May 2012 15:06:44 +0200 Subject: [PATCH 04/21] load project model with VFS only --- .../core/CoreApplicationEnvironment.java | 25 ++++++------------- .../vfs/local/CoreLocalVirtualFile.java | 1 - .../core/ProjectModelEnvironment.java | 1 - .../components/impl/BasePathMacroManager.java | 20 +++++++-------- .../module/impl/ModuleManagerImpl.java | 8 ++++-- 5 files changed, 24 insertions(+), 31 deletions(-) diff --git a/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java index 0719e39c2efb..84710530de59 100644 --- a/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java @@ -17,7 +17,9 @@ package com.intellij.core; import com.intellij.lang.*; import com.intellij.lang.impl.PsiBuilderFactoryImpl; -import com.intellij.mock.*; +import com.intellij.mock.MockApplication; +import com.intellij.mock.MockFileDocumentManagerImpl; +import com.intellij.mock.MockReferenceProvidersRegistry; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -31,11 +33,8 @@ import com.intellij.openapi.extensions.ExtensionsArea; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileTypes.*; import com.intellij.openapi.progress.*; -import com.intellij.openapi.project.DumbService; -import com.intellij.openapi.roots.FileIndexFacade; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.StaticGetter; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.openapi.vfs.encoding.EncodingRegistry; @@ -45,25 +44,13 @@ import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem; import com.intellij.openapi.vfs.local.CoreLocalFileSystem; import com.intellij.openapi.vfs.newvfs.FileSystemPersistence; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; -import com.intellij.psi.PsiFileFactory; -import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReferenceService; import com.intellij.psi.PsiReferenceServiceImpl; -import com.intellij.psi.impl.*; -import com.intellij.psi.impl.file.PsiDirectoryFactory; -import com.intellij.psi.impl.file.PsiDirectoryFactoryImpl; -import com.intellij.psi.impl.file.impl.FileManagerImpl; -import com.intellij.psi.impl.source.resolve.ResolveCache; import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; -import com.intellij.psi.search.ProjectScopeBuilder; import com.intellij.psi.stubs.BinaryFileStubBuilders; import com.intellij.psi.stubs.CoreStubTreeLoader; import com.intellij.psi.stubs.StubTreeLoader; -import com.intellij.psi.util.CachedValuesManager; -import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.util.CachedValuesManagerImpl; import com.intellij.util.Function; -import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.impl.MessageBusImpl; import org.jetbrains.annotations.NotNull; import org.picocontainer.MutablePicoContainer; @@ -93,7 +80,7 @@ public class CoreApplicationEnvironment { new StaticGetter(myFileTypeRegistry), new StaticGetter(myEncodingRegistry), myParentDisposable); - myLocalFileSystem = new CoreLocalFileSystem(); + myLocalFileSystem = createLocalFileSystem(); myJarFileSystem = new CoreJarFileSystem(); Extensions.registerAreaClass(ExtensionAreas.IDEA_PROJECT, null); @@ -153,6 +140,10 @@ public class CoreApplicationEnvironment { }; } + protected CoreLocalFileSystem createLocalFileSystem() { + return new CoreLocalFileSystem(); + } + public MockApplication getApplication() { return myApplication; } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java index 35076321c4b6..3b575138a972 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/local/CoreLocalVirtualFile.java @@ -134,7 +134,6 @@ public class CoreLocalVirtualFile extends VirtualFile { return 0; } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java index 9890d582cca4..60e8c07f98b9 100644 --- a/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java +++ b/platform/projectModel-impl/src/com/intellij/core/ProjectModelEnvironment.java @@ -25,7 +25,6 @@ import com.intellij.openapi.components.impl.ProjectPathMacroManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.ProjectFileIndex; diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java index 20106e0e327d..0ef62c27ae24 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/BasePathMacroManager.java @@ -24,12 +24,13 @@ import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.StandardFileSystems; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.FactoryMap; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.util.*; public class BasePathMacroManager extends PathMacroManager { @@ -41,15 +42,14 @@ public class BasePathMacroManager extends PathMacroManager { protected static void addFileHierarchyReplacements(ExpandMacroToPathMap result, String macroName, @Nullable String path) { if (path == null) return; - final File f = new File(FileUtil.toSystemDependentName(path)); - addFileHierarchyReplacements(result, f, "$" + macroName + "$"); + addFileHierarchyReplacements(result, StandardFileSystems.local().findFileByPath(path), "$" + macroName + "$"); } - protected static void addFileHierarchyReplacements(ExpandMacroToPathMap result, @Nullable File f, String macro) { + private static void addFileHierarchyReplacements(ExpandMacroToPathMap result, @Nullable VirtualFile f, String macro) { if (f == null) return; - addFileHierarchyReplacements(result, f.getParentFile(), macro + "/.."); + addFileHierarchyReplacements(result, f.getParent(), macro + "/.."); - final String path = FileUtil.toSystemIndependentName(f.getAbsolutePath()); + final String path = FileUtil.toSystemIndependentName(f.getCanonicalPath()); String s = macro; if (StringUtil.endsWithChar(path, '/')) s += "/"; result.put(s, path); @@ -59,10 +59,10 @@ public class BasePathMacroManager extends PathMacroManager { if (path == null) return; String macro = "$" + macroName + "$"; - File dir = new File(FileUtil.toSystemDependentName(path)); + VirtualFile dir = StandardFileSystems.local().findFileByPath(path); boolean check = false; - while (dir != null && dir.getParentFile() != null) { - path = FileUtil.toSystemIndependentName(dir.getAbsolutePath()); + while (dir != null && dir.getParent() != null) { + path = FileUtil.toSystemIndependentName(dir.getCanonicalPath()); String s = macro; if (StringUtil.endsWithChar(path, '/')) s += "/"; @@ -83,7 +83,7 @@ public class BasePathMacroManager extends PathMacroManager { macro += "/.."; check = true; - dir = dir.getParentFile(); + dir = dir.getParent(); } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java index 510b837457ba..7ebe49401d5e 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java @@ -652,9 +652,13 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project private Module loadModuleInternal(String filePath, @Nullable ProgressIndicator progressIndicator) throws ModuleWithNameAlreadyExists, IOException, StateStorageException { - final File moduleFile = new File(filePath); - filePath = resolveShortWindowsName(filePath); + final VirtualFile moduleFile = StandardFileSystems.local().findFileByPath(filePath); + if (moduleFile == null) { + throw new IOException(ProjectBundle.message("module.file.does.not.exist.error", filePath)); + } + + filePath = resolveShortWindowsName(filePath); final String name = moduleFile.getName(); if (progressIndicator != null) { progressIndicator.setText2(FileUtil.getNameWithoutExtension(name)); From a1409b76c1448a50cd1597064795a1526d3e0476 Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Thu, 24 May 2012 16:10:15 +0200 Subject: [PATCH 05/21] SerializationManager --- .idea/codeStyleSettings.xml | 98 ++++++++-- .../impl/java/stubs/JavaClassElementType.java | 2 +- .../intellij/psi/stubs/StubInputStream.java | 9 +- .../intellij/psi/stubs/StubOutputStream.java | 9 +- .../psi/stubs/SerializationManagerBase.java | 174 ++++++++++++++++++ .../psi/stubs/StubElementTypeHolderEP.java | 0 .../psi/stubs/SerializationManagerImpl.java | 151 +-------------- .../util/io/AbstractStringEnumerator.java | 34 ++++ .../intellij/util/io/DataInputOutputUtil.java | 4 +- .../util/io/PersistentStringEnumerator.java | 2 +- .../src/com/intellij/util/io/StringRef.java | 10 +- 11 files changed, 310 insertions(+), 183 deletions(-) create mode 100644 platform/indexing-api/src/com/intellij/psi/stubs/SerializationManagerBase.java rename platform/{lang-api => indexing-api}/src/com/intellij/psi/stubs/StubElementTypeHolderEP.java (100%) create mode 100644 platform/util/src/com/intellij/util/io/AbstractStringEnumerator.java diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml index b99a172034b3..6a640c6e8770 100644 --- a/.idea/codeStyleSettings.xml +++ b/.idea/codeStyleSettings.xml @@ -90,12 +90,6 @@ - - - - @@ -104,23 +98,57 @@