Add support for UltraLightScripts

This commit is contained in:
Igor Yakovlev
2020-04-30 22:24:14 +03:00
parent 6a2461f2c6
commit 62c24c95b5
16 changed files with 404 additions and 51 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.asJava.classes
import com.intellij.testFramework.LightProjectDescriptor
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.perf.UltraLightChecker
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
@@ -26,6 +27,10 @@ abstract class AbstractUltraLightClassSanityTest : KotlinLightCodeInsightFixture
UltraLightChecker.checkForReleaseCoroutine(sourceText, module)
if (file.safeIsScript()) {
ScriptConfigurationManager.updateScriptDependenciesSynchronously(file)
}
UltraLightChecker.checkClassEquivalence(file)
}
}
@@ -0,0 +1,35 @@
/*
* 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.LightProjectDescriptor
import junit.framework.TestCase
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.perf.UltraLightChecker
import org.jetbrains.kotlin.idea.perf.UltraLightChecker.checkDescriptorsLeak
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.psi.KtFile
import java.io.File
abstract class AbstractUltraLightScriptLoadingTest : KotlinLightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor(): LightProjectDescriptor = KotlinWithJdkAndRuntimeLightProjectDescriptor.INSTANCE
fun doTest(testDataPath: String) {
val sourceText = File(testDataPath).readText()
val file = myFixture.addFileToProject(testDataPath, sourceText) as KtFile
UltraLightChecker.checkForReleaseCoroutine(sourceText, module)
TestCase.assertNotNull(file.script)
val script = file.script!!
ScriptConfigurationManager.updateScriptDependenciesSynchronously(file)
val ultraLightClass = UltraLightChecker.checkScriptEquivalence(script)
checkDescriptorsLeak(ultraLightClass)
}
}
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2020 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.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/ultraLightScripts")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public class UltraLightScriptLoadingTestGenerated extends AbstractUltraLightScriptLoadingTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInUltraLightScripts() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/asJava/ultraLightScripts"), Pattern.compile("^(.+)\\.(kt|kts)$"), null, true);
}
@TestMetadata("FunsPropsAndFields.kts")
public void testFunsPropsAndFields() throws Exception {
runTest("compiler/testData/asJava/ultraLightScripts/FunsPropsAndFields.kts");
}
@TestMetadata("HelloWorld.kts")
public void testHelloWorld() throws Exception {
runTest("compiler/testData/asJava/ultraLightScripts/HelloWorld.kts");
}
@TestMetadata("InnerClasses.kts")
public void testInnerClasses() throws Exception {
runTest("compiler/testData/asJava/ultraLightScripts/InnerClasses.kts");
}
}
@@ -17,17 +17,22 @@ import com.intellij.testFramework.UsefulTestCase
import com.intellij.util.PairProcessor
import com.intellij.util.ref.DebugReflectionUtil
import junit.framework.TestCase
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.classes.*
import org.jetbrains.kotlin.asJava.elements.KtLightNullabilityAnnotation
import org.jetbrains.kotlin.asJava.elements.KtLightPsiArrayInitializerMemberValue
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.j2k.getContainingClass
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.jetbrains.kotlin.psi.KtScript
import org.junit.Assert
import kotlin.test.assertFails
@@ -57,7 +62,6 @@ object UltraLightChecker {
fun allClasses(file: KtFile): List<KtClassOrObject> =
SyntaxTraverser.psiTraverser(file).filter(KtClassOrObject::class.java).toList()
fun checkFacadeEquivalence(
fqName: FqName,
searchScope: GlobalSearchScope,
@@ -92,6 +96,25 @@ object UltraLightChecker {
return ultraLightClass
}
fun checkScriptEquivalence(script: KtScript): KtLightClass {
val ultraLightScript: KtLightClass?
val oldForceFlag = KtUltraLightSupport.forceUsingOldLightClasses
try {
KtUltraLightSupport.forceUsingOldLightClasses = false
ultraLightScript = KotlinAsJavaSupport.getInstance(script.project).getLightClassForScript(script)
TestCase.assertTrue(ultraLightScript is KtUltraLightClassForScript)
ultraLightScript!!
val gold = KtLightClassForScript.createNoCache(script, forceUsingOldLightClasses = true)
checkClassEquivalenceByRendering(gold, ultraLightScript)
} finally {
KtUltraLightSupport.forceUsingOldLightClasses = oldForceFlag
}
return ultraLightScript!!
}
private fun checkClassEquivalenceByRendering(gold: PsiClass?, ultraLightClass: PsiClass) {
if (gold != null) {
Assert.assertFalse(gold.javaClass.name.contains("Ultra"))