Generation test utils: extract compileFilesUsing standard mode / FIR
This commit is contained in:
@@ -17,11 +17,11 @@
|
|||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
import com.intellij.openapi.extensions.Extensions
|
import com.intellij.openapi.extensions.Extensions
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElementFinder
|
import com.intellij.psi.PsiElementFinder
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import com.intellij.psi.search.ProjectScope
|
import com.intellij.psi.search.ProjectScope
|
||||||
import org.jetbrains.kotlin.TestsCompiletimeError
|
import org.jetbrains.kotlin.TestsCompiletimeError
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
|
||||||
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
|
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
|
||||||
@@ -36,25 +36,16 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
|||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.fir.createSession
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
|
||||||
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
|
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirBuilder
|
||||||
import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession
|
import org.jetbrains.kotlin.fir.createSession
|
||||||
import org.jetbrains.kotlin.fir.java.FirLibrarySession
|
|
||||||
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.firProvider
|
import org.jetbrains.kotlin.fir.resolve.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
|
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
|
||||||
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
|
||||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
|
|
||||||
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
|
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -90,6 +81,28 @@ object GenerationUtils {
|
|||||||
): GenerationState {
|
): GenerationState {
|
||||||
val project = files.first().project
|
val project = files.first().project
|
||||||
val state = if (configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) {
|
val state = if (configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) {
|
||||||
|
compileFilesUsingFrontendIR(project, files, configuration, classBuilderFactory, packagePartProvider)
|
||||||
|
} else {
|
||||||
|
compileFilesUsingStandardMode(project, files, configuration, classBuilderFactory, packagePartProvider, trace)
|
||||||
|
}
|
||||||
|
|
||||||
|
// For JVM-specific errors
|
||||||
|
try {
|
||||||
|
AnalyzingUtils.throwExceptionOnErrors(state.collectedExtraJvmDiagnostics)
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
throw TestsCompiletimeError(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
return state
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun compileFilesUsingFrontendIR(
|
||||||
|
project: Project,
|
||||||
|
files: List<KtFile>,
|
||||||
|
configuration: CompilerConfiguration,
|
||||||
|
classBuilderFactory: ClassBuilderFactory,
|
||||||
|
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider
|
||||||
|
): GenerationState {
|
||||||
Extensions.getArea(project)
|
Extensions.getArea(project)
|
||||||
.getExtensionPoint(PsiElementFinder.EP_NAME)
|
.getExtensionPoint(PsiElementFinder.EP_NAME)
|
||||||
.unregisterExtension(JavaElementFinder::class.java)
|
.unregisterExtension(JavaElementFinder::class.java)
|
||||||
@@ -130,8 +143,17 @@ object GenerationUtils {
|
|||||||
generationState, moduleFragment, CompilationErrorHandler.THROW_EXCEPTION, symbolTable, sourceManager
|
generationState, moduleFragment, CompilationErrorHandler.THROW_EXCEPTION, symbolTable, sourceManager
|
||||||
)
|
)
|
||||||
generationState.factory.done()
|
generationState.factory.done()
|
||||||
generationState
|
return generationState
|
||||||
} else {
|
}
|
||||||
|
|
||||||
|
private fun compileFilesUsingStandardMode(
|
||||||
|
project: Project,
|
||||||
|
files: List<KtFile>,
|
||||||
|
configuration: CompilerConfiguration,
|
||||||
|
classBuilderFactory: ClassBuilderFactory,
|
||||||
|
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
|
||||||
|
trace: BindingTrace
|
||||||
|
): GenerationState {
|
||||||
val analysisResult =
|
val analysisResult =
|
||||||
JvmResolveUtil.analyzeAndCheckForErrors(project, files, configuration, packagePartProvider, trace)
|
JvmResolveUtil.analyzeAndCheckForErrors(project, files, configuration, packagePartProvider, trace)
|
||||||
analysisResult.throwIfError()
|
analysisResult.throwIfError()
|
||||||
@@ -139,7 +161,7 @@ object GenerationUtils {
|
|||||||
/* Currently Kapt3 only works with the old JVM backend, so disable IR for everything except actual bytecode generation. */
|
/* Currently Kapt3 only works with the old JVM backend, so disable IR for everything except actual bytecode generation. */
|
||||||
val isIrBackend =
|
val isIrBackend =
|
||||||
classBuilderFactory.classBuilderMode == ClassBuilderMode.FULL && configuration.getBoolean(JVMConfigurationKeys.IR)
|
classBuilderFactory.classBuilderMode == ClassBuilderMode.FULL && configuration.getBoolean(JVMConfigurationKeys.IR)
|
||||||
val state = GenerationState.Builder(
|
val generationState = GenerationState.Builder(
|
||||||
project, classBuilderFactory, analysisResult.moduleDescriptor, analysisResult.bindingContext,
|
project, classBuilderFactory, analysisResult.moduleDescriptor, analysisResult.bindingContext,
|
||||||
files, configuration
|
files, configuration
|
||||||
).codegenFactory(
|
).codegenFactory(
|
||||||
@@ -148,18 +170,8 @@ object GenerationUtils {
|
|||||||
else DefaultCodegenFactory
|
else DefaultCodegenFactory
|
||||||
).isIrBackend(isIrBackend).build()
|
).isIrBackend(isIrBackend).build()
|
||||||
if (analysisResult.shouldGenerateCode) {
|
if (analysisResult.shouldGenerateCode) {
|
||||||
KotlinCodegenFacade.compileCorrectFiles(state, CompilationErrorHandler.THROW_EXCEPTION)
|
KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION)
|
||||||
}
|
}
|
||||||
state
|
return generationState
|
||||||
}
|
|
||||||
|
|
||||||
// For JVM-specific errors
|
|
||||||
try {
|
|
||||||
AnalyzingUtils.throwExceptionOnErrors(state.collectedExtraJvmDiagnostics)
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
throw TestsCompiletimeError(e)
|
|
||||||
}
|
|
||||||
|
|
||||||
return state
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user