fix "IDEA-221944 Deadlock on opening second project" and support preloading for proje...
[idea/community.git] / platform / projectModel-impl / src / com / intellij / core / CoreModule.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.core;
3
4 import com.intellij.ide.highlighter.ModuleFileType;
5 import com.intellij.mock.MockComponentManager;
6 import com.intellij.openapi.Disposable;
7 import com.intellij.openapi.components.PathMacroManager;
8 import com.intellij.openapi.components.impl.ModulePathMacroManager;
9 import com.intellij.openapi.extensions.ExtensionPointName;
10 import com.intellij.openapi.module.impl.ModuleEx;
11 import com.intellij.openapi.module.impl.ModuleScopeProvider;
12 import com.intellij.openapi.project.Project;
13 import com.intellij.openapi.roots.ModuleFileIndex;
14 import com.intellij.openapi.roots.ModuleRootManager;
15 import com.intellij.openapi.roots.impl.ModuleFileIndexImpl;
16 import com.intellij.openapi.roots.impl.ModuleRootManagerImpl;
17 import com.intellij.openapi.util.Disposer;
18 import com.intellij.openapi.util.text.StringUtil;
19 import com.intellij.openapi.vfs.VirtualFile;
20 import com.intellij.psi.search.GlobalSearchScope;
21 import com.intellij.util.PathUtil;
22 import org.jetbrains.annotations.NotNull;
23 import org.jetbrains.annotations.Nullable;
24
25 /**
26  * @author yole
27  */
28 public class CoreModule extends MockComponentManager implements ModuleEx {
29   private final String myPath;
30   @NotNull private final Disposable myLifetime;
31   @NotNull private final Project myProject;
32   @NotNull private final ModuleScopeProvider myModuleScopeProvider;
33
34   public CoreModule(@NotNull Disposable parentDisposable, @NotNull Project project, String moduleFilePath) {
35     super(project.getPicoContainer(), parentDisposable);
36     myLifetime = parentDisposable;
37     myProject = project;
38     myPath = moduleFilePath;
39
40     initModuleExtensions();
41
42     final ModuleRootManagerImpl moduleRootManager =
43       new ModuleRootManagerImpl(this) {
44         @Override
45         public void loadState(@NotNull ModuleRootManagerState object) {
46           loadState(object, false);
47         }
48       };
49     Disposer.register(parentDisposable, moduleRootManager);
50     getPicoContainer().registerComponentInstance(ModuleRootManager.class, moduleRootManager);
51     getPicoContainer().registerComponentInstance(PathMacroManager.class, createModulePathMacroManager(project));
52     getPicoContainer().registerComponentInstance(ModuleFileIndex.class, createModuleFileIndex());
53     myModuleScopeProvider = createModuleScopeProvider();
54   }
55
56   protected void initModuleExtensions() {
57   }
58
59   protected <T> void addModuleExtension(@NotNull ExtensionPointName<T> name, @NotNull T extension) {
60     //noinspection TestOnlyProblems
61     name.getPoint(this).registerExtension(extension, myLifetime);
62   }
63
64   protected ModuleScopeProvider createModuleScopeProvider() {
65     return new CoreModuleScopeProvider();
66   }
67
68   // used by Upsource
69   protected PathMacroManager createModulePathMacroManager(@SuppressWarnings("unused") @NotNull Project project) {
70     return new ModulePathMacroManager(this);
71   }
72
73   protected ModuleFileIndex createModuleFileIndex() {
74     return new ModuleFileIndexImpl(this);
75   }
76
77   @Override
78   public void clearScopesCache() {
79     myModuleScopeProvider.clearCache();
80   }
81
82   @Override
83   public VirtualFile getModuleFile() {
84     throw new UnsupportedOperationException();
85   }
86
87   @NotNull
88   @Override
89   public String getModuleFilePath() {
90     return myPath;
91   }
92
93   @NotNull
94   @Override
95   public Project getProject() {
96     return myProject;
97   }
98
99   @NotNull
100   @Override
101   public String getName() {
102     return StringUtil.trimEnd(PathUtil.getFileName(myPath), ModuleFileType.DOT_DEFAULT_EXTENSION);
103   }
104
105   @Override
106   public boolean isLoaded() {
107     return true;
108   }
109
110   @Override
111   public void setOption(@NotNull String optionName, @Nullable String optionValue) {
112     throw new UnsupportedOperationException();
113   }
114
115   @Override
116   public String getOptionValue(@NotNull String optionName) {
117     throw new UnsupportedOperationException();
118   }
119
120   @NotNull
121   @Override
122   public GlobalSearchScope getModuleScope() {
123     return myModuleScopeProvider.getModuleScope();
124   }
125
126   @NotNull
127   @Override
128   public GlobalSearchScope getModuleScope(boolean includeTests) {
129     return myModuleScopeProvider.getModuleScope(includeTests);
130   }
131
132   @NotNull
133   @Override
134   public GlobalSearchScope getModuleWithLibrariesScope() {
135     return myModuleScopeProvider.getModuleWithLibrariesScope();
136   }
137
138   @NotNull
139   @Override
140   public GlobalSearchScope getModuleWithDependenciesScope() {
141     return myModuleScopeProvider.getModuleWithDependenciesScope();
142   }
143
144   @NotNull
145   @Override
146   public GlobalSearchScope getModuleContentScope() {
147     return myModuleScopeProvider.getModuleContentScope();
148   }
149
150   @NotNull
151   @Override
152   public GlobalSearchScope getModuleContentWithDependenciesScope() {
153     return myModuleScopeProvider.getModuleContentWithDependenciesScope();
154   }
155
156   @NotNull
157   @Override
158   public GlobalSearchScope getModuleWithDependenciesAndLibrariesScope(boolean includeTests) {
159     return myModuleScopeProvider.getModuleWithDependenciesAndLibrariesScope(includeTests);
160   }
161
162   @NotNull
163   @Override
164   public GlobalSearchScope getModuleWithDependentsScope() {
165     return myModuleScopeProvider.getModuleWithDependentsScope();
166   }
167
168   @NotNull
169   @Override
170   public GlobalSearchScope getModuleTestsWithDependentsScope() {
171     return myModuleScopeProvider.getModuleTestsWithDependentsScope();
172   }
173
174   @NotNull
175   @Override
176   public GlobalSearchScope getModuleRuntimeScope(boolean includeTests) {
177     return myModuleScopeProvider.getModuleRuntimeScope(includeTests);
178   }
179 }