Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions project.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/Node.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -538,7 +538,7 @@ object Node:
_idxInParent = -1

if safe && (oldParent ne null)
then oldParent.nn.assertErrorRefCounts()
then oldParent.assertErrorRefCounts()

this

Expand Down
2 changes: 1 addition & 1 deletion src/Token.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions src/manip/SegmentedStack.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 =>
Expand All @@ -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])
Expand Down
50 changes: 50 additions & 0 deletions src/manip/SeqPattern.test.scala
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,56 @@ 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
Expand Down
6 changes: 6 additions & 0 deletions src/manip/SeqPatternOps.scala
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,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))

Expand Down
Loading