From b7e5d9faaeab8fe3bcba76d73558eb52ccc78f9e Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Fri, 20 Sep 2019 17:01:09 +0300 Subject: [PATCH] Update annotation rendering in diagnostics Disable annotation rendering in default type and descriptor renderers. Preserve annotations in Android and Serialization plugins. Update error texts in ide tests. Nullability annotations in Java descriptors are rendered with context-dependent renderer. #KT-20258 Fixed --- .../fir/FirDiagnosticsSmokeTestGenerated.java | 73 +++++++++++++++ .../kotlin/frontend/java/di/injection.kt | 3 +- .../resolve/jvm/JvmDiagnosticComponents.kt | 28 ++++++ .../jetbrains/kotlin/diagnostics/Errors.java | 4 +- .../AnnotationsWhitelistDescriptorRenderer.kt | 36 +++++++ .../rendering/DefaultErrorMessages.java | 11 ++- .../kotlin/diagnostics/rendering/Renderers.kt | 49 ++++++++-- .../rendering/TabledDescriptorRenderer.java | 6 ++ .../rendering/adaptiveClassifierNamePolicy.kt | 4 +- .../kotlin/resolve/OverrideResolver.kt | 9 +- .../annotations/annotationRenderingInTypes.kt | 25 +++++ .../annotationRenderingInTypes.txt | 17 ++++ .../cannotOverrideInvisibleMember.kt | 15 +++ .../cannotOverrideInvisibleMember.txt | 24 +++++ .../rendering/conflictingOverloads.kt | 10 ++ .../rendering/conflictingOverloads.txt | 19 ++++ .../rendering/differentNamesForParameter.kt | 18 ++++ .../rendering/differentNamesForParameter.txt | 29 ++++++ .../rendering/memberProjectedOut.kt | 15 +++ .../rendering/memberProjectedOut.txt | 18 ++++ .../rendering/multipleInheritedDefaults.kt | 26 ++++++ .../rendering/multipleInheritedDefaults.txt | 38 ++++++++ .../rendering/notImplementedMembers.kt | 48 ++++++++++ .../rendering/notImplementedMembers.txt | 93 +++++++++++++++++++ .../annotations/rendering/tooManyArguments.kt | 11 +++ .../rendering/tooManyArguments.txt | 12 +++ .../typeMismatchDueToTypeProjections.kt | 17 ++++ .../typeMismatchDueToTypeProjections.txt | 25 +++++ .../rendering/typeMismatchOnOverride.kt | 26 ++++++ .../rendering/typeMismatchOnOverride.txt | 35 +++++++ .../typeMismatchOnOverrideJavaNullable.kt | 42 +++++++++ .../typeMismatchOnOverrideJavaNullable.txt | 38 ++++++++ .../annotations/rendering/unusedValue.kt | 12 +++ .../annotations/rendering/unusedValue.txt | 10 ++ .../checkers/DiagnosticsTestGenerated.java | 73 +++++++++++++++ .../DiagnosticsUsingJavacTestGenerated.java | 73 +++++++++++++++ .../PlatformSpecificDiagnosticComponents.kt | 26 ++++++ .../kotlin/renderer/DescriptorRenderer.kt | 7 +- .../renderer/DescriptorRendererOptionsImpl.kt | 2 +- .../idea/highlighter/IdeErrorMessages.java | 2 +- ...IdeMultiplatformDiagnosticRenderingMode.kt | 2 +- .../kotlin/idea/highlighter/IdeRenderers.kt | 14 ++- ...ChangeSuperTypeListEntryTypeArgumentFix.kt | 17 ++-- .../mutableList.kt | 2 +- .../mutableMap.kt | 2 +- .../mutableSet.kt | 2 +- .../changeToVal/classVariable.kt | 2 +- .../localVariable/nonIdentifier.kt | 2 +- .../createVariable/parameter/nonIdentifier.kt | 2 +- .../deprecatedSymbolUsage/callWithError.kt | 2 +- .../scratch/unresolvedMultiline.comp.after | 4 +- .../scratch/unresolvedMultiline.repl.after | 4 +- .../diagnostic/DefaultErrorMessagesAndroid.kt | 3 +- .../SerializationPluginErrorsRendering.kt | 6 +- 54 files changed, 1047 insertions(+), 46 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDiagnosticComponents.kt create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/AnnotationsWhitelistDescriptorRenderer.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.txt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt create mode 100644 compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.txt create mode 100644 core/descriptors/src/org/jetbrains/kotlin/platform/PlatformSpecificDiagnosticComponents.kt diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java index 3bf4508ebc4..6d471a80d82 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsSmokeTestGenerated.java @@ -826,6 +826,11 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok runTest("compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.kt"); } + @TestMetadata("annotationRenderingInTypes.kt") + public void testAnnotationRenderingInTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt"); + } + @TestMetadata("AnnotationsForClasses.kt") public void testAnnotationsForClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt"); @@ -1418,6 +1423,74 @@ public class FirDiagnosticsSmokeTestGenerated extends AbstractFirDiagnosticsSmok } } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/rendering") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Rendering extends AbstractFirDiagnosticsSmokeTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInRendering() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/annotations/rendering"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("cannotOverrideInvisibleMember.kt") + public void testCannotOverrideInvisibleMember() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt"); + } + + @TestMetadata("conflictingOverloads.kt") + public void testConflictingOverloads() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt"); + } + + @TestMetadata("differentNamesForParameter.kt") + public void testDifferentNamesForParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt"); + } + + @TestMetadata("memberProjectedOut.kt") + public void testMemberProjectedOut() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt"); + } + + @TestMetadata("multipleInheritedDefaults.kt") + public void testMultipleInheritedDefaults() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt"); + } + + @TestMetadata("notImplementedMembers.kt") + public void testNotImplementedMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt"); + } + + @TestMetadata("tooManyArguments.kt") + public void testTooManyArguments() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt"); + } + + @TestMetadata("typeMismatchDueToTypeProjections.kt") + public void testTypeMismatchDueToTypeProjections() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt"); + } + + @TestMetadata("typeMismatchOnOverride.kt") + public void testTypeMismatchOnOverride() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt"); + } + + @TestMetadata("typeMismatchOnOverrideJavaNullable.kt") + public void testTypeMismatchOnOverrideJavaNullable() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt"); + } + + @TestMetadata("unusedValue.kt") + public void testUnusedValue() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index 78c4e5a79f2..4a1956b8e01 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.frontend.java.di import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsPackageFragmentProvider -import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.JvmAnalysisFlags import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -44,6 +43,7 @@ import org.jetbrains.kotlin.load.kotlin.VirtualFileFinderFactory import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver +import org.jetbrains.kotlin.resolve.jvm.JvmDiagnosticComponents import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory @@ -128,6 +128,7 @@ fun StorageComponentContainer.configureJavaSpecificComponents( ) useImpl() + useImpl() } fun ComponentProvider.initJvmBuiltInsForTopDownAnalysis() { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDiagnosticComponents.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDiagnosticComponents.kt new file mode 100644 index 00000000000..ae7e5a323ba --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmDiagnosticComponents.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.resolve.jvm + +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver +import org.jetbrains.kotlin.load.java.NULLABILITY_ANNOTATIONS +import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor +import org.jetbrains.kotlin.platform.PlatformSpecificDiagnosticComponents + +class JvmDiagnosticComponents( + private val typeQualifierResolver: AnnotationTypeQualifierResolver +) : PlatformSpecificDiagnosticComponents { + override fun isNullabilityAnnotation( + annotationDescriptor: AnnotationDescriptor, + containingDeclaration: DeclarationDescriptor + ): Boolean { + if (containingDeclaration !is JavaCallableMemberDescriptor) { + return false + } + return annotationDescriptor.fqName?.let { it in NULLABILITY_ANNOTATIONS } == true + || typeQualifierResolver.resolveTypeQualifierAnnotation(annotationDescriptor) != null + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index d7db9248ce2..20c78ecc7ea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -11,12 +11,12 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.impl.source.tree.LeafPsiElement; import kotlin.Pair; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.analyzer.ModuleInfo; import org.jetbrains.kotlin.cfg.WhenMissingCase; import org.jetbrains.kotlin.config.LanguageFeature; import org.jetbrains.kotlin.config.LanguageVersion; import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.descriptors.*; +import org.jetbrains.kotlin.diagnostics.rendering.DeclarationWithDiagnosticComponents; import org.jetbrains.kotlin.lexer.KtKeywordToken; import org.jetbrains.kotlin.lexer.KtModifierKeywordToken; import org.jetbrains.kotlin.lexer.KtTokens; @@ -475,7 +475,7 @@ public interface Errors { DiagnosticFactory3.create(ERROR, VISIBILITY_MODIFIER); DiagnosticFactory3 CANNOT_CHANGE_ACCESS_PRIVILEGE = DiagnosticFactory3.create(ERROR, VISIBILITY_MODIFIER); - DiagnosticFactory2 RETURN_TYPE_MISMATCH_ON_OVERRIDE = + DiagnosticFactory2 RETURN_TYPE_MISMATCH_ON_OVERRIDE = DiagnosticFactory2.create(ERROR, DECLARATION_RETURN_TYPE); DiagnosticFactory2 PROPERTY_TYPE_MISMATCH_ON_OVERRIDE = DiagnosticFactory2.create(ERROR, DECLARATION_RETURN_TYPE); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/AnnotationsWhitelistDescriptorRenderer.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/AnnotationsWhitelistDescriptorRenderer.kt new file mode 100644 index 00000000000..2c59f3fd080 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/AnnotationsWhitelistDescriptorRenderer.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.diagnostics.rendering + +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.platform.PlatformSpecificDiagnosticComponents +import org.jetbrains.kotlin.renderer.DescriptorRenderer + +data class DeclarationWithDiagnosticComponents( + val declaration: DeclarationDescriptor, + val diagnosticComponents: PlatformSpecificDiagnosticComponents +) : Iterable { + override fun iterator() = + sequenceOf(declaration, diagnosticComponents).iterator() +} + +class AnnotationsWhitelistDescriptorRenderer( + private val baseRenderer: DescriptorRenderer, + private val toParameterRenderer: DescriptorRenderer.() -> DiagnosticParameterRenderer +) : DiagnosticParameterRenderer { + override fun render(obj: DeclarationWithDiagnosticComponents, renderingContext: RenderingContext): String { + val (descriptor, diagnosticComponents) = obj + return baseRenderer.withOptions { + annotationFilter = { annotation -> + diagnosticComponents.isNullabilityAnnotation(annotation, descriptor) + } + }.toParameterRenderer().render(descriptor, renderingContext) + } +} + +fun DescriptorRenderer.withAnnotationsWhitelist( + toParameterRenderer: DescriptorRenderer.() -> DiagnosticParameterRenderer = DescriptorRenderer::asRenderer +) = AnnotationsWhitelistDescriptorRenderer(this, toParameterRenderer) 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 997375bea7d..5da85c0a6e9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -84,7 +84,8 @@ public class DefaultErrorMessages { MAP.put(EXTENSION_FUNCTION_SHADOWED_BY_MEMBER_PROPERTY_WITH_INVOKE, "Extension function is shadowed by a member property ''{0}'' with {1}", NAME, COMPACT_WITH_MODIFIERS); - MAP.put(INACCESSIBLE_TYPE, "Type {0} is inaccessible in this context due to: {1}", RENDER_TYPE, commaSeparated(FQ_NAMES_IN_TYPES)); + MAP.put(INACCESSIBLE_TYPE, "Type {0} is inaccessible in this context due to: {1}", RENDER_TYPE, commaSeparated( + FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS)); MAP.put(REDECLARATION, "Conflicting declarations: {0}", commaSeparated(COMPACT_WITH_MODIFIERS)); MAP.put(PACKAGE_OR_CLASSIFIER_REDECLARATION, "Redeclaration: {0}", STRING); @@ -762,7 +763,7 @@ public class DefaultErrorMessages { MAP.put(CANNOT_CHANGE_ACCESS_PRIVILEGE, "Cannot change access privilege ''{0}'' for ''{1}'' in ''{2}''", VISIBILITY, NAME, NAME); MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type of ''{0}'' is not a subtype of the return type of the overridden member ''{1}''", - NAME, FQ_NAMES_IN_TYPES); + NAME, FQ_NAMES_IN_TYPES_ANNOTATIONS_WHITELIST); MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "''{0}'' clashes with ''{1}'': return types are incompatible", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES); @@ -784,7 +785,8 @@ public class DefaultErrorMessages { MAP.put(PROPERTY_TYPE_MISMATCH_BY_DELEGATION, "Type of property ''{0}'' is not a subtype of overridden by delegation ''{1}''", SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES); - MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", FQ_NAMES_IN_TYPES, FQ_NAMES_IN_TYPES); + MAP.put(VAR_OVERRIDDEN_BY_VAL, "Var-property {0} cannot be overridden by val-property {1}", FQ_NAMES_IN_TYPES, + FQ_NAMES_IN_TYPES); MAP.put(CONFLICTING_INHERITED_MEMBERS, "{0} inherits conflicting members: {1}", NAME, commaSeparated(FQ_NAMES_IN_TYPES)); MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "{0} is not abstract and does not implement abstract member {1}", RENDER_CLASS_OR_OBJECT, @@ -921,7 +923,8 @@ public class DefaultErrorMessages { MAP.put(DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES, "Names of the parameter #{1} conflict in the following members of supertypes: ''{0}''. " + - "This may cause problems when calling this function with named arguments.", commaSeparated(FQ_NAMES_IN_TYPES), TO_STRING); + "This may cause problems when calling this function with named arguments.", commaSeparated( + FQ_NAMES_IN_TYPES), TO_STRING); MAP.put(NAME_FOR_AMBIGUOUS_PARAMETER, "Named argument is not allowed for a parameter with an ambiguous name"); 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 f425e0eb9e9..9cbf3451bd5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newTable import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newText +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.isCommon import org.jetbrains.kotlin.psi.* @@ -157,7 +158,25 @@ object Renderers { val RENDER_CLASS_OR_OBJECT_NAME = Renderer { it.renderKindWithName() } @JvmField - val RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.FQ_NAMES_IN_TYPES.withOptions { parameterNamesInFunctionalTypes = false }) + val RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.FQ_NAMES_IN_TYPES.withOptions { + parameterNamesInFunctionalTypes = false + }) + + @JvmField + val RENDER_TYPE_WITH_ANNOTATIONS = SmartTypeRenderer(DescriptorRenderer.FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS.withOptions { + parameterNamesInFunctionalTypes = false + }) + + @JvmField + val TYPE_PROJECTION = Renderer { projection -> + when { + projection.isStarProjection -> "*" + projection.projectionKind == Variance.INVARIANT -> + RENDER_TYPE.render(projection.type, RenderingContext.of(projection.type)) + else -> + "${projection.projectionKind} ${RENDER_TYPE.render(projection.type, RenderingContext.of(projection.type))}" + } + } @JvmField val RENDER_POSITION_VARIANCE = Renderer { variance: Variance -> @@ -504,7 +523,10 @@ object Renderers { newText().normal( typeParameter.name.wrapIntoQuotes() + " cannot capture " + - "${capturedTypeConstructor.projection.toString().wrapIntoQuotes()}. " + + "${result.typeProjectionRenderer.render( + capturedTypeConstructor.projection, + RenderingContext.of(capturedTypeConstructor.projection) + ).wrapIntoQuotes()}. " + explanation ) ) @@ -527,11 +549,18 @@ object Renderers { } } - private fun renderTypes(types: Collection, context: RenderingContext) = - StringUtil.join(types, { RENDER_TYPE.render(it, context) }, ", ") + private fun renderTypes( + types: Collection, + typeRenderer: DiagnosticParameterRenderer, + context: RenderingContext + ): String { + return StringUtil.join(types, { typeRenderer.render(it, context) }, ", ") + } @JvmField - val RENDER_COLLECTION_OF_TYPES = ContextDependentRenderer> { types, context -> renderTypes(types, context) } + val RENDER_COLLECTION_OF_TYPES = ContextDependentRenderer> { types, context -> + renderTypes(types, RENDER_TYPE, context) + } enum class ConstraintSystemRenderingVerbosity { COMPACT, @@ -634,13 +663,13 @@ object Renderers { if (TypeUtils.noExpectedType(inferenceErrorData.expectedType)) { append(inferenceErrorData.expectedType) } else { - append(RENDER_TYPE.render(inferenceErrorData.expectedType, context)) + append(RENDER_TYPE_WITH_ANNOTATIONS.render(inferenceErrorData.expectedType, context)) } append("\nArgument types:\n") if (inferenceErrorData.receiverArgumentType != null) { - append(RENDER_TYPE.render(inferenceErrorData.receiverArgumentType, context)).append(".") + append(RENDER_TYPE_WITH_ANNOTATIONS.render(inferenceErrorData.receiverArgumentType, context)).append(".") } - append("(").append(renderTypes(inferenceErrorData.valueArgumentsTypes, context)).append(")") + append("(").append(renderTypes(inferenceErrorData.valueArgumentsTypes, RENDER_TYPE_WITH_ANNOTATIONS, context)).append(")") } private fun String.wrapIntoQuotes(): String = "'$this'" @@ -662,6 +691,10 @@ object Renderers { @JvmField val FQ_NAMES_IN_TYPES = DescriptorRenderer.FQ_NAMES_IN_TYPES.asRenderer() @JvmField + val FQ_NAMES_IN_TYPES_ANNOTATIONS_WHITELIST = DescriptorRenderer.FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS.withAnnotationsWhitelist() + @JvmField + val FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS = DescriptorRenderer.FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS.asRenderer() + @JvmField val COMPACT = DescriptorRenderer.COMPACT.asRenderer() @JvmField val COMPACT_WITHOUT_SUPERTYPES = DescriptorRenderer.COMPACT_WITHOUT_SUPERTYPES.asRenderer() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/TabledDescriptorRenderer.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/TabledDescriptorRenderer.java index 5f92c2741cc..1cb5649722b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/TabledDescriptorRenderer.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/TabledDescriptorRenderer.java @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.Table import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TextRenderer.TextElement; import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition; import org.jetbrains.kotlin.types.KotlinType; +import org.jetbrains.kotlin.types.TypeProjection; import java.util.ArrayList; import java.util.Iterator; @@ -157,6 +158,11 @@ public class TabledDescriptorRenderer { return Renderers.RENDER_TYPE; } + @NotNull + public DiagnosticParameterRenderer getTypeProjectionRenderer() { + return Renderers.TYPE_PROJECTION; + } + protected void renderText(TextRenderer textRenderer, StringBuilder result) { for (TextElement element : textRenderer.elements) { result.append(element.text); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/adaptiveClassifierNamePolicy.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/adaptiveClassifierNamePolicy.kt index 439891a2d80..c3a9cf56c36 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/adaptiveClassifierNamePolicy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/adaptiveClassifierNamePolicy.kt @@ -77,7 +77,7 @@ private fun collectClassifiersFqNames(objectsToRender: Collection): Set, result: MutableSet) { +private fun collectMentionedClassifiersFqNames(contextObjects: Iterable, result: MutableSet) { fun KotlinType.addMentionedTypeConstructor() { constructor.declarationDescriptor?.let { result.add(it.fqNameUnsafe) } } @@ -90,7 +90,7 @@ private fun collectMentionedClassifiersFqNames(contextObjects: Collection, } } - contextObjects.filterIsInstance>().forEach { + contextObjects.filterIsInstance>().forEach { collectMentionedClassifiersFqNames(it, result) } contextObjects.filterIsInstance().forEach { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt index fa05f053163..acfd8cdc68c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt @@ -30,8 +30,10 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERR import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2 import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement import org.jetbrains.kotlin.diagnostics.Errors.* +import org.jetbrains.kotlin.diagnostics.rendering.DeclarationWithDiagnosticComponents import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.platform.PlatformSpecificDiagnosticComponents import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractFakeOverride import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE @@ -47,7 +49,8 @@ class OverrideResolver( private val trace: BindingTrace, private val overridesBackwardCompatibilityHelper: OverridesBackwardCompatibilityHelper, private val languageVersionSettings: LanguageVersionSettings, - private val kotlinTypeRefiner: KotlinTypeRefiner + private val kotlinTypeRefiner: KotlinTypeRefiner, + private val platformSpecificDiagnosticComponents: PlatformSpecificDiagnosticComponents ) { fun check(c: TopDownAnalysisContext) { @@ -289,7 +292,9 @@ class OverrideResolver( override fun returnTypeMismatchOnOverride(overriding: CallableMemberDescriptor, overridden: CallableMemberDescriptor) { if (!typeMismatchError) { typeMismatchError = true - trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on(member, declared, overridden)) + trace.report(RETURN_TYPE_MISMATCH_ON_OVERRIDE.on( + member, declared, DeclarationWithDiagnosticComponents(overridden, platformSpecificDiagnosticComponents) + )) } } diff --git a/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt b/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt new file mode 100644 index 00000000000..6ad7f38aaff --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt @@ -0,0 +1,25 @@ +// !RENDER_DIAGNOSTICS_MESSAGES +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -UNUSED_ANONYMOUS_PARAMETER + +fun f1(x: String) {} +fun f2(f: () -> Unit) {} +fun test1() = f2( Unit", "KFunction1")!>::f1) + + +@Target(AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.TYPE) +annotation class Ann + +fun <@Ann R : @Ann Any> f3(a: Array<@Ann R>): Array<@Ann R?> = null!! + +fun test2(a: @Ann Array) { + val r: Array = f3(a) +} + + +var test3: Int = 0 + set(s: @Ann String) {} + + +fun f4(fn: (@Ann Int, @Ann Int) -> Unit) {} + +val test4 = f4 { single -> } diff --git a/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.txt b/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.txt new file mode 100644 index 00000000000..5172d3d52d3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.txt @@ -0,0 +1,17 @@ +package + +public var test3: kotlin.Int +public val test4: kotlin.Unit +public fun f1(/*0*/ x: kotlin.String): kotlin.Unit +public fun f2(/*0*/ f: () -> kotlin.Unit): kotlin.Unit +public fun f3(/*0*/ a: kotlin.Array<@Ann R>): kotlin.Array<@Ann R?> +public fun f4(/*0*/ fn: (@Ann kotlin.Int, @Ann kotlin.Int) -> kotlin.Unit): kotlin.Unit +public fun test1(): kotlin.Unit +public fun test2(/*0*/ a: @Ann kotlin.Array): kotlin.Unit + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.TYPE}) public final annotation class Ann : kotlin.Annotation { + public constructor Ann() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt b/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt new file mode 100644 index 00000000000..f612b7fee73 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt @@ -0,0 +1,15 @@ +// !DIAGNOSTICS: -INCOMPATIBLE_MODIFIERS +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS) +annotation class A + +@A +open class B1 { + @A + private open fun foo() {} +} + +class D1 : B1() { + override fun foo() {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.txt b/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.txt new file mode 100644 index 00000000000..0b18f521daf --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.txt @@ -0,0 +1,24 @@ +package + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS}) public final annotation class A : kotlin.Annotation { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@A public open class B1 { + public constructor B1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @A private open fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class D1 : B1 { + public constructor D1() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt b/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt new file mode 100644 index 00000000000..2822ce412ed --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt @@ -0,0 +1,10 @@ +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER) +annotation class An + +@An +data class A(@An val x: @An Int) { + @An + fun copy(@An x: @An Int) = x +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.txt b/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.txt new file mode 100644 index 00000000000..84e1858197e --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.txt @@ -0,0 +1,19 @@ +package + +@An public final data class A { + public constructor A(/*0*/ @An x: @An kotlin.Int) + public final val x: @An kotlin.Int + public final operator /*synthesized*/ fun component1(): @An kotlin.Int + @An public final fun copy(/*0*/ @An x: @An kotlin.Int): @An kotlin.Int + public final /*synthesized*/ fun copy(/*0*/ @An x: @An kotlin.Int = ...): A + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER}) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt b/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt new file mode 100644 index 00000000000..25d3516b121 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt @@ -0,0 +1,18 @@ +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER) +annotation class An + +@An +interface A { + @An + fun foo(@An a : @An Int) +} + +@An +interface B { + @An + fun foo(@An b : @An Int) +} + +interface C : A, B \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.txt b/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.txt new file mode 100644 index 00000000000..509445c436b --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.txt @@ -0,0 +1,29 @@ +package + +@An public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract fun foo(/*0*/ @An a: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER}) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface B { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract fun foo(/*0*/ @An b: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface C : A, B { + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ @An a: @An kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt b/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt new file mode 100644 index 00000000000..99c67a63922 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt @@ -0,0 +1,15 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS) +annotation class A + +@A +class C { + @A + operator fun set(x: @A Int, y: @A T) {} +} + +fun test(a: C) { + ")!>a[1] = 25 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.txt b/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.txt new file mode 100644 index 00000000000..5e7dd0bc29b --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.txt @@ -0,0 +1,18 @@ +package + +public fun test(/*0*/ a: C): kotlin.Unit + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS}) public final annotation class A : kotlin.Annotation { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@A public final class C { + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @A public final operator fun set(/*0*/ x: @A kotlin.Int, /*1*/ y: @A T): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt new file mode 100644 index 00000000000..f0ab2e368b4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt @@ -0,0 +1,26 @@ +// !RENDER_DIAGNOSTICS_MESSAGES +// !DIAGNOSTICS: -ABSTRACT_MEMBER_NOT_IMPLEMENTED + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.EXPRESSION) +@Retention( AnnotationRetention.SOURCE) +annotation class An + +@An +interface A { + @An + fun foo(@An a: @An Int = @An 1) +} + +@An +interface B { + @An + fun foo(@An a: @An Int = @An 2) +} + +class AB1 : A, B + +@An +class AB2 : A, B { + @An + override fun foo(@An a: @An Int) {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.txt b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.txt new file mode 100644 index 00000000000..bdabcebe38f --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.txt @@ -0,0 +1,38 @@ +package + +@An public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract fun foo(/*0*/ @An a: @An kotlin.Int = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class AB1 : A, B { + public constructor AB1() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract override /*2*/ /*fake_override*/ fun foo(/*0*/ @An a: @An kotlin.Int = ...): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public final class AB2 : A, B { + public constructor AB2() + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public open override /*2*/ fun foo(/*0*/ @An a: @An kotlin.Int = ...): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY, AnnotationTarget.EXPRESSION}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface B { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @An public abstract fun foo(/*0*/ @An a: @An kotlin.Int = ...): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt new file mode 100644 index 00000000000..249bd575dfe --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt @@ -0,0 +1,48 @@ +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY) +annotation class An + +@An +interface A { + @An + fun a(@An arg: @An Int) +} + +@An +interface B { + @An + fun a(@An arg: @An Int) +} + + a(arg: Int): Unit defined in B")!>interface C : A, B + +@An +abstract class D { + @An + abstract val d: @An Int +} + +class E : D(), A +class F : A + +@An +interface G { + @An + fun a(@An arg: @An Int) +} + +@An +interface AI : A { + @An + override fun a(@An arg: @An Int) {} +} + +@An +interface GI : G { + @An + override fun a(@An arg: @An Int) {} +} + +class AG1(val a: A, val g: G) : A by a, G by g +class AG2() : AI, GI \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.txt b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.txt new file mode 100644 index 00000000000..1b372970a90 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.txt @@ -0,0 +1,93 @@ +package + +@An public interface A { + @An public abstract fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class AG1 : A, G { + public constructor AG1(/*0*/ a: A, /*1*/ g: G) + public final val a: A + public final val g: G + @An public open override /*2*/ /*delegation*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class AG2 : AI, GI { + public constructor AG2() + @An public open override /*2*/ /*fake_override*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface AI : A { + @An public open override /*1*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.PROPERTY}) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface B { + @An public abstract fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface C : A, B { + @An public abstract override /*1*/ /*fake_override*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public abstract class D { + public constructor D() + @An public abstract val d: @An kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class E : D, A { + public constructor E() + @An public abstract override /*1*/ /*fake_override*/ val d: @An kotlin.Int + @An public abstract override /*1*/ /*fake_override*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class F : A { + public constructor F() + @An public abstract override /*1*/ /*fake_override*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface G { + @An public abstract fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface GI : G { + @An public open override /*1*/ fun a(/*0*/ @An arg: @An kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt b/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt new file mode 100644 index 00000000000..ad9ae7019d9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt @@ -0,0 +1,11 @@ +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS) +annotation class Ann(val s: String = "") + +@Ann("s") +fun foo() {} + +val bar = foo( + 15 +) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.txt b/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.txt new file mode 100644 index 00000000000..a71696f9b46 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.txt @@ -0,0 +1,12 @@ +package + +public val bar: kotlin.Unit +@Ann(s = "s") public fun foo(): kotlin.Unit + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS}) public final annotation class Ann : kotlin.Annotation { + public constructor Ann(/*0*/ s: kotlin.String = ...) + public final val s: kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt new file mode 100644 index 00000000000..6e63befc14f --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt @@ -0,0 +1,17 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS) +annotation class A + +@A +class C { + @A + operator fun plus(x: Out<@A T>): @A C<@A T> = this +} + +class Out + +fun test(a: C, y: Out) { + a + ", "Out", "C", "public final operator fun plus(x: Out): C defined in C")!>y +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.txt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.txt new file mode 100644 index 00000000000..c09da10570b --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.txt @@ -0,0 +1,25 @@ +package + +public fun test(/*0*/ a: C, /*1*/ y: Out): kotlin.Unit + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS}) public final annotation class A : kotlin.Annotation { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@A public final class C { + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @A public final operator fun plus(/*0*/ x: Out<@A T>): @A C<@A T> + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Out { + public constructor Out() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt new file mode 100644 index 00000000000..1da134986bd --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt @@ -0,0 +1,26 @@ +// !RENDER_DIAGNOSTICS_MESSAGES + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER) +annotation class An + +@An +interface A { + @An + val p1: @An String + @An + var p2: @An String + @An + fun test(@An arg: @An String): @An String +} + +@An +interface B : A { + override val p1: Int + @An + override val p2: @An String + override fun test(arg: String): Int +} + +interface C : A { + override var p2: Int +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.txt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.txt new file mode 100644 index 00000000000..3deb0016c95 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.txt @@ -0,0 +1,35 @@ +package + +@An public interface A { + @An public abstract val p1: @An kotlin.String + @An public abstract var p2: @An kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @An public abstract fun test(/*0*/ @An arg: @An kotlin.String): @An kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER}) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface B : A { + public abstract override /*1*/ val p1: kotlin.Int + @An public abstract override /*1*/ val p2: @An kotlin.String + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract override /*1*/ fun test(/*0*/ arg: kotlin.String): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface C : A { + @An public abstract override /*1*/ /*fake_override*/ val p1: @An kotlin.String + public abstract override /*1*/ var p2: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @An public abstract override /*1*/ /*fake_override*/ fun test(/*0*/ @An arg: @An kotlin.String): @An kotlin.String + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt new file mode 100644 index 00000000000..0fd8f38666a --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt @@ -0,0 +1,42 @@ +// !RENDER_DIAGNOSTICS_MESSAGES +// JAVAC_SKIP + +// FILE: A.java + +import org.jetbrains.annotations.NotNull; +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +@javax.annotation.meta.TypeQualifier +public @interface MyTypeQualifier {} + +@An +public interface A { + @NotNull + @An + @MyTypeQualifier + String foo(); +} + +// FILE: k.kt + +import org.jetbrains.annotations.NotNull; + +@Target(AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER) +annotation class An + +class B : A { + override fun foo(): String? = null +} + +@An +public interface C { + @NotNull + @An + fun foo(): String +} + +class D : C { + override fun foo(): String? = null +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.txt b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.txt new file mode 100644 index 00000000000..adaafc549b0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.txt @@ -0,0 +1,38 @@ +package + +@An public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @org.jetbrains.annotations.NotNull @An @MyTypeQualifier public abstract fun foo(): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.VALUE_PARAMETER}) public final annotation class An : kotlin.Annotation { + public constructor An() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class B : A { + public constructor B() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +@An public interface C { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @org.jetbrains.annotations.NotNull @An public abstract fun foo(): kotlin.String + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class D : C { + public constructor D() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(): kotlin.String? + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt b/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt new file mode 100644 index 00000000000..762ba1ef936 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt @@ -0,0 +1,12 @@ +// !RENDER_DIAGNOSTICS_MESSAGES +// !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE + +@Target(AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.LOCAL_VARIABLE) +annotation class A + +@A +fun test() { + @A + var b: @A Int = 0 + b = 15 +} diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.txt b/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.txt new file mode 100644 index 00000000000..b7e59115f75 --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.txt @@ -0,0 +1,10 @@ +package + +@A public fun test(): kotlin.Unit + +@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.PROPERTY, AnnotationTarget.FUNCTION, AnnotationTarget.TYPE, AnnotationTarget.LOCAL_VARIABLE}) public final annotation class A : kotlin.Annotation { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index a86edf4a008..d6c83757e1d 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -828,6 +828,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.kt"); } + @TestMetadata("annotationRenderingInTypes.kt") + public void testAnnotationRenderingInTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt"); + } + @TestMetadata("AnnotationsForClasses.kt") public void testAnnotationsForClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt"); @@ -1425,6 +1430,74 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { } } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/rendering") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Rendering extends AbstractDiagnosticsTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInRendering() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/annotations/rendering"), Pattern.compile("^(.*)\\.kts?$"), TargetBackend.ANY, true); + } + + @TestMetadata("cannotOverrideInvisibleMember.kt") + public void testCannotOverrideInvisibleMember() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt"); + } + + @TestMetadata("conflictingOverloads.kt") + public void testConflictingOverloads() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt"); + } + + @TestMetadata("differentNamesForParameter.kt") + public void testDifferentNamesForParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt"); + } + + @TestMetadata("memberProjectedOut.kt") + public void testMemberProjectedOut() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt"); + } + + @TestMetadata("multipleInheritedDefaults.kt") + public void testMultipleInheritedDefaults() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt"); + } + + @TestMetadata("notImplementedMembers.kt") + public void testNotImplementedMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt"); + } + + @TestMetadata("tooManyArguments.kt") + public void testTooManyArguments() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt"); + } + + @TestMetadata("typeMismatchDueToTypeProjections.kt") + public void testTypeMismatchDueToTypeProjections() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt"); + } + + @TestMetadata("typeMismatchOnOverride.kt") + public void testTypeMismatchOnOverride() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt"); + } + + @TestMetadata("typeMismatchOnOverrideJavaNullable.kt") + public void testTypeMismatchOnOverrideJavaNullable() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt"); + } + + @TestMetadata("unusedValue.kt") + public void testUnusedValue() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 4cdc35250f3..0d0effaad90 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -828,6 +828,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/annotations/annotationOnParameterInFunctionType.kt"); } + @TestMetadata("annotationRenderingInTypes.kt") + public void testAnnotationRenderingInTypes() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/annotationRenderingInTypes.kt"); + } + @TestMetadata("AnnotationsForClasses.kt") public void testAnnotationsForClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/annotations/AnnotationsForClasses.kt"); @@ -1420,6 +1425,74 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing } } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/rendering") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Rendering extends AbstractDiagnosticsUsingJavacTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInRendering() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/annotations/rendering"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("cannotOverrideInvisibleMember.kt") + public void testCannotOverrideInvisibleMember() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/cannotOverrideInvisibleMember.kt"); + } + + @TestMetadata("conflictingOverloads.kt") + public void testConflictingOverloads() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/conflictingOverloads.kt"); + } + + @TestMetadata("differentNamesForParameter.kt") + public void testDifferentNamesForParameter() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/differentNamesForParameter.kt"); + } + + @TestMetadata("memberProjectedOut.kt") + public void testMemberProjectedOut() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/memberProjectedOut.kt"); + } + + @TestMetadata("multipleInheritedDefaults.kt") + public void testMultipleInheritedDefaults() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.kt"); + } + + @TestMetadata("notImplementedMembers.kt") + public void testNotImplementedMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/notImplementedMembers.kt"); + } + + @TestMetadata("tooManyArguments.kt") + public void testTooManyArguments() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/tooManyArguments.kt"); + } + + @TestMetadata("typeMismatchDueToTypeProjections.kt") + public void testTypeMismatchDueToTypeProjections() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchDueToTypeProjections.kt"); + } + + @TestMetadata("typeMismatchOnOverride.kt") + public void testTypeMismatchOnOverride() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverride.kt"); + } + + @TestMetadata("typeMismatchOnOverrideJavaNullable.kt") + public void testTypeMismatchOnOverrideJavaNullable() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/typeMismatchOnOverrideJavaNullable.kt"); + } + + @TestMetadata("unusedValue.kt") + public void testUnusedValue() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/rendering/unusedValue.kt"); + } + } + @TestMetadata("compiler/testData/diagnostics/tests/annotations/withUseSiteTarget") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/descriptors/src/org/jetbrains/kotlin/platform/PlatformSpecificDiagnosticComponents.kt b/core/descriptors/src/org/jetbrains/kotlin/platform/PlatformSpecificDiagnosticComponents.kt new file mode 100644 index 00000000000..03f2ccfc942 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/platform/PlatformSpecificDiagnosticComponents.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.platform + +import org.jetbrains.kotlin.container.DefaultImplementation +import org.jetbrains.kotlin.container.PlatformSpecificExtension +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor + +@DefaultImplementation(impl = PlatformSpecificDiagnosticComponents.Default::class) +interface PlatformSpecificDiagnosticComponents : PlatformSpecificExtension { + fun isNullabilityAnnotation( + annotationDescriptor: AnnotationDescriptor, + containingDeclaration: DeclarationDescriptor + ): Boolean + + object Default : PlatformSpecificDiagnosticComponents { + override fun isNullabilityAnnotation( + annotationDescriptor: AnnotationDescriptor, + containingDeclaration: DeclarationDescriptor + ): Boolean = false + } +} \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index ee78e44e10f..f927f789ca0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -142,6 +142,11 @@ abstract class DescriptorRenderer { @JvmField val FQ_NAMES_IN_TYPES: DescriptorRenderer = withOptions { + modifiers = DescriptorRendererModifier.ALL_EXCEPT_ANNOTATIONS + } + + @JvmField + val FQ_NAMES_IN_TYPES_WITH_ANNOTATIONS: DescriptorRenderer = withOptions { modifiers = DescriptorRendererModifier.ALL } @@ -301,7 +306,7 @@ enum class DescriptorRendererModifier(val includeByDefault: Boolean) { companion object { @JvmField - val DEFAULTS = values().filter { it.includeByDefault }.toSet() + val ALL_EXCEPT_ANNOTATIONS = values().filter { it.includeByDefault }.toSet() @JvmField val ALL = values().toSet() diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt index 8268e8f4056..a225767bf80 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererOptionsImpl.kt @@ -69,7 +69,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions { override var classifierNamePolicy: ClassifierNamePolicy by property(ClassifierNamePolicy.SOURCE_CODE_QUALIFIED) override var withDefinedIn by property(true) override var withSourceFileForTopLevel by property(true) - override var modifiers: Set by property(DescriptorRendererModifier.DEFAULTS) + override var modifiers: Set by property(DescriptorRendererModifier.ALL_EXCEPT_ANNOTATIONS) override var startFromName by property(false) override var startFromDeclarationKeyword by property(false) override var debugMode by property(false) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java index aa1eede1bde..c9a694ad342 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeErrorMessages.java @@ -116,7 +116,7 @@ public class IdeErrorMessages { "Parameter:{1}", HTML_RENDER_TYPE, HTML_RENDER_TYPE); MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "Return type is ''{0}'', which is not a subtype of overridden
" + - "{1}", HTML_RENDER_RETURN_TYPE, HTML); + "{1}", HTML_RENDER_RETURN_TYPE, HTML_WITH_ANNOTATIONS_WHITELIST); MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "Return types of inherited members are incompatible:
{0},
{1}", HTML, HTML); diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeMultiplatformDiagnosticRenderingMode.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeMultiplatformDiagnosticRenderingMode.kt index 6eca64b89b5..741025cec08 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeMultiplatformDiagnosticRenderingMode.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeMultiplatformDiagnosticRenderingMode.kt @@ -36,6 +36,6 @@ object IdeMultiplatformDiagnosticRenderingMode : MultiplatformDiagnosticRenderin } override fun renderDescriptor(sb: StringBuilder, descriptor: DeclarationDescriptor, context: RenderingContext, indent: String) { - sb.append(IdeRenderers.HTML.render(descriptor, context)) + sb.append(IdeRenderers.HTML_WITH_ANNOTATIONS.render(descriptor, context)) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt index 550780966ac..df13139940f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/IdeRenderers.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.diagnostics.rendering.* import org.jetbrains.kotlin.idea.highlighter.renderersUtil.renderResolvedCall import org.jetbrains.kotlin.renderer.DescriptorRenderer +import org.jetbrains.kotlin.renderer.DescriptorRendererModifier import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall @@ -37,7 +38,10 @@ object IdeRenderers { } @JvmField - val HTML_RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.HTML.withOptions { parameterNamesInFunctionalTypes = false }) + val HTML_RENDER_TYPE = SmartTypeRenderer(DescriptorRenderer.HTML.withOptions { + parameterNamesInFunctionalTypes = false + modifiers = DescriptorRendererModifier.ALL_EXCEPT_ANNOTATIONS + }) @JvmField val HTML_NONE_APPLICABLE_CALLS = Renderer { calls: Collection> -> @@ -91,5 +95,11 @@ object IdeRenderers { } @JvmField - val HTML = DescriptorRenderer.HTML.asRenderer() + val HTML = DescriptorRenderer.HTML.withOptions { + modifiers = DescriptorRendererModifier.ALL_EXCEPT_ANNOTATIONS + }.asRenderer() + @JvmField val HTML_WITH_ANNOTATIONS = DescriptorRenderer.HTML.withOptions { + modifiers = DescriptorRendererModifier.ALL + }.asRenderer() + @JvmField val HTML_WITH_ANNOTATIONS_WHITELIST = DescriptorRenderer.HTML.withAnnotationsWhitelist() } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeSuperTypeListEntryTypeArgumentFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeSuperTypeListEntryTypeArgumentFix.kt index d373c61fc27..1d64df1813e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeSuperTypeListEntryTypeArgumentFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeSuperTypeListEntryTypeArgumentFix.kt @@ -55,16 +55,21 @@ class ChangeSuperTypeListEntryTypeArgumentFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { - val casted = when (diagnostic.factory) { - Errors.RETURN_TYPE_MISMATCH_ON_OVERRIDE -> Errors.RETURN_TYPE_MISMATCH_ON_OVERRIDE.cast(diagnostic) - Errors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE -> Errors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE.cast(diagnostic) + val (casted, declaration) = when (diagnostic.factory) { + Errors.RETURN_TYPE_MISMATCH_ON_OVERRIDE -> { + val casted = Errors.RETURN_TYPE_MISMATCH_ON_OVERRIDE.cast(diagnostic) + casted to casted.b.declaration + } + Errors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE -> { + val casted = Errors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE.cast(diagnostic) + casted to casted.b + } else -> null } ?: return null val type = casted.a.returnType?.toString() ?: return null - - val superClassDescriptor = casted.b.containingDeclaration as? ClassDescriptor ?: return null - val superDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(casted.b) as? KtNamedDeclaration ?: return null + val superClassDescriptor = declaration.containingDeclaration as? ClassDescriptor ?: return null + val superDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(declaration) as? KtNamedDeclaration ?: return null val superTypeReference = superDeclaration.getReturnTypeReference()?.text ?: return null val typeParameterIndex = superClassDescriptor.declaredTypeParameters.map { it.name.asString() }.indexOf(superTypeReference) if (typeParameterIndex < 0) return null diff --git a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableList.kt b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableList.kt index a0c0ca000f3..c2c41cc1e98 100644 --- a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableList.kt +++ b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableList.kt @@ -1,5 +1,5 @@ // PROBLEM: none -// ERROR: Assignment operators ambiguity:
public operator fun Collection.plus(element: Int): List defined in kotlin.collections
@InlineOnly public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections +// ERROR: Assignment operators ambiguity:
public operator fun Collection.plus(element: Int): List defined in kotlin.collections
public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections // WITH_RUNTIME fun test() { var list = mutableListOf(1) diff --git a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableMap.kt b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableMap.kt index be3dfd1da1c..4d06e9ad979 100644 --- a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableMap.kt +++ b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableMap.kt @@ -1,5 +1,5 @@ // PROBLEM: none -// ERROR: Assignment operators ambiguity:
public operator fun Map.plus(pair: Pair): Map defined in kotlin.collections
@InlineOnly public inline operator fun MutableMap.plusAssign(pair: Pair): Unit defined in kotlin.collections +// ERROR: Assignment operators ambiguity:
public operator fun Map.plus(pair: Pair): Map defined in kotlin.collections
public inline operator fun MutableMap.plusAssign(pair: Pair): Unit defined in kotlin.collections // WITH_RUNTIME fun test() { var map = mutableMapOf(1 to 2) diff --git a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableSet.kt b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableSet.kt index 601d370092f..9736296ca45 100644 --- a/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableSet.kt +++ b/idea/testData/inspectionsLocal/suspiciousCollectionReassignment/mutableSet.kt @@ -1,5 +1,5 @@ // PROBLEM: none -// ERROR: Assignment operators ambiguity:
public operator fun Set.plus(element: Int): Set defined in kotlin.collections
@InlineOnly public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections +// ERROR: Assignment operators ambiguity:
public operator fun Set.plus(element: Int): Set defined in kotlin.collections
public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections // WITH_RUNTIME fun test() { var set = mutableSetOf(1) diff --git a/idea/testData/quickfix/assignOperatorAmbiguity/changeToVal/classVariable.kt b/idea/testData/quickfix/assignOperatorAmbiguity/changeToVal/classVariable.kt index 0d22ef6d1df..8d4fbff5b16 100644 --- a/idea/testData/quickfix/assignOperatorAmbiguity/changeToVal/classVariable.kt +++ b/idea/testData/quickfix/assignOperatorAmbiguity/changeToVal/classVariable.kt @@ -2,7 +2,7 @@ // ACTION: Replace overloaded operator with function call // ACTION: Replace with 'plusAssign()' call // ACTION: Replace with ordinary assignment -// ERROR: Assignment operators ambiguity:
public operator fun Collection.plus(element: Int): List defined in kotlin.collections
@InlineOnly public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections +// ERROR: Assignment operators ambiguity:
public operator fun Collection.plus(element: Int): List defined in kotlin.collections
public inline operator fun MutableCollection.plusAssign(element: Int): Unit defined in kotlin.collections // WITH_RUNTIME class Test { diff --git a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/nonIdentifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/nonIdentifier.kt index 448ed164792..f013a623777 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/localVariable/nonIdentifier.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/localVariable/nonIdentifier.kt @@ -2,7 +2,7 @@ // ACTION: Create extension function 'A.minus' // ACTION: Create member function 'A.minus' // ACTION: Replace overloaded operator with function call -// ERROR: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@InlineOnly public inline operator fun BigDecimal.minus(other: BigDecimal): BigDecimal defined in kotlin
@InlineOnly public inline operator fun BigInteger.minus(other: BigInteger): BigInteger defined in kotlin
public operator fun Iterable.minus(elements: Array): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Iterable): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Sequence): List defined in kotlin.collections
public operator fun Iterable.minus(element: A): List defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Array): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Iterable): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Sequence): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(key: A): Map defined in kotlin.collections
public operator fun Set.minus(elements: Array): Set defined in kotlin.collections
public operator fun Set.minus(elements: Iterable): Set defined in kotlin.collections
public operator fun Set.minus(elements: Sequence): Set defined in kotlin.collections
public operator fun Set
.minus(element: A): Set defined in kotlin.collections
public operator fun Sequence.minus(elements: Array): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Iterable): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Sequence): Sequence defined in kotlin.sequences
public operator fun Sequence
.minus(element: A): Sequence defined in kotlin.sequences +// ERROR: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline operator fun BigDecimal.minus(other: BigDecimal): BigDecimal defined in kotlin
public inline operator fun BigInteger.minus(other: BigInteger): BigInteger defined in kotlin
public operator fun Iterable.minus(elements: Array): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Iterable): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Sequence): List defined in kotlin.collections
public operator fun Iterable
.minus(element: A): List defined in kotlin.collections
public operator fun Map.minus(keys: Array): Map defined in kotlin.collections
public operator fun Map.minus(keys: Iterable): Map defined in kotlin.collections
public operator fun Map.minus(keys: Sequence): Map defined in kotlin.collections
public operator fun Map.minus(key: A): Map defined in kotlin.collections
public operator fun Set.minus(elements: Array): Set defined in kotlin.collections
public operator fun Set.minus(elements: Iterable): Set defined in kotlin.collections
public operator fun Set.minus(elements: Sequence): Set defined in kotlin.collections
public operator fun Set
.minus(element: A): Set defined in kotlin.collections
public operator fun Sequence.minus(elements: Array): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Iterable): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Sequence): Sequence defined in kotlin.sequences
public operator fun Sequence
.minus(element: A): Sequence defined in kotlin.sequences // COMPILER_ARGUMENTS: -XXLanguage:-NewInference class A diff --git a/idea/testData/quickfix/createFromUsage/createVariable/parameter/nonIdentifier.kt b/idea/testData/quickfix/createFromUsage/createVariable/parameter/nonIdentifier.kt index 3c52fb31380..4233f32adac 100644 --- a/idea/testData/quickfix/createFromUsage/createVariable/parameter/nonIdentifier.kt +++ b/idea/testData/quickfix/createFromUsage/createVariable/parameter/nonIdentifier.kt @@ -2,7 +2,7 @@ // ACTION: Create extension function 'A.minus' // ACTION: Create member function 'A.minus' // ACTION: Replace overloaded operator with function call -// ERROR: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
@InlineOnly public inline operator fun BigDecimal.minus(other: BigDecimal): BigDecimal defined in kotlin
@InlineOnly public inline operator fun BigInteger.minus(other: BigInteger): BigInteger defined in kotlin
public operator fun Iterable.minus(elements: Array): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Iterable): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Sequence): List defined in kotlin.collections
public operator fun Iterable
.minus(element: A): List defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Array): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Iterable): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(keys: Sequence): Map defined in kotlin.collections
@SinceKotlin public operator fun Map.minus(key: A): Map defined in kotlin.collections
public operator fun Set.minus(elements: Array): Set defined in kotlin.collections
public operator fun Set.minus(elements: Iterable): Set defined in kotlin.collections
public operator fun Set.minus(elements: Sequence): Set defined in kotlin.collections
public operator fun Set
.minus(element: A): Set defined in kotlin.collections
public operator fun Sequence.minus(elements: Array): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Iterable): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Sequence): Sequence defined in kotlin.sequences
public operator fun Sequence
.minus(element: A): Sequence defined in kotlin.sequences +// ERROR: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline operator fun BigDecimal.minus(other: BigDecimal): BigDecimal defined in kotlin
public inline operator fun BigInteger.minus(other: BigInteger): BigInteger defined in kotlin
public operator fun Iterable.minus(elements: Array): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Iterable): List defined in kotlin.collections
public operator fun Iterable.minus(elements: Sequence): List defined in kotlin.collections
public operator fun Iterable
.minus(element: A): List defined in kotlin.collections
public operator fun Map.minus(keys: Array): Map defined in kotlin.collections
public operator fun Map.minus(keys: Iterable): Map defined in kotlin.collections
public operator fun Map.minus(keys: Sequence): Map defined in kotlin.collections
public operator fun Map.minus(key: A): Map defined in kotlin.collections
public operator fun Set.minus(elements: Array): Set defined in kotlin.collections
public operator fun Set.minus(elements: Iterable): Set defined in kotlin.collections
public operator fun Set.minus(elements: Sequence): Set defined in kotlin.collections
public operator fun Set
.minus(element: A): Set defined in kotlin.collections
public operator fun Sequence.minus(elements: Array): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Iterable): Sequence defined in kotlin.sequences
public operator fun Sequence.minus(elements: Sequence): Sequence defined in kotlin.sequences
public operator fun Sequence
.minus(element: A): Sequence defined in kotlin.sequences // COMPILER_ARGUMENTS: -XXLanguage:-NewInference class A diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/callWithError.kt b/idea/testData/quickfix/deprecatedSymbolUsage/callWithError.kt index 1277b293c45..36a0a517d93 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/callWithError.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/callWithError.kt @@ -1,5 +1,5 @@ // "class org.jetbrains.kotlin.idea.quickfix.replaceWith.DeprecatedSymbolUsageFix" "false" -// ERROR: Too many arguments for @Deprecated public fun oldFun(): Unit defined in root package in file callWithError.kt +// ERROR: Too many arguments for public fun oldFun(): Unit defined in root package in file callWithError.kt @Deprecated("", ReplaceWith("newFun()")) fun oldFun() { diff --git a/idea/testData/scratch/unresolvedMultiline.comp.after b/idea/testData/scratch/unresolvedMultiline.comp.after index 17b85e35611..d26befcff68 100644 --- a/idea/testData/scratch/unresolvedMultiline.comp.after +++ b/idea/testData/scratch/unresolvedMultiline.comp.after @@ -9,6 +9,6 @@ fun goo(a: String) { // ERROR: Unresolved reference: goo } /** unresolvedMultiline.kts:3 Unresolved reference: foo */ /** unresolvedMultiline.kts:3 Overload resolution ambiguity: -@HidesMembers public inline fun Iterable.forEach(action: (TypeVariable(T)) -> Unit): Unit defined in kotlin.collections -@HidesMembers public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections */ +public inline fun Iterable.forEach(action: (TypeVariable(T)) -> Unit): Unit defined in kotlin.collections +public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections */ /** unresolvedMultiline.kts:7 Unresolved reference: goo */ \ No newline at end of file diff --git a/idea/testData/scratch/unresolvedMultiline.repl.after b/idea/testData/scratch/unresolvedMultiline.repl.after index 826169acb24..9729256d0bf 100644 --- a/idea/testData/scratch/unresolvedMultiline.repl.after +++ b/idea/testData/scratch/unresolvedMultiline.repl.after @@ -11,8 +11,8 @@ fun goo(a: String) { // ERROR: error: unresolved reference: goo... foo.forEach { ^ error: cannot choose among the following candidates without completing type inference: -@HidesMembers public inline fun Iterable.forEach(action: (???) -> Unit): Unit defined in kotlin.collections -@HidesMembers public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections +public inline fun Iterable.forEach(action: (???) -> Unit): Unit defined in kotlin.collections +public inline fun Map.forEach(action: (Map.Entry) -> Unit): Unit defined in kotlin.collections foo.forEach { ^ */ /** unresolvedMultiline.kts:7 error: unresolved reference: goo diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/diagnostic/DefaultErrorMessagesAndroid.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/diagnostic/DefaultErrorMessagesAndroid.kt index c58f228badc..93fbb3699d9 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/diagnostic/DefaultErrorMessagesAndroid.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/diagnostic/DefaultErrorMessagesAndroid.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap import org.jetbrains.kotlin.diagnostics.rendering.Renderers import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_CLASS_OR_OBJECT import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_TYPE +import org.jetbrains.kotlin.diagnostics.rendering.Renderers.RENDER_TYPE_WITH_ANNOTATIONS object DefaultErrorMessagesAndroid : DefaultErrorMessages.Extension { private val MAP = DiagnosticFactoryToRendererMap("Android") @@ -89,7 +90,7 @@ object DefaultErrorMessagesAndroid : DefaultErrorMessages.Extension { MAP.put(ErrorsAndroid.PARCELER_TYPE_INCOMPATIBLE, "Parceler type {0} is incompatible with {1}", - RENDER_TYPE, RENDER_TYPE) + RENDER_TYPE_WITH_ANNOTATIONS, RENDER_TYPE_WITH_ANNOTATIONS) MAP.put(ErrorsAndroid.DUPLICATING_TYPE_PARCELERS, "Duplicating ''TypeParceler'' annotations") diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt index 390ea949972..ab71c7e7581 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/diagnostic/SerializationPluginErrorsRendering.kt @@ -45,13 +45,13 @@ object SerializationPluginErrorsRendering : DefaultErrorMessages.Extension { SerializationErrors.SERIALIZER_NOT_FOUND, "Serializer has not been found for type ''{0}''. " + "To use context serializer as fallback, explicitly annotate type or property with @ContextualSerialization", - Renderers.RENDER_TYPE + Renderers.RENDER_TYPE_WITH_ANNOTATIONS ) MAP.put( SerializationErrors.SERIALIZER_NULLABILITY_INCOMPATIBLE, "Type ''{1}'' is non-nullable and therefore can not be serialized with serializer for nullable type ''{0}''", - Renderers.RENDER_TYPE, - Renderers.RENDER_TYPE + Renderers.RENDER_TYPE_WITH_ANNOTATIONS, + Renderers.RENDER_TYPE_WITH_ANNOTATIONS ) MAP.put( SerializationErrors.TRANSIENT_MISSING_INITIALIZER,