Skip to content

feat: IPv6 canonicalization to RFC 5952 behind the experimental flag#499

Open
SJrX wants to merge 2 commits into
242.xfrom
ipv6-canonicalization-v2
Open

feat: IPv6 canonicalization to RFC 5952 behind the experimental flag#499
SJrX wants to merge 2 commits into
242.xfrom
ipv6-canonicalization-v2

Conversation

@SJrX

@SJrX SJrX commented Jun 29, 2026

Copy link
Copy Markdown
Owner

What

A weak-warning inspection + quick-fix that rewrites a non-canonical IPv6 address to its RFC 5952 form (e.g. 2001:DB8:0:0:0:0:0:12001:db8::1), anywhere an IPv6 address appears in a grammar-validated value.

  • Ipv6.kt — pure-Kotlin RFC 5952 canonicalization.
  • Ipv6CanonicalFormInspection — walks the value-coloring layer's labeledRegions to find the IPv6-address span and flags it if not canonical (WEAK_WARNING, flag-gated).
  • CanonicalizeIpv6QuickFix — rewrites it.

Why a new PR

This is the same work as #498, which got merged into the grammar-value-coloring branch instead of 242.x — value coloring landed first via #497's squash, so the IPv6 commits never actually reached 242.x. This re-cuts them cleanly against current 242.x (which already has the value-coloring layer + the Role.IDENTIFIER removal it depends on).

Verification

./gradlew test and ./gradlew test -Dsystemd.unit.grammarParseEngine=true both pass.

🤖 Generated with Claude Code

Steve Ramage and others added 2 commits June 29, 2026 05:26
Offers a quick-fix to rewrite a non-canonical IPv6 address to its recommended form.
Behind the experimental flag.

- canonicalizeIpv6 (pure, dependency-free): parses to 8 groups and reformats per RFC
  5952 §4 — lowercase hex, drop leading zeros, compress the longest zero run to "::"
  (leftmost on ties, only for runs of 2+, never a single zero group). Returns null for
  non-IPv6 input and, for now, for embedded-IPv4 (§5 mixed notation) addresses.
- Combinator.labeledRegions(value): the grammar's explicit Labeled spans (e.g. a whole
  IP address) from the first fully-valid parse — lets features act on semantic spans.
- Ipv6CanonicalFormInspection: flag-gated; for grammar-backed options it scans labeled
  spans and registers a WEAK_WARNING + CanonicalizeIpv6QuickFix on any IPv6 that isn't
  already canonical. Reuses the IPV4_ADDR/IPV6_ADDR Labeled(LITERAL) spans we added for
  coloring, so no IPv6-specific engine markers were needed.

Tests: canonicalizer cases incl. zero-run/tie/single-zero/idempotence/non-IPv6; e2e
warning + quick-fix rewriting 2001:DB8::1 -> 2001:db8::1, and nothing when canonical or
the flag is off.

Closes #363. Refs #467

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
labeledRegions() was inserted between colorize()'s doc comment and its body;
reorder so each function sits under its own KDoc.
@github-actions

Copy link
Copy Markdown

Unit Test Results (grammar engine false)

1 176 tests   1 176 ✅  49s ⏱️
  308 suites      0 💤
  308 files        0 ❌

Results for commit 77da3cf.

@github-actions

Copy link
Copy Markdown

Unit Test Results (grammar engine true)

1 176 tests   1 176 ✅  51s ⏱️
  308 suites      0 💤
  308 files        0 ❌

Results for commit 77da3cf.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant