Diagnostic tests for duplicate JVM signatures

This commit is contained in:
Andrey Breslav
2014-05-25 18:14:34 +02:00
parent d25b2459d4
commit 27e61a75a1
47 changed files with 622 additions and 41 deletions
@@ -51,6 +51,7 @@ public class KotlinLightClassForPackage extends KotlinWrappingLightClass impleme
public static class FileStubCache {
@NotNull
public static FileStubCache getInstance(@NotNull Project project) {
return ServiceManager.getService(project, FileStubCache.class);
}
@@ -0,0 +1,57 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.asJava
import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.resolve.Diagnostics
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetClassBody
import org.jetbrains.jet.lang.psi.JetClassOrObject
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.jet.lang.psi.JetPropertyAccessor
public fun getJvmSignatureDiagnostics(element: PsiElement): Diagnostics? {
var parent = element.getParent()
if (parent is JetFile) {
if (element is JetClassOrObject) {
return getDiagnosticsForNonLocalClass(element)
}
return getDiagnosticsForPackage(parent as JetFile)
}
else
if (element is JetPropertyAccessor) {
parent = parent?.getParent()
}
if (parent is JetClassBody) {
val parentsParent = parent?.getParent()
if (parentsParent is JetClassOrObject) {
return getDiagnosticsForNonLocalClass(parentsParent)
}
}
return null
}
private fun getDiagnosticsForPackage(file: JetFile): Diagnostics? {
val project = file.getProject()
val cache = KotlinLightClassForPackage.FileStubCache.getInstance(project)
return cache[file.getPackageFqName(), GlobalSearchScope.allScope(project)].getValue()?.extraDiagnostics
}
private fun getDiagnosticsForNonLocalClass(jetClassOrObject: JetClassOrObject): Diagnostics {
return KotlinLightClassForExplicitDeclaration.getLightClassData(jetClassOrObject).extraDiagnostics
}
@@ -0,0 +1,8 @@
open class B {
fun getX() = 1
}
class C : B() {
val x: Int
<!CONFLICTING_PLATFORM_DECLARATIONS!>get() = 1<!>
}
@@ -0,0 +1,8 @@
open class B {
val x: Int
get() = 1
}
class C : B() {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,8 @@
trait T {
fun getX() = 1
}
class C : T {
val x: Int
<!CONFLICTING_PLATFORM_DECLARATIONS!>get() = 1<!>
}
@@ -0,0 +1,8 @@
trait T {
val x: Int
get() = 1
}
class C : T {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,4 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: List<String>) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: MutableList<String>) {}<!>
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo<T> {
fun foo(l: List<T>)
}
trait Bar<T> {
fun foo(l: List<T>)
}
<!CONFLICTING_PLATFORM_DECLARATIONS!>class Baz(f: Foo<String>, b: Bar<Int>): Foo<String> by f, Bar<Int> by b {
}<!>
@@ -0,0 +1,9 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo<T> {
fun foo(l: List<T>)
}
class Bar(f: Foo<String>): Foo<String> by f {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(l: List<Int>) {}<!>
}
@@ -0,0 +1,6 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class G<T>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: G<String>): G<Int> {null!!}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: G<Int>): G<String> {null!!}<!>
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo<T> {
fun foo(l: List<T>) {}
}
trait Bar<T> {
fun foo(l: List<T>) {}
}
<!CONFLICTING_JVM_DECLARATIONS!>class Baz()<!>: Foo<String>, Bar<Int> {
}
@@ -0,0 +1,4 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: List<String>) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: java.util.List<String>) {}<!>
@@ -0,0 +1,4 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: String) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: String?) {}<!>
@@ -0,0 +1,4 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -PLATFORM_CLASS_MAPPED_TO_KOTLIN
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: java.lang.String) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(s: String) {}<!>
@@ -0,0 +1,4 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun <T> foo(x: T): T {null!!}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: Any): Any {null!!}<!>
@@ -0,0 +1,6 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun <T: Foo> foo(x: T): T {null!!}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: Foo): Foo {null!!}<!>
@@ -0,0 +1,8 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo
trait Bar
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun <T: Foo> foo(x: T): T where T: Bar {null!!}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: Foo): Foo {null!!}<!>
fun foo(x: Bar): Bar {null!!}
@@ -0,0 +1,8 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo
trait Bar
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun <T> foo(x: T): T where T: Foo, T: Bar {null!!}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: Foo): Foo {null!!}<!>
fun foo(x: Bar): Bar {null!!}
@@ -0,0 +1,4 @@
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,6 @@
class C {
class object {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
}
@@ -0,0 +1,6 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun foo(x: Any) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun Any.foo() {}<!>
}
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX(t: Any) = 1<!>
val Any.x: Int
<!CONFLICTING_PLATFORM_DECLARATIONS!>get() = 1<!>
}
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun setX(x: Int) {}<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>var x: Int = 1<!>
}
@@ -0,0 +1,8 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun setX(x: Int) {}<!>
var x: Int = 1
<!CONFLICTING_PLATFORM_DECLARATIONS!>set(v) {}<!>
}
@@ -0,0 +1,6 @@
fun foo() {
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
}
@@ -0,0 +1,6 @@
class B {
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
}
@@ -0,0 +1,4 @@
object C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,5 @@
fun foo() =
object {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,2 @@
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
@@ -0,0 +1,5 @@
// FILE: a.kt
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
// FILE: b.kt
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
@@ -0,0 +1,3 @@
val x: Int
<!CONFLICTING_PLATFORM_DECLARATIONS!>get() = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
@@ -0,0 +1,5 @@
trait T {
val x: Int
<!CONFLICTING_PLATFORM_DECLARATIONS!>get() = 1<!>
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun getX() = 1<!>
}
@@ -0,0 +1,5 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
data class C(val c: Int) {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun `copy$default`(c: C, x: Int, m: Int) = 1<!>
}
@@ -0,0 +1,6 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
<!CONFLICTING_PLATFORM_DECLARATIONS!>class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>fun `a$default`(c: C, x: Int, m: Int) {}<!>
fun a(x: Int = 1) {}
}<!>
@@ -0,0 +1,5 @@
trait Foo
class Bar(f: Foo) : Foo by f {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val `$delegate_0`: Foo? = null<!>
}
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class C {
<!CONFLICTING_PLATFORM_DECLARATIONS!>inner class D {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val `this$0`: C? = null<!>
}<!>
}
@@ -0,0 +1,7 @@
trait T {
fun getX() = 1
}
class C : T {
<!CONFLICTING_PLATFORM_DECLARATIONS!>val x = 1<!>
}
@@ -0,0 +1,11 @@
trait T1 {
fun getX() = 1
}
trait T2 {
val x: Int
get() = 1
}
<!CONFLICTING_PLATFORM_DECLARATIONS!>class C : T1, T2<!> {
}
@@ -0,0 +1,7 @@
import kotlin.properties.ReadWriteProperty
import kotlin.properties.Delegates
class C {
val `x$delegate`: ReadWriteProperty<Any, Any>? = null
val x: String? by Delegates.notNull()
}
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.platform.*
[platformName("bar")]
fun foo(a: Any) {}
fun Any.foo() {}
@@ -0,0 +1,7 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
import kotlin.platform.*
<!CONFLICTING_JVM_DECLARATIONS!>[platformName("bar")]
fun foo(a: Any)<!> {}
<!CONFLICTING_JVM_DECLARATIONS!>fun bar(a: Any)<!> {}
@@ -27,6 +27,7 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import kotlin.Function1;
@@ -37,10 +38,13 @@ import org.jetbrains.jet.ConfigurationKind;
import org.jetbrains.jet.JetLiteFixture;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.TestJdkKind;
import org.jetbrains.jet.asJava.AsJavaPackage;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.diagnostics.*;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.Diagnostics;
import org.jetbrains.jet.utils.UtilsPackage;
import org.junit.Assert;
@@ -310,9 +314,18 @@ public abstract class BaseDiagnosticsTest extends JetLiteFixture {
return true;
}
Set<Diagnostic> jvmSignatureDiagnostics = new HashSet<Diagnostic>();
Collection<JetDeclaration> declarations = PsiTreeUtil.findChildrenOfType(jetFile, JetDeclaration.class);
for (JetDeclaration declaration : declarations) {
Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(declaration);
if (diagnostics == null) continue;
jvmSignatureDiagnostics.addAll(diagnostics.forElement(declaration));
}
final boolean[] ok = { true };
List<Diagnostic> diagnostics = ContainerUtil.filter(
CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile),
KotlinPackage.plus(CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile),
jvmSignatureDiagnostics),
whatDiagnosticsToConsider
);
CheckerTestUtil.diagnosticsDiff(diagnosedRanges, diagnostics, new CheckerTestUtil.DiagnosticDiffCallbacks() {
@@ -33,7 +33,7 @@ import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTest;
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class, JetDiagnosticsTestGenerated.TailRecursion.class})
public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
@TestMetadata("compiler/testData/diagnostics/tests")
@InnerTestClasses({Tests.Annotations.class, Tests.BackingField.class, Tests.Cast.class, Tests.CheckArguments.class, Tests.ClassObjects.class, Tests.ControlFlowAnalysis.class, Tests.ControlStructures.class, Tests.CyclicHierarchy.class, Tests.DataClasses.class, Tests.DataFlow.class, Tests.DataFlowInfoTraversal.class, Tests.DeclarationChecks.class, Tests.DelegatedProperty.class, Tests.Deparenthesize.class, Tests.Enum.class, Tests.Evaluate.class, Tests.Extensions.class, Tests.FunctionLiterals.class, Tests.Generics.class, Tests.Imports.class, Tests.IncompleteCode.class, Tests.Inference.class, Tests.Infos.class, Tests.Inline.class, Tests.Inner.class, Tests.J_k.class, Tests.Jdk_annotations.class, Tests.Labels.class, Tests.Library.class, Tests.Multimodule.class, Tests.NamedArguments.class, Tests.NullabilityAndAutoCasts.class, Tests.NullableTypes.class, Tests.Numbers.class, Tests.Objects.class, Tests.OperatorsOverloading.class, Tests.Overload.class, Tests.Override.class, Tests.Recovery.class, Tests.Redeclarations.class, Tests.Regressions.class, Tests.Resolve.class, Tests.Scopes.class, Tests.SenselessComparison.class, Tests.Shadowing.class, Tests.SmartCasts.class, Tests.Substitutions.class, Tests.Subtyping.class, Tests.Suppress.class, Tests.ThisAndSuper.class, Tests.Typedefs.class, Tests.Unit.class, Tests.Varargs.class, Tests.When.class})
@InnerTestClasses({Tests.Annotations.class, Tests.BackingField.class, Tests.Cast.class, Tests.CheckArguments.class, Tests.ClassObjects.class, Tests.ControlFlowAnalysis.class, Tests.ControlStructures.class, Tests.CyclicHierarchy.class, Tests.DataClasses.class, Tests.DataFlow.class, Tests.DataFlowInfoTraversal.class, Tests.DeclarationChecks.class, Tests.DelegatedProperty.class, Tests.Deparenthesize.class, Tests.DuplicateJvmSignature.class, Tests.Enum.class, Tests.Evaluate.class, Tests.Extensions.class, Tests.FunctionLiterals.class, Tests.Generics.class, Tests.Imports.class, Tests.IncompleteCode.class, Tests.Inference.class, Tests.Infos.class, Tests.Inline.class, Tests.Inner.class, Tests.J_k.class, Tests.Jdk_annotations.class, Tests.Labels.class, Tests.Library.class, Tests.Multimodule.class, Tests.NamedArguments.class, Tests.NullabilityAndAutoCasts.class, Tests.NullableTypes.class, Tests.Numbers.class, Tests.Objects.class, Tests.OperatorsOverloading.class, Tests.Overload.class, Tests.Override.class, Tests.Recovery.class, Tests.Redeclarations.class, Tests.Regressions.class, Tests.Resolve.class, Tests.Scopes.class, Tests.SenselessComparison.class, Tests.Shadowing.class, Tests.SmartCasts.class, Tests.Substitutions.class, Tests.Subtyping.class, Tests.Suppress.class, Tests.ThisAndSuper.class, Tests.Typedefs.class, Tests.Unit.class, Tests.Varargs.class, Tests.When.class})
public static class Tests extends AbstractJetDiagnosticsTest {
@TestMetadata("Abstract.kt")
public void testAbstract() throws Exception {
@@ -2545,6 +2545,245 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature")
@InnerTestClasses({DuplicateJvmSignature.AccidentalOverrides.class, DuplicateJvmSignature.Erasure.class, DuplicateJvmSignature.FunctionAndProperty.class, DuplicateJvmSignature.SpecialNames.class, DuplicateJvmSignature.TraitImpl.class})
public static class DuplicateJvmSignature extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInDuplicateJvmSignature() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides")
public static class AccidentalOverrides extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInAccidentalOverrides() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("classFunctionOverriddenByProperty.kt")
public void testClassFunctionOverriddenByProperty() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/classFunctionOverriddenByProperty.kt");
}
@TestMetadata("classPropertyOverriddenByFunction.kt")
public void testClassPropertyOverriddenByFunction() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/classPropertyOverriddenByFunction.kt");
}
@TestMetadata("traitFunctionOverriddenByProperty.kt")
public void testTraitFunctionOverriddenByProperty() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitFunctionOverriddenByProperty.kt");
}
@TestMetadata("traitPropertyOverriddenByFunction.kt")
public void testTraitPropertyOverriddenByFunction() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/accidentalOverrides/traitPropertyOverriddenByFunction.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure")
public static class Erasure extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInErasure() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("collections.kt")
public void testCollections() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/collections.kt");
}
@TestMetadata("delegateToTwoTraits.kt")
public void testDelegateToTwoTraits() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/delegateToTwoTraits.kt");
}
@TestMetadata("delegationAndOwnMethod.kt")
public void testDelegationAndOwnMethod() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/delegationAndOwnMethod.kt");
}
@TestMetadata("genericType.kt")
public void testGenericType() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/genericType.kt");
}
@TestMetadata("inheritFromTwoTraits.kt")
public void testInheritFromTwoTraits() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/inheritFromTwoTraits.kt");
}
@TestMetadata("kotlinAndJavaCollections.kt")
public void testKotlinAndJavaCollections() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/kotlinAndJavaCollections.kt");
}
@TestMetadata("nullableType.kt")
public void testNullableType() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/nullableType.kt");
}
@TestMetadata("typeMappedToJava.kt")
public void testTypeMappedToJava() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeMappedToJava.kt");
}
@TestMetadata("typeParameter.kt")
public void testTypeParameter() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameter.kt");
}
@TestMetadata("typeParameterWithBound.kt")
public void testTypeParameterWithBound() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithBound.kt");
}
@TestMetadata("typeParameterWithTwoBounds.kt")
public void testTypeParameterWithTwoBounds() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithTwoBounds.kt");
}
@TestMetadata("typeParameterWithTwoBoundsInWhere.kt")
public void testTypeParameterWithTwoBoundsInWhere() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithTwoBoundsInWhere.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty")
public static class FunctionAndProperty extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInFunctionAndProperty() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("class.kt")
public void testClass() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/class.kt");
}
@TestMetadata("classObject.kt")
public void testClassObject() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/classObject.kt");
}
@TestMetadata("extensionFunctionAndNormalFunction.kt")
public void testExtensionFunctionAndNormalFunction() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/extensionFunctionAndNormalFunction.kt");
}
@TestMetadata("extensionPropertyAndFunction.kt")
public void testExtensionPropertyAndFunction() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/extensionPropertyAndFunction.kt");
}
@TestMetadata("functionAndSetter.kt")
public void testFunctionAndSetter() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/functionAndSetter.kt");
}
@TestMetadata("functionAndVar.kt")
public void testFunctionAndVar() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/functionAndVar.kt");
}
@TestMetadata("localClass.kt")
public void testLocalClass() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/localClass.kt");
}
@TestMetadata("nestedClass.kt")
public void testNestedClass() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/nestedClass.kt");
}
@TestMetadata("object.kt")
public void testObject() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/object.kt");
}
@TestMetadata("objectExpression.kt")
public void testObjectExpression() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/objectExpression.kt");
}
@TestMetadata("topLevel.kt")
public void testTopLevel() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevel.kt");
}
@TestMetadata("topLevelDifferentFiles.kt")
public void testTopLevelDifferentFiles() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelDifferentFiles.kt");
}
@TestMetadata("topLevelGetter.kt")
public void testTopLevelGetter() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/topLevelGetter.kt");
}
@TestMetadata("trait.kt")
public void testTrait() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/functionAndProperty/trait.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames")
public static class SpecialNames extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInSpecialNames() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("componentInheritedFromTrait.kt")
public void testComponentInheritedFromTrait() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/componentInheritedFromTrait.kt");
}
@TestMetadata("defaults.kt")
public void testDefaults() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/defaults.kt");
}
@TestMetadata("delegationBy.kt")
public void testDelegationBy() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/delegationBy.kt");
}
@TestMetadata("innerClassField.kt")
public void testInnerClassField() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/innerClassField.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl")
public static class TraitImpl extends AbstractJetDiagnosticsTest {
public void testAllFilesPresentInTraitImpl() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("oneTrait.kt")
public void testOneTrait() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/oneTrait.kt");
}
@TestMetadata("twoTraits.kt")
public void testTwoTraits() throws Exception {
doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/twoTraits.kt");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("DuplicateJvmSignature");
suite.addTestSuite(DuplicateJvmSignature.class);
suite.addTestSuite(AccidentalOverrides.class);
suite.addTestSuite(Erasure.class);
suite.addTestSuite(FunctionAndProperty.class);
suite.addTestSuite(SpecialNames.class);
suite.addTestSuite(TraitImpl.class);
return suite;
}
}
@TestMetadata("compiler/testData/diagnostics/tests/enum")
@InnerTestClasses({Enum.Inner.class})
public static class Enum extends AbstractJetDiagnosticsTest {
@@ -7382,6 +7621,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
suite.addTest(DeclarationChecks.innerSuite());
suite.addTest(DelegatedProperty.innerSuite());
suite.addTestSuite(Deparenthesize.class);
suite.addTest(DuplicateJvmSignature.innerSuite());
suite.addTest(Enum.innerSuite());
suite.addTestSuite(Evaluate.class);
suite.addTestSuite(Extensions.class);
@@ -31,7 +31,7 @@ import org.jetbrains.jet.checkers.AbstractJetDiagnosticsTestWithStdLib;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib")
@InnerTestClasses({JetDiagnosticsTestWithStdLibGenerated.Annotations.class, JetDiagnosticsTestWithStdLibGenerated.CallableReference.class, JetDiagnosticsTestWithStdLibGenerated.FunctionLiterals.class, JetDiagnosticsTestWithStdLibGenerated.KotlinSignature.class})
@InnerTestClasses({JetDiagnosticsTestWithStdLibGenerated.Annotations.class, JetDiagnosticsTestWithStdLibGenerated.CallableReference.class, JetDiagnosticsTestWithStdLibGenerated.DuplicateJvmSignature.class, JetDiagnosticsTestWithStdLibGenerated.FunctionLiterals.class, JetDiagnosticsTestWithStdLibGenerated.KotlinSignature.class})
public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnosticsTestWithStdLib {
public void testAllFilesPresentInTestsWithStdLib() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), true);
@@ -357,6 +357,29 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic
}
}
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature")
public static class DuplicateJvmSignature extends AbstractJetDiagnosticsTestWithStdLib {
public void testAllFilesPresentInDuplicateJvmSignature() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("delegatedProperty.kt")
public void testDelegatedProperty() throws Exception {
doTest("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature/delegatedProperty.kt");
}
@TestMetadata("platformNames.kt")
public void testPlatformNames() throws Exception {
doTest("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature/platformNames.kt");
}
@TestMetadata("platformNamesDuplicate.kt")
public void testPlatformNamesDuplicate() throws Exception {
doTest("compiler/testData/diagnostics/testsWithStdLib/duplicateJvmSignature/platformNamesDuplicate.kt");
}
}
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/functionLiterals")
public static class FunctionLiterals extends AbstractJetDiagnosticsTestWithStdLib {
public void testAllFilesPresentInFunctionLiterals() throws Exception {
@@ -393,6 +416,7 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic
suite.addTestSuite(JetDiagnosticsTestWithStdLibGenerated.class);
suite.addTest(Annotations.innerSuite());
suite.addTest(CallableReference.innerSuite());
suite.addTestSuite(DuplicateJvmSignature.class);
suite.addTestSuite(FunctionLiterals.class);
suite.addTestSuite(KotlinSignature.class);
return suite;
@@ -18,14 +18,11 @@ package org.jetbrains.jet.plugin.highlighter;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration;
import org.jetbrains.jet.asJava.KotlinLightClassForPackage;
import org.jetbrains.jet.lang.psi.JetClassBody;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.asJava.AsJavaPackage;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.Diagnostics;
import org.jetbrains.jet.plugin.project.TargetPlatform;
@@ -35,38 +32,13 @@ public class DuplicateJvmSignatureAnnotator implements Annotator {
@Override
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
Diagnostics diagnostics;
if (!(element instanceof JetFile) && !(element instanceof JetDeclaration)) return;
PsiFile file = element.getContainingFile();
if (!(file instanceof JetFile) || TargetPlatformDetector.getPlatform((JetFile) file) != TargetPlatform.JVM) return;
Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(element);
PsiElement parent = element.getParent();
if (parent instanceof JetFile) {
if (TargetPlatformDetector.getPlatform((JetFile) parent) != TargetPlatform.JVM) return;
diagnostics = getDiagnosticsForPackage((JetFile) parent);
}
else if (parent instanceof JetClassBody) {
PsiElement parentsParent = parent.getParent();
if (!(parentsParent instanceof JetClassOrObject)) return;
if (TargetPlatformDetector.getPlatform(((JetClassBody) parent).getContainingJetFile()) != TargetPlatform.JVM) return;
diagnostics = getDiagnosticsForNonLocalClass((JetClassOrObject) parentsParent);
}
else {
return;
}
if (diagnostics == null) return;
JetPsiChecker.annotateElement(element, holder, diagnostics);
}
@NotNull
private static Diagnostics getDiagnosticsForPackage(JetFile file) {
Project project = file.getProject();
return KotlinLightClassForPackage.FileStubCache.getInstance(project).get(
file.getPackageFqName(),
GlobalSearchScope.allScope(project)
).getValue().getExtraDiagnostics();
}
@NotNull
private static Diagnostics getDiagnosticsForNonLocalClass(JetClassOrObject jetClassOrObject) {
return KotlinLightClassForExplicitDeclaration.getLightClassData(jetClassOrObject).getExtraDiagnostics();
}
}
@@ -0,0 +1,11 @@
trait T1 {
fun getX() = 1
}
trait T2 {
val x: Int
get() = 1
}
<error>class C : T1, T2</error> {
}
@@ -422,7 +422,7 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest {
}
@TestMetadata("idea/testData/checker/duplicateJvmSignature")
@InnerTestClasses({DuplicateJvmSignature.FunctionAndProperty.class})
@InnerTestClasses({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);
@@ -471,10 +471,24 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest {
}
@TestMetadata("idea/testData/checker/duplicateJvmSignature/traitImpl")
public static class TraitImpl extends AbstractJetPsiCheckerTest {
public void testAllFilesPresentInTraitImpl() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/checker/duplicateJvmSignature/traitImpl"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("twoTraits.kt")
public void testTwoTraits() throws Exception {
doTest("idea/testData/checker/duplicateJvmSignature/traitImpl/twoTraits.kt");
}
}
public static Test innerSuite() {
TestSuite suite = new TestSuite("DuplicateJvmSignature");
suite.addTestSuite(DuplicateJvmSignature.class);
suite.addTestSuite(FunctionAndProperty.class);
suite.addTestSuite(TraitImpl.class);
return suite;
}
}