From 2a729082a020b6648df731e3f721d8cd76240734 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 27 May 2019 19:55:30 +0300 Subject: [PATCH] Add UltraLightFacadeClassTest --- .../asJava/ultraLightFacades/coroutines.kt | 5 + .../asJava/ultraLightFacades/importAliases.kt | 3 + .../asJava/ultraLightFacades/inlineOnly.kt | 2 + .../asJava/ultraLightFacades/jvmField.kt | 4 + .../asJava/ultraLightFacades/jvmName.kt | 22 +++++ .../jvmWildcardAnnotations.kt | 31 ++++++ .../ultraLightFacades/lateinitProperty.kt | 10 ++ .../ultraLightFacades/multifileFacade.kt | 4 + .../ultraLightFacades/multifileFacade.kt.1 | 4 + .../multifileFacadeJvmName.kt | 4 + .../multifileFacadeJvmName.kt.1 | 4 + .../asJava/ultraLightFacades/properties.kt | 73 ++++++++++++++ .../ultraLightFacades/simpleFunctions.kt | 9 ++ .../ultraLightFacades/throwsAnnotation.kt | 9 ++ .../ultraLightFacades/wildcardOptimization.kt | 51 ++++++++++ .../kotlin/generators/tests/GenerateTests.kt | 5 + .../generators/tests/GenerateTests.kt.183 | 5 + .../injava/MultiFileFacadeMembers.java | 3 +- ...bstractUltraLightFacadeClassLoadingTest.kt | 55 +++++++++++ .../UltraLightFacadeClassTestGenerated.java | 96 +++++++++++++++++++ .../kotlin/idea/perf/UltraLightChecker.kt | 38 +++++++- 21 files changed, 431 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/asJava/ultraLightFacades/coroutines.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/importAliases.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/inlineOnly.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/jvmField.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/jvmName.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/jvmWildcardAnnotations.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/lateinitProperty.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/multifileFacade.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/multifileFacade.kt.1 create mode 100644 compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt.1 create mode 100644 compiler/testData/asJava/ultraLightFacades/properties.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/throwsAnnotation.kt create mode 100644 compiler/testData/asJava/ultraLightFacades/wildcardOptimization.kt create mode 100644 idea/tests/org/jetbrains/kotlin/asJava/classes/AbstractUltraLightFacadeClassLoadingTest.kt create mode 100644 idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightFacadeClassTestGenerated.java diff --git a/compiler/testData/asJava/ultraLightFacades/coroutines.kt b/compiler/testData/asJava/ultraLightFacades/coroutines.kt new file mode 100644 index 00000000000..ba95cb14367 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/coroutines.kt @@ -0,0 +1,5 @@ +/** should load cls */ + +suspend fun doSomething(foo: String): Int {} + +fun async(block: suspend () -> T) \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightFacades/importAliases.kt b/compiler/testData/asJava/ultraLightFacades/importAliases.kt new file mode 100644 index 00000000000..fef67e936dd --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/importAliases.kt @@ -0,0 +1,3 @@ +import JS = kotlin.jvm.JvmName + +@JS("notFoo") fun foo() {} diff --git a/compiler/testData/asJava/ultraLightFacades/inlineOnly.kt b/compiler/testData/asJava/ultraLightFacades/inlineOnly.kt new file mode 100644 index 00000000000..6fe4a922846 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/inlineOnly.kt @@ -0,0 +1,2 @@ +@kotlin.internal.InlineOnly +inline fun foo() {} diff --git a/compiler/testData/asJava/ultraLightFacades/jvmField.kt b/compiler/testData/asJava/ultraLightFacades/jvmField.kt new file mode 100644 index 00000000000..b9fdefe6a29 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/jvmField.kt @@ -0,0 +1,4 @@ +@JvmField +val a: Collection<*> = emptyList() +@JvmField +var b: Int = 1 diff --git a/compiler/testData/asJava/ultraLightFacades/jvmName.kt b/compiler/testData/asJava/ultraLightFacades/jvmName.kt new file mode 100644 index 00000000000..0f0542b67a9 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/jvmName.kt @@ -0,0 +1,22 @@ +var rwProp: Int + @JvmName("get_rwProp") + get() = 0 + @JvmName("set_rwProp") + set(v) {} + +@get:JvmName("xyz1") +@set:JvmName("xyz2") +var xyz: String + get() = "" + set(value) {} + +@get:JvmName("hasBigArity") +val hasBigArity: Boolean + get() = true + +fun getRwProp(): Int = 123 +fun setRwProp(v: Int) {} + +fun foo(x: List) {} +@JvmName("fooInt") +fun foo(x: List) {} diff --git a/compiler/testData/asJava/ultraLightFacades/jvmWildcardAnnotations.kt b/compiler/testData/asJava/ultraLightFacades/jvmWildcardAnnotations.kt new file mode 100644 index 00000000000..ba325e60feb --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/jvmWildcardAnnotations.kt @@ -0,0 +1,31 @@ +class Inv +class Out +class OutPair +class In + +class Final +open class Open + +@JvmSuppressWildcards(true) +fun deepOpen(x: Out>>) {} + +@JvmSuppressWildcards(false) +fun bar(): Out = null!! + +fun simpleOut(x: Out<@JvmWildcard Final>) {} +fun simpleIn(x: In<@JvmWildcard Any?>) {} + +fun falseTrueFalse(): @JvmSuppressWildcards(false) OutPair, Out<@JvmSuppressWildcards(false) Final>>> = null!! +fun combination(): @JvmSuppressWildcards OutPair>> = null!! + +@JvmSuppressWildcards(false) +fun foo(x: Boolean, y: Out): Int = 1 + +@JvmSuppressWildcards(true) +fun bar(x: Boolean, y: In, z: @JvmSuppressWildcards(false) Long): Int = 1 + +@JvmSuppressWildcards(true) +fun foo2(): Out + +@JvmSuppressWildcards(true) +fun foo3(): In diff --git a/compiler/testData/asJava/ultraLightFacades/lateinitProperty.kt b/compiler/testData/asJava/ultraLightFacades/lateinitProperty.kt new file mode 100644 index 00000000000..fa252d3ba43 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/lateinitProperty.kt @@ -0,0 +1,10 @@ +lateinit var a: String + +lateinit var b: String + private set + +lateinit var c: String + protected set + +lateinit var d: String + internal set diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt b/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt new file mode 100644 index 00000000000..80ac73702af --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt @@ -0,0 +1,4 @@ +@file:JvmMultifileClass +@file:JvmName("multifileFacade") + +fun foo() = 42 \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt.1 b/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt.1 new file mode 100644 index 00000000000..3ee8c99cde2 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacade.kt.1 @@ -0,0 +1,4 @@ +@file:JvmMultifileClass +@file:JvmName("multifileFacade") + +fun bar() = 24 \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt b/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt new file mode 100644 index 00000000000..80ac73702af --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt @@ -0,0 +1,4 @@ +@file:JvmMultifileClass +@file:JvmName("multifileFacade") + +fun foo() = 42 \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt.1 b/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt.1 new file mode 100644 index 00000000000..eb5a140c912 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt.1 @@ -0,0 +1,4 @@ +@file:JvmMultifileClass +@file:JvmName("otherMultifileFacade") + +fun bar() = 24 \ No newline at end of file diff --git a/compiler/testData/asJava/ultraLightFacades/properties.kt b/compiler/testData/asJava/ultraLightFacades/properties.kt new file mode 100644 index 00000000000..3c4b0c7b8eb --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/properties.kt @@ -0,0 +1,73 @@ + +import kotlin.reflect.KProperty + +val f1 = 2 + +val intConst: dynamic = 30 +val arrayConst: Any = byteArrayOf(1,2) + +protected var f2 = 3 + +var name: String = "x" + +val isEmpty get() = false +var isEmptyMutable: Boolean? +var islowercase: Boolean? +var isEmptyInt: Int? +var getInt: Int? + +internal var stringRepresentation: String +get() = this.toString() +set(value) { + setDataFromString(value) +} + +const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated" + +var counter = 0 +set(value) { + if (value >= 0) field = value +} +var counter2 : Int? +get() = field +set(value) { + if (value >= 0) field = value +} + +lateinit var subject: Unresolved +internal lateinit var internalVarPrivateSet: String +private set +protected lateinit var protectedLateinitVar: String + +var delegatedProp: String by Delegate() +var delegatedProp2 by MyProperty() + +var lazyProp: String by lazy { "abc" } + +val Int.intProp: Int +get() = 1 + +final internal var internalWithPrivateSet: Int = 1 +private set + +protected var protectedWithPrivateSet: String = "" +private set + +val sum: (Int)->Int = { x: Int -> sum(x - 1) + x } + +operator fun getValue(t: T, p: KProperty<*>): Int = 42 +operator fun setValue(t: T, p: KProperty<*>, i: Int) {} + +@delegate:Transient +val plainField: Int = 1 + +@delegate:Transient +val lazy by lazy { 1 } + +public var int1: Int + private set + protected get +public var int2: Int + public get + internal set + diff --git a/compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt b/compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt new file mode 100644 index 00000000000..f49d6bd279c --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt @@ -0,0 +1,9 @@ +open fun bar(a: Int, b:Any, c:Foo): Unit {} +internal fun bar2(a: Sequence, b: Unresolved) {} +private fun bar3(x: Foo.Inner, vararg y: Inner) = "str" +fun bar4() = 42 + +public fun nullableVararg(vararg o: Any?): Unit + +operator fun plus(increment: Int): Foo {} +fun String.onString(a: (Int) -> Any?): Foo {} diff --git a/compiler/testData/asJava/ultraLightFacades/throwsAnnotation.kt b/compiler/testData/asJava/ultraLightFacades/throwsAnnotation.kt new file mode 100644 index 00000000000..7350e8870a7 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/throwsAnnotation.kt @@ -0,0 +1,9 @@ + +class MyException : Exception + +@Throws(java.io.IOException::class, MyException::class) +fun readFile(name: String): String {} + +// Should be mapped to java.lang.Throwable +@Throws(kotlin.Throwable::class) +fun baz() {} diff --git a/compiler/testData/asJava/ultraLightFacades/wildcardOptimization.kt b/compiler/testData/asJava/ultraLightFacades/wildcardOptimization.kt new file mode 100644 index 00000000000..b2877fd5ac2 --- /dev/null +++ b/compiler/testData/asJava/ultraLightFacades/wildcardOptimization.kt @@ -0,0 +1,51 @@ +class Inv +class Out +class OutPair +class In + +class Final +open class Open + +// The signatures are obtained from compiler/testData/writeSignature/declarationSiteVariance/wildcardOptimization +fun openClassArgument(x: Out, y: In) {} +fun finalClassArgument(x: Out, y: In) {} +fun oneArgumentFinal(x: OutPair) {} + +fun arrayOfOutOpen(x: Array>) {} +fun arrayOfOutFinal(x: Array>) {} +fun outOfArrayOpen(x: Out>) {} +fun outOfArrayOutOpen(x: Out>) {} + +fun deepOpen(x: Out>>) {} +fun deepFinal(x: Out>>) {} + +fun skipAllOutInvWildcards(): Inv>>> = null!! +fun skipAllInvWildcards(): Inv>> = null!! +fun notDeepIn(): In = null!! +fun skipWildcardsUntilIn0(): Out>> = null!! +fun skipWildcardsUntilIn1(): Out>> = null!! +fun skipWildcardsUntilIn2(): Out>>> = null!! +fun skipWildcardsUntilInProjection(): Inv> = null!! + +fun outIn(x: Out>) {} +fun outInAny(x: Out>) {} + +fun invInv(x: Out>) {} +fun invOut(x: Out>) {} +fun invOutFinal(x: Out>) {} +fun invIn(x: Out>) {} +fun invInAny(x: Out>) {} + +fun inFinal(x: In) {} +fun inAny(x: In) {} +fun inOutFinal(x: In>) {} + +fun invOpen(x: Inv) {} +fun invFinal(x: Inv) {} +fun invOutOpen(x: Inv>) {} +fun invOutFinal(x: Inv>) {} +fun invInOutOpen(x: Inv>>) {} +fun invInOutFinal(x: Inv>>) {} +fun invOutProjectedOutFinal(x: Inv>) {} + +fun typeParameter(x: Out, y: In) {} diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 3d466b098d7..7c4c786bd06 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeT import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightClassLoadingTest import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightClassSanityTest +import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightFacadeClassTest import org.jetbrains.kotlin.checkers.* import org.jetbrains.kotlin.copyright.AbstractUpdateKotlinCopyrightTest import org.jetbrains.kotlin.findUsages.AbstractFindUsagesTest @@ -843,6 +844,10 @@ fun main(args: Array) { model("asJava/ultraLightClasses", pattern = KT_OR_KTS) } + testClass { + model("asJava/ultraLightFacades", pattern = KT_OR_KTS) + } + testClass { model("asJava/lightClasses", excludeDirs = listOf("local", "compilationErrors", "ideRegression"), pattern = KT_OR_KTS_WITHOUT_DOTS_IN_NAME) } diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 index 54d96ba5994..7255841d6b7 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt.183 @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeT import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightClassLoadingTest import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightClassSanityTest +import org.jetbrains.kotlin.asJava.classes.AbstractUltraLightFacadeClassTest import org.jetbrains.kotlin.checkers.* import org.jetbrains.kotlin.copyright.AbstractUpdateKotlinCopyrightTest import org.jetbrains.kotlin.findUsages.AbstractFindUsagesTest @@ -856,6 +857,10 @@ fun main(args: Array) { model("asJava/ultraLightClasses", pattern = KT_OR_KTS) } + testClass { + model("asJava/ultraLightFacades", pattern = KT_OR_KTS) + } + testClass { model("asJava/lightClasses", excludeDirs = listOf("local", "compilationErrors", "ideRegression"), pattern = KT_OR_KTS_WITHOUT_DOTS_IN_NAME) } diff --git a/idea/idea-completion/testData/injava/MultiFileFacadeMembers.java b/idea/idea-completion/testData/injava/MultiFileFacadeMembers.java index b33cbce486d..3ae69ab91b0 100644 --- a/idea/idea-completion/testData/injava/MultiFileFacadeMembers.java +++ b/idea/idea-completion/testData/injava/MultiFileFacadeMembers.java @@ -5,5 +5,4 @@ public class Testing { } // EXIST: funInFacade -// EXIST: funInFacade2 -// LIGHT_CLASS: facades.MultiFileFacadeClass \ No newline at end of file +// EXIST: funInFacade2 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/AbstractUltraLightFacadeClassLoadingTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/classes/AbstractUltraLightFacadeClassLoadingTest.kt new file mode 100644 index 00000000000..dc16369691d --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/AbstractUltraLightFacadeClassLoadingTest.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.asJava.classes + +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.testFramework.LightProjectDescriptor +import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport +import org.jetbrains.kotlin.idea.perf.UltraLightChecker +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor +import org.jetbrains.kotlin.kdoc.psi.api.KDoc +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType +import java.io.File + +abstract class AbstractUltraLightFacadeClassTest : KotlinLightCodeInsightFixtureTestCase() { + override fun getProjectDescriptor(): LightProjectDescriptor = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE + + fun doTest(testDataPath: String) { + val file = myFixture.addFileToProject(testDataPath, File(testDataPath).readText()) as KtFile + + val additionalFilePath = "$testDataPath.1" + if(File(additionalFilePath).exists()) { + myFixture.addFileToProject(additionalFilePath.replaceFirst(".kt.1", "1.kt"), File(additionalFilePath).readText()) + } + + val scope = GlobalSearchScope.allScope(project) + val facades = KotlinAsJavaSupport.getInstance(project).getFacadeNames(FqName.ROOT, scope) + + for (facadeName in facades) { + val ultraLightClass = UltraLightChecker.checkFacadeEquivalence(FqName(facadeName), scope, project) + if (ultraLightClass != null) { + checkClassLoadingExpectations(file, ultraLightClass) + } + } + } + + private fun checkClassLoadingExpectations( + primaryFile: KtFile, + ultraLightClass: KtLightClassForFacade + ) { + + val clsLoadingExpected = primaryFile.findDescendantOfType { it.text?.contains("should load cls") == true } !== null + + assertEquals( + "Cls-loaded status differs from expected for ${ultraLightClass.qualifiedName}", + clsLoadingExpected, + ultraLightClass.isClsDelegateLoaded + ) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightFacadeClassTestGenerated.java b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightFacadeClassTestGenerated.java new file mode 100644 index 00000000000..b53f9ead75b --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/asJava/classes/UltraLightFacadeClassTestGenerated.java @@ -0,0 +1,96 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.asJava.classes; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TargetBackend; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("compiler/testData/asJava/ultraLightFacades") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class UltraLightFacadeClassTestGenerated extends AbstractUltraLightFacadeClassTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInUltraLightFacades() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/ultraLightFacades"), Pattern.compile("^(.+)\\.(kt|kts)$"), TargetBackend.ANY, true); + } + + @TestMetadata("coroutines.kt") + public void testCoroutines() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/coroutines.kt"); + } + + @TestMetadata("importAliases.kt") + public void testImportAliases() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/importAliases.kt"); + } + + @TestMetadata("inlineOnly.kt") + public void testInlineOnly() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/inlineOnly.kt"); + } + + @TestMetadata("jvmField.kt") + public void testJvmField() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/jvmField.kt"); + } + + @TestMetadata("jvmName.kt") + public void testJvmName() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/jvmName.kt"); + } + + @TestMetadata("jvmWildcardAnnotations.kt") + public void testJvmWildcardAnnotations() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/jvmWildcardAnnotations.kt"); + } + + @TestMetadata("lateinitProperty.kt") + public void testLateinitProperty() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/lateinitProperty.kt"); + } + + @TestMetadata("multifileFacade.kt") + public void testMultifileFacade() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/multifileFacade.kt"); + } + + @TestMetadata("multifileFacadeJvmName.kt") + public void testMultifileFacadeJvmName() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/multifileFacadeJvmName.kt"); + } + + @TestMetadata("properties.kt") + public void testProperties() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/properties.kt"); + } + + @TestMetadata("simpleFunctions.kt") + public void testSimpleFunctions() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/simpleFunctions.kt"); + } + + @TestMetadata("throwsAnnotation.kt") + public void testThrowsAnnotation() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/throwsAnnotation.kt"); + } + + @TestMetadata("wildcardOptimization.kt") + public void testWildcardOptimization() throws Exception { + runTest("compiler/testData/asJava/ultraLightFacades/wildcardOptimization.kt"); + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt index 9b01486c143..266991aad1b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/perf/UltraLightChecker.kt @@ -6,16 +6,16 @@ package org.jetbrains.kotlin.idea.perf import com.intellij.openapi.Disposable +import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.psi.* +import com.intellij.psi.search.GlobalSearchScope import com.intellij.testFramework.UsefulTestCase import org.jetbrains.kotlin.asJava.LightClassGenerationSupport -import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration -import org.jetbrains.kotlin.asJava.classes.KtUltraLightClass -import org.jetbrains.kotlin.asJava.classes.KtUltraLightSupport -import org.jetbrains.kotlin.asJava.classes.isPrivateOrParameterInPrivateMethod +import org.jetbrains.kotlin.asJava.classes.* import org.jetbrains.kotlin.asJava.elements.KtLightNullabilityAnnotation import org.jetbrains.kotlin.load.kotlin.NON_EXISTENT_CLASS_NAME +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.junit.Assert @@ -37,6 +37,36 @@ object UltraLightChecker { fun allClasses(file: KtFile): List = SyntaxTraverser.psiTraverser(file).filter(KtClassOrObject::class.java).toList() + + fun checkFacadeEquivalence( + fqName: FqName, + searchScope: GlobalSearchScope, + project: Project + ): KtLightClassForFacade? { + + val oldForceFlag = KtUltraLightSupport.forceUsingOldLightClasses + KtUltraLightSupport.forceUsingOldLightClasses = true + val gold = KtLightClassForFacade.createForFacadeNoCache(fqName, searchScope, project) + KtUltraLightSupport.forceUsingOldLightClasses = false + val ultraLightClass = KtLightClassForFacade.createForFacadeNoCache(fqName, searchScope, project) ?: return null + KtUltraLightSupport.forceUsingOldLightClasses = oldForceFlag + + if (gold != null) { + Assert.assertFalse(gold.javaClass.name.contains("Ultra")) + } + + val goldText = gold?.renderClass().orEmpty() + val ultraText = ultraLightClass.renderClass() + + if (goldText != ultraText) { + Assert.assertEquals( + "// Classic implementation:\n$goldText", + "// Ultra-light implementation:\n$ultraText" + ) + } + return ultraLightClass + } + fun checkClassEquivalence(ktClass: KtClassOrObject): KtUltraLightClass? { val gold = KtLightClassForSourceDeclaration.createNoCache(ktClass, forceUsingOldLightClasses = true) val ultraLightClass = LightClassGenerationSupport.getInstance(ktClass.project).createUltraLightClass(ktClass) ?: return null