2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.execution
.testframework
;
18 import com
.intellij
.openapi
.module
.Module
;
19 import com
.intellij
.openapi
.module
.ModuleManager
;
20 import com
.intellij
.openapi
.project
.Project
;
21 import com
.intellij
.openapi
.vfs
.VirtualFile
;
22 import com
.intellij
.psi
.search
.GlobalSearchScope
;
23 import com
.intellij
.util
.containers
.HashMap
;
24 import com
.intellij
.util
.graph
.Graph
;
25 import org
.jetbrains
.annotations
.NotNull
;
32 public abstract class SourceScope
{
33 public abstract GlobalSearchScope
getGlobalSearchScope();
34 public abstract Project
getProject();
35 public abstract GlobalSearchScope
getLibrariesScope();
37 public static Map
<Module
, Collection
<Module
>> buildAllDependencies(final Project project
) {
38 Graph
<Module
> graph
= ModuleManager
.getInstance(project
).moduleGraph();
39 Map
<Module
, Collection
<Module
>> result
= new HashMap
<Module
, Collection
<Module
>>();
40 for (final Module module
: graph
.getNodes()) {
41 buildDependenciesForModule(module
, graph
, result
);
46 private static void buildDependenciesForModule(final Module module
, final Graph
<Module
> graph
, Map
<Module
, Collection
<Module
>> map
) {
47 final Set
<Module
> deps
= new com
.intellij
.util
.containers
.HashSet
<Module
>();
48 map
.put(module
, deps
);
51 void traverse(Module m
) {
52 for (Iterator
<Module
> iterator
= graph
.getIn(m
); iterator
.hasNext();) {
53 final Module dep
= iterator
.next();
54 if (!deps
.contains(dep
)) {
63 private abstract static class ModuleSourceScope
extends SourceScope
{
64 private final Project myProject
;
66 protected ModuleSourceScope(final Project project
) {
70 public Project
getProject() {
76 public static SourceScope
wholeProject(final Project project
) {
77 return new SourceScope() {
78 public GlobalSearchScope
getGlobalSearchScope() {
79 return GlobalSearchScope
.allScope(project
);
82 public Project
getProject() {
86 public Module
[] getModulesToCompile() {
87 return ModuleManager
.getInstance(project
).getModules();
90 public GlobalSearchScope
getLibrariesScope() {
91 return getGlobalSearchScope();
96 public static SourceScope
modulesWithDependencies(final Module
[] modules
) {
97 if (modules
== null || modules
.length
== 0) return null;
98 return new ModuleSourceScope(modules
[0].getProject()) {
99 public GlobalSearchScope
getGlobalSearchScope() {
100 return evaluateScopesAndUnite(modules
, new ScopeForModuleEvaluator() {
101 public GlobalSearchScope
evaluate(final Module module
) {
102 return GlobalSearchScope
.moduleWithDependenciesScope(module
);
107 public GlobalSearchScope
getLibrariesScope() {
108 return evaluateScopesAndUnite(modules
, new ScopeForModuleEvaluator() {
109 public GlobalSearchScope
evaluate(final Module module
) {
110 return new ModuleWithDependenciesAndLibsDependencies(module
);
115 public Module
[] getModulesToCompile() {
121 private interface ScopeForModuleEvaluator
{
122 GlobalSearchScope
evaluate(Module module
);
124 private static GlobalSearchScope
evaluateScopesAndUnite(final Module
[] modules
, final ScopeForModuleEvaluator evaluator
) {
125 GlobalSearchScope scope
= evaluator
.evaluate(modules
[0]);
126 for (int i
= 1; i
< modules
.length
; i
++) {
127 final Module module
= modules
[i
];
128 final GlobalSearchScope otherscope
= evaluator
.evaluate(module
);
129 scope
= scope
.uniteWith(otherscope
);
134 public static SourceScope
modules(final Module
[] modules
) {
135 if (modules
== null || modules
.length
== 0) return null;
136 return new ModuleSourceScope(modules
[0].getProject()) {
137 public GlobalSearchScope
getGlobalSearchScope() {
138 return evaluateScopesAndUnite(modules
, new ScopeForModuleEvaluator() {
139 public GlobalSearchScope
evaluate(final Module module
) {
140 return GlobalSearchScope
.moduleScope(module
);
145 public GlobalSearchScope
getLibrariesScope() {
146 return evaluateScopesAndUnite(modules
, new ScopeForModuleEvaluator() {
147 public GlobalSearchScope
evaluate(final Module module
) {
148 return GlobalSearchScope
.moduleWithLibrariesScope(module
);
153 public Module
[] getModulesToCompile() {
159 public abstract Module
[] getModulesToCompile();
161 private static class ModuleWithDependenciesAndLibsDependencies
extends GlobalSearchScope
{
162 private final GlobalSearchScope myMainScope
;
163 private final Collection
<GlobalSearchScope
> myScopes
= new ArrayList
<GlobalSearchScope
>();
165 public ModuleWithDependenciesAndLibsDependencies(final Module module
) {
166 super(module
.getProject());
167 myMainScope
= GlobalSearchScope
.moduleWithDependenciesAndLibrariesScope(module
);
168 final Map
<Module
, Collection
<Module
>> map
= buildAllDependencies(module
.getProject());
169 if (map
== null) return;
170 final Collection
<Module
> modules
= map
.get(module
);
171 for (final Module dependency
: modules
) {
172 myScopes
.add(GlobalSearchScope
.moduleWithLibrariesScope(dependency
));
176 public boolean contains(final VirtualFile file
) {
177 return findScopeFor(file
) != null;
180 public int compare(final VirtualFile file1
, final VirtualFile file2
) {
181 final GlobalSearchScope scope
= findScopeFor(file1
);
182 if (scope
.contains(file2
)) return scope
.compare(file1
, file2
);
186 public boolean isSearchInModuleContent(@NotNull final Module aModule
) {
187 return myMainScope
.isSearchInModuleContent(aModule
);
190 public boolean isSearchInLibraries() {
194 private GlobalSearchScope
findScopeFor(final VirtualFile file
) {
195 if (myMainScope
.contains(file
)) return myMainScope
;
196 for (final GlobalSearchScope scope
: myScopes
) {
197 if (scope
.contains(file
)) return scope
;