From de28bfaa9c8fb557539e41a7e687eef11d945ec2 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Tue, 27 Sep 2016 05:54:36 +0300 Subject: [PATCH] native.backend + native.frontend --- experiments/backend.native/backend.native.iml | 14 ++++ .../bc.frontend/bc.frontend.iml | 13 +++ .../bc/analyze/TopDownAnalyzerFacadeForBC.kt | 19 +++++ .../backend.native/cli.native/cli.native.iml | 18 +++++ .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 81 +++++++++++++++++++ .../cli/bc/K2NativeCompilerArguments.java | 13 +++ .../backend/native/NativeBackendFacade.kt | 11 +++ .../backend/native/NativeIrCodegenFactory.kt | 35 ++++++++ 8 files changed, 204 insertions(+) create mode 100644 experiments/backend.native/backend.native.iml create mode 100644 experiments/backend.native/bc.frontend/bc.frontend.iml create mode 100644 experiments/backend.native/bc.frontend/src/org/jetbrains/kotlin/bc/analyze/TopDownAnalyzerFacadeForBC.kt create mode 100644 experiments/backend.native/cli.native/cli.native.iml create mode 100644 experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt create mode 100644 experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java create mode 100644 experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt create mode 100644 experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt diff --git a/experiments/backend.native/backend.native.iml b/experiments/backend.native/backend.native.iml new file mode 100644 index 00000000000..5bab15c4427 --- /dev/null +++ b/experiments/backend.native/backend.native.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/experiments/backend.native/bc.frontend/bc.frontend.iml b/experiments/backend.native/bc.frontend/bc.frontend.iml new file mode 100644 index 00000000000..a8bfb8f9d08 --- /dev/null +++ b/experiments/backend.native/bc.frontend/bc.frontend.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/experiments/backend.native/bc.frontend/src/org/jetbrains/kotlin/bc/analyze/TopDownAnalyzerFacadeForBC.kt b/experiments/backend.native/bc.frontend/src/org/jetbrains/kotlin/bc/analyze/TopDownAnalyzerFacadeForBC.kt new file mode 100644 index 00000000000..841c05a961c --- /dev/null +++ b/experiments/backend.native/bc.frontend/src/org/jetbrains/kotlin/bc/analyze/TopDownAnalyzerFacadeForBC.kt @@ -0,0 +1,19 @@ +package org.jetbrains.kotlin.bc.analyze + +import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.context.ModuleContext +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.BindingTrace +import kotlin.reflect.jvm.internal.impl.descriptors.PackagePartProvider + + +fun analyze(moduleContext: ModuleContext, + files:Collection, + trace:BindingTrace, + configuration: CompilerConfiguration, + packagePartProvider: PackagePartProvider) : AnalysisResult { + val bindingContext = trace.bindingContext + val module = moduleContext.module + return AnalysisResult.success(bindingContext, module) +} diff --git a/experiments/backend.native/cli.native/cli.native.iml b/experiments/backend.native/cli.native/cli.native.iml new file mode 100644 index 00000000000..507103972c1 --- /dev/null +++ b/experiments/backend.native/cli.native/cli.native.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt new file mode 100644 index 00000000000..f0834cd3002 --- /dev/null +++ b/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -0,0 +1,81 @@ +package org.jetbrains.kotlin.cli.bc + +import com.intellij.openapi.Disposable +import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.cli.common.CLICompiler +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport +import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport +import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.config.CommonConfigurationKeys +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.Services +import org.jetbrains.kotlin.config.addKotlinSourceRoots +import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor +import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration +import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator +import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM +import java.lang.System.out +import java.util.Collections.emptyList +import kotlin.reflect.jvm.internal.impl.load.java.JvmAbi + +/** + * Created by minamoto on 14/09/16. + */ + +class K2Native : CLICompiler() { + override fun doExecute(arguments: K2NativeCompilerArguments, configuration: CompilerConfiguration, rootDisposable: Disposable): ExitCode { + configuration.put(CommonConfigurationKeys.MODULE_NAME, JvmAbi.DEFAULT_MODULE_NAME) + + configuration.addKotlinSourceRoots(arguments.freeArgs) + val environment = KotlinCoreEnvironment.createForProduction(rootDisposable, configuration, emptyList()) + val collector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + val analyzerWithCompilerReport = AnalyzerWithCompilerReport(collector) + + analyzerWithCompilerReport.analyzeAndReport( + environment.getSourceFiles(), object : AnalyzerWithCompilerReport.Analyzer { + override fun analyze(): AnalysisResult { + val sharedTrace = CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace() + + /* replace this with native specific */ + val moduleContext = + TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(environment.project, environment.configuration) + + + return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( + moduleContext, + environment.getSourceFiles(), + sharedTrace, + environment.configuration, + JvmPackagePartProvider(environment) + ) + } + override fun reportEnvironmentErrors() { + TODO("implement me") + } + }) + + val translator = Psi2IrTranslator(Psi2IrConfiguration(false)) + val module = translator.generateModule(analyzerWithCompilerReport.analysisResult.moduleDescriptor, + environment.getSourceFiles(), + analyzerWithCompilerReport.analysisResult.bindingContext) + + module.accept(DumpIrTreeVisitor(out), "") + return ExitCode.OK + } + + override fun setupPlatformSpecificArgumentsAndServices(configuration: CompilerConfiguration, arguments: K2NativeCompilerArguments, services: Services) {} + + override fun createArguments(): K2NativeCompilerArguments { + return K2NativeCompilerArguments() + } + + companion object { + @JvmStatic fun main(args: Array) { + CLICompiler.doMain(K2Native(), args) + } + } +} +fun main(args: Array) = K2Native.main(args) diff --git a/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java b/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java new file mode 100644 index 00000000000..7741daa2fcf --- /dev/null +++ b/experiments/backend.native/cli.native/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.java @@ -0,0 +1,13 @@ +package org.jetbrains.kotlin.cli.bc; + +import com.sampullara.cli.Argument; +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments; +import org.jetbrains.kotlin.cli.common.arguments.ValueDescription; + + +public class K2NativeCompilerArguments extends CommonCompilerArguments { + @Argument(value = "output", description = "Output file path") + @ValueDescription("") + public String outputFile; + +} diff --git a/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt b/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt new file mode 100644 index 00000000000..85c5bfe2fcf --- /dev/null +++ b/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeBackendFacade.kt @@ -0,0 +1,11 @@ +package org.jetbrains.kotlin.backend.native + +import org.jetbrains.kotlin.codegen.CompilationErrorHandler +import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.psi.KtFile + +object NativeBackendFacade { + fun doGenerateFiles(files: Collection, state: GenerationState, errorHandler: CompilationErrorHandler) { + TODO() + } +} diff --git a/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt b/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt new file mode 100644 index 00000000000..fa74199f1c3 --- /dev/null +++ b/experiments/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/native/NativeIrCodegenFactory.kt @@ -0,0 +1,35 @@ +package org.jetbrains.kotlin.backend.native + +import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.context.PackageContext +import org.jetbrains.kotlin.codegen.state.GenerationState +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.psi.KtClassOrObject + + +object NativeIrCodegenFactory: CodegenFactory { + override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: org.jetbrains.kotlin.name.FqName, registry: PackagePartRegistry): PackageCodegen { + val impl = PackageCodegenImpl(state, files, fqName, registry) + + + return object : PackageCodegen { + override fun generate(errorHandler: CompilationErrorHandler) { + NativeBackendFacade.doGenerateFiles(files, state, errorHandler) + } + + override fun generateClassOrObject(classOrObject: KtClassOrObject, packagePartContext: PackageContext) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getPackageFragment(): PackageFragmentDescriptor { + return impl.packageFragment + } + } + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: org.jetbrains.kotlin.name.FqName, registry: PackagePartRegistry): MultifileClassCodegen { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } +} +