Skip to content

Commit 60ed4ad

Browse files
authored
Merge pull request #3482 from Rawi01/getter-lazy
Keep initializer position for lazy getter
2 parents f16c131 + 3fb99fa commit 60ed4ad

10 files changed

Lines changed: 77 additions & 21 deletions

File tree

src/core/lombok/javac/JavacAugments.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ private JavacAugments() {
3434
public static final FieldAugment<JCTree, Boolean> JCTree_handled = FieldAugment.augment(JCTree.class, boolean.class, "lombok$handled");
3535
public static final FieldAugment<JCTree, JCTree> JCTree_generatedNode = FieldAugment.circularSafeAugment(JCTree.class, JCTree.class, "lombok$generatedNode");
3636
public static final FieldAugment<JCImport, Boolean> JCImport_deletable = FieldAugment.circularSafeAugment(JCImport.class, Boolean.class, "lombok$deletable");
37+
public static final FieldAugment<JCTree, Boolean> JCTree_keepPosition = FieldAugment.augment(JCTree.class, boolean.class, "lombok$keepPosition");
3738
}

src/core/lombok/javac/handlers/HandleGetter.java

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import static lombok.core.handlers.HandlerUtil.*;
2525
import static lombok.javac.Javac.*;
26+
import static lombok.javac.JavacAugments.JCTree_keepPosition;
2627
import static lombok.javac.JavacTreeMaker.TypeTag.*;
2728
import static lombok.javac.handlers.JavacHandlerUtil.*;
2829

@@ -47,7 +48,6 @@
4748
import lombok.spi.Provides;
4849

4950
import com.sun.tools.javac.code.Flags;
50-
import com.sun.tools.javac.tree.JCTree;
5151
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
5252
import com.sun.tools.javac.tree.JCTree.JCBinary;
5353
import com.sun.tools.javac.tree.JCTree.JCBlock;
@@ -229,18 +229,9 @@ public JCMethodDecl createGetter(long access, JavacNode field, JavacTreeMaker tr
229229
boolean makeFinal = shouldMakeFinal(field, accessors);
230230

231231
List<JCStatement> statements;
232-
JCTree toClearOfMarkers = null;
233-
int[] methodArgPos = null;
234232
boolean addSuppressWarningsUnchecked = false;
235233
if (lazy && !inNetbeansEditor(field)) {
236-
toClearOfMarkers = fieldNode.init;
237-
if (toClearOfMarkers instanceof JCMethodInvocation) {
238-
List<JCExpression> args = ((JCMethodInvocation) toClearOfMarkers).args;
239-
methodArgPos = new int[args.length()];
240-
for (int i = 0; i < methodArgPos.length; i++) {
241-
methodArgPos[i] = args.get(i).pos;
242-
}
243-
}
234+
JCTree_keepPosition.set(fieldNode.init, true);
244235
statements = createLazyGetterBody(treeMaker, field, source);
245236
addSuppressWarningsUnchecked = LombokOptionsFactory.getDelombokOptions(field.getContext()).getFormatPreferences().generateSuppressWarnings();
246237
} else {
@@ -268,12 +259,6 @@ public JCMethodDecl createGetter(long access, JavacNode field, JavacTreeMaker tr
268259
JCMethodDecl decl = recursiveSetGeneratedBy(treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType,
269260
methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source);
270261

271-
if (toClearOfMarkers != null) recursiveSetGeneratedBy(toClearOfMarkers, null);
272-
if (methodArgPos != null) {
273-
for (int i = 0; i < methodArgPos.length; i++) {
274-
((JCMethodInvocation) toClearOfMarkers).args.get(i).pos = methodArgPos[i];
275-
}
276-
}
277262
decl.mods.annotations = decl.mods.annotations.appendList(delegates);
278263
if (addSuppressWarningsUnchecked) {
279264
ListBuffer<JCExpression> suppressions = new ListBuffer<JCExpression>();

src/core/lombok/javac/handlers/JavacHandlerUtil.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static lombok.core.handlers.HandlerUtil.*;
2626
import static lombok.javac.Javac.*;
2727
import static lombok.javac.JavacAugments.JCTree_generatedNode;
28+
import static lombok.javac.JavacAugments.JCTree_keepPosition;
2829

2930
import java.lang.annotation.Annotation;
3031
import java.lang.reflect.Constructor;
@@ -126,6 +127,7 @@ private static class MarkingScanner extends TreeScanner {
126127

127128
@Override public void scan(JCTree tree) {
128129
if (tree == null) return;
130+
if (JCTree_keepPosition.get(tree)) return;
129131
setGeneratedBy(tree, source);
130132
super.scan(tree);
131133
}
@@ -173,10 +175,11 @@ public static <T extends JCTree> T setGeneratedBy(T node, JavacNode sourceNode)
173175
}
174176
JCTree_generatedNode.set(node, sourceNode.get());
175177

176-
if (!inNetbeansEditor(sourceNode.getContext()) || isParameter(node)) {
177-
node.pos = sourceNode.getStartPos();
178-
storeEnd(node, sourceNode.getEndPosition(), (JCCompilationUnit) sourceNode.top().get());
179-
}
178+
if (JCTree_keepPosition.get(node)) return node;
179+
if (inNetbeansEditor(sourceNode.getContext()) && !isParameter(node)) return node;
180+
181+
node.pos = sourceNode.getStartPos();
182+
storeEnd(node, sourceNode.getEndPosition(), (JCCompilationUnit) sourceNode.top().get());
180183
return node;
181184
}
182185

test/transform/resource/after-delombok/GetterLazyArguments.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ static String stringRunnable(String arg1, Runnable arg2) {
1717
private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field3 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
1818
private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field4 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
1919
private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field5 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
20+
private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field6 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
2021

2122
@java.lang.SuppressWarnings({"all", "unchecked"})
2223
public String getField1() {
@@ -99,4 +100,20 @@ public String getField5() {
99100
}
100101
return (String) (value == this.field5 ? null : value);
101102
}
103+
104+
@java.lang.SuppressWarnings({"all", "unchecked"})
105+
public String getField6() {
106+
java.lang.Object value = this.field6.get();
107+
if (value == null) {
108+
synchronized (this.field6) {
109+
value = this.field6.get();
110+
if (value == null) {
111+
final String actualValue = true ? stringInt(true ? "a" : "b", true ? 1 : 0) : "";
112+
value = actualValue == null ? this.field6 : actualValue;
113+
this.field6.set(value);
114+
}
115+
}
116+
}
117+
return (String) (value == this.field6 ? null : value);
118+
}
102119
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class GetterLazyErrorPosition {
2+
private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> field = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
3+
4+
@java.lang.SuppressWarnings({"all", "unchecked"})
5+
public String getField() {
6+
java.lang.Object value = this.field.get();
7+
if (value == null) {
8+
synchronized (this.field) {
9+
value = this.field.get();
10+
if (value == null) {
11+
final String actualValue = true ? "" : new ErrorPosition();
12+
value = actualValue == null ? this.field : actualValue;
13+
this.field.set(value);
14+
}
15+
}
16+
}
17+
return (String) (value == this.field ? null : value);
18+
}
19+
}

test/transform/resource/after-ecj/GetterLazyArguments.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ class GetterLazyArguments {
44
private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field3 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
55
private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field4 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
66
private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field5 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
7+
private final @lombok.Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> field6 = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
78
GetterLazyArguments() {
89
super();
910
}
@@ -103,4 +104,21 @@ static String stringRunnable(String arg1, Runnable arg2) {
103104
}
104105
return (String) ((value == this.field5) ? null : value);
105106
}
107+
public @java.lang.SuppressWarnings({"all", "unchecked"}) String getField6() {
108+
java.lang.Object value = this.field6.get();
109+
if ((value == null))
110+
{
111+
synchronized (this.field6)
112+
{
113+
value = this.field6.get();
114+
if ((value == null))
115+
{
116+
final String actualValue = (true ? stringInt((true ? "a" : "b"), (true ? 1 : 0)) : "");
117+
value = ((actualValue == null) ? this.field6 : actualValue);
118+
this.field6.set(value);
119+
}
120+
}
121+
}
122+
return (String) ((value == this.field6) ? null : value);
123+
}
106124
}

test/transform/resource/before/GetterLazyArguments.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ class GetterLazyArguments {
1818

1919
@lombok.Getter(lazy=true)
2020
private final String field5 = stringRunnable(("a"), () -> { });
21+
22+
@lombok.Getter(lazy=true)
23+
private final String field6 = true ? stringInt(true ? "a" : "b", true ? 1 : 0) : "";
2124
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//platform javac: positions in eclipse are hard...
2+
class GetterLazyErrorPosition {
3+
@lombok.Getter(lazy=true)
4+
private final String field =
5+
true ?
6+
"" :
7+
new ErrorPosition();
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7 cannot find symbol
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
11 cannot find symbol

0 commit comments

Comments
 (0)