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 bd3496eb5f6..37840ef2431 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -90,8 +90,8 @@ public class DefaultErrorMessages { static { MAP.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", ELEMENT_TEXT); - MAP.put(INVISIBLE_REFERENCE, "Cannot access ''{0}'': it is {1} in {2}", NAME, VISIBILITY, NAME_OF_PARENT_OR_FILE); - MAP.put(INVISIBLE_MEMBER, "Cannot access ''{0}'': it is {1} in {2}", NAME, VISIBILITY, NAME_OF_PARENT_OR_FILE); + MAP.put(INVISIBLE_REFERENCE, "Cannot access ''{0}'': it is {1} in {2}", NAME, VISIBILITY, NAME_OF_CONTAINING_DECLARATION_OR_FILE); + MAP.put(INVISIBLE_MEMBER, "Cannot access ''{0}'': it is {1} in {2}", NAME, VISIBILITY, NAME_OF_CONTAINING_DECLARATION_OR_FILE); MAP.put(PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL, "Protected constructor ''{0}'' from other classes can only be used in super-call", Renderers.SHORT_NAMES_IN_TYPES); @@ -306,7 +306,8 @@ public class DefaultErrorMessages { MAP.put(CAPTURED_VAL_INITIALIZATION, "Captured values initialization is forbidden due to possible reassignment", NAME); MAP.put(CAPTURED_MEMBER_VAL_INITIALIZATION, "Captured member values initialization is forbidden due to possible reassignment", NAME); MAP.put(SETTER_PROJECTED_OUT, "Setter for ''{0}'' is removed by type projection", NAME); - MAP.put(INVISIBLE_SETTER, "Cannot assign to ''{0}'': the setter is {1} in {2}", NAME, VISIBILITY, NAME_OF_PARENT_OR_FILE); + MAP.put(INVISIBLE_SETTER, "Cannot assign to ''{0}'': the setter is {1} in {2}", NAME, VISIBILITY, + NAME_OF_CONTAINING_DECLARATION_OR_FILE); MAP.put(INITIALIZATION_BEFORE_DECLARATION, "Variable cannot be initialized before declaration", NAME); MAP.put(VARIABLE_EXPECTED, "Variable expected"); 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 fea7ab78825..6186f5b9eba 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.Name import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -107,12 +108,18 @@ object Renderers { "$declarationKindWithSpace'${it.name.asString()}'" } - @JvmField val NAME_OF_PARENT_OR_FILE = Renderer { + @JvmField val NAME_OF_CONTAINING_DECLARATION_OR_FILE = Renderer { if (DescriptorUtils.isTopLevelDeclaration(it) && it is DeclarationDescriptorWithVisibility && it.visibility == Visibilities.PRIVATE) { "file" } else { - "'" + it.containingDeclaration!!.name + "'" + val containingDeclaration = it.containingDeclaration + if (containingDeclaration is PackageFragmentDescriptor) { + containingDeclaration.fqName.asString().wrapIntoQuotes() + } + else { + containingDeclaration!!.name.asString().wrapIntoQuotes() + } } } @@ -122,7 +129,7 @@ object Renderers { @JvmField val RENDER_CLASS_OR_OBJECT = Renderer { classOrObject: KtClassOrObject -> - val name = if (classOrObject.name != null) " '" + classOrObject.name + "'" else "" + val name = classOrObject.name?.let { " ${it.wrapIntoQuotes()}" } ?: "" if (classOrObject is KtClass) "Class" + name else "Object" + name } @@ -413,13 +420,13 @@ object Renderers { } val explanation = - "Type parameter has an upper bound '" + result.typeRenderer.render(upperBound, RenderingContext.of(upperBound)) + "'" + + "Type parameter has an upper bound ${result.typeRenderer.render(upperBound, RenderingContext.of(upperBound)).wrapIntoQuotes()}" + " that cannot be satisfied capturing 'in' projection" result.text(newText().normal( - "'" + typeParameter.name + "'" + + typeParameter.name.wrapIntoQuotes() + " cannot capture " + - "'" + capturedTypeConstructor.typeProjection + "'. " + + "${capturedTypeConstructor.typeProjection.toString().wrapIntoQuotes()}. " + explanation )) return result @@ -496,6 +503,9 @@ object Renderers { append("(").append(renderTypes(inferenceErrorData.valueArgumentsTypes, context)).append(")") } + private fun String.wrapIntoQuotes(): String = "'$this'" + private fun Name.wrapIntoQuotes(): String = "'${this.asString()}'" + private val WHEN_MISSING_LIMIT = 7 @JvmField val RENDER_WHEN_MISSING_CASES = Renderer> { diff --git a/idea/testData/checker/diagnosticsMessage/fullPackageFQNameOnVisiblityError.kt b/idea/testData/checker/diagnosticsMessage/fullPackageFQNameOnVisiblityError.kt new file mode 100644 index 00000000000..df9ae566fd9 --- /dev/null +++ b/idea/testData/checker/diagnosticsMessage/fullPackageFQNameOnVisiblityError.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME + +package a.b + +@kotlin.internal.InlineOnly +inline fun foo() {} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/testRoot/m2Test/m2Test.kt b/idea/testData/multiModuleHighlighting/testRoot/m2Test/m2Test.kt index 3e92a829a4e..0e3b6fd516a 100644 --- a/idea/testData/multiModuleHighlighting/testRoot/m2Test/m2Test.kt +++ b/idea/testData/multiModuleHighlighting/testRoot/m2Test/m2Test.kt @@ -15,7 +15,7 @@ fun access() { publicInM1() privateInM1Test() - internalInM1Test() + internalInM1Test() publicInM1Test() privateInM2() diff --git a/idea/testData/multiModuleHighlighting/testRoot/m3Test/m3Test.kt b/idea/testData/multiModuleHighlighting/testRoot/m3Test/m3Test.kt index 2465887c082..23f6c40a81f 100644 --- a/idea/testData/multiModuleHighlighting/testRoot/m3Test/m3Test.kt +++ b/idea/testData/multiModuleHighlighting/testRoot/m3Test/m3Test.kt @@ -15,7 +15,7 @@ fun access() { publicInM1() privateInM1Test() - internalInM1Test() + internalInM1Test() publicInM1Test() privateInM2() @@ -23,7 +23,7 @@ fun access() { publicInM2() privateInM2Test() - internalInM2Test() + internalInM2Test() publicInM2Test() privateInM3() diff --git a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java index cb735484441..9e1920fc264 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/PsiCheckerTestGenerated.java @@ -986,6 +986,12 @@ public class PsiCheckerTestGenerated extends AbstractPsiCheckerTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/checker/diagnosticsMessage"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("fullPackageFQNameOnVisiblityError.kt") + public void testFullPackageFQNameOnVisiblityError() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/fullPackageFQNameOnVisiblityError.kt"); + doTest(fileName); + } + @TestMetadata("incompleteTypeArgumentList.kt") public void testIncompleteTypeArgumentList() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/checker/diagnosticsMessage/incompleteTypeArgumentList.kt");