|
1 | 1 | package org.axonframework.intellij.ide.plugin.publisher;
|
2 | 2 |
|
3 |
| -import com.intellij.ide.highlighter.JavaFileType; |
| 3 | +import com.intellij.openapi.fileTypes.StdFileTypes; |
4 | 4 | import com.intellij.openapi.project.Project;
|
5 | 5 | import com.intellij.openapi.util.Condition;
|
6 | 6 | import com.intellij.psi.JavaPsiFacade;
|
|
19 | 19 | import com.intellij.psi.util.PsiTreeUtil;
|
20 | 20 | import com.intellij.util.Processor;
|
21 | 21 | import com.intellij.util.Query;
|
22 |
| -import com.intellij.util.containers.ConcurrentMultiMap; |
23 |
| -import com.intellij.util.containers.MultiMap; |
24 | 22 |
|
25 | 23 | import java.util.Collections;
|
26 |
| -import java.util.List; |
| 24 | +import java.util.HashSet; |
| 25 | +import java.util.Map; |
| 26 | +import java.util.Set; |
| 27 | +import java.util.concurrent.ConcurrentHashMap; |
27 | 28 |
|
28 | 29 | import static java.util.Arrays.asList;
|
29 | 30 |
|
30 | 31 | class DefaultEventPublisherProvider implements EventPublisherProvider {
|
31 | 32 |
|
32 |
| - private final MultiMap<Project, PsiMethod> publisherMethodsPerProject = new ConcurrentMultiMap<Project, PsiMethod>(); |
| 33 | + private final Map<Project, Set<PsiMethod>> publisherMethodsPerProject = new ConcurrentHashMap<Project, Set<PsiMethod>>(); |
33 | 34 |
|
34 | 35 | @Override
|
35 | 36 | public void scanPublishers(final Project project, GlobalSearchScope scope, final Registrar registrar) {
|
36 | 37 | cleanClosedProjects();
|
37 |
| - publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project), |
| 38 | + publisherMethodsPerProject.putIfAbsent(project, new HashSet<PsiMethod>()); |
| 39 | + Set<PsiMethod> psiMethods = publisherMethodsPerProject.get(project); |
| 40 | + psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project), |
38 | 41 | "org.axonframework.eventsourcing.AbstractEventSourcedAggregateRoot", "apply"));
|
39 |
| - publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project), |
| 42 | + psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project), |
40 | 43 | "org.axonframework.domain.AbstractAggregateRoot", "registerEvent"));
|
41 |
| - publisherMethodsPerProject.putValues(project, findMethods(project, GlobalSearchScope.allScope(project), |
| 44 | + psiMethods.addAll(findMethods(project, GlobalSearchScope.allScope(project), |
42 | 45 | "org.axonframework.eventsourcing.AbstractEventSourcedEntity", "apply"));
|
43 | 46 |
|
44 |
| - scanEventPublishers(scope, registrar); |
45 |
| - scanCommandPublishers(project, scope, registrar); |
| 47 | + GlobalSearchScope scopeNarrowedToJavaSourceFiles = |
| 48 | + GlobalSearchScope.getScopeRestrictedByFileTypes(scope, StdFileTypes.JAVA); |
| 49 | + scanEventPublishers(project, scopeNarrowedToJavaSourceFiles, registrar); |
| 50 | + scanCommandPublishers(project, scopeNarrowedToJavaSourceFiles, registrar); |
46 | 51 | }
|
47 | 52 |
|
48 | 53 | private void scanCommandPublishers(final Project project, GlobalSearchScope scope, final Registrar registrar) {
|
49 | 54 | PsiClass commandHandlerAnnotation = findCommandHandlersAnnotation(project);
|
50 | 55 | if (commandHandlerAnnotation != null) {
|
51 |
| - Query<PsiReference> annotationUsages = ReferencesSearch.search(commandHandlerAnnotation, scope); |
| 56 | + Query<PsiReference> annotationUsages = |
| 57 | + ReferencesSearch.search(commandHandlerAnnotation, scope); |
52 | 58 | annotationUsages.forEachAsync(new Processor<PsiReference>() {
|
53 | 59 | @Override
|
54 | 60 | public boolean process(PsiReference psiReference) {
|
@@ -117,9 +123,10 @@ private PsiClass findCommandHandlersAnnotation(Project project) {
|
117 | 123 | GlobalSearchScope.allScope(project));
|
118 | 124 | }
|
119 | 125 |
|
120 |
| - private void scanEventPublishers(GlobalSearchScope scope, final Registrar registrar) { |
121 |
| - for (PsiMethod method : publisherMethodsPerProject.values()) { |
122 |
| - Query<PsiReference> invocations = ReferencesSearch.search(method, GlobalSearchScope.getScopeRestrictedByFileTypes(scope, JavaFileType.INSTANCE)); |
| 126 | + private void scanEventPublishers(Project project, GlobalSearchScope scope, final Registrar registrar) { |
| 127 | + for (final PsiMethod method : publisherMethodsPerProject.get(project)) { |
| 128 | + Query<PsiReference> invocations = |
| 129 | + MethodReferencesSearch.search(method, scope, false); |
123 | 130 | invocations.forEachAsync(new Processor<PsiReference>() {
|
124 | 131 | @Override
|
125 | 132 | public boolean process(PsiReference psiReference) {
|
@@ -156,13 +163,13 @@ private void cleanClosedProjects() {
|
156 | 163 | }
|
157 | 164 | }
|
158 | 165 |
|
159 |
| - private List<PsiMethod> findMethods(Project project, GlobalSearchScope allScope, String className, |
160 |
| - String methodName) { |
| 166 | + private Set<PsiMethod> findMethods(Project project, GlobalSearchScope allScope, String className, |
| 167 | + String methodName) { |
161 | 168 | PsiClass aggregateClass = JavaPsiFacade.getInstance(project).findClass(className, allScope);
|
162 | 169 | if (aggregateClass != null) {
|
163 |
| - return asList(aggregateClass.findMethodsByName(methodName, true)); |
| 170 | + return new HashSet<PsiMethod>(asList(aggregateClass.findMethodsByName(methodName, true))); |
164 | 171 | }
|
165 |
| - return Collections.emptyList(); |
| 172 | + return Collections.emptySet(); |
166 | 173 | }
|
167 | 174 |
|
168 | 175 | @Override
|
|
0 commit comments