Skip to content

Commit a7cf2bb

Browse files
#30: Refactor file reference source roots lookup logic
1 parent 0400535 commit a7cf2bb

File tree

5 files changed

+91
-34
lines changed

5 files changed

+91
-34
lines changed

src/main/java/io/protostuff/jetbrains/plugin/psi/FileReferenceNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public ProtoPsiFileRoot getTarget() {
7979
}
8080

8181
private ProtoPsiFileRoot getTarget(@NotNull String filename, @NotNull Module module) {
82-
Collection<PsiFileSystemItem> roots = FilePathReferenceProvider.getRoots(module);
82+
Collection<PsiFileSystemItem> roots = new FilePathReferenceProvider().getRoots(module);
8383
for (PsiFileSystemItem root : roots) {
8484
VirtualFile file = root.getVirtualFile().findFileByRelativePath(getFilename());
8585
if (file != null) {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.protostuff.jetbrains.plugin.reference.file;
2+
3+
import com.intellij.openapi.module.Module;
4+
import com.intellij.openapi.roots.ModuleRootManager;
5+
import com.intellij.openapi.vfs.VirtualFile;
6+
7+
/**
8+
* Returns "all source roots". In the IntelliJ IDEA it include source & resource roots,
9+
* for both main and test source sets.
10+
*
11+
* @author Kostiantyn Shchepanovskyi
12+
*/
13+
class AllSourceRootsProvider implements FilePathReferenceProvider.SourceRootsProvider {
14+
@Override
15+
public VirtualFile[] getSourceRoots(Module module) {
16+
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
17+
return moduleRootManager.orderEntries().getAllSourceRoots();
18+
}
19+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.protostuff.jetbrains.plugin.reference.file;
2+
3+
import com.intellij.openapi.module.Module;
4+
import com.intellij.openapi.project.Project;
5+
import com.intellij.openapi.vfs.LocalFileSystem;
6+
import com.intellij.openapi.vfs.VirtualFile;
7+
import io.protostuff.jetbrains.plugin.settings.ProtobufSettings;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
/**
12+
* Returns source roots for custom include paths.
13+
*
14+
* @author Kostiantyn Shchepanovskyi
15+
*/
16+
class CustomIncludePathRootsProvider implements FilePathReferenceProvider.SourceRootsProvider {
17+
@Override
18+
public VirtualFile[] getSourceRoots(Module module) {
19+
List<VirtualFile> result = new ArrayList<>();
20+
Project project = module.getProject();
21+
ProtobufSettings settings = project.getComponent(ProtobufSettings.class);
22+
List<String> includePaths = settings.getIncludePaths();
23+
for (String includePath : includePaths) {
24+
VirtualFile path = LocalFileSystem.getInstance().findFileByPath(includePath);
25+
if (path != null && path.isDirectory()) {
26+
result.add(path);
27+
}
28+
}
29+
return result.toArray(new VirtualFile[0]);
30+
}
31+
}

src/main/java/io/protostuff/jetbrains/plugin/reference/file/FilePathReferenceProvider.java

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,8 @@
1818

1919
import com.intellij.openapi.module.Module;
2020
import com.intellij.openapi.module.ModuleUtilCore;
21-
import com.intellij.openapi.project.Project;
22-
import com.intellij.openapi.roots.ModuleRootManager;
2321
import com.intellij.openapi.util.Condition;
2422
import com.intellij.openapi.util.TextRange;
25-
import com.intellij.openapi.vfs.LocalFileSystem;
2623
import com.intellij.openapi.vfs.VirtualFile;
2724
import com.intellij.psi.PsiCompiledElement;
2825
import com.intellij.psi.PsiDirectory;
@@ -35,7 +32,7 @@
3532
import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet;
3633
import com.intellij.util.ProcessingContext;
3734
import com.intellij.util.containers.ContainerUtil;
38-
import io.protostuff.jetbrains.plugin.settings.ProtobufSettings;
35+
import java.util.ArrayList;
3936
import java.util.Collection;
4037
import java.util.Collections;
4138
import java.util.List;
@@ -53,48 +50,39 @@ public class FilePathReferenceProvider extends PsiReferenceProvider {
5350

5451
private final boolean myEndingSlashNotAllowed;
5552

53+
interface SourceRootsProvider {
54+
VirtualFile[] getSourceRoots(Module module);
55+
}
56+
57+
private List<SourceRootsProvider> sourceRootsProviders = new ArrayList<>();
58+
5659
public FilePathReferenceProvider() {
5760
this(true);
5861
}
5962

6063
public FilePathReferenceProvider(boolean endingSlashNotAllowed) {
6164
myEndingSlashNotAllowed = endingSlashNotAllowed;
65+
sourceRootsProviders.add(new AllSourceRootsProvider());
66+
sourceRootsProviders.add(new CustomIncludePathRootsProvider());
67+
sourceRootsProviders.add(new LibrariesAndSdkClassesRootsProvider());
6268
}
6369

6470
@NotNull
65-
public static Collection<PsiFileSystemItem> getRoots(@Nullable final Module thisModule) {
66-
if (thisModule == null) {
71+
public Collection<PsiFileSystemItem> getRoots(@Nullable final Module module) {
72+
if (module == null) {
6773
return Collections.emptyList();
6874
}
6975

70-
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(thisModule);
7176
Set<PsiFileSystemItem> result = ContainerUtil.newLinkedHashSet();
72-
final PsiManager psiManager = PsiManager.getInstance(thisModule.getProject());
73-
74-
VirtualFile[] libraryUrls = moduleRootManager.orderEntries().getAllLibrariesAndSdkClassesRoots();
75-
for (VirtualFile file : libraryUrls) {
76-
PsiDirectory directory = psiManager.findDirectory(file);
77-
if (directory != null) {
78-
result.add(directory);
79-
}
80-
}
81-
82-
VirtualFile[] sourceRoots = moduleRootManager.orderEntries().getAllSourceRoots();
83-
for (VirtualFile root : sourceRoots) {
84-
final PsiDirectory directory = psiManager.findDirectory(root);
85-
if (directory != null) {
86-
result.add(directory);
87-
}
88-
}
89-
90-
Project project = thisModule.getProject();
91-
ProtobufSettings settings = project.getComponent(ProtobufSettings.class);
92-
List<String> includePaths = settings.getIncludePaths();
93-
for (String includePath : includePaths) {
94-
VirtualFile path = LocalFileSystem.getInstance().findFileByPath(includePath);
95-
if (path != null && path.isDirectory()) {
96-
PsiDirectory psiDirectory = psiManager.findDirectory(path);
97-
result.add(psiDirectory);
77+
PsiManager psiManager = PsiManager.getInstance(module.getProject());
78+
79+
for (SourceRootsProvider sourceRootsProvider : sourceRootsProviders) {
80+
VirtualFile[] sourceRoots = sourceRootsProvider.getSourceRoots(module);
81+
for (VirtualFile root : sourceRoots) {
82+
final PsiDirectory directory = psiManager.findDirectory(root);
83+
if (directory != null) {
84+
result.add(directory);
85+
}
9886
}
9987
}
10088
return result;
@@ -188,4 +176,5 @@ protected boolean isPsiElementAccepted(PsiElement element) {
188176
protected FileReference createFileReference(FileReferenceSet referenceSet, final TextRange range, final int index, final String text) {
189177
return new FileReference(referenceSet, range, index, text);
190178
}
179+
191180
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package io.protostuff.jetbrains.plugin.reference.file;
2+
3+
import com.intellij.openapi.module.Module;
4+
import com.intellij.openapi.roots.ModuleRootManager;
5+
import com.intellij.openapi.vfs.VirtualFile;
6+
7+
/**
8+
* Returns source roots for libraries and SDK classes.
9+
*
10+
* @author Kostiantyn Shchepanovskyi
11+
*/
12+
class LibrariesAndSdkClassesRootsProvider implements FilePathReferenceProvider.SourceRootsProvider {
13+
@Override
14+
public VirtualFile[] getSourceRoots(Module module) {
15+
ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
16+
return moduleRootManager.orderEntries().getAllLibrariesAndSdkClassesRoots();
17+
}
18+
}

0 commit comments

Comments
 (0)