IrModule -> IrModuleFragment
This commit is contained in:
committed by
Dmitry Petrov
parent
e8bacad62b
commit
1e00561b6f
+1
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+16
-12
@@ -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
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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()
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+15
-4
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user