From 5ae339d9405a3322f700e72f4659ce013c84853f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 31 Mar 2014 22:49:27 +0400 Subject: [PATCH] Fix "Cannot infer visibility" for fake overrides #KT-4785 Fixed --- .../diagnostics/PositioningStrategies.java | 18 ++++++++++++------ .../jet/lang/resolve/OverrideResolver.java | 6 +++++- .../diagnostics/tests/override/kt4785.kt | 11 +++++++++++ .../tests/override/kt4785classObject.kt | 13 +++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 10 ++++++++++ 5 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/override/kt4785.kt create mode 100644 compiler/testData/diagnostics/tests/override/kt4785classObject.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index 5d4bf223d55..e34e6c32fe0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -145,24 +145,30 @@ public class PositioningStrategies { property.getTextRange().getStartOffset(), endOfSignatureElement.getTextRange().getEndOffset())); } else if (element instanceof JetClass) { - // primary constructor - JetClass klass = (JetClass)element; - PsiElement nameAsDeclaration = klass.getNameIdentifier(); + PsiElement nameAsDeclaration = element.getNameIdentifier(); if (nameAsDeclaration == null) { - return markElement(klass); + return markElement(element); } - PsiElement primaryConstructorParameterList = klass.getPrimaryConstructorParameterList(); + PsiElement primaryConstructorParameterList = ((JetClass) element).getPrimaryConstructorParameterList(); if (primaryConstructorParameterList == null) { return markRange(nameAsDeclaration.getTextRange()); } return markRange(new TextRange( nameAsDeclaration.getTextRange().getStartOffset(), primaryConstructorParameterList.getTextRange().getEndOffset())); } + else if (element instanceof JetObjectDeclaration) { + PsiElement nameAsDeclaration = element.getNameIdentifier(); + if (nameAsDeclaration == null) { + return markElement(((JetObjectDeclaration) element).getObjectKeyword()); + } + return markRange(nameAsDeclaration.getTextRange()); + } return super.mark(element); } + @Override public boolean isValid(@NotNull PsiNameIdentifierOwner element) { - return element.getNameIdentifier() != null && super.isValid(element); + return (element.getNameIdentifier() != null || element instanceof JetObjectDeclaration) && super.isValid(element); } }; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index e15840f38b7..d2ab67fd72b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -174,7 +174,11 @@ public class OverrideResolver { OverridingUtil.resolveUnknownVisibilityForMember(descriptor, new OverridingUtil.NotInferredVisibilitySink() { @Override public void cannotInferVisibility(@NotNull CallableMemberDescriptor descriptor) { - PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), descriptor); + DeclarationDescriptor reportOn = descriptor.getKind() == FAKE_OVERRIDE + ? DescriptorUtils.getParentOfType(descriptor, ClassDescriptor.class) + : descriptor; + //noinspection ConstantConditions + PsiElement element = BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(), reportOn); if (element instanceof JetDeclaration) { trace.report(CANNOT_INFER_VISIBILITY.on((JetDeclaration) element)); } diff --git a/compiler/testData/diagnostics/tests/override/kt4785.kt b/compiler/testData/diagnostics/tests/override/kt4785.kt new file mode 100644 index 00000000000..a7c6036c4f7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/kt4785.kt @@ -0,0 +1,11 @@ +trait T { + internal fun foo() +} + +open class C { + protected fun foo() {} +} + +class E : C(), T + +val z: T = object : C(), T {} diff --git a/compiler/testData/diagnostics/tests/override/kt4785classObject.kt b/compiler/testData/diagnostics/tests/override/kt4785classObject.kt new file mode 100644 index 00000000000..6f199f7165c --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/kt4785classObject.kt @@ -0,0 +1,13 @@ +trait A { + internal fun foo() +} + +trait B { + protected fun foo() {} +} + +class C { + class object : A, B { + fun bar() = null + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index ac528d3ede0..32bd4539aa0 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -5384,6 +5384,16 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } + @TestMetadata("kt4785.kt") + public void testKt4785() throws Exception { + doTest("compiler/testData/diagnostics/tests/override/kt4785.kt"); + } + + @TestMetadata("kt4785classObject.kt") + public void testKt4785classObject() throws Exception { + doTest("compiler/testData/diagnostics/tests/override/kt4785classObject.kt"); + } + @TestMetadata("kt880.kt") public void testKt880() throws Exception { doTest("compiler/testData/diagnostics/tests/override/kt880.kt");