Skip to content

Commit

Permalink
✨ implement compiler base
Browse files Browse the repository at this point in the history
  • Loading branch information
youta1119 committed Dec 13, 2019
1 parent de6133c commit 10ffec6
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 6 deletions.
@@ -1,11 +1,18 @@
package com.github.youta1119.kotlin.cli

import com.github.youta1119.kotlin.compiler.DotNetConfigurationKeys
import com.github.youta1119.kotlin.compiler.compileToDotNetByteCode
import com.github.youta1119.kotlin.compiler.toplevelPhase
import com.github.youta1119.kotlin.config.DotNetConfigurationKeys
import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.cli.common.CLICompiler
import org.jetbrains.kotlin.cli.common.CommonCompilerPerformanceManager
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.*
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.MessageUtil
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.CompilationException
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
Expand All @@ -23,7 +30,33 @@ class K2DotNetCompiler : CLICompiler<K2DotNetCompilerArguments>() {
rootDisposable: Disposable,
paths: KotlinPaths?
): ExitCode {
return ExitCode.OK
val environment = KotlinCoreEnvironment.createForProduction(
rootDisposable,
configuration,
EnvironmentConfigFiles.NATIVE_CONFIG_FILES
)
val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) ?: MessageCollector.NONE
configuration.put(
CLIConfigurationKeys.PHASE_CONFIG,
createPhaseConfig(toplevelPhase, arguments, messageCollector)
)
if (environment.getSourceFiles().isEmpty()) {
if (arguments.version) return ExitCode.OK

messageCollector.report(CompilerMessageSeverity.ERROR, "No source files")
return ExitCode.COMPILATION_ERROR
}
return try {
compileToDotNetByteCode(environment, configuration)
ExitCode.OK
} catch (e: CompilationException) {
messageCollector.report(
CompilerMessageSeverity.EXCEPTION,
OutputMessageUtil.renderException(e),
MessageUtil.psiElementToMessageLocation(e.element)
)
ExitCode.INTERNAL_ERROR
}
}

override fun setupPlatformSpecificArgumentsAndServices(
Expand Down
@@ -0,0 +1,27 @@
package com.github.youta1119.kotlin.compiler

import org.jetbrains.kotlin.backend.common.phaser.*
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
import org.jetbrains.kotlin.config.languageVersionSettings


internal fun createUnitPhase(
name: String,
description: String,
prerequisite: Set<AnyNamedPhase> = emptySet(),
op: DotNetBackendContext.() -> Unit
) = namedOpUnitPhase(name, description, prerequisite, op)

internal val noOpPhase = createUnitPhase(
op = {
println("no op")
},
name = "NoOp",
description = "no-op"
)

val toplevelPhase: CompilerPhase<DotNetBackendContext, Unit, Unit> = namedUnitPhase(
name = "Compiler",
description = "The whole compilation process",
lower = noOpPhase
)
@@ -0,0 +1,70 @@
package com.github.youta1119.kotlin.compiler


import com.github.youta1119.kotlin.config.DotNetConfigurationKeys
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.ir.DeclarationFactory
import org.jetbrains.kotlin.backend.common.ir.Ir
import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.BindingContext

class DotNetBackendContext(val environment: KotlinCoreEnvironment, override val configuration: CompilerConfiguration) :
CommonBackendContext {
lateinit var moduleDescriptor: ModuleDescriptor
lateinit var bindingContext: BindingContext

val phaseConfig = configuration.get(CLIConfigurationKeys.PHASE_CONFIG)!!

val outputName = configuration.get(DotNetConfigurationKeys.OUTPUT_NAME) ?: DEFAULT_OUTPUT_NAME

override val builtIns: DotNetBuiltIns by lazy {
moduleDescriptor.builtIns as DotNetBuiltIns
}

override val irBuiltIns: IrBuiltIns
get() = TODO("not implemented")

override val sharedVariablesManager: SharedVariablesManager
get() = TODO("not implemented")

override val declarationFactory: DeclarationFactory
get() = TODO("not implemented")
override var inVerbosePhase: Boolean = false

override val internalPackageFqn: FqName
get() = TODO("not implemented")

override val ir: Ir<CommonBackendContext>
get() = TODO("not implemented")

override fun log(message: () -> String) {
if (inVerbosePhase) {
println(message())
}
}

override fun report(element: IrElement?, irFile: IrFile?, message: String, isError: Boolean) {
this.messageCollector.report(
if (isError) CompilerMessageSeverity.ERROR else CompilerMessageSeverity.WARNING,
message, null
)
}

private val messageCollector: MessageCollector
get() = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)

companion object {
private const val DEFAULT_OUTPUT_NAME = "program"
}
}

@@ -0,0 +1,7 @@
package com.github.youta1119.kotlin.compiler

import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.storage.StorageManager


class DotNetBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager)
11 changes: 11 additions & 0 deletions src/main/kotlin/com/github/youta1119/kotlin/compiler/compiler.kt
@@ -0,0 +1,11 @@
package com.github.youta1119.kotlin.compiler

import org.jetbrains.kotlin.backend.common.phaser.invokeToplevel
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CompilerConfiguration


fun compileToDotNetByteCode(environment: KotlinCoreEnvironment, configuration: CompilerConfiguration) {
val context = DotNetBackendContext(environment, configuration)
toplevelPhase.invokeToplevel(context.phaseConfig, context, Unit)
}
@@ -1,4 +1,4 @@
package com.github.youta1119.kotlin.compiler
package com.github.youta1119.kotlin.config

import org.jetbrains.kotlin.config.CompilerConfigurationKey

Expand Down

0 comments on commit 10ffec6

Please sign in to comment.