From 4bfaa7123a8ed9476dceaf8d4482d1b953b5ce6d Mon Sep 17 00:00:00 2001 From: Cosku Acay Date: Tue, 15 Feb 2022 21:52:30 -0500 Subject: [PATCH] Remove dependence of `compiler` on `runtime` --- compiler/build.gradle.kts | 1 - .../cleartext/CleartextCodeGenerator.kt | 21 +++++++------ .../commitment/CommitmentCreatorGenerator.kt | 12 ++++---- .../commitment/CommitmentHolderGenerator.kt | 16 +++++----- .../codegeneration/BackendCodeGenerator.kt | 30 ++++++++++--------- 5 files changed, 41 insertions(+), 39 deletions(-) diff --git a/compiler/build.gradle.kts b/compiler/build.gradle.kts index 7af13c5b0c..7e87efd4f9 100644 --- a/compiler/build.gradle.kts +++ b/compiler/build.gradle.kts @@ -15,7 +15,6 @@ plugins { dependencies { implementation(project(":shared")) - implementation(project(":runtime")) // Data structures implementation("com.uchuhimo:kotlinx-bimap:1.2") diff --git a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/cleartext/CleartextCodeGenerator.kt b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/cleartext/CleartextCodeGenerator.kt index 9b649a0acb..060586374e 100644 --- a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/cleartext/CleartextCodeGenerator.kt +++ b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/cleartext/CleartextCodeGenerator.kt @@ -1,10 +1,10 @@ package edu.cornell.cs.apl.viaduct.backends.cleartext +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.MemberName import com.squareup.kotlinpoet.ParameterizedTypeName import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy -import com.squareup.kotlinpoet.asClassName import edu.cornell.cs.apl.viaduct.analysis.NameAnalysis import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator @@ -13,9 +13,6 @@ import edu.cornell.cs.apl.viaduct.codegeneration.UnsupportedOperatorException import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated import edu.cornell.cs.apl.viaduct.codegeneration.typeTranslator import edu.cornell.cs.apl.viaduct.codegeneration.valueClass -import edu.cornell.cs.apl.viaduct.runtime.EquivocationException -import edu.cornell.cs.apl.viaduct.runtime.commitment.Commitment -import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication import edu.cornell.cs.apl.viaduct.syntax.BinaryOperator @@ -37,6 +34,12 @@ import edu.cornell.cs.apl.viaduct.syntax.operators.Minimum import edu.cornell.cs.apl.viaduct.syntax.types.MutableCellType import edu.cornell.cs.apl.viaduct.syntax.types.VectorType +private const val runtimePackage = "edu.cornell.cs.apl.viaduct.runtime" +private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment" +private val EquivocationException = ClassName(runtimePackage, "EquivocationException") +private val Commitment = ClassName(commitmentPackage, "Commitment") +private val Committed = ClassName(commitmentPackage, "Committed") + class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenerator(context) { private val typeAnalysis = TypeAnalysis.get(context.program) private val nameAnalysis = NameAnalysis.get(context.program) @@ -221,7 +224,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera for (host in hostsToCheckWith) { receiveBuilder.addStatement( "%T.%N(%N, %L, %L, %L)", - EquivocationException::class, + EquivocationException, "assertEquals", clearTextTemp, context.codeOf(cleartextInputs.first().send.host), @@ -262,9 +265,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera clearTextCommittedTemp, receiveDispatcher( cleartextCommitmentInputs.first(), - Committed::class.asClassName().parameterizedBy( - typeTranslator((typeAnalysis.type(sender))) - ) + Committed.parameterizedBy(typeTranslator((typeAnalysis.type(sender)))) ) ) @@ -273,9 +274,7 @@ class CleartextCodeGenerator(context: CodeGeneratorContext) : AbstractCodeGenera "%L.%N(%N)", receiveDispatcher( hashSendEvent, - Commitment::class.asClassName().parameterizedBy( - typeTranslator((typeAnalysis.type(sender))) - ) + Commitment.parameterizedBy(typeTranslator((typeAnalysis.type(sender)))) ), "open", clearTextCommittedTemp diff --git a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentCreatorGenerator.kt b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentCreatorGenerator.kt index 85f5221550..024aa30b45 100644 --- a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentCreatorGenerator.kt +++ b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentCreatorGenerator.kt @@ -1,13 +1,12 @@ package edu.cornell.cs.apl.viaduct.backends.commitment +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.MemberName -import com.squareup.kotlinpoet.asClassName import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator import edu.cornell.cs.apl.viaduct.codegeneration.CodeGeneratorContext import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated -import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication import edu.cornell.cs.apl.viaduct.syntax.Host @@ -18,6 +17,9 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.ExpressionNode import edu.cornell.cs.apl.viaduct.syntax.intermediate.LetNode import edu.cornell.cs.apl.viaduct.syntax.intermediate.LiteralNode +private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment" +private val Committed = ClassName(commitmentPackage, "Committed") + internal class CommitmentCreatorGenerator( context: CodeGeneratorContext ) : AbstractCodeGenerator(context) { @@ -29,7 +31,7 @@ internal class CommitmentCreatorGenerator( when (expr) { is LiteralNode -> CodeBlock.of( "%T.%N(%L)", - Committed::class, + Committed, "fake", value(expr.value) ) @@ -108,7 +110,7 @@ internal class CommitmentCreatorGenerator( receiveBuilder.addStatement( "val %N = %T(%L)", context.kotlinName(sender.temporary.value, receiveProtocol), - Committed::class, + Committed, receiveReplicated( sender, sendProtocol, @@ -123,7 +125,7 @@ internal class CommitmentCreatorGenerator( "val %N = %N.%M()", commitmentTemp, context.kotlinName(sender.temporary.value, receiveProtocol), - MemberName(Committed.Companion::class.asClassName(), "commitment") + MemberName(Committed.nestedClass("Companion"), "commitment") ) for (hashHost in hashHosts) { diff --git a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentHolderGenerator.kt b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentHolderGenerator.kt index edf2c656c0..891628e19d 100644 --- a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentHolderGenerator.kt +++ b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/backends/commitment/CommitmentHolderGenerator.kt @@ -1,17 +1,15 @@ package edu.cornell.cs.apl.viaduct.backends.commitment +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.MemberName import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy -import com.squareup.kotlinpoet.asClassName import edu.cornell.cs.apl.viaduct.analysis.TypeAnalysis import edu.cornell.cs.apl.viaduct.codegeneration.AbstractCodeGenerator import edu.cornell.cs.apl.viaduct.codegeneration.CodeGeneratorContext import edu.cornell.cs.apl.viaduct.codegeneration.UnsupportedOperatorException import edu.cornell.cs.apl.viaduct.codegeneration.receiveReplicated import edu.cornell.cs.apl.viaduct.codegeneration.typeTranslator -import edu.cornell.cs.apl.viaduct.runtime.commitment.Commitment -import edu.cornell.cs.apl.viaduct.runtime.commitment.Committed import edu.cornell.cs.apl.viaduct.selection.CommunicationEvent import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication import edu.cornell.cs.apl.viaduct.syntax.Protocol @@ -22,6 +20,10 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.LetNode import edu.cornell.cs.apl.viaduct.syntax.intermediate.LiteralNode import edu.cornell.cs.apl.viaduct.backends.commitment.Commitment as CommitmentProtocol +private const val commitmentPackage = "edu.cornell.cs.apl.viaduct.runtime.commitment" +private val CommitmentClass = ClassName(commitmentPackage, "Commitment") +private val Committed = ClassName(commitmentPackage, "Committed") + internal class CommitmentHolderGenerator( context: CodeGeneratorContext ) : AbstractCodeGenerator(context) { @@ -34,10 +36,10 @@ internal class CommitmentHolderGenerator( when (expr) { is LiteralNode -> CodeBlock.of( "%T.%N(%L).%M()", - Committed::class, + Committed, "fake", value(expr.value), - MemberName(Committed.Companion::class.asClassName(), "commitment") + MemberName(Committed.nestedClass("Companion"), "commitment") ) else -> super.exp(protocol, expr) @@ -109,9 +111,7 @@ internal class CommitmentHolderGenerator( "val %N = %L", context.kotlinName(sender.temporary.value, receiveProtocol), context.receive( - Commitment::class.asClassName().parameterizedBy( - typeTranslator(typeAnalysis.type(sender)) - ), + CommitmentClass.parameterizedBy(typeTranslator(typeAnalysis.type(sender))), events.first().send.host ) ) diff --git a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/codegeneration/BackendCodeGenerator.kt b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/codegeneration/BackendCodeGenerator.kt index 70cb28dc3c..9c237c077c 100644 --- a/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/codegeneration/BackendCodeGenerator.kt +++ b/compiler/src/main/kotlin/edu/cornell/cs/apl/viaduct/codegeneration/BackendCodeGenerator.kt @@ -1,6 +1,7 @@ package edu.cornell.cs.apl.viaduct.codegeneration import com.squareup.kotlinpoet.AnnotationSpec +import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FileSpec import com.squareup.kotlinpoet.FunSpec @@ -16,9 +17,6 @@ import com.squareup.kotlinpoet.joinToCode import edu.cornell.cs.apl.prettyprinting.joined import edu.cornell.cs.apl.viaduct.analysis.NameAnalysis import edu.cornell.cs.apl.viaduct.analysis.ProtocolAnalysis -import edu.cornell.cs.apl.viaduct.runtime.Boxed -import edu.cornell.cs.apl.viaduct.runtime.ViaductGeneratedProgram -import edu.cornell.cs.apl.viaduct.runtime.ViaductRuntime import edu.cornell.cs.apl.viaduct.selection.ProtocolCommunication import edu.cornell.cs.apl.viaduct.selection.ProtocolComposer import edu.cornell.cs.apl.viaduct.syntax.Host @@ -43,6 +41,13 @@ import edu.cornell.cs.apl.viaduct.syntax.intermediate.StatementNode import edu.cornell.cs.apl.viaduct.util.FreshNameGenerator import javax.annotation.processing.Generated +private const val runtimePackage = "edu.cornell.cs.apl.viaduct.runtime" +private val Boxed = ClassName(runtimePackage, "Boxed") +private val ViaductGeneratedProgram = ClassName(runtimePackage, "ViaductGeneratedProgram") +private val ViaductRuntime = ClassName(runtimePackage, "ViaductRuntime") +private val ViaductRuntimeReceive = MemberName(runtimePackage, "receive") +private val ViaductRuntimeSend = MemberName(runtimePackage, "send") + private class BackendCodeGenerator( val program: ProgramNode, val host: Host, @@ -60,10 +65,10 @@ private class BackendCodeGenerator( host.name.replaceFirstChar { it.uppercase() } ).primaryConstructor( FunSpec.constructorBuilder() - .addParameter("runtime", ViaductRuntime::class) + .addParameter("runtime", ViaductRuntime) .build() ).addProperty( - PropertySpec.builder("runtime", ViaductRuntime::class) + PropertySpec.builder("runtime", ViaductRuntime) .initializer("runtime") .addModifiers(KModifier.PRIVATE) .build() @@ -152,7 +157,7 @@ private class BackendCodeGenerator( hostFunctionBuilder.addStatement( "var %L = %T", context.kotlinName(outObjectDeclarations[i].name.value), - Boxed::class.asClassName() + Boxed ) // add out parameter for declared object @@ -230,9 +235,6 @@ private class BackendCodeGenerator( private var tempMap: MutableMap, String> = mutableMapOf() private var varMap: MutableMap = mutableMapOf() - private val receiveMember = MemberName(ViaductRuntime::class.java.packageName, "receive") - private val sendMember = MemberName(ViaductRuntime::class.java.packageName, "send") - private val freshNameGenerator: FreshNameGenerator = FreshNameGenerator().apply { this.getFreshName("runtime") } @@ -259,10 +261,10 @@ private class BackendCodeGenerator( hostDeclarations.reference(host) override fun receive(type: TypeName, sender: Host): CodeBlock = - CodeBlock.of("%N.%M<%T>(%L)", "runtime", receiveMember, type, codeOf(sender)) + CodeBlock.of("%N.%M<%T>(%L)", "runtime", ViaductRuntimeReceive, type, codeOf(sender)) override fun send(value: CodeBlock, receiver: Host): CodeBlock = - CodeBlock.of("%N.%M(%L, %L)", "runtime", sendMember, value, codeOf(receiver)) + CodeBlock.of("%N.%M(%L, %L)", "runtime", ViaductRuntimeSend, value, codeOf(receiver)) override fun url(host: Host): CodeBlock = CodeBlock.of("%N.url(%L)", "runtime", codeOf(host)) @@ -314,7 +316,7 @@ fun ProgramNode.compileToKotlin( ) // Create an object wrapping all generated code. - val objectBuilder = TypeSpec.objectBuilder(fileName).addSuperinterface(ViaductGeneratedProgram::class) + val objectBuilder = TypeSpec.objectBuilder(fileName).addSuperinterface(ViaductGeneratedProgram) // Add host declarations to wrapper object. val hostDeclarations = hostDeclarations(this) @@ -322,7 +324,7 @@ fun ProgramNode.compileToKotlin( // Expose set of all hosts. objectBuilder.addProperty( - PropertySpec.builder(ViaductGeneratedProgram::hosts.name, SET.parameterizedBy(Host::class.asClassName())) + PropertySpec.builder("hosts", SET.parameterizedBy(Host::class.asClassName())) .initializer( CodeBlock.of( "%M(%L)", @@ -344,7 +346,7 @@ fun ProgramNode.compileToKotlin( val main = with(FunSpec.builder("main")) { addModifiers(KModifier.OVERRIDE) addParameter("host", Host::class) - addParameter("runtime", ViaductRuntime::class) + addParameter("runtime", ViaductRuntime) // Dispatch to correct class based on host. beginControlFlow("when (host)")