Module: Ibex::Runtime::CST::Editing

Defined in:
lib/json5/generated_parser.rb

Overview

Shared path-copying operations for Red syntax elements.

Class Method Summary collapse

Class Method Details

.green_element(value) ⇒ Object

RBS:

  • (green | element value) -> green

Raises:

  • (TypeError)


1779
1780
1781
1782
1783
1784
# File 'lib/json5/generated_parser.rb', line 1779

def green_element(value)
  return value.green if value.is_a?(SyntaxNode) || value.is_a?(SyntaxToken)
  return value if value.is_a?(GreenNode) || value.is_a?(GreenToken)

  raise TypeError, "replacement must be a Green syntax element or Red syntax view"
end

.red_root(previous, green) ⇒ Object

RBS:

  • (SyntaxNode previous, GreenNode green) -> SyntaxNode



1769
1770
1771
1772
1773
1774
1775
# File 'lib/json5/generated_parser.rb', line 1769

def red_root(previous, green)
  source = SourceText.new(green.to_source, file: previous.source_text.file)
  SyntaxNode.new(
    green: green, kinds: previous.kinds, trivia_policy: previous.trivia_policy,
    source_text: source
  )
end

.replace(target, replacement) ⇒ Object

RBS:

  • (element target, green | element replacement) -> SyntaxNode

Raises:

  • (TypeError)


1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
# File 'lib/json5/generated_parser.rb', line 1748

def replace(target, replacement)
  green = green_element(replacement)
  current = target
  parent = target.parent
  while parent
    children = parent.green.children.dup
    children[current.index] = green
    green = GreenNode.new(
      kind: parent.green.kind, children: children,
      flags: parent.green.intrinsic_flags, annotations: parent.green.annotations
    )
    current = parent
    parent = parent.parent
  end
  raise TypeError, "the root replacement must be a GreenNode" unless green.is_a?(GreenNode)

  red_root(target.root, green)
end