Class: Solargraph::SourceMap::Clip

Inherits:
Object
  • Object
show all
Defined in:
lib/solargraph/source_map/clip.rb

Overview

A static analysis tool for obtaining definitions, completions, signatures, and type inferences from a cursor.

Instance Method Summary collapse

Constructor Details

#initialize(api_map, cursor) ⇒ Clip

Returns a new instance of Clip.

Parameters:



11
12
13
14
# File 'lib/solargraph/source_map/clip.rb', line 11

def initialize api_map, cursor
  @api_map = api_map
  @cursor = cursor
end

Instance Method Details

#completeCompletion

Returns:



31
32
33
34
35
36
37
38
39
40
# File 'lib/solargraph/source_map/clip.rb', line 31

def complete
  return package_completions([]) if !source_map.source.parsed? || cursor.string?
  return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
  return Completion.new([], cursor.range) if cursor.chain.literal?
  if cursor.comment?
    tag_complete
  else
    code_complete
  end
end

#defineArray<Pin::Base>

Returns:



17
18
19
20
21
22
23
# File 'lib/solargraph/source_map/clip.rb', line 17

def define
  return [] if cursor.comment? || cursor.chain.literal?
  result = cursor.chain.define(api_map, block, locals)
  result.concat file_global_methods
  result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
  result
end

#gatesObject



70
71
72
# File 'lib/solargraph/source_map/clip.rb', line 70

def gates
  block.gates
end

#in_block?Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
80
# File 'lib/solargraph/source_map/clip.rb', line 74

def in_block?
  return @in_block unless @in_block.nil?
  @in_block = begin
    tree = cursor.source.tree_at(cursor.position.line, cursor.position.column)
    Parser.is_ast_node?(tree[1]) && [:block, :ITER].include?(tree[1].type)
  end
end

#inferComplexType

Returns:



50
51
52
53
54
55
56
57
58
59
# File 'lib/solargraph/source_map/clip.rb', line 50

def infer
  result = cursor.chain.infer(api_map, block, locals)
  if result.tag == 'Class'
    # HACK: Exception to return Object from Class#new
    dfn = cursor.chain.define(api_map, block, locals).first
    return ComplexType.try_parse('Object') if dfn && dfn.path == 'Class#new'
  end
  return result unless result.tag == 'self'
  ComplexType.try_parse(cursor.chain.base.infer(api_map, block, locals).namespace)
end

#localsArray<Solargraph::Pin::Base>

Get an array of all the locals that are visible from the cursors’s position. Locals can be local variables, method parameters, or block parameters. The array starts with the nearest local pin.

Returns:



66
67
68
# File 'lib/solargraph/source_map/clip.rb', line 66

def locals
  @locals ||= source_map.locals_at(location)
end

#signifyArray<Pin::Base>

Returns:



43
44
45
46
47
# File 'lib/solargraph/source_map/clip.rb', line 43

def signify
  return [] unless cursor.argument?
  chain = Parser.chain(cursor.recipient_node, cursor.filename)
  chain.define(api_map, context_pin, locals).select { |pin| pin.is_a?(Pin::Method) }
end

#translate(phrase) ⇒ Array<Solargraph::Pin::Base>

Parameters:

  • phrase (String)

Returns:



84
85
86
87
# File 'lib/solargraph/source_map/clip.rb', line 84

def translate phrase
  chain = Parser.chain(Parser.parse(phrase))
  chain.define(api_map, block, locals)
end

#typesArray<Pin::Base>

Returns:



26
27
28
# File 'lib/solargraph/source_map/clip.rb', line 26

def types
  infer.namespaces.map { |namespace| api_map.get_path_pins(namespace) }.flatten
end