diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11156c0..4d6f072 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -101,6 +101,31 @@ jobs: ./gradlew publishToMavenLocal --stacktrace --show-version --no-configuration-cache ./gradlew -p gradle-plugin publishToMavenLocal --stacktrace --show-version --no-configuration-cache + publish-pr72-snapshot: + if: ${{ github.event_name == 'pull_request' && github.event.pull_request.number == 72 && github.head_ref == 'tomm/use-scoped-contribution-hints' && github.repository == 'square/metro-extensions' }} + runs-on: ubuntu-latest + timeout-minutes: 60 + + steps: + - uses: actions/checkout@v6 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Setup + uses: ./.github/actions/setup-action + with: + gradle-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} + + - name: Publish PR72 Kotlin 2.3.21 snapshot + run: | + ./gradlew clean publish -Pkotlin.version=2.3.21 -PRELEASE_SIGNING_ENABLED=true --no-build-cache --stacktrace --show-version --no-configuration-cache + ./gradlew -p gradle-plugin clean publish -Pkotlin.version=2.3.21 -PRELEASE_SIGNING_ENABLED=true --no-build-cache --stacktrace --show-version --no-configuration-cache + env: + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.SONATYPE_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.SONATYPE_CENTRAL_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_SECRET_KEY }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.GPG_SECRET_PASSPHRASE }} + build-logic: runs-on: ubuntu-latest timeout-minutes: 25 diff --git a/compiler/api/compiler.api b/compiler/api/compiler.api index ac9fc53..59330f0 100644 --- a/compiler/api/compiler.api +++ b/compiler/api/compiler.api @@ -114,17 +114,6 @@ public final class com/squareup/metro/extensions/scoped/ContributesMultibindingS public fun create (Lorg/jetbrains/kotlin/fir/FirSession;Ldev/zacsweers/metro/compiler/MetroOptions;Ldev/zacsweers/metro/compiler/compat/CompatContext;)Ldev/zacsweers/metro/compiler/api/fir/MetroFirDeclarationGenerationExtension; } -public final class com/squareup/metro/extensions/scoped/ContributesMultibindingScopedMetroExtension : dev/zacsweers/metro/compiler/api/fir/MetroContributionExtension { - public fun (Lorg/jetbrains/kotlin/fir/FirSession;)V - public fun getContributions (Lorg/jetbrains/kotlin/name/ClassId;Ldev/zacsweers/metro/compiler/fir/MetroFirTypeResolver$Factory;)Ljava/util/List; - public fun registerPredicates (Lorg/jetbrains/kotlin/fir/extensions/FirDeclarationPredicateRegistrar;)V -} - -public final class com/squareup/metro/extensions/scoped/ContributesMultibindingScopedMetroExtension$Factory : dev/zacsweers/metro/compiler/api/fir/MetroContributionExtension$Factory { - public fun ()V - public fun create (Lorg/jetbrains/kotlin/fir/FirSession;Ldev/zacsweers/metro/compiler/MetroOptions;Ldev/zacsweers/metro/compiler/compat/CompatContext;)Ldev/zacsweers/metro/compiler/api/fir/MetroContributionExtension; -} - public final class com/squareup/metro/extensions/service/ContributesServiceFir : dev/zacsweers/metro/compiler/api/fir/MetroFirDeclarationGenerationExtension { public fun (Lorg/jetbrains/kotlin/fir/FirSession;)V public fun generateConstructors (Lorg/jetbrains/kotlin/fir/extensions/DeclarationGenerationContext$Member;)Ljava/util/List; diff --git a/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedIds.kt b/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedIds.kt index f617b75..416842f 100644 --- a/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedIds.kt +++ b/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedIds.kt @@ -8,9 +8,8 @@ import org.jetbrains.kotlin.name.Name /** * Shared identifiers for the `@ContributesMultibindingScoped` compiler plugin support. * - * Used by both: - * - [ContributesMultibindingScopedFir] (FIR generator that creates the contribution interface) - * - [ContributesMultibindingScopedMetroExtension] (Metro extension that bridges predicate gap) + * Used by [ContributesMultibindingScopedFir] to create scoped binding containers and contribution + * hints. */ internal object ContributesMultibindingScopedIds { diff --git a/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedMetroExtension.kt b/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedMetroExtension.kt deleted file mode 100644 index 505272a..0000000 --- a/compiler/src/main/kotlin/com/squareup/metro/extensions/scoped/ContributesMultibindingScopedMetroExtension.kt +++ /dev/null @@ -1,100 +0,0 @@ -package com.squareup.metro.extensions.scoped - -import com.fueledbycaffeine.autoservice.AutoService -import com.squareup.metro.extensions.fir.extractScopeClassId -import dev.zacsweers.metro.compiler.MetroOptions -import dev.zacsweers.metro.compiler.api.fir.MetroContributionExtension -import dev.zacsweers.metro.compiler.compat.CompatContext -import dev.zacsweers.metro.compiler.fir.MetroFirTypeResolver -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.extensions.FirDeclarationPredicateRegistrar -import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider -import org.jetbrains.kotlin.fir.resolve.defaultType -import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.name.ClassId - -/** - * Implements [MetroContributionExtension] to tell Metro's `ContributedInterfaceSupertypeGenerator` - * about contributions from our generated `MultibindingScopedContribution` interfaces. - * - * This is necessary because Metro's predicate-based provider only sees source declarations and - * declarations generated by generators that registered the predicate for `@ContributesTo`. Our - * `MultibindingScopedContribution` is generated by [ContributesMultibindingScopedFir] (which - * registered a predicate for `@ContributesMultibindingScoped`), so Metro's in-compilation discovery - * doesn't see it. - */ -public class ContributesMultibindingScopedMetroExtension(private val session: FirSession) : - MetroContributionExtension { - - private val predicate = ContributesMultibindingScopedIds.PREDICATE - - private val annotatedClasses by lazy { - session.predicateBasedProvider - .getSymbolsByPredicate(predicate) - .filterIsInstance() - .toList() - } - - override fun FirDeclarationPredicateRegistrar.registerPredicates() { - register(predicate) - } - - override fun getContributions( - scopeClassId: ClassId, - typeResolverFactory: MetroFirTypeResolver.Factory, - ): List { - return annotatedClasses.flatMap { parentSymbol -> - val annotationScopeClassId = - extractScopeClassId( - parentSymbol, - ContributesMultibindingScopedIds.CONTRIBUTES_MULTIBINDING_SCOPED_CLASS_ID, - session, - ) ?: return@flatMap emptyList() - - if (annotationScopeClassId != scopeClassId) return@flatMap emptyList() - - val contributionInterfaceClassId = - ContributesMultibindingScopedIds.contributionClassId(parentSymbol.classId) - val holderClassId = ContributesMultibindingScopedIds.holderClassId(parentSymbol.classId) - - val contributionSymbol = - session.symbolProvider.getClassLikeSymbolByClassId(contributionInterfaceClassId) - as? FirRegularClassSymbol - val holderSymbol = - session.symbolProvider.getClassLikeSymbolByClassId(holderClassId) as? FirRegularClassSymbol - - buildList { - if (holderSymbol != null) { - add( - MetroContributionExtension.Contribution( - supertype = holderSymbol.defaultType(), - replaces = emptyList(), - originClassId = holderClassId, - ) - ) - } - if (contributionSymbol != null) { - add( - MetroContributionExtension.Contribution( - supertype = contributionSymbol.defaultType(), - replaces = emptyList(), - originClassId = contributionInterfaceClassId, - ) - ) - } - } - } - } - - @AutoService(MetroContributionExtension.Factory::class) - public class Factory : MetroContributionExtension.Factory { - override fun create( - session: FirSession, - options: MetroOptions, - compatContext: CompatContext, - ): MetroContributionExtension { - return ContributesMultibindingScopedMetroExtension(session) - } - } -} diff --git a/compiler/src/test/kotlin/com/squareup/metro/extensions/services/FileSortingAssertionsService.kt b/compiler/src/test/kotlin/com/squareup/metro/extensions/services/FileSortingAssertionsService.kt index 3c69d28..bf0f214 100644 --- a/compiler/src/test/kotlin/com/squareup/metro/extensions/services/FileSortingAssertionsService.kt +++ b/compiler/src/test/kotlin/com/squareup/metro/extensions/services/FileSortingAssertionsService.kt @@ -1,6 +1,7 @@ package com.squareup.metro.extensions.services import java.io.File +import kotlin.time.Duration import org.jetbrains.kotlin.test.services.AssertionsService import org.jetbrains.kotlin.test.services.JUnit5Assertions @@ -104,6 +105,14 @@ object FileSortingAssertionsService : AssertionsService() { override fun assertAll(conditions: List<() -> Unit>) = delegate.assertAll(conditions) + override fun assertTimeoutPreemptively( + timeout: Duration, + message: () -> String, + action: () -> Unit, + ) { + delegate.assertTimeoutPreemptively(timeout, message, action) + } + override fun assertNotNull(value: Any?, message: (() -> String)?) { delegate.assertNotNull(value, message ?: { "" }) } diff --git a/gradle.properties b/gradle.properties index e037cff..d8736a4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=0.0.12-SNAPSHOT +VERSION_NAME=0.0.12-pr72-5d5d96f-k2321-SNAPSHOT GROUP=com.squareup.metro.extensions org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4b5c055..728ab7c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,12 @@ [versions] -autoservice = "0.1.4" +autoservice = "0.1.5" binary-compat-validator = "0.18.1" buildconfig = "6.0.9" jdk = "21" kotlin = "2.3.21" ktfmt = "0.26.0" maven-publish = "0.36.0" -metro = "1.1.1" +metro = "1.2.0" [libraries] kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin" }