feat: IPv6 canonicalization to RFC 5952 (#363)#485
Open
SJrX wants to merge 1 commit into
Open
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>
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
Closes #363. Offers a quick-fix to rewrite a non-canonical IPv6 address to its RFC 5952 recommended form — e.g.
IPAddressAllow=2001:DB8::1→2001:db8::1,FE80:0:0:0:0:0:0:1→fe80::1. Behind the experimental flag.Pieces
canonicalizeIpv6(addr)(pure, dependency-free): parse to 8 groups, reformat per RFC 5952 §4 — lowercase hex, drop leading zeros, compress the longest zero run to::(leftmost on ties, only runs of 2+, never a single zero group). Returnsnullfor non-IPv6 input, and (for now) for embedded-IPv4§5mixed notation (::ffff:1.2.3.4), which it leaves alone.Combinator.labeledRegions(value): the grammar's explicitLabeledspans (a whole IP address) from the first fully-valid parse. This is where the coloring work pays off — IP addresses are alreadyLabeled(LITERAL)spans, so I can locate them without any IPv6-specific engine markers.Ipv6CanonicalFormInspection(flag-gated): scans labeled spans of grammar-backed options;canonicalizeIpv6doubles as the filter (null ⇒ not a pure IPv6). Registers aWEAK_WARNING+CanonicalizeIpv6QuickFixfor any non-canonical address.Tests
Ipv6Test: canonicalization incl. zero-run/tie/single-zero/all-zeros/idempotence, andnullfor IPv4/embedded-IPv4/integer/garbage.Ipv6CanonicalFormInspectionTest: e2e weak-warning, the quick-fix rewriting2001:DB8::1→2001:db8::1, and nothing when already canonical or the flag is off.Known limitation
Embedded-IPv4 (
::ffff:1.2.3.4, RFC 5952 §5 mixed notation) is intentionally left alone for now — the§5rules interact with::compression and deserve their own pass. Pure IPv6 is fully handled.Closes #363. Refs #467
🤖 Generated with Claude Code