Skip to content

Commit

Permalink
setting up new maven publish plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Oct 11, 2024
1 parent d195494 commit cbf3acb
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 46 deletions.
48 changes: 46 additions & 2 deletions ast/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import com.vanniktech.maven.publish.KotlinMultiplatform
import com.vanniktech.maven.publish.JavadocJar

plugins {
kotlin("multiplatform")
alias(libs.plugins.ktlint)
id("maven-publish")
//id("maven-publish")
id("signing")
id("org.jetbrains.dokka")
id("com.vanniktech.maven.publish") version "0.28.0"
alias(libs.plugins.kover)
}

Expand Down Expand Up @@ -44,7 +47,48 @@ kotlin {

publishing {
addSonatypeRepo(project)
// addPublication("kolasu_ast", "Framework to work with AST and building languages", project)
// addPublication("kolasu_ast",
// "Framework to work with AST and building languages", project,
// kotlinMultiplatform = true)
}

mavenPublishing {
coordinates(project.group as String, "kolasu-ast", project.version as String)

pom {
name.set("kolasu-" + project.name)
description.set("Framework to work with AST and building languages")
version = project.version as String
packaging = "jar"
url.set("https://github.com/Strumenta/kolasu")

scm {
connection.set("scm:git:https://github.com/Strumenta/kolasu.git")
developerConnection.set("scm:git:git@github.com:Strumenta/kolasu.git")
url.set("https://github.com/Strumenta/kolasu.git")
}

licenses {
license {
name.set("Apache License V2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0")
distribution.set("repo")
}
}

developers {
developer {
id.set("ftomassetti")
name.set("Federico Tomassetti")
email.set("federico@strumenta.com")
}
developer {
id.set("alessiostalla")
name.set("Alessio Stalla")
email.set("alessio.stalla@strumenta.com")
}
}
}
}

signing {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.strumenta.kolasu.model

/**
* This ensures that the generation of the Concept and other facilities is performed for the annotated
* node.
*/
annotation class KolasuGen
78 changes: 39 additions & 39 deletions buildSrc/src/main/kotlin/publication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,52 +35,52 @@ fun PublishingExtension.addPublication(
pubName: String,
pubDescription: String,
project: Project,
kotlinMultiplatform: Boolean = false,
addPrefix: Boolean = true
) {
publications {
create<MavenPublication>(pubName) {
from(project.components["java"])
artifactId = if (addPrefix) "kolasu-" + project.name else project.name
artifact(project.tasks.named("sourcesJar"))
artifact(project.tasks.named("kdocJar"))
suppressPomMetadataWarningsFor("cliApiElements")
suppressPomMetadataWarningsFor("cliRuntimeElements")
pom {
name.set(if (addPrefix) "kolasu-" + project.name else project.name)
description.set(pubDescription)
version = project.version as String
packaging = "jar"
url.set("https://github.com/Strumenta/kolasu")
if (kotlinMultiplatform) {
TODO()
} else {
create<MavenPublication>(pubName) {
from(project.components["java"])
artifactId = if (addPrefix) "kolasu-" + project.name else project.name
artifact(project.tasks.named("sourcesJar"))
artifact(project.tasks.named("kdocJar"))
suppressPomMetadataWarningsFor("cliApiElements")
suppressPomMetadataWarningsFor("cliRuntimeElements")
pom {
name.set(if (addPrefix) "kolasu-" + project.name else project.name)
description.set(pubDescription)
version = project.version as String
packaging = "jar"
url.set("https://github.com/Strumenta/kolasu")

scm {
connection.set("scm:git:https://github.com/Strumenta/kolasu.git")
developerConnection.set("scm:git:git@github.com:Strumenta/kolasu.git")
url.set("https://github.com/Strumenta/kolasu.git")
}

licenses {
license {
name.set("Apache License V2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0")
distribution.set("repo")
scm {
connection.set("scm:git:https://github.com/Strumenta/kolasu.git")
developerConnection.set("scm:git:git@github.com:Strumenta/kolasu.git")
url.set("https://github.com/Strumenta/kolasu.git")
}
}

developers {
developer {
id.set("ftomassetti")
name.set("Federico Tomassetti")
email.set("federico@strumenta.com")
licenses {
license {
name.set("Apache License V2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0")
distribution.set("repo")
}
}
developer {
id.set("alessiostalla")
name.set("Alessio Stalla")
email.set("alessio.stalla@strumenta.com")
}
developer {
id.set("lorenzoaddazi")
name.set("Lorenzo Addazi")
email.set("lorenzo.addazi@strumenta.com")

developers {
developer {
id.set("ftomassetti")
name.set("Federico Tomassetti")
email.set("federico@strumenta.com")
}
developer {
id.set("alessiostalla")
name.set("Alessio Stalla")
email.set("alessio.stalla@strumenta.com")
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version=1.6.0-Alpha2-SNAPSHOT
version=1.6.0-Alpha3-SNAPSHOT
kotlinVersion=2.0.20
dokkaVersion=1.9.20
org.gradle.jvmargs=-XX:MaxMetaspaceSize=512m
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.strumenta.kolasu.kcp

import com.strumenta.kolasu.language.Concept
import com.strumenta.kolasu.model.Node
import com.strumenta.kolasu.model.NodeLike
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
Expand Down Expand Up @@ -58,11 +59,12 @@ fun IrBuilderWithScope.companionGetter(irClass: IrClass): IrExpression {
}

fun IrBuilderWithScope.conceptGetter(nodeSubclass: IrClass): IrExpression {
val extendNode = nodeSubclass.superTypes.any { it.classFqName!!.asString() == Node::class.qualifiedName!! }
val companionClass =
nodeSubclass
.companionObject()
?: throw IllegalStateException(
"Cannot find companion object for ${nodeSubclass.kotlinFqName}",
"Cannot find companion object for ${nodeSubclass.kotlinFqName}. ${if (extendNode) "It extends Node and not MPNode" else ""}",
)
val conceptField = companionClass.properties.find { it.name.identifier == "concept" }!!
val conceptInstance: IrExpression =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class LanguageGenerator(
classSymbol: FirClassSymbol<*>,
context: NestedClassGenerationContext,
): Set<Name> {
if (classSymbol.extendMPNode(session)) {
if (classSymbol.isKolasuGenEnabled(session)) {
knownMPNodeSubclasses.add(classSymbol.name)
println("FOR CLASS ${classSymbol.name} GOT COMPANION")
return setOf(DEFAULT_NAME_FOR_COMPANION_OBJECT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ package com.strumenta.kolasu.kcp.fir

import com.strumenta.kolasu.kcp.fir.MPNodesCollector.knownMPNodeSubclasses
import com.strumenta.kolasu.language.Concept
import com.strumenta.kolasu.model.KolasuGen
import com.strumenta.kolasu.model.MPNode
import org.jetbrains.kotlin.GeneratedDeclarationKey
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol
import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.utils.isAbstract
import org.jetbrains.kotlin.fir.declarations.utils.isSealed
import org.jetbrains.kotlin.fir.expressions.builder.FirBlockBuilder
Expand All @@ -24,6 +27,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.classId
import org.jetbrains.kotlin.fir.types.coneTypeOrNull
import org.jetbrains.kotlin.fir.types.impl.FirImplicitAnyTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
import org.jetbrains.kotlin.fir.types.impl.FirUserTypeRefImpl
Expand Down Expand Up @@ -136,18 +140,38 @@ fun FirClassSymbol<*>.isMPNode(firSession: FirSession): Boolean =
this.classId.asSingleFqName().asString() == MPNode::class.qualifiedName!!

@OptIn(SymbolInternals::class)
fun FirClassSymbol<*>.extendMPNode(firSession: FirSession): Boolean =
this.fir.superTypeRefs.any {
fun FirClassSymbol<*>.isKolasuGenEnabled(firSession: FirSession): Boolean {
return this.extendMPNode(firSession) || this.annotations.any {
val classId = it.annotationTypeRef.firClassLike(firSession)?.classId
if (classId == null) {
val coneType = it.annotationTypeRef.coneTypeOrNull
if (coneType == null) {
throw IllegalStateException("Unable to process annotation ${it}")
} else {
coneType.classId?.asSingleFqName()?.asString() == KolasuGen::class.qualifiedName
}
} else {
classId.asSingleFqName().asString() == KolasuGen::class.qualifiedName
}
}
}

@OptIn(SymbolInternals::class)
fun FirClassSymbol<*>.extendMPNode(firSession: FirSession): Boolean {
return this.fir.superTypeRefs.any {
when (it) {
is FirResolvedTypeRefImpl -> {
(it.type.classId!!.toSymbol(firSession) as FirClassSymbol<*>).isOrExtendMPNode(firSession)
}

is FirImplicitAnyTypeRef -> {
false
}

is FirErrorTypeRef -> {
false
}

is FirUserTypeRefImpl -> {
if (it.qualifier.any { it.name.identifier == "MPNode" }) {
true
Expand All @@ -169,3 +193,4 @@ fun FirClassSymbol<*>.extendMPNode(firSession: FirSession): Boolean =
}
}
}
}

0 comments on commit cbf3acb

Please sign in to comment.