Skip to content
This repository was archived by the owner on Nov 3, 2024. It is now read-only.

Commit b484fdc

Browse files
committed
merged adapted changes from master
1 parent c2da4ff commit b484fdc

File tree

9 files changed

+178
-28
lines changed

9 files changed

+178
-28
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# https://www.jetbrains.com/intellij-repository/snapshots
44
#
55
ideaVersion=2020.1
6-
#ideaVersion=2020.2.1
6+
#ideaVersion=2020.2
77
#
88
pluginGroup=de.plushnikov.intellij.plugin
99
pluginName=lombok-plugin

src/main/java/de/plushnikov/intellij/plugin/processor/SynchronizedProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ public Collection<LombokProblem> verifyAnnotation(@NotNull PsiAnnotation psiAnno
4040
if (null != psiMethod) {
4141
if (psiMethod.hasModifierProperty(PsiModifier.ABSTRACT)) {
4242
problemNewBuilder.addError(LombokBundle.message("inspection.message.synchronized.legal.only.on.concrete.methods"),
43-
PsiQuickFixFactory.createModifierListFix(psiMethod, PsiModifier.ABSTRACT, false, false)
43+
PsiQuickFixFactory.createModifierListFix(psiMethod, PsiModifier.ABSTRACT, false, false)
4444
);
4545
}
4646

47-
@NlsSafe final String lockFieldName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value", "");
47+
final String lockFieldName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value", "");
4848
if (StringUtil.isNotEmpty(lockFieldName)) {
4949
final PsiClass containingClass = psiMethod.getContainingClass();
5050

src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.intellij.openapi.application.ApplicationManager;
44
import com.intellij.openapi.diagnostic.Logger;
5+
import com.intellij.openapi.util.RecursionGuard;
6+
import com.intellij.openapi.util.RecursionManager;
57
import com.intellij.psi.*;
68
import com.intellij.psi.augment.PsiAugmentProvider;
79
import com.intellij.psi.impl.source.PsiExtensibleClass;
@@ -71,7 +73,7 @@ public <Psi extends PsiElement> List<Psi> getAugments(@NotNull PsiElement elemen
7173
}
7274

7375
@NotNull
74-
@Override
76+
// @Override
7577
public <Psi extends PsiElement> List<Psi> getAugments(@NotNull PsiElement element,
7678
@NotNull final Class<Psi> type,
7779
@Nullable String nameHint) {
@@ -90,14 +92,63 @@ public <Psi extends PsiElement> List<Psi> getAugments(@NotNull PsiElement elemen
9092
return emptyResult;
9193
}
9294

93-
// All invoker of AugmentProvider already make caching
94-
// and we want to try to skip recursive calls completely
95+
final LombokValueProvider<Psi> result;
96+
if (type == PsiField.class) {
97+
result = new FieldLombokProvider<>(type, psiClass, nameHint);
98+
} else if (type == PsiMethod.class) {
99+
result = new MethodLombokProvider<>(type, psiClass, nameHint);
100+
} else {
101+
result = new ClassLombokProvider<>(type, psiClass, nameHint);
102+
}
95103

96-
/// final String message = String.format("Process call for type: %s class: %s", type.getSimpleName(), psiClass.getQualifiedName());
97-
// log.info(">>>" + message);
98-
final List<Psi> result = getPsis(psiClass, type, nameHint);
99-
// log.info("<<<" + message);
100-
return result;
104+
final List<Psi> computed = result.compute();
105+
return null != computed ? computed : emptyResult;
106+
}
107+
108+
private static class FieldLombokProvider<Psi extends PsiElement> extends LombokValueProvider<Psi> {
109+
private static final RecursionGuard<PsiClass> ourGuard = RecursionManager.createGuard("lombok.augment.field");
110+
111+
FieldLombokProvider(Class<Psi> type, PsiClass psiClass, String nameHint) {
112+
super(type, psiClass, ourGuard, nameHint);
113+
}
114+
}
115+
116+
private static class MethodLombokProvider<Psi extends PsiElement> extends LombokValueProvider<Psi> {
117+
private static final RecursionGuard<PsiClass> ourGuard = RecursionManager.createGuard("lombok.augment.method");
118+
119+
MethodLombokProvider(Class<Psi> type, PsiClass psiClass, String nameHint) {
120+
super(type, psiClass, ourGuard, nameHint);
121+
}
122+
}
123+
124+
private static class ClassLombokProvider<Psi extends PsiElement> extends LombokValueProvider<Psi> {
125+
private static final RecursionGuard<PsiClass> ourGuard = RecursionManager.createGuard("lombok.augment.class");
126+
127+
ClassLombokProvider(Class<Psi> type, PsiClass psiClass, String nameHint) {
128+
super(type, psiClass, ourGuard, nameHint);
129+
}
130+
}
131+
132+
private abstract static class LombokValueProvider<Psi extends PsiElement> {
133+
private final Class<Psi> type;
134+
private final PsiClass psiClass;
135+
private final RecursionGuard<PsiClass> recursionGuard;
136+
private final String nameHint;
137+
138+
LombokValueProvider(Class<Psi> type, PsiClass psiClass, RecursionGuard<PsiClass> recursionGuard, String nameHint) {
139+
this.type = type;
140+
this.psiClass = psiClass;
141+
this.recursionGuard = recursionGuard;
142+
this.nameHint = nameHint;
143+
}
144+
145+
public List<Psi> compute() {
146+
return recursionGuard.doPreventingRecursion(psiClass, true, this::computeIntern);
147+
}
148+
149+
private List<Psi> computeIntern() {
150+
return getPsis(psiClass, type, nameHint);
151+
}
101152
}
102153

103154
@NotNull

src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public JComponent createComponent() {
4141

4242
private void initFromSettings() {
4343
myEnableExtensionMethodSupport.setSelected(ProjectSettings.isEnabled(myProject, ProjectSettings.IS_EXTENSION_METHOD_ENABLED, false));
44-
4544
myEnableLombokVersionWarning.setSelected(ProjectSettings.isEnabled(myProject, ProjectSettings.IS_LOMBOK_VERSION_CHECK_ENABLED, false));
4645
}
4746

@@ -59,8 +58,6 @@ public void apply() {
5958
ProjectSettings.setEnabled(myProject, ProjectSettings.IS_LOMBOK_VERSION_CHECK_ENABLED, myEnableLombokVersionWarning.isSelected());
6059

6160
// Redo code checking and highlighting.
62-
LombokAugmentProvider.onConfigChange();
63-
6461
PsiManager.getInstance(myProject).dropPsiCaches();
6562
DaemonCodeAnalyzer.getInstance(myProject).restart();
6663
}

src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ public final class LombokProcessorUtil {
2525
@NonNls
2626
private static final String ACCESS_LEVEL_NONE = "NONE";
2727

28-
private static final Map<Integer, String> ACCESS_LEVEL_MAP = new HashMap<>() {{
28+
private static final Map<Integer, String> ACCESS_LEVEL_MAP = new HashMap<Integer, String>() {{
2929
put(PsiUtil.ACCESS_LEVEL_PUBLIC, ACCESS_LEVEL_PUBLIC);
3030
put(PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL, ACCESS_LEVEL_PACKAGE_LOCAL);
3131
put(PsiUtil.ACCESS_LEVEL_PROTECTED, ACCESS_LEVEL_PROTECTED);
3232
put(PsiUtil.ACCESS_LEVEL_PRIVATE, ACCESS_LEVEL_PRIVATE);
3333
}};
3434

35-
private static final Map<String, String> VALUE_ACCESS_LEVEL_MAP = new HashMap<>() {{
35+
private static final Map<String, String> VALUE_ACCESS_LEVEL_MAP = new HashMap<String, String>() {{
3636
put(ACCESS_LEVEL_PUBLIC, PsiModifier.PUBLIC);
3737
put(ACCESS_LEVEL_PACKAGE_LOCAL, PsiModifier.PACKAGE_LOCAL);
3838
put(ACCESS_LEVEL_PROTECTED, PsiModifier.PROTECTED);

src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java

Lines changed: 86 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,107 @@
11
package de.plushnikov.intellij.plugin.util;
22

33
import com.intellij.openapi.util.text.StringUtil;
4-
import com.intellij.psi.PsiAnnotation;
5-
import com.intellij.psi.PsiJavaCodeReferenceElement;
6-
import com.intellij.psi.PsiModifierList;
7-
import com.intellij.psi.PsiModifierListOwner;
4+
import com.intellij.psi.*;
5+
import com.intellij.psi.impl.source.SourceJavaCodeReference;
6+
import com.intellij.util.ArrayUtil;
87
import org.jetbrains.annotations.NotNull;
98
import org.jetbrains.annotations.Nullable;
109

1110
import java.util.Collection;
12-
import java.util.Objects;
1311
import java.util.regex.Pattern;
14-
import java.util.stream.Stream;
1512

16-
public class PsiAnnotationSearchUtil {
13+
public final class PsiAnnotationSearchUtil {
1714

1815
@Nullable
1916
public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) {
20-
return psiModifierListOwner.getAnnotation(annotationFQN);
17+
return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQN);
2118
}
2219

2320
@Nullable
2421
public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String... annotationFQNs) {
25-
return Stream.of(annotationFQNs).map(psiModifierListOwner::getAnnotation).filter(Objects::nonNull).findAny().orElse(null);
22+
return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQNs);
2623
}
2724

28-
public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) {
29-
return psiModifierListOwner.hasAnnotation(annotationFQN);
25+
@Nullable
26+
private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String qualifiedName) {
27+
if (annotationOwner == null) {
28+
return null;
29+
}
30+
31+
PsiAnnotation[] annotations = annotationOwner.getAnnotations();
32+
if (annotations.length == 0) {
33+
return null;
34+
}
35+
36+
final String shortName = StringUtil.getShortName(qualifiedName);
37+
38+
for (PsiAnnotation annotation : annotations) {
39+
PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement();
40+
if (null != referenceElement) {
41+
final String referenceName = referenceElement.getReferenceName();
42+
if (shortName.equals(referenceName)) {
43+
44+
if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) {
45+
String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText();
46+
if (qualifiedName.equals(possibleFullQualifiedName)) {
47+
return annotation;
48+
}
49+
}
50+
51+
final String annotationQualifiedName = annotation.getQualifiedName();
52+
if (null != annotationQualifiedName && qualifiedName.endsWith(annotationQualifiedName)) {
53+
return annotation;
54+
}
55+
}
56+
}
57+
}
58+
59+
return null;
60+
}
61+
62+
@Nullable
63+
private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String... qualifiedNames) {
64+
if (annotationOwner == null || qualifiedNames.length == 0) {
65+
return null;
66+
}
67+
68+
PsiAnnotation[] annotations = annotationOwner.getAnnotations();
69+
if (annotations.length == 0) {
70+
return null;
71+
}
72+
73+
final String[] shortNames = new String[qualifiedNames.length];
74+
for (int i = 0; i < qualifiedNames.length; i++) {
75+
shortNames[i] = StringUtil.getShortName(qualifiedNames[i]);
76+
}
77+
78+
for (PsiAnnotation annotation : annotations) {
79+
final PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement();
80+
if (null != referenceElement) {
81+
final String referenceName = referenceElement.getReferenceName();
82+
if (ArrayUtil.find(shortNames, referenceName) > -1) {
83+
84+
if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) {
85+
final String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText();
86+
87+
if (ArrayUtil.find(qualifiedNames, possibleFullQualifiedName) > -1) {
88+
return annotation;
89+
}
90+
}
91+
92+
final String annotationQualifiedName = annotation.getQualifiedName();
93+
if (ArrayUtil.find(qualifiedNames, annotationQualifiedName) > -1) {
94+
return annotation;
95+
}
96+
}
97+
}
98+
}
99+
100+
return null;
101+
}
102+
103+
public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationTypeName) {
104+
return null != findAnnotation(psiModifierListOwner, annotationTypeName);
30105
}
31106

32107
public static boolean isNotAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, String annotationTypeName) {

src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.plushnikov.intellij.plugin;
22

3+
import com.intellij.openapi.util.RecursionManager;
34
import com.intellij.openapi.util.io.FileUtil;
45
import com.intellij.openapi.util.text.StringUtil;
56
import com.intellij.openapi.vfs.VirtualFile;
@@ -35,6 +36,9 @@ public void setUp() throws Exception {
3536
super.setUp();
3637

3738
loadLombokLibrary();
39+
40+
//TODO disable assertions for the moment
41+
RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable());
3842
}
3943

4044
protected void loadLombokLibrary() {

src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.plushnikov.intellij.plugin.inspection;
22

3+
import com.intellij.openapi.util.RecursionManager;
34
import com.intellij.openapi.util.registry.Registry;
45
import com.intellij.testFramework.LightProjectDescriptor;
56
import com.siyeh.ig.LightJavaInspectionTestCase;
@@ -16,6 +17,9 @@ public void setUp() throws Exception {
1617
LombokTestUtil.loadLombokLibrary(myFixture.getProjectDisposable(), getModule());
1718

1819
Registry.get("platform.random.idempotence.check.rate").setValue(1, getTestRootDisposable());
20+
21+
//TODO disable assertions for the moment
22+
RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable());
1923
}
2024

2125
@NotNull

test-manual/src/main/java/de/plushnikov/builder/singularperformance/SingularPerformanceIssueDemo.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,26 @@
99
public class SingularPerformanceIssueDemo {
1010
@Singular
1111
private Collection<java.lang.String> number_0_strings;
12-
12+
@Singular
13+
private Collection<java.lang.String> number_1_strings;
14+
@Singular
15+
private Collection<java.lang.String> number_2_strings;
16+
@Singular
17+
private Collection<java.lang.String> number_3_strings;
18+
@Singular
19+
private Collection<java.lang.String> number_4_strings;
20+
@Singular
21+
private Collection<java.lang.String> number_5_strings;
22+
@Singular
23+
private Collection<java.lang.String> number_6_strings;
24+
@Singular
25+
private Collection<java.lang.String> number_7_strings;
26+
@Singular
27+
private Collection<java.lang.String> number_8_strings;
28+
@Singular
29+
private Collection<java.lang.String> number_9_strings;
30+
@Singular
31+
private Collection<java.lang.String> number_10_strings;
1332

1433
public static void main(String[] args) {
1534
for (int i = 0; i < 20; i++) {

0 commit comments

Comments
 (0)