IrModule -> IrModuleFragment

This commit is contained in:
Dmitry Petrov
2016-09-09 13:43:40 +03:00
committed by Dmitry Petrov
parent e8bacad62b
commit 1e00561b6f
10 changed files with 48 additions and 33 deletions
@@ -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
@@ -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<KtFile>, bindingContext: BindingContext): IrModule {
fun generateModule(moduleDescriptor: ModuleDescriptor, ktFiles: List<KtFile>, 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)
}
}
@@ -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<KtFile>): IrModule {
fun generateModuleFragment(ktFiles: Collection<KtFile>): IrModuleFragment =
IrModuleFragmentImpl(context.moduleDescriptor, context.irBuiltIns, generateFiles(ktFiles))
fun generateFiles(ktFiles: Collection<KtFile>): List<IrFile> {
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
}
}
@@ -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
@@ -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<TestFile>)
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<KtFile>, environment: KotlinCoreEnvironment, ignoreErrors: Boolean = false): IrModule {
fun generateIrModule(ktFiles: List<KtFile>, environment: KotlinCoreEnvironment, ignoreErrors: Boolean = false): IrModuleFragment {
val analysisResult = JvmResolveUtil.analyze(ktFiles, environment)
if (!ignoreErrors) {
analysisResult.throwIfError()
@@ -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
@@ -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<IrFile>) : this(descriptor, irBuiltins) {
this.addAll(files)
}
override val files: MutableList<IrFile> = ArrayList()
fun addFile(file: IrFile) {
@@ -39,6 +43,13 @@ class IrModuleImpl(
files.add(file)
}
fun addAll(newFiles: List<IrFile>) {
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 <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitModule(this, data)
visitor.visitModuleFragment(this, data)
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
files.forEach { it.accept(visitor, data) }
@@ -36,8 +36,8 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
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}"
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.*
interface IrElementVisitor<out R, in D> {
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)
@@ -24,8 +24,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
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)