diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.java b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.java index a2260c4be27..02dc355584c 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.java +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/ClassObjectField.java @@ -3,6 +3,11 @@ public final class ClassObjectField implements kotlin.jvm.internal.KObject { public static final java.lang.String x = ""; private static final java.lang.String y = ""; public static final ClassObjectField.Default Default; + /** + * @deprecated + */ + @java.lang.Deprecated + public static final ClassObjectField.Default OBJECT$; public ClassObjectField() { /* compiled code */ } diff --git a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.java b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.java index 72bc3eaef1d..1997bc2ab45 100644 --- a/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.java +++ b/compiler/testData/asJava/lightClasses/nullabilityAnnotations/TraitClassObjectField.java @@ -1,5 +1,10 @@ public interface TraitClassObjectField { TraitClassObjectField.Default Default; + /** + * @deprecated + */ + @java.lang.Deprecated + TraitClassObjectField.Default OBJECT$; @org.jetbrains.annotations.Nullable java.lang.String x = ""; diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt index fd43f9a43bd..433aca2c956 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.kt @@ -2,4 +2,10 @@ class C { class object {} val Default = C +} + +class D { + class object {} + + val `OBJECT$` = D } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.txt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.txt index 248b9f35155..c4d122a00c7 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.txt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObject.txt @@ -14,3 +14,18 @@ internal final class C { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } } + +internal final class D { + public constructor D() + internal final val `OBJECT$`: D.Default + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + internal class object Default { + private constructor Default() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt index 2471324107a..8c8780618a9 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.kt @@ -4,4 +4,12 @@ class C { } val Default = C +} + +class D { + class object { + val `OBJECT$` = this + } + + val `OBJECT$` = D } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.txt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.txt index 75eae1ea90f..1f9acaec143 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.txt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/specialNames/classObjectCopiedFieldObject.txt @@ -15,3 +15,19 @@ internal final class C { public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } } + +internal final class D { + public constructor D() + internal final val `OBJECT$`: D.Default + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + internal class object Default { + private constructor Default() + internal final val `OBJECT$`: D.Default + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/idea/testData/completion/injava/ClassObjectField.java b/idea/testData/completion/injava/ClassObjectField.java new file mode 100644 index 00000000000..e944968728d --- /dev/null +++ b/idea/testData/completion/injava/ClassObjectField.java @@ -0,0 +1,8 @@ +public class Testing { + public static void test() { + mockLib.foo.LibClass. + } +} + +// EXIST: Default +// EXIST: OBJECT$ \ No newline at end of file diff --git a/idea/testData/resolve/referenceInJava/DeprecatedClassObjectField.java b/idea/testData/resolve/referenceInJava/DeprecatedClassObjectField.java new file mode 100644 index 00000000000..fa8a730dae7 --- /dev/null +++ b/idea/testData/resolve/referenceInJava/DeprecatedClassObjectField.java @@ -0,0 +1,7 @@ +public class ClassObjectField { + public static void foo() { + k.ClassWithClassObject.OBJECT$.f(); + } +} + +// REF: class object of (k).ClassWithClassObject diff --git a/idea/tests/org/jetbrains/kotlin/completion/CompiledKotlinInJavaCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/CompiledKotlinInJavaCompletionTestGenerated.java index dd597b6f5f8..65ea045543f 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/CompiledKotlinInJavaCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/CompiledKotlinInJavaCompletionTestGenerated.java @@ -55,6 +55,12 @@ public class CompiledKotlinInJavaCompletionTestGenerated extends AbstractCompile doTest(fileName); } + @TestMetadata("ClassObjectField.java") + public void testClassObjectField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/injava/ClassObjectField.java"); + doTest(fileName); + } + @TestMetadata("ClassesFromNamespace.java") public void testClassesFromNamespace() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/injava/ClassesFromNamespace.java"); diff --git a/idea/tests/org/jetbrains/kotlin/completion/KotlinSourceInJavaCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/KotlinSourceInJavaCompletionTestGenerated.java index 61b76a921e3..b5e8a1f2676 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/KotlinSourceInJavaCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/KotlinSourceInJavaCompletionTestGenerated.java @@ -55,6 +55,12 @@ public class KotlinSourceInJavaCompletionTestGenerated extends AbstractKotlinSou doTest(fileName); } + @TestMetadata("ClassObjectField.java") + public void testClassObjectField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/injava/ClassObjectField.java"); + doTest(fileName); + } + @TestMetadata("ClassesFromNamespace.java") public void testClassesFromNamespace() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/injava/ClassesFromNamespace.java"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java b/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java index 0eb8e250e5e..2804da99fb5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/javaFacade/JetJavaFacadeTest.java @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.asJava.LightClassUtil; import org.jetbrains.kotlin.idea.JetLightCodeInsightFixtureTestCase; import org.jetbrains.kotlin.idea.JetLightProjectDescriptor; import org.jetbrains.kotlin.idea.PluginTestCaseBase; +import org.jetbrains.kotlin.load.java.JvmAbi; import org.jetbrains.kotlin.name.SpecialNames; import org.jetbrains.kotlin.psi.*; @@ -199,6 +200,14 @@ public class JetJavaFacadeTest extends JetLightCodeInsightFixtureTestCase { assertTrue(instance.hasModifierProperty(PsiModifier.STATIC)); assertTrue(instance.hasModifierProperty(PsiModifier.FINAL)); + PsiField deprecatedAccessor = theClass.findFieldByName(JvmAbi.DEPRECATED_CLASS_OBJECT_FIELD, false); + assertNotNull(deprecatedAccessor); + assertEquals("foo.TheClass." + defaultClassObjectName, deprecatedAccessor.getType().getCanonicalText()); + assertTrue(deprecatedAccessor.hasModifierProperty(PsiModifier.PUBLIC)); + assertTrue(deprecatedAccessor.hasModifierProperty(PsiModifier.STATIC)); + assertTrue(deprecatedAccessor.hasModifierProperty(PsiModifier.FINAL)); + assertTrue(deprecatedAccessor.isDeprecated()); + PsiMethod[] methods = classObjectClass.findMethodsByName("getOut", false); assertEquals("java.io.PrintStream", methods[0].getReturnType().getCanonicalText()); diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java index c2b062f967b..a36ac00f57e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveInJavaTestGenerated.java @@ -60,6 +60,12 @@ public class ReferenceResolveInJavaTestGenerated extends AbstractReferenceResolv doTest(fileName); } + @TestMetadata("DeprecatedClassObjectField.java") + public void testDeprecatedClassObjectField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/DeprecatedClassObjectField.java"); + doTest(fileName); + } + @TestMetadata("EnumEntry.java") public void testEnumEntry() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/referenceInJava/EnumEntry.java");