feat: IPv6 canonicalization to RFC 5952 behind the experimental flag#499
Open
SJrX wants to merge 2 commits into
Open
feat: IPv6 canonicalization to RFC 5952 behind the experimental flag#499SJrX wants to merge 2 commits into
SJrX wants to merge 2 commits into
Conversation
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.
Unit Test Results (grammar engine false)1 176 tests 1 176 ✅ 49s ⏱️ Results for commit 77da3cf. |
Unit Test Results (grammar engine true)1 176 tests 1 176 ✅ 51s ⏱️ Results for commit 77da3cf. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:1→2001: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'slabeledRegionsto 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-coloringbranch 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 + theRole.IDENTIFIERremoval it depends on).Verification
./gradlew testand./gradlew test -Dsystemd.unit.grammarParseEngine=trueboth pass.🤖 Generated with Claude Code