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.
|
* 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.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.psi2ir
|
package org.jetbrains.kotlin.psi2ir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
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.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.ModuleGenerator
|
import org.jetbrains.kotlin.psi2ir.generators.ModuleGenerator
|
||||||
@@ -25,14 +25,14 @@ import org.jetbrains.kotlin.psi2ir.transformations.insertImplicitCasts
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
class Psi2IrTranslator(val configuration: Psi2IrConfiguration) {
|
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 context = GeneratorContext(configuration, moduleDescriptor, bindingContext)
|
||||||
val irModule = ModuleGenerator(context).generateModule(ktFiles)
|
val irModule = ModuleGenerator(context).generateModuleFragment(ktFiles)
|
||||||
postprocess(irModule)
|
postprocess(irModule)
|
||||||
return irModule
|
return irModule
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun postprocess(irModule: IrModule) {
|
private fun postprocess(irModuleFragment: IrModuleFragment) {
|
||||||
insertImplicitCasts(irModule.descriptor.builtIns, irModule)
|
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.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
|
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.psi.KtFile
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
|
||||||
class ModuleGenerator(override val context: GeneratorContext) : Generator {
|
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 irDeclarationGenerator = DeclarationGenerator(context)
|
||||||
|
|
||||||
val irModule = IrModuleImpl(context.moduleDescriptor, context.irBuiltIns)
|
return ktFiles.map { ktFile ->
|
||||||
|
val irFile = createEmptyIrFile(ktFile)
|
||||||
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)
|
|
||||||
|
|
||||||
for (ktAnnotationEntry in ktFile.annotationEntries) {
|
for (ktAnnotationEntry in ktFile.annotationEntries) {
|
||||||
irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry))
|
irFile.addAnnotation(getOrFail(BindingContext.ANNOTATION, ktAnnotationEntry))
|
||||||
@@ -43,9 +40,16 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
|
|||||||
irFile.addDeclaration(irDeclarationGenerator.generateMemberDeclaration(ktDeclaration))
|
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.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
import org.jetbrains.kotlin.xbackend.common.AbstractClosureAnnotator
|
import org.jetbrains.kotlin.backend.common.AbstractClosureAnnotator
|
||||||
import org.jetbrains.kotlin.xbackend.common.Closure
|
import org.jetbrains.kotlin.backend.common.Closure
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import java.io.StringWriter
|
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.codegen.CodegenTestCase
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
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.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
||||||
@@ -80,7 +80,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
|
|||||||
|
|
||||||
protected abstract fun doTest(wholeFile: File, testFiles: List<TestFile>)
|
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(myFiles != null) { "myFiles not initialized" }
|
||||||
assert(myEnvironment != null) { "myEnvironment not initialized" }
|
assert(myEnvironment != null) { "myEnvironment not initialized" }
|
||||||
return generateIrModule(myFiles.psiFiles, myEnvironment, ignoreErrors)
|
return generateIrModule(myFiles.psiFiles, myEnvironment, ignoreErrors)
|
||||||
@@ -109,7 +109,7 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
|
|||||||
return textFile
|
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)
|
val analysisResult = JvmResolveUtil.analyze(ktFiles, environment)
|
||||||
if (!ignoreErrors) {
|
if (!ignoreErrors) {
|
||||||
analysisResult.throwIfError()
|
analysisResult.throwIfError()
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
|||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import java.lang.AssertionError
|
import java.lang.AssertionError
|
||||||
|
|
||||||
interface IrModule : IrElement {
|
interface IrModuleFragment : IrElement {
|
||||||
override val startOffset: Int get() = UNDEFINED_OFFSET
|
override val startOffset: Int get() = UNDEFINED_OFFSET
|
||||||
override val endOffset: 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.IrElement
|
||||||
import org.jetbrains.kotlin.ir.assertDetached
|
import org.jetbrains.kotlin.ir.assertDetached
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
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.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.detach
|
import org.jetbrains.kotlin.ir.detach
|
||||||
import org.jetbrains.kotlin.ir.throwNoSuchSlot
|
import org.jetbrains.kotlin.ir.throwNoSuchSlot
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class IrModuleImpl(
|
class IrModuleFragmentImpl(
|
||||||
override val descriptor: ModuleDescriptor,
|
override val descriptor: ModuleDescriptor,
|
||||||
override val irBuiltins: IrBuiltIns
|
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()
|
override val files: MutableList<IrFile> = ArrayList()
|
||||||
|
|
||||||
fun addFile(file: IrFile) {
|
fun addFile(file: IrFile) {
|
||||||
@@ -39,6 +43,13 @@ class IrModuleImpl(
|
|||||||
files.add(file)
|
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? =
|
override fun getChild(slot: Int): IrElement? =
|
||||||
files.getOrNull(slot)
|
files.getOrNull(slot)
|
||||||
|
|
||||||
@@ -48,7 +59,7 @@ class IrModuleImpl(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
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) {
|
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||||
files.forEach { it.accept(visitor, data) }
|
files.forEach { it.accept(visitor, data) }
|
||||||
@@ -36,8 +36,8 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
|||||||
override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?): String =
|
override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?): String =
|
||||||
"? ${declaration.javaClass.simpleName} ${declaration.descriptor.ref()}"
|
"? ${declaration.javaClass.simpleName} ${declaration.descriptor.ref()}"
|
||||||
|
|
||||||
override fun visitModule(declaration: IrModule, data: Nothing?): String =
|
override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?): String =
|
||||||
"MODULE ${declaration.descriptor.ref()}"
|
"MODULE_FRAGMENT ${declaration.descriptor.ref()}"
|
||||||
|
|
||||||
override fun visitFile(declaration: IrFile, data: Nothing?): String =
|
override fun visitFile(declaration: IrFile, data: Nothing?): String =
|
||||||
"FILE ${declaration.name}"
|
"FILE ${declaration.name}"
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
|||||||
|
|
||||||
interface IrElementVisitor<out R, in D> {
|
interface IrElementVisitor<out R, in D> {
|
||||||
fun visitElement(element: IrElement, data: D): R
|
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 visitFile(declaration: IrFile, data: D) = visitElement(declaration, data)
|
||||||
|
|
||||||
fun visitDeclaration(declaration: IrDeclaration, 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)
|
fun visitElement(element: IrElement)
|
||||||
override fun visitElement(element: IrElement, data: Nothing?) = visitElement(element)
|
override fun visitElement(element: IrElement, data: Nothing?) = visitElement(element)
|
||||||
|
|
||||||
fun visitModule(declaration: IrModule) = visitElement(declaration)
|
fun visitModuleFragment(declaration: IrModuleFragment) = visitElement(declaration)
|
||||||
override fun visitModule(declaration: IrModule, data: Nothing?) = visitModule(declaration)
|
override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?) = visitModuleFragment(declaration)
|
||||||
|
|
||||||
fun visitFile(declaration: IrFile) = visitElement(declaration)
|
fun visitFile(declaration: IrFile) = visitElement(declaration)
|
||||||
override fun visitFile(declaration: IrFile, data: Nothing?) = visitFile(declaration)
|
override fun visitFile(declaration: IrFile, data: Nothing?) = visitFile(declaration)
|
||||||
|
|||||||
Reference in New Issue
Block a user