From a43c830373b63e968986c2068d5018b389aa1e90 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 5 Jun 2017 19:36:58 +0300 Subject: [PATCH] convert to threadlocal: convert initializer to modern ThreadLocal.withInitial if java version >= 8 --- .../rules/ThreadLocalConversionRule.java | 48 ++++++++++++------- .../intentions/threadLocal/after1.java | 7 +-- .../intentions/threadLocal/after2.java | 7 +-- .../intentions/threadLocal/after3.java | 7 +-- .../intentions/threadLocal/after4.java | 7 +-- .../intentions/threadLocal/after5.java | 7 +-- .../intentions/threadLocal/after6.java | 7 +-- .../intentions/threadLocal/after7.java | 7 +-- .../intentions/threadLocal/after8.java | 7 +-- .../threadLocal/afterArrayInitializer.java | 7 +-- ...rFieldAssignmentFromNonFinalParameter.java | 9 +--- .../threadLocal/afterFinalField.java | 7 +-- .../intentions/threadLocal/afterJava6.java | 13 +++++ .../threadLocal/afterNormalize.java | 7 +-- .../afterPrimitiveNoInitializer.java | 7 +-- .../intentions/threadLocal/afterTA1.java | 7 +-- ...eFieldAssignmentFromNonFinalParameter.java | 2 +- .../intentions/threadLocal/beforeJava6.java | 8 ++++ 18 files changed, 67 insertions(+), 104 deletions(-) create mode 100644 java/typeMigration/testData/intentions/threadLocal/afterJava6.java create mode 100644 java/typeMigration/testData/intentions/threadLocal/beforeJava6.java diff --git a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java index db91ae18d825..bf7e2cc746aa 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java @@ -158,27 +158,39 @@ public class ThreadLocalConversionRule extends TypeConversionRule { final String boxedTypeName = from instanceof PsiPrimitiveType ? ((PsiPrimitiveType)from).getBoxedTypeName() : from.getCanonicalText(); List toMakeFinal = TypeConversionRuleUtil.getVariablesToMakeFinal(initializer); if (toMakeFinal == null) return null; - return new WrappingWithInnerClassOrLambdaDescriptor("$qualifier$", "new " + - to.getCanonicalText() + - "() {\n" + - "@Override \n" + - "protected " + - boxedTypeName + - " initialValue() {\n" + - " return " + - (PsiUtil.isLanguageLevel5OrHigher(initializer) - ? initializer.getText() - : (from instanceof PsiPrimitiveType ? "new " + - ((PsiPrimitiveType)from).getBoxedTypeName() + - "(" + - initializer.getText() + - ")" : initializer.getText())) + - ";\n" + - "}\n" + - "}", initializer, + return new WrappingWithInnerClassOrLambdaDescriptor("$qualifier$", + createThreadLocalInitializerReplacement(to, from, initializer, boxedTypeName), + initializer, toMakeFinal); } + private static String createThreadLocalInitializerReplacement(PsiType to, + PsiType from, + PsiExpression initializer, + String boxedTypeName) { + if (PsiUtil.isLanguageLevel8OrHigher(initializer)) { + return "java.lang.ThreadLocal.withInitial(() -> " + initializer.getText() + ")"; + } + return "new " + + to.getCanonicalText() + + "() {\n" + + "@Override \n" + + "protected " + + boxedTypeName + + " initialValue() {\n" + + " return " + + (PsiUtil.isLanguageLevel5OrHigher(initializer) + ? initializer.getText() + : (from instanceof PsiPrimitiveType ? "new " + + ((PsiPrimitiveType)from).getBoxedTypeName() + + "(" + + initializer.getText() + + ")" : initializer.getText())) + + ";\n" + + "}\n" + + "}"; + } + private static String toPrimitive(String replaceByArg, PsiType from, PsiElement context) { return PsiUtil.isLanguageLevel5OrHigher(context) ? replaceByArg diff --git a/java/typeMigration/testData/intentions/threadLocal/after1.java b/java/typeMigration/testData/intentions/threadLocal/after1.java index b5df8fd35214..be391d4abec4 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after1.java +++ b/java/typeMigration/testData/intentions/threadLocal/after1.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return 0; - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> 0); void foo() { field.set(field.get() + 1); } diff --git a/java/typeMigration/testData/intentions/threadLocal/after2.java b/java/typeMigration/testData/intentions/threadLocal/after2.java index 3a546c5b0c9a..5f02c2f3925d 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after2.java +++ b/java/typeMigration/testData/intentions/threadLocal/after2.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected String initialValue() { - return ""; - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> ""); void foo() { System.out.println(field.get()); } diff --git a/java/typeMigration/testData/intentions/threadLocal/after3.java b/java/typeMigration/testData/intentions/threadLocal/after3.java index 9fc0f825ac4b..2e2f950d899a 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after3.java +++ b/java/typeMigration/testData/intentions/threadLocal/after3.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return new Integer(0); - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> new Integer(0)); void foo() { if (field.get() == null) return; } diff --git a/java/typeMigration/testData/intentions/threadLocal/after4.java b/java/typeMigration/testData/intentions/threadLocal/after4.java index 8410a1c33c0e..4dbc67bb1b47 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after4.java +++ b/java/typeMigration/testData/intentions/threadLocal/after4.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected String initialValue() { - return ""; - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> ""); void foo() { if (field.get().indexOf("a") == -1) return; } diff --git a/java/typeMigration/testData/intentions/threadLocal/after5.java b/java/typeMigration/testData/intentions/threadLocal/after5.java index 435e1b6a50e6..31ca64fbaaef 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after5.java +++ b/java/typeMigration/testData/intentions/threadLocal/after5.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return new Integer(0); - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> new Integer(0)); void foo(Test t) { if (t.field.get() == null) return; } diff --git a/java/typeMigration/testData/intentions/threadLocal/after6.java b/java/typeMigration/testData/intentions/threadLocal/after6.java index 1879a46be16d..d153a6579061 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after6.java +++ b/java/typeMigration/testData/intentions/threadLocal/after6.java @@ -2,11 +2,6 @@ class Test { static final ThreadLocal field; static { - field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return new Integer(0); - } - }; + field = ThreadLocal.withInitial(() -> new Integer(0)); } } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/after7.java b/java/typeMigration/testData/intentions/threadLocal/after7.java index 5398ff5e2991..14fa782d7060 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after7.java +++ b/java/typeMigration/testData/intentions/threadLocal/after7.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class X { - private final ThreadLocal bytes = new ThreadLocal() { - @Override - protected byte[] initialValue() { - return new byte[10]; - } - }; + private final ThreadLocal bytes = ThreadLocal.withInitial(() -> new byte[10]); byte foo(byte b) { bytes.get()[0] = 1; diff --git a/java/typeMigration/testData/intentions/threadLocal/after8.java b/java/typeMigration/testData/intentions/threadLocal/after8.java index d158894b6130..2d4aa4b61658 100644 --- a/java/typeMigration/testData/intentions/threadLocal/after8.java +++ b/java/typeMigration/testData/intentions/threadLocal/after8.java @@ -1,9 +1,4 @@ // "Convert to ThreadLocal" "true" class X { - final ThreadLocal i = new ThreadLocal() { - @Override - protected Integer initialValue() { - return 0; - } - }; + final ThreadLocal i = ThreadLocal.withInitial(() -> 0); } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java b/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java index 59323f18e0e5..dde597cbc1da 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterArrayInitializer.java @@ -1,9 +1,4 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected String[] initialValue() { - return new String[]{}; - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> new String[]{}); } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterFieldAssignmentFromNonFinalParameter.java b/java/typeMigration/testData/intentions/threadLocal/afterFieldAssignmentFromNonFinalParameter.java index f0531b222ae9..654691a7f2c9 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterFieldAssignmentFromNonFinalParameter.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterFieldAssignmentFromNonFinalParameter.java @@ -2,16 +2,11 @@ class Main { private final ThreadLocal property; - Main3(boolean property) {] + Main3(boolean property) { if (property) { property = false; } boolean finalProperty = property; - this.property = new ThreadLocal() { - @Override - protected Boolean initialValue() { - return finalProperty; - } - }; + this.property = ThreadLocal.withInitial(() -> finalProperty); } } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterFinalField.java b/java/typeMigration/testData/intentions/threadLocal/afterFinalField.java index 9575f8c84842..da8f5235f329 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterFinalField.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterFinalField.java @@ -3,11 +3,6 @@ class Foo { private final ThreadLocal property; Foo(boolean property) { - this.property = new ThreadLocal() { - @Override - protected Boolean initialValue() { - return property; - } - }; + this.property = ThreadLocal.withInitial(() -> property); } } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterJava6.java b/java/typeMigration/testData/intentions/threadLocal/afterJava6.java new file mode 100644 index 000000000000..77bd711defff --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/afterJava6.java @@ -0,0 +1,13 @@ +// "Convert to ThreadLocal" "true" +class Main { + private final ThreadLocal property; + + Main3(final boolean property) { + this.property = new ThreadLocal() { + @Override + protected Boolean initialValue() { + return property; + } + }; + } +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterNormalize.java b/java/typeMigration/testData/intentions/threadLocal/afterNormalize.java index 1b2532d9d1de..9c7a8342ebe8 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterNormalize.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterNormalize.java @@ -1,11 +1,6 @@ // "Convert to ThreadLocal" "true" class X { - private final ThreadLocal s = new ThreadLocal() { - @Override - protected String initialValue() { - return ""; - } - }; + private final ThreadLocal s = ThreadLocal.withInitial(() -> ""); private String t; private String u; } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterPrimitiveNoInitializer.java b/java/typeMigration/testData/intentions/threadLocal/afterPrimitiveNoInitializer.java index b922e385cde7..2560a2a708d6 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterPrimitiveNoInitializer.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterPrimitiveNoInitializer.java @@ -1,9 +1,4 @@ // "Convert to ThreadLocal" "true" class Test { - final ThreadLocal field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return 0; - } - }; + final ThreadLocal field = ThreadLocal.withInitial(() -> 0); } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/afterTA1.java b/java/typeMigration/testData/intentions/threadLocal/afterTA1.java index 0e3687e146b6..d1da14e75739 100644 --- a/java/typeMigration/testData/intentions/threadLocal/afterTA1.java +++ b/java/typeMigration/testData/intentions/threadLocal/afterTA1.java @@ -5,10 +5,5 @@ import java.lang.annotation.*; public @interface TA { int value(); } class Test { - final ThreadLocal<@TA(42) Integer> field = new ThreadLocal() { - @Override - protected Integer initialValue() { - return 0; - } - }; + final ThreadLocal<@TA(42) Integer> field = ThreadLocal.withInitial(() -> 0); } \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeFieldAssignmentFromNonFinalParameter.java b/java/typeMigration/testData/intentions/threadLocal/beforeFieldAssignmentFromNonFinalParameter.java index 4e1ffd387df8..48a644f90053 100644 --- a/java/typeMigration/testData/intentions/threadLocal/beforeFieldAssignmentFromNonFinalParameter.java +++ b/java/typeMigration/testData/intentions/threadLocal/beforeFieldAssignmentFromNonFinalParameter.java @@ -2,7 +2,7 @@ class Main { private final boolean property; - Main3(boolean property) {] + Main3(boolean property) { if (property) { property = false; } diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeJava6.java b/java/typeMigration/testData/intentions/threadLocal/beforeJava6.java new file mode 100644 index 000000000000..acc57b15ecde --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/beforeJava6.java @@ -0,0 +1,8 @@ +// "Convert to ThreadLocal" "true" +class Main { + private final boolean property; + + Main3(boolean property) { + this.property = property; + } +} \ No newline at end of file