From 53325cdba6731a6e268e8177c023069a35756140 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 31 Jul 2020 13:20:43 +0200 Subject: [PATCH] Forming the generator slowly --- buildSrc/src/main/kotlin/Deps.kt | 4 + .../build.gradle | 22 --- .../build.gradle.kts | 37 +++++ .../libsodium/definitions/Definitions.kt | 129 ++++++++++++++++++ .../generator/CommonLibsodiumGenerator.kt | 59 ++++++++ .../libsodium/generator/Coordinator.kt | 16 +++ .../generator/JvmLibsodiumGenerator.kt | 41 ++++++ .../libsodium/generator/SharedCreators.kt | 30 ++++ .../kotlin/crypto/generator/DebugTest.kt | 19 +++ 9 files changed, 335 insertions(+), 22 deletions(-) delete mode 100644 kotlin-multiplatform-libsodium-generator/build.gradle create mode 100644 kotlin-multiplatform-libsodium-generator/build.gradle.kts create mode 100644 kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/definitions/Definitions.kt create mode 100644 kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/CommonLibsodiumGenerator.kt create mode 100644 kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/Coordinator.kt create mode 100644 kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/JvmLibsodiumGenerator.kt create mode 100644 kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/SharedCreators.kt create mode 100644 kotlin-multiplatform-libsodium-generator/src/test/kotlin/com/ionspin/kotlin/crypto/generator/DebugTest.kt diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index 6a6b215..0869413 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -28,6 +28,8 @@ object Versions { val lazySodium = "4.2.6" val jna = "5.5.0" + val kotlinPoet = "1.6.0" + } @@ -75,6 +77,8 @@ object Deps { val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinSerialization}" val coroutinesTest = "org.jetbrains.kotlinx:kotlinx-coroutines-test:${Versions.kotlinCoroutines}" + val kotlinPoet = "com.squareup:kotlinpoet:${Versions.kotlinPoet}" + object Delegated { val lazysodium = "com.goterl.lazycode:lazysodium-java:${Versions.lazySodium}" val jna = "net.java.dev.jna:jna:${Versions.jna}" diff --git a/kotlin-multiplatform-libsodium-generator/build.gradle b/kotlin-multiplatform-libsodium-generator/build.gradle deleted file mode 100644 index 3f26d44..0000000 --- a/kotlin-multiplatform-libsodium-generator/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' -} - -group 'com.ionspin.kotlin.crypto' -version '0.0.1' - -repositories { - maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' } - mavenCentral() -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" -} - -compileKotlin { - kotlinOptions.jvmTarget = "1.8" -} -compileTestKotlin { - kotlinOptions.jvmTarget = "1.8" -} diff --git a/kotlin-multiplatform-libsodium-generator/build.gradle.kts b/kotlin-multiplatform-libsodium-generator/build.gradle.kts new file mode 100644 index 0000000..a200ebe --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/build.gradle.kts @@ -0,0 +1,37 @@ +plugins { + kotlin +} + +group = "com.ionspin.kotlin.crypto" +version = "0.0.1" + +repositories { + mavenCentral() + google() + maven ("https://kotlin.bintray.com/kotlinx") + maven ("https://dl.bintray.com/kotlin/kotlin-eap") + maven ("https://dl.bintray.com/kotlin/kotlin-dev") + jcenter() + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } +} + +dependencies { + implementation (kotlin(Deps.Jvm.stdLib)) + implementation("com.squareup:kotlinpoet:1.6.0") + testImplementation(kotlin(Deps.Jvm.test)) + testImplementation(kotlin(Deps.Jvm.testJUnit)) +} + +tasks.withType().all { + kotlinOptions.freeCompilerArgs += listOf( + "-Xuse-experimental=kotlin.ExperimentalUnsignedTypes", + "" + ) +} + + + + + diff --git a/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/definitions/Definitions.kt b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/definitions/Definitions.kt new file mode 100644 index 0000000..8bd8253 --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/definitions/Definitions.kt @@ -0,0 +1,129 @@ +package com.ionspin.kotlin.crypto.generator.libsodium.definitions + +import com.squareup.kotlinpoet.TypeName +import com.squareup.kotlinpoet.asTypeName + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 28-Jul-2020 + */ + +class KotlinFileDefinition( + val name: String, + val commonClassList: MutableList = mutableListOf() +) { + operator fun ClassDefinition.unaryPlus() { + commonClassList.add(this) + } +} + +class ClassDefinition( + val name: String, + val innerClasses: MutableList = mutableListOf(), + val methods: MutableList = mutableListOf() +) { + operator fun InnerClassDefinition.unaryPlus() { + innerClasses.add(this) + } + + operator fun FunctionDefinition.unaryPlus() { + methods.add(this) + } +} + +class InnerClassDefinition ( + val name: String, + val javaName: String, + val jsName: String, + val nativeName: String, + val functions: MutableList = mutableListOf() +) + +class FunctionDefinition( + val name: String, + val javaName: String, + val jsName: String, + val nativeName: String, + val parameterList: MutableList = mutableListOf(), + val returnType: TypeDefinition +) { + operator fun ParameterDefinition.unaryPlus() { + parameterList.add(this) + } +} + +class ParameterDefinition( + val parameterName: String, + val parameterType: TypeDefinition +) + +enum class TypeDefinition(val typeName: TypeName) { + ARRAY_OF_UBYTES(UByteArray::class.asTypeName()), + LONG(Long::class.asTypeName()), + INT(Int::class.asTypeName()), + STRING(String::class.asTypeName()) +} + +fun fileDef(name: String, body: KotlinFileDefinition.() -> Unit) : KotlinFileDefinition { + val commonKotlinFileInstance = KotlinFileDefinition(name) + commonKotlinFileInstance.body() + return commonKotlinFileInstance +} + + +fun classDef(name: String, body: ClassDefinition.() -> Unit): ClassDefinition { + val commonClass = ClassDefinition(name) + commonClass.body() + return commonClass +} + +fun innerClassDef( + name: String, + javaName: String, + jsName: String, + nativeName: String, + body: InnerClassDefinition.() -> Unit = {} +) : InnerClassDefinition { + val genClass = InnerClassDefinition( + name, + javaName, + jsName, + nativeName + ) + genClass.body() + return genClass +} + +fun funcDef( + name: String, + javaName: String, + jsName: String, + nativeName: String, + returnType: TypeDefinition, body: FunctionDefinition.() -> Unit +): FunctionDefinition { + val function = FunctionDefinition(name, javaName, jsName, nativeName, returnType = returnType) + function.body() + return function +} + + +object LibSodiumDefinitions { + val testKotlinFile = fileDef("Test.kt") { + +classDef("Hashing") { + +innerClassDef( + "Sha256State", + "Hash.State256", + "Sha256State", + "crypto_hash_sha256_state" + ) + +funcDef( + "test", "test", "test", "test", TypeDefinition.ARRAY_OF_UBYTES + ) { + +ParameterDefinition("first", TypeDefinition.ARRAY_OF_UBYTES) + +ParameterDefinition("second", TypeDefinition.LONG) + +ParameterDefinition("third", TypeDefinition.STRING) + } + } + } +} diff --git a/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/CommonLibsodiumGenerator.kt b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/CommonLibsodiumGenerator.kt new file mode 100644 index 0000000..df7e041 --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/CommonLibsodiumGenerator.kt @@ -0,0 +1,59 @@ +package com.ionspin.kotlin.crypto.generator.libsodium.generator + +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.ClassDefinition +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.FunctionDefinition +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.KotlinFileDefinition +import com.squareup.kotlinpoet.* + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 31-Jul-2020 + */ + +enum class MultiplatformModifier(val modifierList : List) { + EXPECT(listOf(KModifier.EXPECT)), + ACTUAL(listOf(KModifier.ACTUAL)), + NONE(listOf()) +} + +object CommonLibsodiumGenerator { + + fun createCommonFile(packageName: String, fileDefinition: KotlinFileDefinition): FileSpec { + val fileBuilder = FileSpec.builder(packageName, fileDefinition.name) + for (commonClassDefinition in fileDefinition.commonClassList) { + val commonClassSpec = + createClass(commonClassDefinition, MultiplatformModifier.EXPECT, ::createCommonMethodSpec) + fileBuilder.addType(commonClassSpec) + } + val file = fileBuilder.build() + file.writeTo(System.out) + return file + } + + fun createCommonMethodSpec(methodDefinition: FunctionDefinition): FunSpec { + val methodBuilder = FunSpec.builder(methodDefinition.name) + for (paramDefinition in methodDefinition.parameterList) { + val parameterSpec = + ParameterSpec.builder(paramDefinition.parameterName, paramDefinition.parameterType.typeName) + methodBuilder.addParameter(parameterSpec.build()) + } + methodBuilder.returns(methodDefinition.returnType.typeName) + return methodBuilder.build() + } + +} + + + + + + + + + + + + + + diff --git a/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/Coordinator.kt b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/Coordinator.kt new file mode 100644 index 0000000..48d52e4 --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/Coordinator.kt @@ -0,0 +1,16 @@ +package com.ionspin.kotlin.crypto.generator.libsodium.generator + +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.LibSodiumDefinitions + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 31-Jul-2020 + */ +object Coordinator { + + fun run(packageName: String) { + CommonLibsodiumGenerator.createCommonFile(packageName, LibSodiumDefinitions.testKotlinFile) + JvmLibsodiumGenerator.createJvmFile(packageName, LibSodiumDefinitions.testKotlinFile) + } +} diff --git a/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/JvmLibsodiumGenerator.kt b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/JvmLibsodiumGenerator.kt new file mode 100644 index 0000000..2b59aaf --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/JvmLibsodiumGenerator.kt @@ -0,0 +1,41 @@ +package com.ionspin.kotlin.crypto.generator.libsodium.generator + +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.FunctionDefinition +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.KotlinFileDefinition +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.ParameterSpec + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 31-Jul-2020 + */ +object JvmLibsodiumGenerator { + + + fun createJvmFile(packageName: String, fileDefinition: KotlinFileDefinition) : FileSpec { + val fileBuilder = FileSpec.builder(packageName, fileDefinition.name) + for (commonClassDefinition in fileDefinition.commonClassList) { + val commonClassSpec = createClass(commonClassDefinition, MultiplatformModifier.ACTUAL, ::createJvmFunctionImplementation) + fileBuilder.addType(commonClassSpec) + } + val file = fileBuilder.build() + file.writeTo(System.out) + return file + } + + fun createJvmFunctionImplementation(methodDefinition: FunctionDefinition) : FunSpec { + val methodBuilder = FunSpec.builder(methodDefinition.name) + for (paramDefinition in methodDefinition.parameterList) { + val parameterSpec = + ParameterSpec.builder(paramDefinition.parameterName, paramDefinition.parameterType.typeName) + methodBuilder.addParameter(parameterSpec.build()) + } + methodBuilder.addStatement("val test1 = ${methodDefinition.javaName}") + methodBuilder.returns(methodDefinition.returnType.typeName) + return methodBuilder.build() + } + + +} diff --git a/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/SharedCreators.kt b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/SharedCreators.kt new file mode 100644 index 0000000..132e6a3 --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/main/kotlin/com/ionspin/kotlin/crypto/generator/libsodium/generator/SharedCreators.kt @@ -0,0 +1,30 @@ +package com.ionspin.kotlin.crypto.generator.libsodium.generator + +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.ClassDefinition +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.FunctionDefinition +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.KotlinFileDefinition +import com.squareup.kotlinpoet.FileSpec +import com.squareup.kotlinpoet.FunSpec +import com.squareup.kotlinpoet.ParameterSpec +import com.squareup.kotlinpoet.TypeSpec + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 31-Jul-2020 + */ +fun createClass(classDefinition: ClassDefinition, multiplatformModifier: MultiplatformModifier, methodCreator : (FunctionDefinition) -> FunSpec) : TypeSpec { + val commonClassBuilder = TypeSpec.classBuilder(classDefinition.name) + commonClassBuilder.modifiers += multiplatformModifier.modifierList + for (innerClassDefinition in classDefinition.innerClasses) { + val innerClassBuilder = TypeSpec.classBuilder(innerClassDefinition.name) + innerClassBuilder.modifiers += multiplatformModifier.modifierList + commonClassBuilder.addType(innerClassBuilder.build()) + } + for (methodDefinition in classDefinition.methods) { + commonClassBuilder.addFunction(methodCreator(methodDefinition)) + } + return commonClassBuilder.build() +} + + diff --git a/kotlin-multiplatform-libsodium-generator/src/test/kotlin/com/ionspin/kotlin/crypto/generator/DebugTest.kt b/kotlin-multiplatform-libsodium-generator/src/test/kotlin/com/ionspin/kotlin/crypto/generator/DebugTest.kt new file mode 100644 index 0000000..466a548 --- /dev/null +++ b/kotlin-multiplatform-libsodium-generator/src/test/kotlin/com/ionspin/kotlin/crypto/generator/DebugTest.kt @@ -0,0 +1,19 @@ +package com.ionspin.kotlin.crypto.generator + +import com.ionspin.kotlin.crypto.generator.libsodium.generator.CommonLibsodiumGenerator +import com.ionspin.kotlin.crypto.generator.libsodium.definitions.LibSodiumDefinitions +import com.ionspin.kotlin.crypto.generator.libsodium.generator.Coordinator +import org.junit.Test + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 31-Jul-2020 + */ +class DebugTest { + val packageName = "debug.test" + @Test + fun debugTest() { + Coordinator.run(packageName) + } +}