From 7f86ce0a20ee3fcdb7dad3c321c13d7091cb3d79 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 25 Oct 2016 15:38:17 +0300 Subject: [PATCH] Introduce fallback option to add built-ins in position manager test In AbstractPositionManagerTest, built-ins could no longer be resolved because JvmIDEVirtualFileFinder is used in IDE tests (even when the compilation is called through JvmResolveUtil/GenerationUtils as in compiler tests), which is not yet able to locate .kotlin_builtins files --- .../kotlin/config/JVMConfigurationKeys.java | 2 ++ .../jvm/TopDownAnalyzerFacadeForJVM.kt | 12 +++++++++-- .../kotlin/codegen/GenerationUtils.kt | 17 +++++++++------ .../debugger/AbstractPositionManagerTest.java | 21 ++++++++++++++++++- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java index e9cf1019b03..c25b221d6fb 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/config/JVMConfigurationKeys.java @@ -58,6 +58,8 @@ public class JVMConfigurationKeys { public static final CompilerConfigurationKey USE_SINGLE_MODULE = CompilerConfigurationKey.create("combine modules for source files and binary dependencies into a single module"); + public static final CompilerConfigurationKey ADD_BUILT_INS_TO_DEPENDENCIES = + CompilerConfigurationKey.create("add built-ins to dependencies"); public static final CompilerConfigurationKey JVM_TARGET = CompilerConfigurationKey.create("JVM bytecode target version"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt index e234f5a9d4b..8ff7ae53c3e 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt @@ -60,6 +60,7 @@ import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.storage.StorageManager +import org.jetbrains.kotlin.utils.addToStdlib.check import java.util.* object TopDownAnalyzerFacadeForJVM { @@ -131,7 +132,12 @@ object TopDownAnalyzerFacadeForJVM { moduleClassResolver.compiledCodeResolver = dependenciesContainer.get() - dependenciesContext.setDependencies(dependenciesContext.module) + dependenciesContext.setDependencies(listOfNotNull( + dependenciesContext.module, + dependenciesContext.module.builtIns.builtInsModule.check { + configuration.getBoolean(JVMConfigurationKeys.ADD_BUILT_INS_TO_DEPENDENCIES) + } + )) dependenciesContext.initializeModuleContents(CompositePackageFragmentProvider(listOf( moduleClassResolver.compiledCodeResolver.packageFragmentProvider, dependenciesContainer.get() @@ -175,7 +181,9 @@ object TopDownAnalyzerFacadeForJVM { // TODO: remove dependencyModule from friends module.setDependencies(ModuleDependenciesImpl( - listOfNotNull(module, dependencyModule), + listOfNotNull(module, dependencyModule, module.builtIns.builtInsModule.check { + configuration.getBoolean(JVMConfigurationKeys.ADD_BUILT_INS_TO_DEPENDENCIES) + }), if (dependencyModule != null) setOf(dependencyModule) else emptySet() )) module.initialize(CompositePackageFragmentProvider( diff --git a/compiler/tests-common/org/jetbrains/kotlin/codegen/GenerationUtils.kt b/compiler/tests-common/org/jetbrains/kotlin/codegen/GenerationUtils.kt index eb5289f9fe9..767c664e2b2 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/codegen/GenerationUtils.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/codegen/GenerationUtils.kt @@ -16,15 +16,16 @@ package org.jetbrains.kotlin.codegen +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.common.output.outputUtils.writeAllTo import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.AnalyzingUtils import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil -import org.jetbrains.kotlin.test.KotlinTestUtils import java.io.File object GenerationUtils { @@ -39,12 +40,16 @@ object GenerationUtils { compileFiles(listOf(ktFile), environment).factory @JvmStatic - fun compileFiles(files: List, environment: KotlinCoreEnvironment?): GenerationState { - val configuration = environment?.configuration ?: KotlinTestUtils.newConfiguration() + fun compileFiles(files: List, environment: KotlinCoreEnvironment): GenerationState = + compileFiles(files, environment.configuration) { scope -> JvmPackagePartProvider(environment, scope) } - val analysisResult = JvmResolveUtil.analyzeAndCheckForErrors(files.first().project, files, configuration) { scope -> - if (environment == null) PackagePartProvider.Empty else JvmPackagePartProvider(environment, scope) - } + @JvmStatic + fun compileFiles( + files: List, + configuration: CompilerConfiguration, + packagePartProvider: (GlobalSearchScope) -> PackagePartProvider + ): GenerationState { + val analysisResult = JvmResolveUtil.analyzeAndCheckForErrors(files.first().project, files, configuration, packagePartProvider) analysisResult.throwIfError() val state = GenerationState( diff --git a/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractPositionManagerTest.java b/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractPositionManagerTest.java index d0a883cdc70..8e001432135 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractPositionManagerTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/debugger/AbstractPositionManagerTest.java @@ -42,12 +42,18 @@ import org.jetbrains.kotlin.backend.common.output.OutputFile; import org.jetbrains.kotlin.backend.common.output.OutputFileCollection; import org.jetbrains.kotlin.codegen.GenerationUtils; import org.jetbrains.kotlin.codegen.state.GenerationState; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.config.JVMConfigurationKeys; +import org.jetbrains.kotlin.descriptors.PackagePartProvider; import org.jetbrains.kotlin.idea.debugger.evaluate.KotlinDebuggerCaches; import org.jetbrains.kotlin.idea.project.PluginJetFilesProvider; import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase; import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor; import org.jetbrains.kotlin.idea.test.PluginTestCaseBase; import org.jetbrains.kotlin.psi.KtFile; +import org.jetbrains.kotlin.test.ConfigurationKind; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestJdkKind; import org.jetbrains.kotlin.utils.CollectionsKt; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; @@ -136,7 +142,20 @@ public abstract class AbstractPositionManagerTest extends KotlinLightCodeInsight breakpoints.addAll(extractBreakpointsInfo(file, file.getText())); } - GenerationState state = GenerationUtils.compileFiles(files, null); + CompilerConfiguration configuration = KotlinTestUtils.newConfiguration(ConfigurationKind.JDK_ONLY, TestJdkKind.MOCK_JDK); + // TODO: delete this once JvmIDEVirtualFileFinder supports loading .kotlin_builtins files + configuration.put(JVMConfigurationKeys.ADD_BUILT_INS_TO_DEPENDENCIES, true); + + GenerationState state = GenerationUtils.compileFiles( + files, + configuration, + new Function1() { + @Override + public PackagePartProvider invoke(GlobalSearchScope scope) { + return PackagePartProvider.Empty.INSTANCE; + } + } + ); Map referencesByName = getReferenceMap(state.getFactory());