From c7251172b89fd57c53cdf297605dab88e9193f98 Mon Sep 17 00:00:00 2001 From: KuterBora Date: Fri, 1 Aug 2025 14:13:27 -0700 Subject: [PATCH 1/2] rightSibling and leftSibling --- src/manip/SeqPattern.test.scala | 51 +++++++++++++++++++++++++++++++++ src/manip/SeqPatternOps.scala | 6 ++++ 2 files changed, 57 insertions(+) diff --git a/src/manip/SeqPattern.test.scala b/src/manip/SeqPattern.test.scala index 10aee95..acc3c69 100644 --- a/src/manip/SeqPattern.test.scala +++ b/src/manip/SeqPattern.test.scala @@ -85,6 +85,57 @@ class SeqPatternTests extends munit.FunSuite: .onChildren("fields skip: last missing")(tok1(), tok2())("no") .onChildren("fields skip: empty")()("no") + on( + field( + tok(tok1).withChildren: + field(tok(tok2)) + ~ eof, + ) + ~ eof + | SeqPattern.pure("no"), + ) + .onChildren("fields withChildren: exact")(tok1(tok2()))(tok2()) + .onChildren("fields withChildren: missing parent")(tok2(tok2()))("no") + .onChildren("fields withChildren: missing child")(tok1(tok1()))("no") + .onChildren("fields parent: empty")()("no") + + on( + field( + anyNode.withChildren: + parent(tok(tok1)) *> field(tok(tok2)) + ~ eof, + ) + ~ eof + | SeqPattern.pure("no"), + ) + .onChildren("fields parent: exact")(tok1(tok2()))(tok2()) + .onChildren("fields parent: missing parent")(tok2(tok2()))("no") + .onChildren("fields parent: missing child")(tok1(tok1()))("no") + .onChildren("fields parent: empty")()("no") + + + on( + skip(anyNode) + ~ field(leftSibling(tok(tok1)) *> tok(tok2)) + ~ eof + | SeqPattern.pure("no"), + ) + .onChildren("fields leftSibling: exact")(tok1(), tok2())(tok2()) + .onChildren("fields leftSibling: different left")(tok2(), tok2())("no") + .onChildren("fields leftSibling: different right")(tok1(), tok1())("no") + .onChildren("fields leftSibling: empty")()("no") + + on( + field(rightSibling(tok(tok2)) *> tok(tok1)) + ~ skip(anyNode) + ~ eof + | SeqPattern.pure("no"), + ) + .onChildren("fields rightSibling: exact")(tok1(), tok2())(tok1()) + .onChildren("fields rightSibling: different left")(tok2(), tok2())("no") + .onChildren("fields rightSibling: different right")(tok1(), tok1())("no") + .onChildren("fields rightSibling: empty")()("no") + object PatternTests: object tok1 extends Token object tok2 extends Token diff --git a/src/manip/SeqPatternOps.scala b/src/manip/SeqPatternOps.scala index d001e9b..67eb58d 100644 --- a/src/manip/SeqPatternOps.scala +++ b/src/manip/SeqPatternOps.scala @@ -177,6 +177,12 @@ trait SeqPatternOps: def parent[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = refine(atParent(on(pattern).value)) + + def leftSibling[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = + refine(atLeftSibling(on(pattern).value)) + + def rightSibling[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = + refine(atRightSibling(on(pattern).value)) def ancestor[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = refine(atAncestor(on(pattern).value)) From 01b8ea9af0f005cfc1a6808139c3c70923a5acbc Mon Sep 17 00:00:00 2001 From: Finn Hackett Date: Mon, 1 Sep 2025 23:22:02 +0000 Subject: [PATCH 2/2] formatting and upkeep --- project.scala | 12 ++++++------ src/Node.scala | 6 +++--- src/Token.scala | 2 +- src/manip/SegmentedStack.scala | 4 ++-- src/manip/SeqPattern.test.scala | 3 +-- src/manip/SeqPatternOps.scala | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/project.scala b/project.scala index c0bf71b..0a77987 100644 --- a/project.scala +++ b/project.scala @@ -4,14 +4,14 @@ //> using javaProperty distcompiler.Node.assertErrorRefCorrectness=no //> using dependency com.github.scopt::scopt:4.1.0 -//> using dependency com.lihaoyi::os-lib:0.11.4 -//> using dependency com.lihaoyi::pprint:0.9.0 -//> using dependency com.lihaoyi::sourcecode:0.4.2 -//> using dependency com.lihaoyi::ujson::4.2.1 -//> using dependency dev.zio::izumi-reflect:3.0.3 +//> using dependency com.lihaoyi::os-lib:0.11.5 +//> using dependency com.lihaoyi::pprint:0.9.3 +//> using dependency com.lihaoyi::sourcecode:0.4.4 +//> using dependency com.lihaoyi::ujson::4.3.0 +//> using dependency dev.zio::izumi-reflect:3.0.6 //> using dependency edu.berkeley.cs.jqf:jqf-fuzz:2.1 //> using dependency edu.berkeley.cs.jqf:jqf-instrument:2.1 -//> using dependency io.github.java-diff-utils:java-diff-utils:4.15 +//> using dependency io.github.java-diff-utils:java-diff-utils:4.16 //> using dependency org.typelevel::cats-core:2.13.0 // Test diff --git a/src/Node.scala b/src/Node.scala index 953b660..d36c112 100644 --- a/src/Node.scala +++ b/src/Node.scala @@ -520,9 +520,9 @@ object Node: else throw NodeError("node already has a parent") if oldParent ne null - then oldParent.nn.assertErrorRefCounts() + then oldParent.assertErrorRefCounts() if parent ne null - then parent.nn.assertErrorRefCounts() + then parent.assertErrorRefCounts() this @@ -538,7 +538,7 @@ object Node: _idxInParent = -1 if safe && (oldParent ne null) - then oldParent.nn.assertErrorRefCounts() + then oldParent.assertErrorRefCounts() this diff --git a/src/Token.scala b/src/Token.scala index 1d9f724..d5f2cfe 100644 --- a/src/Token.scala +++ b/src/Token.scala @@ -116,7 +116,7 @@ object Token: * is null, go around again. */ sym = ref.get() end while - sym.nn + sym end TokenSym /** Helper trait that overrides [[forja.Token#showSource]] to return true. diff --git a/src/manip/SegmentedStack.scala b/src/manip/SegmentedStack.scala index a7b2f81..37d8d2f 100644 --- a/src/manip/SegmentedStack.scala +++ b/src/manip/SegmentedStack.scala @@ -25,7 +25,7 @@ final class SegmentedStack[T <: AnyRef](using NotGiven[Array[?] <:< T]): def consumeInReverse(fn: T => Unit): Unit = var idx = 0 while base ne stack do - base(idx).nn match + base(idx) match case next: Array[AnyRef] if idx == 0 => idx += 1 // back ref, skip case next: Array[AnyRef] if idx == base.length - 1 => @@ -37,7 +37,7 @@ final class SegmentedStack[T <: AnyRef](using NotGiven[Array[?] <:< T]): end while while idx < stackSize do - base(idx).nn match + base(idx) match case _: Array[AnyRef] if idx == 0 => // skip case elem => fn(elem.asInstanceOf[T]) diff --git a/src/manip/SeqPattern.test.scala b/src/manip/SeqPattern.test.scala index acc3c69..78e0bd5 100644 --- a/src/manip/SeqPattern.test.scala +++ b/src/manip/SeqPattern.test.scala @@ -98,7 +98,7 @@ class SeqPatternTests extends munit.FunSuite: .onChildren("fields withChildren: missing parent")(tok2(tok2()))("no") .onChildren("fields withChildren: missing child")(tok1(tok1()))("no") .onChildren("fields parent: empty")()("no") - + on( field( anyNode.withChildren: @@ -113,7 +113,6 @@ class SeqPatternTests extends munit.FunSuite: .onChildren("fields parent: missing child")(tok1(tok1()))("no") .onChildren("fields parent: empty")()("no") - on( skip(anyNode) ~ field(leftSibling(tok(tok1)) *> tok(tok2)) diff --git a/src/manip/SeqPatternOps.scala b/src/manip/SeqPatternOps.scala index 67eb58d..1e73c63 100644 --- a/src/manip/SeqPatternOps.scala +++ b/src/manip/SeqPatternOps.scala @@ -177,10 +177,10 @@ trait SeqPatternOps: def parent[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = refine(atParent(on(pattern).value)) - + def leftSibling[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = refine(atLeftSibling(on(pattern).value)) - + def rightSibling[T](using DebugInfo)(pattern: SeqPattern[T]): SeqPattern[T] = refine(atRightSibling(on(pattern).value))