Skip to content

build(deps): bump dev.zacsweers.metro from 1.4.5 to 1.5.1 - #1901

Merged
bmc08gt merged 5 commits into
code/cashfrom
dependabot/gradle/code/cash/dev.zacsweers.metro-1.5.0
Nov 3, 2026
Merged

bmc08gt merged 5 commits into
code/cashfrom
dependabot/gradle/code/cash/dev.zacsweers.metro-1.5.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Oct 30, 2026

Copy link
Copy Markdown
Contributor

Bumps dev.zacsweers.metro from 1.4.5 to 1.5.0.

Release notes

Sourced from dev.zacsweers.metro's releases.

1.5.0

New

  • [metrox-viewmodel-compose] Add support for linuxX64.
  • [FIR] Add the diagnostic-level compiler option to change the severity of Metro diagnostics reported in FIR. It works like kotlinc's -Xwarning-level but can also lower errors and use IDE-only levels. See changing diagnostic severity.
  • [FIR/IC] Add the function-inject-annotations-override compiler option to use dedicated annotations for top-level function injection. See custom function injection annotations.
  • [FIR/IR] Support context parameters and extension receivers on @Provides functions and properties. Both are dependencies and can be qualified.
  • [Gradle] Add opt-in checks to find Metro contributions hidden from a graph's compile classpath. Run checkMainMetroHiddenDependencies (i.e., on CI). It writes a report and fails if it finds hidden contributions.
    • Supports JVM and Android compilations, including JVM targets in KMP. See checking for hidden contributions.
    • Also checks Hilt aggregation metadata when Hilt interop is enabled.
    • Configure scope filters with scopes in the experimental metro.hiddenDependencies DSL. Enable checkOnCompile in the same block to run each check automatically after its Kotlin compilation, including when compilation fails. Automatic checks are disabled by default and may become the default in a future release.

Enhancements

  • [IR] Reduce generated code in graph extensions by reusing existing parent bindings when their contributions and resolved dependencies are unchanged. Objects constructed in a single extension can receive sets and maps from parent getters when the parent already uses those collections.
  • [IR] Graphs no longer generate a private getter for a multibinding that only one site reads. That site builds the collection itself.
    • Reads from graph extensions that reuse the multibinding count too.
    • Multibindings with more than 25 contributions also keep a getter so they don't crowd their reader's method. You can configure that threshold with the new multibinding-getter-threshold compiler option.
  • [IR] When several graph extensions use the same binding, their nearest common ancestor now generates its construction code in a shared getter. This also applies when different classes in those extensions depend on the binding. Unscoped bindings still create a new instance on each call.
  • [IR] When several accessors request the same key and return type, the first accessor holds the binding's code and the others call through to it.
  • [IR] Graphs no longer store themselves in a field. Code that needs the graph reads this, or the graph reference that a shard or switching provider already holds.
  • [IR] Generated code wraps instances in providers with providerOf(). On JVM that's one static call. InstanceFactory.invoke() also loaded its companion and boxed the value class.
  • [IR] Provider lambdas that Metro generates are SAM-converted to Provider directly. The inline provider() function they went through before added a type check and a second wrapper object at every site.
  • [IR] Each switching provider class numbers its bindings from zero. Shards used to switch on graph-wide IDs with gaps between them.
  • [IR] Switching provider branches read the graph reference into a local when more than one branch needs it.
  • [IR] Graph shard constructors read the graph from their constructor parameter. A shard drops its graph field when only its constructor used it.
  • [IR] Instance reads of @Includes graph accessors that return Provider<T> or () -> T call the accessor directly. They used to cache a converted provider in a field or wrap the accessor in a new provider lambda. Lazy accessors still cache their handle, so their value is computed once.
  • [IR/JVM] Fields in generated graphs, shards, and switching providers are now package-private on JVM. This reduces synthetic accessors.
  • [IR/JVM] Generated code calls @JvmStatic functions in objects and companion objects statically on JVM. This keeps companion classes out of the caller's constant pool. At runtime each call still goes through the companion, since the static method forwards to it. In a 500-module benchmark this made the generated graph classes 17% smaller.
  • [IR/JS] On JS, converting a Provider to () -> T or suspend () -> T now calls a small runtime helper. Each site used to generate its own wrapper lambda.
  • [IR/interop] Providers of absent @BindsOptionalOf bindings use an InstanceFactory that holds Optional.empty() instead of generating a local lambda each time.

Fixes

  • [FIR] Reduce redundant lookups when discovering contributed graph extension factories.
  • [FIR] Fix accessor override status on Kotlin 2.5.0-dev-10106.
  • [FIR/IC] Avoid unnecessary recompilation of independent injected classes when generating contribution hints.
  • [FIR/interop] Fix duplicate class errors during caused by Hilt interop generating hints for upstream modules.
  • [FIR/IR/interop] Fix incremental builds not updating graphs when an upstream Hilt @AggregatedDeps marker changes or is removed.
  • [FIR/IR/Gradle] Fix false self-loop errors in analyzeMetroGraph when one qualified map depends on another.
  • [IR] Fix a qualified request resolving to an unqualified @Inject class. A qualified optional binding now uses its default, and other qualified requests report a missing binding.
  • [IR] Fix member injection across modules when an injected member uses a generic base class's type parameter.
  • [IR] Fix missing binding errors for accessors inherited from another module having no source location.
  • [IR] Fix MissingRuntimeCoroutines errors for injected top-level functions pointing at 0:0 in a generated file. They're now reported on the function.
  • [IR] Fix declaration parents for copied default argument lambdas and callable references, including references inside generated provider wrappers.
  • [IR] Include extension receivers in generated lambda function types, including set and map builder callbacks.
  • [IR] Fix a compiler crash when injecting a provider of a single-entry Map<Class<*>, V> with enableKClassToClassMapKeyInterop enabled.
  • [IR] Fix IR diagnostic reporting on Kotlin 2.5.0-dev-10106.
  • [IR] Fix graphs storing an @Includes graph parameter in two fields when the included graph has graph extensions.
  • [IR] Fix runtime tracing passing a contextual type that matches the binding's type. It's now null as documented.

... (truncated)

Changelog

Sourced from dev.zacsweers.metro's changelog.

1.5.0

2026-10-26

New

  • [metrox-viewmodel-compose] Add support for linuxX64.
  • [FIR] Add the diagnostic-level compiler option to change the severity of Metro diagnostics reported in FIR. It works like kotlinc's -Xwarning-level but can also lower errors and use IDE-only levels. See changing diagnostic severity.
  • [FIR/IC] Add the function-inject-annotations-override compiler option to use dedicated annotations for top-level function injection. See custom function injection annotations.
  • [FIR/IR] Support context parameters and extension receivers on @Provides functions and properties. Both are dependencies and can be qualified.
  • [Gradle] Add opt-in checks to find Metro contributions hidden from a graph's compile classpath. Run checkMainMetroHiddenDependencies (i.e., on CI). It writes a report and fails if it finds hidden contributions.
    • Supports JVM and Android compilations, including JVM targets in KMP. See checking for hidden contributions.
    • Also checks Hilt aggregation metadata when Hilt interop is enabled.
    • Configure scope filters with scopes in the experimental metro.hiddenDependencies DSL. Enable checkOnCompile in the same block to run each check automatically after its Kotlin compilation, including when compilation fails. Automatic checks are disabled by default and may become the default in a future release.

Enhancements

  • [IR] Reduce generated code in graph extensions by reusing existing parent bindings when their contributions and resolved dependencies are unchanged. Objects constructed in a single extension can receive sets and maps from parent getters when the parent already uses those collections.
  • [IR] Graphs no longer generate a private getter for a multibinding that only one site reads. That site builds the collection itself.
    • Reads from graph extensions that reuse the multibinding count too.
    • Multibindings with more than 25 contributions also keep a getter so they don't crowd their reader's method. You can configure that threshold with the new multibinding-getter-threshold compiler option.
  • [IR] When several graph extensions use the same binding, their nearest common ancestor now generates its construction code in a shared getter. This also applies when different classes in those extensions depend on the binding. Unscoped bindings still create a new instance on each call.
  • [IR] When several accessors request the same key and return type, the first accessor holds the binding's code and the others call through to it.
  • [IR] Graphs no longer store themselves in a field. Code that needs the graph reads this, or the graph reference that a shard or switching provider already holds.
  • [IR] Generated code wraps instances in providers with providerOf(). On JVM that's one static call. InstanceFactory.invoke() also loaded its companion and boxed the value class.
  • [IR] Provider lambdas that Metro generates are SAM-converted to Provider directly. The inline provider() function they went through before added a type check and a second wrapper object at every site.
  • [IR] Each switching provider class numbers its bindings from zero. Shards used to switch on graph-wide IDs with gaps between them.
  • [IR] Switching provider branches read the graph reference into a local when more than one branch needs it.
  • [IR] Graph shard constructors read the graph from their constructor parameter. A shard drops its graph field when only its constructor used it.
  • [IR] Instance reads of @Includes graph accessors that return Provider<T> or () -> T call the accessor directly. They used to cache a converted provider in a field or wrap the accessor in a new provider lambda. Lazy accessors still cache their handle, so their value is computed once.
  • [IR/JVM] Fields in generated graphs, shards, and switching providers are now package-private on JVM. This reduces synthetic accessors.
  • [IR/JVM] Generated code calls @JvmStatic functions in objects and companion objects statically on JVM. This keeps companion classes out of the caller's constant pool. At runtime each call still goes through the companion, since the static method forwards to it. In a 500-module benchmark this made the generated graph classes 17% smaller.
  • [IR/JS] On JS, converting a Provider to () -> T or suspend () -> T now calls a small runtime helper. Each site used to generate its own wrapper lambda.
  • [IR/interop] Providers of absent @BindsOptionalOf bindings use an InstanceFactory that holds Optional.empty() instead of generating a local lambda each time.

Fixes

  • [FIR] Reduce redundant lookups when discovering contributed graph extension factories.
  • [FIR] Fix accessor override status on Kotlin 2.5.0-dev-10106.
  • [FIR/IC] Avoid unnecessary recompilation of independent injected classes when generating contribution hints.
  • [FIR/interop] Fix duplicate class errors during caused by Hilt interop generating hints for upstream modules.
  • [FIR/IR/interop] Fix incremental builds not updating graphs when an upstream Hilt @AggregatedDeps marker changes or is removed.
  • [FIR/IR/Gradle] Fix false self-loop errors in analyzeMetroGraph when one qualified map depends on another.
  • [IR] Fix a qualified request resolving to an unqualified @Inject class. A qualified optional binding now uses its default, and other qualified requests report a missing binding.
  • [IR] Fix member injection across modules when an injected member uses a generic base class's type parameter.
  • [IR] Fix missing binding errors for accessors inherited from another module having no source location.
  • [IR] Fix MissingRuntimeCoroutines errors for injected top-level functions pointing at 0:0 in a generated file. They're now reported on the function.
  • [IR] Fix declaration parents for copied default argument lambdas and callable references, including references inside generated provider wrappers.
  • [IR] Include extension receivers in generated lambda function types, including set and map builder callbacks.

... (truncated)

Commits
  • ef9ddf2 Prepare for release 1.5.0.
  • 7173774 Wait for indexing before implicit-usage tests (#3012)
  • 26b1cd2 Support context params & extensions on @Provides declarations (#3008)
  • ba007a0 Update dependency mkdocs-material to v9.8.0 (#3006)
  • 11416df Update dependency com.android.tools:r8 to v9.5.28 (#2986)
  • ff2e594 Update dependency com.slack.foundry:better-gradle-properties to v0.37.3 (#2995)
  • 27c8e4a Update dependency tornado to v6.6 (#2998)
  • fce2a6a Update dependency python-dateutil to v3 (#2999)
  • f6a7a37 Update dependency com.squareup.okhttp3:okhttp to v5.5.1 (#3000)
  • 8bd9aaf Update dependency zensical to v0.0.72 (#3004)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [dev.zacsweers.metro](https://github.com/ZacSweers/metro) from 1.4.5 to 1.5.0.
- [Release notes](https://github.com/ZacSweers/metro/releases)
- [Changelog](https://github.com/ZacSweers/metro/blob/main/CHANGELOG.md)
- [Commits](ZacSweers/metro@1.4.5...1.5.0)

---
updated-dependencies:
- dependency-name: dev.zacsweers.metro
  dependency-version: 1.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file type: build Build system, Gradle, dependencies labels Oct 30, 2026
@github-actions github-actions Bot added the area: build-system Gradle, convention plugins, build-logic label Oct 30, 2026
1.5.1 fixes false hidden-dependency reports for KMP associated
compilations. Note in services/opencode that Metro 1.5 now fails the
desktop graph if this module's factories come from Dagger.
@github-actions github-actions Bot added the area: network gRPC, connectivity, API, exchange rates label Nov 2, 2026
@bmc08gt bmc08gt changed the title build(deps): bump dev.zacsweers.metro from 1.4.5 to 1.5.0 build(deps): bump dev.zacsweers.metro from 1.4.5 to 1.5.1 Nov 2, 2026
@bmc08gt
bmc08gt merged commit 7a22538 into code/cash Nov 3, 2026
6 checks passed
bmc08gt added a commit that referenced this pull request Nov 3, 2026
…ee-pane

* origin/code/cash: (44 commits)
  refactor(chat-list): move the chat list into a KMP module and wire it into the desktop graph (#1950)
  build(deps): bump dev.zacsweers.metro from 1.4.5 to 1.5.1 (#1901)
  feat(flipcash): add return-payment contract scaffolding (#1949)
  refactor(chat-ui): make shared/chat-ui a KMP module (#1934)
  build(deps): bump com.google.firebase:firebase-bom from 34.19.0 to 35.1.0 (#1900)
  build(deps): bump io.ktor:ktor-network from 3.4.1 to 3.6.0 (#1909)
  build(deps): bump rinku from 1.6.0 to 1.9.0 (#1907)
  build(deps): bump androidx.webkit:webkit from 1.17.0 to 1.18.0 (#1906)
  build(deps): bump agp from 9.4.1 to 9.5.0 (#1905)
  build(deps): bump androidx-datastore from 1.2.1 to 1.3.0 (#1904)
  build(deps): bump compose-multiplatform from 1.12.1 to 1.12.2 (#1903)
  build(deps): bump com.google.android.gms:play-services-base (#1902)
  build(deps): bump okhttp from 5.5.0 to 5.5.1 (#1899)
  refactor(messenger): split ChatViewModel's reducer into per-area files (#1933)
  refactor(amount-entry): make shared/amount-entry a KMP module (#1932)
  fix(build): stop KMP host tests building release variants and debug manifests changing per commit (#1948)
  refactor(theme): collapse Avenir into one family with a real Medium face (#1947)
  perf: run independent hot-path calls concurrently (#1945)
  docs(claude): test gestures with device input and keep mode state at screen level (#1943)
  build: bump Flipcash to 2026.11.2
  ...

# Conflicts:
#	CLAUDE.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: build-system Gradle, convention plugins, build-logic area: network gRPC, connectivity, API, exchange rates dependencies Pull requests that update a dependency file type: build Build system, Gradle, dependencies

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant