From 1e00561b6fc9c50f3d9c44e70d571c8c93700e4d Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 9 Sep 2016 13:43:40 +0300 Subject: [PATCH] IrModule -> IrModuleFragment --- .../common/AbstractClosureAnnotator.kt | 2 +- .../kotlin/psi2ir/Psi2IrTranslator.kt | 10 +++---- .../psi2ir/generators/ModuleGenerator.kt | 28 +++++++++++-------- .../ir/AbstractClosureAnnotatorTestCase.kt | 4 +-- .../kotlin/ir/AbstractIrGeneratorTestCase.kt | 6 ++-- .../{IrModule.kt => IrModuleFragment.kt} | 2 +- ...rModuleImpl.kt => IrModuleFragmentImpl.kt} | 19 ++++++++++--- .../kotlin/ir/util/RenderIrElement.kt | 4 +-- .../kotlin/ir/visitors/IrElementVisitor.kt | 2 +- .../ir/visitors/IrElementVisitorVoid.kt | 4 +-- 10 files changed, 48 insertions(+), 33 deletions(-) rename compiler/ir/backend.common/src/org/jetbrains/kotlin/{xbackend => backend}/common/AbstractClosureAnnotator.kt (99%) rename compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/{IrModule.kt => IrModuleFragment.kt} (97%) rename compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/{IrModuleImpl.kt => IrModuleFragmentImpl.kt} (75%) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/xbackend/common/AbstractClosureAnnotator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/AbstractClosureAnnotator.kt similarity index 99% rename from compiler/ir/backend.common/src/org/jetbrains/kotlin/xbackend/common/AbstractClosureAnnotator.kt rename to compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/AbstractClosureAnnotator.kt index 76addd66009..745cddb60c5 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/xbackend/common/AbstractClosureAnnotator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/AbstractClosureAnnotator.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.xbackend.common +package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrElement 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 43953e36b1b..dcedc0cd728 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 @@ -17,7 +17,7 @@ package org.jetbrains.kotlin.psi2ir import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.ir.declarations.IrModule +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.psi2ir.generators.ModuleGenerator @@ -25,14 +25,14 @@ import org.jetbrains.kotlin.psi2ir.transformations.insertImplicitCasts import org.jetbrains.kotlin.resolve.BindingContext class Psi2IrTranslator(val configuration: Psi2IrConfiguration) { - fun generateModule(moduleDescriptor: ModuleDescriptor, ktFiles: List, bindingContext: BindingContext): IrModule { + fun generateModule(moduleDescriptor: ModuleDescriptor, ktFiles: List, bindingContext: BindingContext): IrModuleFragment { val context = GeneratorContext(configuration, moduleDescriptor, bindingContext) - val irModule = ModuleGenerator(context).generateModule(ktFiles) + val irModule = ModuleGenerator(context).generateModuleFragment(ktFiles) postprocess(irModule) return irModule } - private fun postprocess(irModule: IrModule) { - insertImplicitCasts(irModule.descriptor.builtIns, irModule) + private fun postprocess(irModuleFragment: IrModuleFragment) { + insertImplicitCasts(irModuleFragment.descriptor.builtIns, irModuleFragment) } } 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 eeb49bdad87..81a46eb1cf1 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 @@ -18,22 +18,19 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl -import org.jetbrains.kotlin.ir.declarations.impl.IrModuleImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext class ModuleGenerator(override val context: GeneratorContext) : Generator { - fun generateModule(ktFiles: List): IrModule { + fun generateModuleFragment(ktFiles: Collection): IrModuleFragment = + IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns, generateFiles(ktFiles)) + + fun generateFiles(ktFiles: Collection): List { val irDeclarationGenerator = DeclarationGenerator(context) - val irModule = IrModuleImpl(context.moduleDescriptor, context.irBuiltIns) - - for (ktFile in ktFiles) { - val fileEntry = context.sourceManager.getOrCreateFileEntry(ktFile) - val packageFragmentDescriptor = getOrFail(BindingContext.FILE_TO_PACKAGE_FRAGMENT, ktFile) - val fileName = fileEntry.getRecognizableName() - val irFile = IrFileImpl(fileEntry, fileName, packageFragmentDescriptor) - context.sourceManager.putFileEntry(irFile, fileEntry) + return ktFiles.map { ktFile -> + val irFile = createEmptyIrFile(ktFile) for (ktAnnotationEntry in ktFile.annotationEntries) { irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry)) @@ -43,9 +40,16 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator { irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration)) } - irModule.addFile(irFile) + irFile } - return irModule } + fun createEmptyIrFile(ktFile: KtFile): IrFileImpl { + val fileEntry = context.sourceManager.getOrCreateFileEntry(ktFile) + val packageFragmentDescriptor = getOrFail(BindingContext.FILE_TO_PACKAGE_FRAGMENT, ktFile) + val fileName = fileEntry.getRecognizableName() + val irFile = IrFileImpl(fileEntry, fileName, packageFragmentDescriptor) + context.sourceManager.putFileEntry(irFile, fileEntry) + return irFile + } } \ No newline at end of file diff --git a/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractClosureAnnotatorTestCase.kt b/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractClosureAnnotatorTestCase.kt index 349ab54c65e..04bbfc738df 100644 --- a/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractClosureAnnotatorTestCase.kt +++ b/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractClosureAnnotatorTestCase.kt @@ -22,8 +22,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.test.KotlinTestUtils -import org.jetbrains.kotlin.xbackend.common.AbstractClosureAnnotator -import org.jetbrains.kotlin.xbackend.common.Closure +import org.jetbrains.kotlin.backend.common.AbstractClosureAnnotator +import org.jetbrains.kotlin.backend.common.Closure import java.io.File import java.io.PrintWriter import java.io.StringWriter diff --git a/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractIrGeneratorTestCase.kt b/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractIrGeneratorTestCase.kt index 4e211effa2e..cda099a2e81 100644 --- a/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractIrGeneratorTestCase.kt +++ b/compiler/ir/ir.tests/tests/org/jetbrains/kotlin/ir/AbstractIrGeneratorTestCase.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrModule +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator @@ -80,7 +80,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() { protected abstract fun doTest(wholeFile: File, testFiles: List) - protected fun generateIrModule(ignoreErrors: Boolean = false): IrModule { + protected fun generateIrModule(ignoreErrors: Boolean = false): IrModuleFragment { assert(myFiles != null) { "myFiles not initialized" } assert(myEnvironment != null) { "myEnvironment not initialized" } return generateIrModule(myFiles.psiFiles, myEnvironment, ignoreErrors) @@ -109,7 +109,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() { return textFile } - fun generateIrModule(ktFiles: List, environment: KotlinCoreEnvironment, ignoreErrors: Boolean = false): IrModule { + fun generateIrModule(ktFiles: List, environment: KotlinCoreEnvironment, ignoreErrors: Boolean = false): IrModuleFragment { val analysisResult = JvmResolveUtil.analyze(ktFiles, environment) if (!ignoreErrors) { analysisResult.throwIfError() diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModule.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModuleFragment.kt similarity index 97% rename from compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModule.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModuleFragment.kt index 5e9c09b9b51..f6ed998f5e7 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModule.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrModuleFragment.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import java.lang.AssertionError -interface IrModule : IrElement { +interface IrModuleFragment : IrElement { override val startOffset: Int get() = UNDEFINED_OFFSET override val endOffset: Int get() = UNDEFINED_OFFSET diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleFragmentImpl.kt similarity index 75% rename from compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleImpl.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleFragmentImpl.kt index f9219a80535..3da80365a5c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrModuleFragmentImpl.kt @@ -20,17 +20,21 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.assertDetached import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrModule +import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.detach import org.jetbrains.kotlin.ir.throwNoSuchSlot import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import java.util.* -class IrModuleImpl( +class IrModuleFragmentImpl( override val descriptor: ModuleDescriptor, override val irBuiltins: IrBuiltIns -) : IrModule { +) : IrModuleFragment { + constructor(descriptor: ModuleDescriptor, irBuiltins: IrBuiltIns, files: List) : this(descriptor, irBuiltins) { + this.addAll(files) + } + override val files: MutableList = ArrayList() fun addFile(file: IrFile) { @@ -39,6 +43,13 @@ class IrModuleImpl( files.add(file) } + fun addAll(newFiles: List) { + newFiles.forEach { it.assertDetached() } + val originalSize = files.size + files.addAll(newFiles) + newFiles.forEachIndexed { i, irFile -> irFile.setTreeLocation(this, originalSize + i) } + } + override fun getChild(slot: Int): IrElement? = files.getOrNull(slot) @@ -48,7 +59,7 @@ class IrModuleImpl( } override fun accept(visitor: IrElementVisitor, data: D): R = - visitor.visitModule(this, data) + visitor.visitModuleFragment(this, data) override fun acceptChildren(visitor: IrElementVisitor, data: D) { files.forEach { it.accept(visitor, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index ad1858628ff..349adea19d5 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -36,8 +36,8 @@ class RenderIrElementVisitor : IrElementVisitor { override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?): String = "? ${declaration.javaClass.simpleName} ${declaration.descriptor.ref()}" - override fun visitModule(declaration: IrModule, data: Nothing?): String = - "MODULE ${declaration.descriptor.ref()}" + override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?): String = + "MODULE_FRAGMENT ${declaration.descriptor.ref()}" override fun visitFile(declaration: IrFile, data: Nothing?): String = "FILE ${declaration.name}" diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt index f7b8961e618..1227046cedf 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.* interface IrElementVisitor { fun visitElement(element: IrElement, data: D): R - fun visitModule(declaration: IrModule, data: D) = visitElement(declaration, data) + fun visitModuleFragment(declaration: IrModuleFragment, data: D) = visitElement(declaration, data) fun visitFile(declaration: IrFile, data: D) = visitElement(declaration, data) fun visitDeclaration(declaration: IrDeclaration, data: D) = visitElement(declaration, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt index bd1e7857356..46b6edf4ff1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt @@ -24,8 +24,8 @@ interface IrElementVisitorVoid : IrElementVisitor { fun visitElement(element: IrElement) override fun visitElement(element: IrElement, data: Nothing?) = visitElement(element) - fun visitModule(declaration: IrModule) = visitElement(declaration) - override fun visitModule(declaration: IrModule, data: Nothing?) = visitModule(declaration) + fun visitModuleFragment(declaration: IrModuleFragment) = visitElement(declaration) + override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?) = visitModuleFragment(declaration) fun visitFile(declaration: IrFile) = visitElement(declaration) override fun visitFile(declaration: IrFile, data: Nothing?) = visitFile(declaration)