tests/tinytest/test-constraints.R

source("helpers.R")

# one constraint ----------------------------------------------------

temp_rule <- tempfile(fileext = ".yml")
cat(
  "rule:
  pattern: print($VAR)
constraints:
  VAR:
    has:
      kind: identifier
",
  file = temp_rule
)

src <- "
print(1)
print(a)
print(x)
"

root <- src |>
  tree_new() |>
  tree_root()

expect_equal(
  root |>
    node_find(files = temp_rule) |>
    node_text(),
  list(rule_1 = "print(a)")
)

expect_equal(
  root |>
    node_find_all(files = temp_rule) |>
    node_text_all(),
  list(rule_1 = list(node_1 = "print(a)", node_2 = "print(x)"))
)

# several constraints ----------------------------------------------------

temp_rule <- tempfile(fileext = ".yml")
cat(
  "rule:
  pattern: $VAR + $FLOAT
constraints:
  VAR:
    kind: identifier
  FLOAT:
    kind: float
",
  file = temp_rule
)

src <- "
1 + 1
x+2
y+a
y + 1
"

root <- src |>
  tree_new() |>
  tree_root()

expect_equal(
  root |>
    node_find(files = temp_rule) |>
    node_text(),
  list(rule_1 = "x+2")
)

expect_equal(
  root |>
    node_find_all(files = temp_rule) |>
    node_text_all(),
  list(rule_1 = list(node_1 = "x+2", node_2 = "y + 1"))
)

# several rules and several constraints ------------------------------------------

temp_rule <- tempfile(fileext = ".yml")
cat(
  "rule:
  pattern: $VAR + $FLOAT
constraints:
  VAR:
    kind: identifier
  FLOAT:
    kind: float
",
  file = temp_rule
)

cat(
  "
---

rule:
  pattern: any(duplicated($VAR))
message: foo
",
  file = temp_rule,
  append = TRUE
)

src <- "
1 + 1
x+2
y+a
y + 1
any(duplicated(x))
"

root <- src |>
  tree_new() |>
  tree_root()

expect_equal(
  root |>
    node_find(files = temp_rule) |>
    node_text(),
  list(rule_1 = "x+2", rule_2 = "any(duplicated(x))")
)

expect_equal(
  root |>
    node_find_all(files = temp_rule) |>
    node_text_all(),
  list(
    rule_1 = list(node_1 = "x+2", node_2 = "y + 1"),
    rule_2 = list(node_1 = "any(duplicated(x))")
  )
)

Try the astgrepr package in your browser

Any scripts or data that you put into this service are public.

astgrepr documentation built on June 8, 2025, 11:05 a.m.