Module: Solargraph::Parser::ParserGem::ClassMethods

Included in:
Solargraph::Parser
Defined in:
lib/solargraph/parser/parser_gem/class_methods.rb

Instance Method Summary collapse

Instance Method Details

#chain(*args) ⇒ Source::Chain

Returns:



96
97
98
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 96

def chain *args
  NodeChainer.chain *args
end

#chain_string(*args) ⇒ Source::Chain

Returns:



101
102
103
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 101

def chain_string *args
  NodeChainer.load_string *args
end

#infer_literal_node_type(node) ⇒ String?

Parameters:

  • node (Parser::AST::Node)

Returns:

  • (String, nil)


112
113
114
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 112

def infer_literal_node_type node
  NodeMethods.infer_literal_node_type node
end

#inner_node_references(name, top) ⇒ Array<AST::Node>

Parameters:

Returns:



86
87
88
89
90
91
92
93
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 86

def inner_node_references name, top
  result = []
  if top.is_a?(AST::Node) && top.to_s.include?(":#{name}")
    result.push top if top.children.any? { |c| c.to_s == name }
    top.children.each { |c| result.concat inner_node_references(name, c) }
  end
  result
end

#is_ast_node?(node) ⇒ Boolean

Parameters:

  • node (BasicObject)

Returns:

  • (Boolean)


123
124
125
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 123

def is_ast_node? node
  node.is_a?(::Parser::AST::Node)
end

#map(source) ⇒ Array(Array<Pin::Base>, Array<Pin::Base>)

Parameters:

Returns:



49
50
51
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 49

def map source
  NodeProcessor.process(source.node, Region.new(source: source))
end

#node_range(node) ⇒ Range

Parameters:

  • node (Parser::AST::Node)

Returns:



129
130
131
132
133
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 129

def node_range node
  st = Position.new(node.loc.line, node.loc.column)
  en = Position.new(node.loc.last_line, node.loc.last_column)
  Range.new(st, en)
end

#parse(code, filename = nil, line = 0) ⇒ Parser::AST::Node

Parameters:

  • code (String)
  • filename (String, nil) (defaults to: nil)
  • line (Integer) (defaults to: 0)

Returns:

  • (Parser::AST::Node)


31
32
33
34
35
36
37
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 31

def parse code, filename = nil, line = 0
  buffer = ::Parser::Source::Buffer.new(filename, line)
  buffer.source = code
  parser.parse(buffer)
rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
  raise Parser::SyntaxError, e.message
end

#parse_with_comments(code, filename = nil) ⇒ Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})

Parameters:

  • code (String)
  • filename (String, nil) (defaults to: nil)

Returns:



21
22
23
24
25
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 21

def parse_with_comments code, filename = nil
  node = parse(code, filename)
  comments = CommentRipper.new(code, filename, 0).parse
  [node, comments]
end

#parser::Parser::Base

Returns:



40
41
42
43
44
45
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 40

def parser
  @parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
    parser.diagnostics.all_errors_are_fatal = true
    parser.diagnostics.ignore_warnings      = true
  end
end

#process_node(*args) ⇒ Array(Array<Pin::Base>, Array<Pin::Base>)

Returns:



106
107
108
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 106

def process_node *args
  Solargraph::Parser::NodeProcessor.process *args
end

#references(source, name) ⇒ Array<Location>

Parameters:

  • source (Source)
  • name (String)

Returns:



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 56

def references source, name
  if name.end_with?("=")
    reg = /#{Regexp.escape name[0..-2]}\s*=/
    # @param code [String]
    # @param offset [Integer]
    # @return [Array(Integer, Integer), Array(nil, nil)]
    extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
  else
    # @param code [String]
    # @param offset [Integer]
    # @return [Array(Integer, Integer), Array(nil, nil)]
    extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
  end
  inner_node_references(name, source.node).map do |n|
    rng = Range.from_node(n)
    offset = Position.to_offset(source.code, rng.start)
    soff, eoff = extract_offset[source.code, offset]
    Location.new(
      source.filename,
      Range.new(
        Position.from_offset(source.code, soff),
        Position.from_offset(source.code, eoff)
      )
    )
  end
end

#string_ranges(node) ⇒ Array<Range>

Parameters:

  • node (Parser::AST::Node)

Returns:



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 137

def string_ranges node
  return [] unless is_ast_node?(node)
  result = []
  if node.type == :str
    result.push Range.from_node(node)
  end
  node.children.each do |child|
    result.concat string_ranges(child)
  end
  if node.type == :dstr && node.children.last.nil?
    last = node.children[-2]
    unless last.nil?
      rng = Range.from_node(last)
      pos = Position.new(rng.ending.line, rng.ending.column - 1)
      result.push Range.new(pos, pos)
    end
  end
  result
end

#versionInteger

Returns:

  • (Integer)


117
118
119
# File 'lib/solargraph/parser/parser_gem/class_methods.rb', line 117

def version
  parser.version
end