From e2c5d9edf6b79d294e7dbf5cc9e3a1f0033120ac Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 19 Jun 2014 14:03:57 +0400 Subject: [PATCH] Support reporting errors on class objects and any classes or objects contained anywhere --- .../diagnostics/PositioningStrategies.java | 9 +++++++- .../jet/asJava/duplicateJvmSignatureUtil.kt | 23 ++++++++++--------- .../specialNames/classObject.kt | 2 +- .../classObjectCopiedFieldObject.kt | 7 ++++++ .../override/ObjectDelegationManyImpl.kt | 2 +- .../tests/override/kt4785classObject.kt | 2 +- .../checkers/JetDiagnosticsTestGenerated.java | 5 ++++ .../fields/classObjectCopiedFieldObject.kt | 7 ++++++ .../checkers/JetPsiCheckerTestGenerated.java | 16 ++++++++++++- 9 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt create mode 100644 idea/testData/checker/duplicateJvmSignature/fields/classObjectCopiedFieldObject.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 8770d8a19bf..b472dd4169c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -99,7 +99,14 @@ public class PositioningStrategies { return markElement(nameIdentifier); } if (element instanceof JetObjectDeclaration) { - return markElement(((JetObjectDeclaration) element).getObjectKeyword()); + PsiElement objectKeyword = ((JetObjectDeclaration) element).getObjectKeyword(); + PsiElement parent = element.getParent(); + if (parent instanceof JetClassObject) { + PsiElement classKeyword = ((JetClassObject) parent).getClassKeywordNode(); + PsiElement start = classKeyword == null ? objectKeyword : classKeyword; + return markRange(new TextRange(start.getTextRange().getStartOffset(), objectKeyword.getTextRange().getEndOffset())); + } + return markElement(objectKeyword); } return markElement(element); } diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt index 823f2241eba..de69b023b3b 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt @@ -32,6 +32,7 @@ import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory.* import org.jetbrains.jet.lang.psi.JetParameter import org.jetbrains.jet.lang.psi.JetClass import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory +import org.jetbrains.jet.lang.psi.JetClassObject public fun getJvmSignatureDiagnostics(element: PsiElement, otherDiagnostics: Diagnostics): Diagnostics? { fun doGetDiagnostics(): Diagnostics? { @@ -46,19 +47,20 @@ public fun getJvmSignatureDiagnostics(element: PsiElement, otherDiagnostics: Dia return getDiagnosticsForClass(parentClass) } } - - if (parent is JetFile) { - if (element is JetClassOrObject) { - return getDiagnosticsForClass(element) - } - return getDiagnosticsForPackage(parent as JetFile) + if (element is JetClassOrObject) { + return getDiagnosticsForClass(element) } - if (parent is JetClassBody) { - val parentsParent = parent?.getParent() + when (parent) { + is JetFile -> { + return getDiagnosticsForPackage(parent as JetFile) + } + is JetClassBody -> { + val parentsParent = parent?.getParent() - if (parentsParent is JetClassOrObject) { - return getDiagnosticsForClass(parentsParent) + if (parentsParent is JetClassOrObject) { + return getDiagnosticsForClass(parentsParent) + } } } return null @@ -125,7 +127,6 @@ class FilteredJvmDiagnostics(val jvmDiagnostics: Diagnostics, val otherDiagnosti } } - private fun ConflictingJvmDeclarationsData.higherThan(other: ConflictingJvmDeclarationsData): Boolean { return when (other.classOrigin.originKind) { PACKAGE_PART -> this.classOrigin.originKind == PACKAGE_FACADE diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt index 2dd47549c49..bd23c7ffa4d 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt @@ -1,5 +1,5 @@ class C { - class object {} + class object {} val `object$` = C } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt new file mode 100644 index 00000000000..e1a933b160c --- /dev/null +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt @@ -0,0 +1,7 @@ +class C { + class object { + val `object$` = this + } + + val `object$` = C +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt b/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt index 8967df9c046..d40355f0a7e 100644 --- a/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt +++ b/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt @@ -10,4 +10,4 @@ object Impl : D, E { override fun foo() {} } -val obj: D = object : D by Impl, E by Impl {} +val obj: D = object : D by Impl, E by Impl {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/kt4785classObject.kt b/compiler/testData/diagnostics/tests/override/kt4785classObject.kt index 6f199f7165c..07c99c7a756 100644 --- a/compiler/testData/diagnostics/tests/override/kt4785classObject.kt +++ b/compiler/testData/diagnostics/tests/override/kt4785classObject.kt @@ -7,7 +7,7 @@ trait B { } class C { - class object : A, B { + 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 3cc7ef1093e..828cb0fcb7d 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2855,6 +2855,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedField.kt"); } + @TestMetadata("classObjectCopiedFieldObject.kt") + public void testClassObjectCopiedFieldObject() throws Exception { + doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt"); + } + @TestMetadata("dataClassCopy.kt") public void testDataClassCopy() throws Exception { doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/dataClassCopy.kt"); diff --git a/idea/testData/checker/duplicateJvmSignature/fields/classObjectCopiedFieldObject.kt b/idea/testData/checker/duplicateJvmSignature/fields/classObjectCopiedFieldObject.kt new file mode 100644 index 00000000000..e7a6c422fa7 --- /dev/null +++ b/idea/testData/checker/duplicateJvmSignature/fields/classObjectCopiedFieldObject.kt @@ -0,0 +1,7 @@ +class C { + class object { + val `object$` = this + } + + val `object$` = C +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java index bdd6b55d8d7..d6454ac3a0a 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java @@ -440,12 +440,25 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { } @TestMetadata("idea/testData/checker/duplicateJvmSignature") - @InnerTestClasses({DuplicateJvmSignature.FunctionAndProperty.class, DuplicateJvmSignature.TraitImpl.class}) + @InnerTestClasses({DuplicateJvmSignature.Fields.class, DuplicateJvmSignature.FunctionAndProperty.class, DuplicateJvmSignature.TraitImpl.class}) public static class DuplicateJvmSignature extends AbstractJetPsiCheckerTest { public void testAllFilesPresentInDuplicateJvmSignature() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/checker/duplicateJvmSignature"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("idea/testData/checker/duplicateJvmSignature/fields") + public static class Fields extends AbstractJetPsiCheckerTest { + public void testAllFilesPresentInFields() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/checker/duplicateJvmSignature/fields"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("classObjectCopiedFieldObject.kt") + public void testClassObjectCopiedFieldObject() throws Exception { + doTest("idea/testData/checker/duplicateJvmSignature/fields/classObjectCopiedFieldObject.kt"); + } + + } + @TestMetadata("idea/testData/checker/duplicateJvmSignature/functionAndProperty") public static class FunctionAndProperty extends AbstractJetPsiCheckerTest { public void testAllFilesPresentInFunctionAndProperty() throws Exception { @@ -510,6 +523,7 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { public static Test innerSuite() { TestSuite suite = new TestSuite("DuplicateJvmSignature"); suite.addTestSuite(DuplicateJvmSignature.class); + suite.addTestSuite(Fields.class); suite.addTestSuite(FunctionAndProperty.class); suite.addTestSuite(TraitImpl.class); return suite;