Support reporting errors on class objects and any classes or objects contained anywhere

This commit is contained in:
Andrey Breslav
2014-06-19 14:03:57 +04:00
parent 86e8a1d410
commit e2c5d9edf6
9 changed files with 57 additions and 16 deletions
@@ -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);
}
@@ -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
@@ -1,5 +1,5 @@
class C {
class object {}
<!CONFLICTING_JVM_DECLARATIONS!>class object<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>val `object$`<!> = C
}
@@ -0,0 +1,7 @@
class C {
<!CONFLICTING_JVM_DECLARATIONS!>class object<!> {
<!CONFLICTING_JVM_DECLARATIONS!>val `object$`<!> = this
}
val `object$` = C
}
@@ -10,4 +10,4 @@ object Impl : D, E {
override fun foo() {}
}
val obj: D = <!MANY_IMPL_MEMBER_NOT_IMPLEMENTED!>object<!> : D by Impl, E by Impl {}
val obj: D = <!MANY_IMPL_MEMBER_NOT_IMPLEMENTED!>object<!> : D by Impl, E by Impl {}
@@ -7,7 +7,7 @@ trait B {
}
class C {
class <!CANNOT_INFER_VISIBILITY!>object<!> : A, B {
<!CANNOT_INFER_VISIBILITY!>class object<!> : A, B {
fun bar() = null
}
}
@@ -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");
@@ -0,0 +1,7 @@
class C {
<error>class object</error> {
<error>val `object$`</error> = this
}
val `object$` = C
}
@@ -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;