diff --git a/compiler/ir/backend.jvm/backend.jvm.iml b/compiler/ir/backend.jvm/backend.jvm.iml index 3613835647f..3f63500dde0 100644 --- a/compiler/ir/backend.jvm/backend.jvm.iml +++ b/compiler/ir/backend.jvm/backend.jvm.iml @@ -10,5 +10,6 @@ + \ No newline at end of file diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt new file mode 100644 index 00000000000..eeed7dd12a6 --- /dev/null +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * 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 org.jetbrains.kotlin.backend.jvm + +import org.jetbrains.kotlin.codegen.CompilationErrorHandler +import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus +import org.jetbrains.kotlin.psi.KtFile + +object JvmBackendFacade { + fun compileCorrectFiles(state: GenerationState, errorHandler: CompilationErrorHandler) { + ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() + state.beforeCompile() + ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() + doGenerateFiles(state.files, state, errorHandler) + } + + fun doGenerateFiles(files: Collection, state: GenerationState, errorHandler: CompilationErrorHandler) { + // TODO + } +} diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt index dcedc0cd728..d5bb692071f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/Psi2IrTranslator.kt @@ -16,7 +16,9 @@ package org.jetbrains.kotlin.psi2ir +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext @@ -28,11 +30,18 @@ class Psi2IrTranslator(val configuration: Psi2IrConfiguration) { fun generateModule(moduleDescriptor: ModuleDescriptor, ktFiles: List, bindingContext: BindingContext): IrModuleFragment { val context = GeneratorContext(configuration, moduleDescriptor, bindingContext) val irModule = ModuleGenerator(context).generateModuleFragment(ktFiles) - postprocess(irModule) + postprocess(irModule.descriptor.builtIns, irModule) return irModule } - private fun postprocess(irModuleFragment: IrModuleFragment) { - insertImplicitCasts(irModuleFragment.descriptor.builtIns, irModuleFragment) + fun generateSingleFileFragment(moduleDescriptor: ModuleDescriptor, ktFile: KtFile, bindingContext: BindingContext): IrModuleFragment { + val context = GeneratorContext(configuration, moduleDescriptor, bindingContext) + val irFileFragment = ModuleGenerator(context).generateSingleFileFragment(ktFile) + postprocess(moduleDescriptor.builtIns, irFileFragment) + return irFileFragment + } + + private fun postprocess(builtIns: KotlinBuiltIns, irElement: IrElement) { + insertImplicitCasts(builtIns, irElement) } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 14e481f5313..42ce16910e9 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -24,26 +24,35 @@ import org.jetbrains.kotlin.resolve.BindingContext class ModuleGenerator(override val context: GeneratorContext) : Generator { fun generateModuleFragment(ktFiles: Collection): IrModuleFragment = - IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns, generateFiles(ktFiles)) + IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns, + generateFiles(ktFiles)) fun generateFiles(ktFiles: Collection): List { val irDeclarationGenerator = DeclarationGenerator(context) return ktFiles.map { ktFile -> - val irFile = createEmptyIrFile(ktFile) - - for (ktAnnotationEntry in ktFile.annotationEntries) { - irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry)) - } - - for (ktDeclaration in ktFile.declarations) { - irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration)) - } - - irFile + generateSingleFile(irDeclarationGenerator, ktFile) } } + fun generateSingleFileFragment(ktFile: KtFile) = + IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns, + listOf(generateSingleFile(DeclarationGenerator(context), ktFile))) + + private fun generateSingleFile(irDeclarationGenerator: DeclarationGenerator, ktFile: KtFile): IrFileImpl { + val irFile = createEmptyIrFile(ktFile) + + for (ktAnnotationEntry in ktFile.annotationEntries) { + irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry)) + } + + for (ktDeclaration in ktFile.declarations) { + irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration)) + } + + return irFile + } + fun createEmptyIrFile(ktFile: KtFile): IrFileImpl { val fileEntry = context.sourceManager.getOrCreateFileEntry(ktFile) val packageFragmentDescriptor = getOrFail(BindingContext.FILE_TO_PACKAGE_FRAGMENT, ktFile)