From ee173077c0fd3de59908089a0fc4e84a1c4457dc Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Mon, 10 Jul 2017 18:43:02 +0300 Subject: [PATCH] Simplify diagnostic when there are wrong number of type arguments #KT-12767 Fixed --- .../diagnostics/rendering/DefaultErrorMessages.java | 2 +- .../jetbrains/kotlin/diagnostics/rendering/Renderers.kt | 3 ++- .../org/jetbrains/kotlin/renderer/DescriptorRenderer.kt | 8 +++++++- .../diagnosticsMessage/incompleteTypeArgumentList.kt | 2 +- .../diagnosticsMessage/nArgumentsExpectedMessage.kt | 7 +++++++ idea/testData/checker/regression/kt9887.kt | 2 +- .../quickfix/addStarProjections/unqualifiedMapOneArg.kt | 2 +- .../addStarProjections/when/unqualifiedMapOneArg.kt | 2 +- .../createSecondaryConstructor/callWithTypeArguments.kt | 2 +- .../inReferencedDeclaration/missingArguments.kt | 2 +- .../inReferencedDeclaration/notOnTypeArgumentList.kt | 2 +- idea/testData/quickfix/modifiers/kt10409.kt | 2 +- idea/testData/quickfix/modifiers/kt10409.kt.after | 2 +- .../kotlin/checkers/PsiCheckerTestGenerated.java | 6 ++++++ .../typeParameterListChanged/build.log | 8 ++++---- 15 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index fb0b0a49128..8e0011cd379 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -747,7 +747,7 @@ public class DefaultErrorMessages { MAP.put(TYPE_INFERENCE_FAILED_ON_SPECIAL_CONSTRUCT, "Type inference for control flow expression failed. Please specify its type explicitly."); String wrongNumberOfTypeArguments = "{0,choice,0#No type arguments|1#One type argument|1<{0,number,integer} type arguments} expected"; - MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, wrongNumberOfTypeArguments + " for {1}", null, WITHOUT_MODIFIERS); + MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, wrongNumberOfTypeArguments + " for {1}", null, COMPACT_WITHOUT_SUPERTYPES); MAP.put( OUTER_CLASS_ARGUMENTS_REQUIRED, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index 407c8613250..fea7ab78825 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -511,6 +511,7 @@ object Renderers { @JvmField val FQ_NAMES_IN_TYPES = DescriptorRenderer.FQ_NAMES_IN_TYPES.asRenderer() @JvmField val COMPACT = DescriptorRenderer.COMPACT.asRenderer() + @JvmField val COMPACT_WITHOUT_SUPERTYPES = DescriptorRenderer.COMPACT_WITHOUT_SUPERTYPES.asRenderer() @JvmField val WITHOUT_MODIFIERS = DescriptorRenderer.withOptions { modifiers = emptySet() }.asRenderer() diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index f6ce55e7a1b..814ce794208 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. + * Copyright 2010-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -106,6 +106,12 @@ abstract class DescriptorRenderer { modifiers = emptySet() } + @JvmField val COMPACT_WITHOUT_SUPERTYPES: DescriptorRenderer = withOptions { + withDefinedIn = false + modifiers = emptySet() + withoutSuperTypes = true + } + @JvmField val COMPACT_WITH_SHORT_TYPES: DescriptorRenderer = withOptions { modifiers = emptySet() classifierNamePolicy = ClassifierNamePolicy.SHORT diff --git a/idea/testData/checker/diagnosticsMessage/incompleteTypeArgumentList.kt b/idea/testData/checker/diagnosticsMessage/incompleteTypeArgumentList.kt index 156f97620d0..5582280a7c2 100644 --- a/idea/testData/checker/diagnosticsMessage/incompleteTypeArgumentList.kt +++ b/idea/testData/checker/diagnosticsMessage/incompleteTypeArgumentList.kt @@ -1,3 +1,3 @@ interface ApplicationFeature, B : Any, V> open class Pipeline() -fun , T : Any, V> A.feature(feature: ApplicationFeature) : Unit {} \ No newline at end of file +fun , T : Any, V> A.feature(feature: ApplicationFeature) : Unit {} \ No newline at end of file diff --git a/idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt b/idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt new file mode 100644 index 00000000000..3c8baee264d --- /dev/null +++ b/idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt @@ -0,0 +1,7 @@ +package name.that.may.be.very.long + +import java.io.Serializable + +interface Foo : Comparable>, Serializable, Cloneable + +fun test(f: Foo) {} \ No newline at end of file diff --git a/idea/testData/checker/regression/kt9887.kt b/idea/testData/checker/regression/kt9887.kt index be47483dbea..4ad82a0d5de 100644 --- a/idea/testData/checker/regression/kt9887.kt +++ b/idea/testData/checker/regression/kt9887.kt @@ -2,4 +2,4 @@ open class A() class G() -class B : A<G>() \ No newline at end of file +class B : A<G>() \ No newline at end of file diff --git a/idea/testData/quickfix/addStarProjections/unqualifiedMapOneArg.kt b/idea/testData/quickfix/addStarProjections/unqualifiedMapOneArg.kt index 275eb099d63..58032e0bfbb 100644 --- a/idea/testData/quickfix/addStarProjections/unqualifiedMapOneArg.kt +++ b/idea/testData/quickfix/addStarProjections/unqualifiedMapOneArg.kt @@ -1,5 +1,5 @@ // "class org.jetbrains.kotlin.idea.quickfix.AddStarProjectionsFix" "false" -// ERROR: 2 type arguments expected for interface Map defined in kotlin.collections +// ERROR: 2 type arguments expected for interface Map public fun foo(a: Any) { a is Map } diff --git a/idea/testData/quickfix/addStarProjections/when/unqualifiedMapOneArg.kt b/idea/testData/quickfix/addStarProjections/when/unqualifiedMapOneArg.kt index b41f477f16d..c177c02de8e 100644 --- a/idea/testData/quickfix/addStarProjections/when/unqualifiedMapOneArg.kt +++ b/idea/testData/quickfix/addStarProjections/when/unqualifiedMapOneArg.kt @@ -1,5 +1,5 @@ // "class org.jetbrains.kotlin.idea.quickfix.AddStarProjectionsFix" "false" -// ERROR: 2 type arguments expected for interface Map defined in kotlin.collections +// ERROR: 2 type arguments expected for interface Map public fun foo(a: Any) { when (a) { is Map -> {} diff --git a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/callWithTypeArguments.kt b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/callWithTypeArguments.kt index f3dcf3fe3e4..5707d29f55d 100644 --- a/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/callWithTypeArguments.kt +++ b/idea/testData/quickfix/createFromUsage/createSecondaryConstructor/callWithTypeArguments.kt @@ -1,7 +1,7 @@ // "Create secondary constructor" "false" // ACTION: Add parameter to constructor 'A' // ACTION: Create function 'A' -// ERROR: No type arguments expected for constructor A() defined in A +// ERROR: No type arguments expected for constructor A() // ERROR: Too many arguments for public constructor A() defined in A class A diff --git a/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/missingArguments.kt b/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/missingArguments.kt index d830dc5d8a9..2fb0e61cc99 100644 --- a/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/missingArguments.kt +++ b/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/missingArguments.kt @@ -1,4 +1,4 @@ // "Create type parameter in class 'X'" "false" -// ERROR: 2 type arguments expected for class X defined in root package in file missingArguments.kt +// ERROR: 2 type arguments expected for class X class X fun Y(x: X<String>) {} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/notOnTypeArgumentList.kt b/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/notOnTypeArgumentList.kt index 0e50ce084d2..fd5e1844640 100644 --- a/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/notOnTypeArgumentList.kt +++ b/idea/testData/quickfix/createFromUsage/createTypeParameter/inReferencedDeclaration/notOnTypeArgumentList.kt @@ -1,5 +1,5 @@ // "Create type parameter in class 'X'" "false" -// ERROR: No type arguments expected for class X defined in root package in file notOnTypeArgumentList.kt +// ERROR: No type arguments expected for class X class X diff --git a/idea/testData/quickfix/modifiers/kt10409.kt b/idea/testData/quickfix/modifiers/kt10409.kt index 92f115034ee..600ce85262e 100644 --- a/idea/testData/quickfix/modifiers/kt10409.kt +++ b/idea/testData/quickfix/modifiers/kt10409.kt @@ -1,6 +1,6 @@ // "Make 'IterablePipeline' abstract" "true" // ERROR: 'pipe' overrides nothing -// ERROR: One type argument expected for interface Pipeline defined in root package in file kt10409.kt +// ERROR: One type argument expected for interface Pipeline // Actually this test is about getting rid of assertion happenning while creating quick fixes // See KT-10409 diff --git a/idea/testData/quickfix/modifiers/kt10409.kt.after b/idea/testData/quickfix/modifiers/kt10409.kt.after index 7b166d79eda..679eec09a6d 100644 --- a/idea/testData/quickfix/modifiers/kt10409.kt.after +++ b/idea/testData/quickfix/modifiers/kt10409.kt.after @@ -1,6 +1,6 @@ // "Make 'IterablePipeline' abstract" "true" // ERROR: 'pipe' overrides nothing -// ERROR: One type argument expected for interface Pipeline defined in root package in file kt10409.kt +// ERROR: One type argument expected for interface Pipeline // Actually this test is about getting rid of assertion happenning while creating quick fixes // See KT-10409 diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index ae41edef17a..cb735484441 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -998,6 +998,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { doTest(fileName); } + @TestMetadata("nArgumentsExpectedMessage.kt") + public void testNArgumentsExpectedMessage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/nArgumentsExpectedMessage.kt"); + doTest(fileName); + } + @TestMetadata("noSubstitutedTypeParameter.kt") public void testNoSubstitutedTypeParameter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/noSubstitutedTypeParameter.kt"); diff --git a/jps-plugin/testData/incremental/classHierarchyAffected/typeParameterListChanged/build.log b/jps-plugin/testData/incremental/classHierarchyAffected/typeParameterListChanged/build.log index 9202c3caec9..b172c86a66c 100644 --- a/jps-plugin/testData/incremental/classHierarchyAffected/typeParameterListChanged/build.log +++ b/jps-plugin/testData/incremental/classHierarchyAffected/typeParameterListChanged/build.log @@ -51,16 +51,16 @@ End of files Exit code: ABORT ------------------------------------------ COMPILATION FAILED -One type argument expected for class A defined in foo -One type argument expected for class A defined in foo -One type argument expected for class A defined in foo +One type argument expected for class A +One type argument expected for class A +One type argument expected for class A Type inference failed: Not enough information to infer parameter T in constructor A() Please specify it explicitly. Type inference failed: Not enough information to infer parameter T in constructor A() Please specify it explicitly. Type inference failed: Not enough information to infer parameter T in constructor A() Please specify it explicitly. -One type argument expected for class A defined in foo +One type argument expected for class A ================ Step #2 =================