From 759ffafb0a6c28da34dd889440cbf11e9b3a4057 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 1 Aug 2018 17:10:04 +0300 Subject: [PATCH] Render flexible types with enhancement as enhanced in IDE (KT-25622) Main targets for the fix is completion, parameters info, inlay hints and override/implement. Other IDE functions might be affected. #KT-24911 Fixed #KT-25616 Fixed #KT-25622 Fixed --- .../kotlin/idea/util/IdeDescriptorRenderers.kt | 1 + .../src/org/jetbrains/kotlin/idea/util/TypeUtils.kt | 2 +- .../idea/completion/BasicLookupElementFactory.kt | 6 +++++- .../EnhancementFlexibleTypes.java | 12 ++++++++++++ .../EnhancementFlexibleTypes.kt | 6 ++++++ .../EnhancementFlexibleTypes/RecentlyNonNull.java | 8 ++++++++ .../EnhancementFlexibleTypes/RecentlyNullable.java | 9 +++++++++ .../MultiFileJvmBasicCompletionTestGenerated.java | 5 +++++ .../overrideImplement/OverrideMemberChooserObject.kt | 1 + .../KotlinFunctionParameterInfoHandler.kt | 2 ++ .../jetbrains/kotlin/idea/parameterInfo/TypeHints.kt | 1 + .../androidx/annotation/RecentlyNonNull.java | 8 ++++++++ .../androidx/annotation/RecentlyNullable.java | 9 +++++++++ .../overrideImplement/androidxNotNull/foo/A.java | 10 ++++++++++ .../overrideImplement/androidxNotNull/foo/Impl.kt | 5 +++++ .../androidxNotNull/foo/Impl.kt.after | 7 +++++++ .../parameterInfo/functionCall/Nullability.kt | 2 +- .../kotlin/idea/codeInsight/OverrideImplementTest.kt | 4 ++++ 18 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.java create mode 100644 idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.kt create mode 100644 idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNonNull.java create mode 100644 idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNullable.java create mode 100644 idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNonNull.java create mode 100644 idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNullable.java create mode 100644 idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/A.java create mode 100644 idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt create mode 100644 idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt.after diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/IdeDescriptorRenderers.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/IdeDescriptorRenderers.kt index 5c8e49a0695..59b65262a4d 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/IdeDescriptorRenderers.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/IdeDescriptorRenderers.kt @@ -48,6 +48,7 @@ object IdeDescriptorRenderers { renderDefaultVisibility = false overrideRenderingPolicy = OverrideRenderingPolicy.RENDER_OVERRIDE unitReturnType = false + enhancedTypes = true modifiers = DescriptorRendererModifier.ALL renderUnabbreviatedType = false annotationArgumentsRenderingPolicy = AnnotationArgumentsRenderingPolicy.UNLESS_EMPTY diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt index 39c2ebab741..2820e6b5db7 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/TypeUtils.kt @@ -37,7 +37,7 @@ fun KotlinType.approximateFlexibleTypes( preferStarForRaw: Boolean = false ): KotlinType { if (isDynamic()) return this - return approximateNonDynamicFlexibleTypes(preferNotNull, preferStarForRaw) + return unwrapEnhancement().approximateNonDynamicFlexibleTypes(preferNotNull, preferStarForRaw) } private fun KotlinType.approximateNonDynamicFlexibleTypes( diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt index 2da4618aee5..f14b932be74 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/BasicLookupElementFactory.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.completion.handlers.KotlinFunctionInsertHandler import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.core.completion.PackageLookupObject import org.jetbrains.kotlin.idea.highlighter.dsl.DslHighlighterExtension +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.name.FqName @@ -50,7 +51,10 @@ class BasicLookupElementFactory( ) { companion object { // we skip parameter names in functional types in most of cases for shortness - val SHORT_NAMES_RENDERER = DescriptorRenderer.SHORT_NAMES_IN_TYPES.withOptions { parameterNamesInFunctionalTypes = false } + val SHORT_NAMES_RENDERER = DescriptorRenderer.SHORT_NAMES_IN_TYPES.withOptions { + enhancedTypes = true + parameterNamesInFunctionalTypes = false + } } fun createLookupElement( diff --git a/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.java b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.java new file mode 100644 index 00000000000..340443796b0 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.java @@ -0,0 +1,12 @@ +import androidx.annotation.RecentlyNonNull; +import androidx.annotation.RecentlyNullable; + +public class EnhancementFlexibleTypes { + public static void testNullable(@RecentlyNullable String string) { + + } + + public static void testNotNull(@RecentlyNonNull String string) { + + } +} \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.kt b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.kt new file mode 100644 index 00000000000..ca05a96dc71 --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/EnhancementFlexibleTypes.kt @@ -0,0 +1,6 @@ +fun temp() { + EnhancementFlexibleTypes.test +} + +// EXIST: { lookupString: "testNotNull", tailText:"(string: String)" } +// EXIST: { lookupString: "testNullable", tailText:"(string: String?)" } \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNonNull.java b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNonNull.java new file mode 100644 index 00000000000..40cd10dfacb --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNonNull.java @@ -0,0 +1,8 @@ +package androidx.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.PARAMETER, ElementType.TYPE}) +public @interface RecentlyNonNull { +} diff --git a/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNullable.java b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNullable.java new file mode 100644 index 00000000000..06b4acab8cc --- /dev/null +++ b/idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/RecentlyNullable.java @@ -0,0 +1,9 @@ +package androidx.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.lang.reflect.Parameter; + +@Target({ElementType.PARAMETER, ElementType.TYPE}) +public @interface RecentlyNullable { +} diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java index 9a92b10b8c6..2d3c3208b9b 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/MultiFileJvmBasicCompletionTestGenerated.java @@ -74,6 +74,11 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ runTest("idea/idea-completion/testData/basic/multifile/DoNotCompleteWithConstraints/"); } + @TestMetadata("EnhancementFlexibleTypes") + public void testEnhancementFlexibleTypes() throws Exception { + runTest("idea/idea-completion/testData/basic/multifile/EnhancementFlexibleTypes/"); + } + @TestMetadata("EntriesOfNotImportedEnumFromKotlin") public void testEntriesOfNotImportedEnumFromKotlin() throws Exception { runTest("idea/idea-completion/testData/basic/multifile/EntriesOfNotImportedEnumFromKotlin/"); diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index 381da9fb129..535a310d121 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -157,6 +157,7 @@ private val OVERRIDE_RENDERER = DescriptorRenderer.withOptions { classifierNamePolicy = ClassifierNamePolicy.SOURCE_CODE_QUALIFIED overrideRenderingPolicy = OverrideRenderingPolicy.RENDER_OVERRIDE unitReturnType = false + enhancedTypes = true typeNormalizer = IdeDescriptorRenderers.APPROXIMATE_FLEXIBLE_TYPES renderUnabbreviatedType = false annotationFilter = { diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt index cb2d94f91a4..d385309cc70 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.OptionalParametersHelper import org.jetbrains.kotlin.idea.core.resolveCandidates import org.jetbrains.kotlin.idea.resolve.ResolutionFacade +import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.load.java.NULLABILITY_ANNOTATIONS @@ -248,6 +249,7 @@ abstract class KotlinParameterInfoWithCallHandlerBase() private val RENDERER = DescriptorRenderer.SHORT_NAMES_IN_TYPES.withOptions { + enhancedTypes = true renderUnabbreviatedType = false } diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/TypeHints.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/TypeHints.kt index a39e2849709..4945d8ba5c0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/TypeHints.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/TypeHints.kt @@ -70,6 +70,7 @@ class ImportAwareClassifierNamePolicy( fun getInlayHintsTypeRenderer(bindingContext: BindingContext, context: KtElement) = DescriptorRenderer.COMPACT_WITH_SHORT_TYPES.withOptions { + enhancedTypes = true textFormat = RenderingFormat.PLAIN renderUnabbreviatedType = false classifierNamePolicy = ImportAwareClassifierNamePolicy(bindingContext, context) diff --git a/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNonNull.java b/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNonNull.java new file mode 100644 index 00000000000..40cd10dfacb --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNonNull.java @@ -0,0 +1,8 @@ +package androidx.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.PARAMETER, ElementType.TYPE}) +public @interface RecentlyNonNull { +} diff --git a/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNullable.java b/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNullable.java new file mode 100644 index 00000000000..06b4acab8cc --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/androidxNotNull/androidx/annotation/RecentlyNullable.java @@ -0,0 +1,9 @@ +package androidx.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.lang.reflect.Parameter; + +@Target({ElementType.PARAMETER, ElementType.TYPE}) +public @interface RecentlyNullable { +} diff --git a/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/A.java b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/A.java new file mode 100644 index 00000000000..70293c61793 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/A.java @@ -0,0 +1,10 @@ +package foo; + +import androidx.annotation.RecentlyNonNull; +import androidx.annotation.RecentlyNullable; + +public class A { + public @RecentlyNonNull String foo(@RecentlyNonNull String s1, @RecentlyNullable String s2) { + return null; + } +} diff --git a/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt new file mode 100644 index 00000000000..4cfd67ae82c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt @@ -0,0 +1,5 @@ +import foo.A + +class B : A() { + +} diff --git a/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt.after new file mode 100644 index 00000000000..422fa407a06 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/androidxNotNull/foo/Impl.kt.after @@ -0,0 +1,7 @@ +import foo.A + +class B : A() { + override fun foo(s1: String, s2: String?): String { + return super.foo(s1, s2) + } +} diff --git a/idea/testData/parameterInfo/functionCall/Nullability.kt b/idea/testData/parameterInfo/functionCall/Nullability.kt index f5e26e45e6d..0471e37bfac 100644 --- a/idea/testData/parameterInfo/functionCall/Nullability.kt +++ b/idea/testData/parameterInfo/functionCall/Nullability.kt @@ -3,5 +3,5 @@ fun test() { } /* -Text: (s1: String?, s2: String, a: String!, b: String!, s3: String!), Disabled: false, Strikeout: false, Green: true +Text: (s1: String?, s2: String, a: String?, b: String, s3: String!), Disabled: false, Strikeout: false, Green: true */ \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt index 723543be368..78017598e56 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -25,6 +25,10 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { myFixture.testDataPath = PluginTestCaseBase.getTestDataPathBase() + "/codeInsight/overrideImplement" } + fun testAndroidxNotNull() { + doOverrideDirectoryTest("foo") + } + fun testEmptyClassBodyFunctionMethod() { doImplementFileTest() }