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 df94357d6836..b36f4c212237 100644 --- a/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java +++ b/java/typeMigration/src/com/intellij/refactoring/typeMigration/rules/ThreadLocalConversionRule.java @@ -55,7 +55,7 @@ public class ThreadLocalConversionRule extends TypeConversionRule { } } else { - return TypeConversionUtil.isAssignable(from, PsiUtil.captureToplevelWildcards(toTypeParameterValue, context)); + return TypeConversionUtil.isAssignable(toTypeParameterValue, from); } } return !PsiUtil.isLanguageLevel5OrHigher(context); diff --git a/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTestSuite.java b/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTestSuite.java index 0488c937dfc2..2ee8a0bb7a2f 100644 --- a/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTestSuite.java +++ b/java/typeMigration/test/com/intellij/refactoring/AllTypeMigrationTestSuite.java @@ -1,6 +1,8 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring; import com.intellij.codeInsight.ConvertToAtomicIntentionTest; +import com.intellij.codeInsight.ConvertToLongAdderIntentionTest; import com.intellij.codeInsight.ConvertToThreadLocalIntention6Test; import com.intellij.codeInsight.ConvertToThreadLocalIntentionTest; import com.intellij.codeInsight.inspections.GuavaInspectionTest; @@ -17,11 +19,10 @@ import org.junit.runners.Suite; ChangeTypeSignatureTest.class, WildcardTypeMigrationTest.class, ConvertToAtomicIntentionTest.class, + ConvertToLongAdderIntentionTest.class, ConvertToThreadLocalIntentionTest.class, ConvertToThreadLocalIntention6Test.class, GuavaInspectionTest.class, - GuavaInspectionTest.class, - GuavaInspectionTest.class, }) public class AllTypeMigrationTestSuite { } \ No newline at end of file diff --git a/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java b/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java index 25204de7d16b..e6f21b30c3b8 100644 --- a/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java +++ b/java/typeMigration/test/com/intellij/refactoring/WildcardTypeMigrationTest.java @@ -1,3 +1,4 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.refactoring; import com.intellij.psi.CommonClassNames; @@ -125,7 +126,7 @@ public class WildcardTypeMigrationTest extends TypeMigrationTestBase{ } //List is not assignable to List though it is possible to pass string where ? super String was - public void _testThreadLocalProducerSuper() { + public void testThreadLocalProducerSuper() { doTestFirstParamType("method", getElementFactory().createTypeFromText("java.lang.ThreadLocal>", null)); } diff --git a/java/typeMigration/testData/intentions/threadLocal/afterTypeWideningConversion.java b/java/typeMigration/testData/intentions/threadLocal/afterTypeWideningConversion.java new file mode 100644 index 000000000000..1d76066fb990 --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/afterTypeWideningConversion.java @@ -0,0 +1,19 @@ +// "Convert to 'ThreadLocal'" "true" +import java.util.Date; + +class X { + private static final ThreadLocal dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z")); + + public String getDateString() { + return dateFormat.get().format(new Date()); + } +} +abstract class DateFormat { + + public final String format(Date date) { + return date.toString(); + } +} +class SimpleDateFormat extends DateFormat { + public SimpleDateFormat(String patten) {} +} \ No newline at end of file diff --git a/java/typeMigration/testData/intentions/threadLocal/beforeTypeWideningConversion.java b/java/typeMigration/testData/intentions/threadLocal/beforeTypeWideningConversion.java new file mode 100644 index 000000000000..cabdf7474570 --- /dev/null +++ b/java/typeMigration/testData/intentions/threadLocal/beforeTypeWideningConversion.java @@ -0,0 +1,19 @@ +// "Convert to 'ThreadLocal'" "true" +import java.util.Date; + +class X { + private static DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z"); + + public String getDateString() { + return dateFormat.format(new Date()); + } +} +abstract class DateFormat { + + public final String format(Date date) { + return date.toString(); + } +} +class SimpleDateFormat extends DateFormat { + public SimpleDateFormat(String patten) {} +} \ No newline at end of file diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items index d05d101463c7..ca4103a5697c 100644 --- a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items +++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/Test.items @@ -1,9 +1,10 @@ Types: +PsiMethodCallExpression:l.substring(0) : java.lang.String PsiParameter:l : java.lang.ThreadLocal PsiReferenceExpression:l : java.lang.ThreadLocal Conversions: +l.substring(0) -> $qualifier$.get() $qualifier$ l New expression type changes: Fails: -l->java.lang.ThreadLocal diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java index beb0d0ebef46..843646c04325 100644 --- a/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java +++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalConsumerSuper/after/test.java @@ -1,5 +1,5 @@ class Test { void method(ThreadLocal l) { - l.substring(0); + l.get().substring(0); } } \ No newline at end of file diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items index 47a89e441962..0adcaf792ac9 100644 --- a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items +++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/Test.items @@ -1,9 +1,10 @@ Types: +PsiMethodCallExpression:l.add("") : boolean PsiParameter:l : java.lang.ThreadLocal> PsiReferenceExpression:l : java.lang.ThreadLocal> Conversions: +l.add("") -> $qualifier$.get() $qualifier$ l New expression type changes: Fails: -l->java.lang.ThreadLocal> diff --git a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java index 93724be5c0dd..123868b8b60e 100644 --- a/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java +++ b/java/typeMigration/testData/refactoring/wildcard/threadLocalProducerExtends/after/test.java @@ -2,6 +2,6 @@ import java.util.*; class Test { void method(ThreadLocal> l) { - l.add(""); + l.get().add(""); } } \ No newline at end of file