| /* |
| * Copyright 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package androidx.compose.compiler.plugins.kotlin |
| |
| import com.intellij.psi.search.GlobalSearchScope |
| import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig |
| import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory |
| import org.jetbrains.kotlin.backend.jvm.jvmPhases |
| import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys |
| import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment |
| import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace |
| import org.jetbrains.kotlin.codegen.ClassBuilderFactories |
| import org.jetbrains.kotlin.codegen.ClassBuilderFactory |
| import org.jetbrains.kotlin.codegen.DefaultCodegenFactory |
| import org.jetbrains.kotlin.codegen.KotlinCodegenFacade |
| import org.jetbrains.kotlin.codegen.state.GenerationState |
| import org.jetbrains.kotlin.config.CompilerConfiguration |
| import org.jetbrains.kotlin.config.JVMConfigurationKeys |
| import org.jetbrains.kotlin.load.kotlin.PackagePartProvider |
| import org.jetbrains.kotlin.psi.KtFile |
| import org.jetbrains.kotlin.resolve.AnalyzingUtils |
| import org.jetbrains.kotlin.resolve.BindingTrace |
| |
| object GenerationUtils { |
| @JvmStatic |
| @JvmOverloads |
| fun compileFiles( |
| files: List<KtFile>, |
| environment: KotlinCoreEnvironment, |
| classBuilderFactory: ClassBuilderFactory = ClassBuilderFactories.TEST, |
| trace: BindingTrace = NoScopeRecordCliBindingTrace() |
| ): GenerationState = |
| compileFiles( |
| files, |
| environment.configuration, |
| classBuilderFactory, |
| environment::createPackagePartProvider, |
| trace |
| ) |
| |
| @JvmStatic |
| @JvmOverloads |
| fun compileFiles( |
| files: List<KtFile>, |
| configuration: CompilerConfiguration, |
| classBuilderFactory: ClassBuilderFactory, |
| packagePartProvider: (GlobalSearchScope) -> PackagePartProvider, |
| trace: BindingTrace = NoScopeRecordCliBindingTrace() |
| ): GenerationState { |
| val analysisResult = |
| JvmResolveUtil.analyzeAndCheckForErrors( |
| files.first().project, |
| files, |
| configuration, |
| packagePartProvider, |
| trace |
| ) |
| analysisResult.throwIfError() |
| |
| val state = GenerationState.Builder( |
| files.first().project, |
| classBuilderFactory, |
| analysisResult.moduleDescriptor, |
| analysisResult.bindingContext, |
| files, |
| configuration |
| ).codegenFactory( |
| if (configuration.getBoolean(JVMConfigurationKeys.IR)) |
| JvmIrCodegenFactory( |
| configuration, |
| configuration.get(CLIConfigurationKeys.PHASE_CONFIG) |
| ?: PhaseConfig(jvmPhases) |
| ) |
| else DefaultCodegenFactory |
| ).build() |
| if (analysisResult.shouldGenerateCode) { |
| KotlinCodegenFacade.compileCorrectFiles(state) |
| } |
| |
| // For JVM-specific errors |
| try { |
| AnalyzingUtils.throwExceptionOnErrors(state.collectedExtraJvmDiagnostics) |
| } catch (e: Throwable) { |
| throw TestsCompilerError(e) |
| } |
| |
| return state |
| } |
| } |