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;