Class: Decode::Index

Inherits:
Object
  • Object
show all
Defined in:
lib/decode/index.rb

Overview

A list of definitions organised for quick lookup and lexical enumeration.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeIndex

Initialize an empty index.



28
29
30
31
32
33
34
# File 'lib/decode/index.rb', line 28

def initialize
  @sources = {}
  @definitions = {}
  
  # This is essentially a prefix tree:
  @trie = Trie.new
end

Instance Attribute Details

#definitionsObject (readonly)

All definitions which have been parsed.



42
43
44
# File 'lib/decode/index.rb', line 42

def definitions
  @definitions
end

#sourcesObject (readonly)

All source files that have been parsed.



38
39
40
# File 'lib/decode/index.rb', line 38

def sources
  @sources
end

#trieObject (readonly)

A (prefix) trie of lexically scoped definitions.



47
48
49
# File 'lib/decode/index.rb', line 47

def trie
  @trie
end

Instance Method Details

#lookup(reference, relative_to: nil) ⇒ Object

Lookup the specified reference and return matching definitions.

Parameters:

  • reference (Reference)

    The reference to match.

  • relative_to (Definition) (defaults to: nil)

    Lookup the reference relative to the scope of this definition.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/decode/index.rb', line 72

def lookup(reference, relative_to: nil)
  if reference.absolute? || relative_to.nil?
    lexical_path = []
  else
    lexical_path = relative_to.path.dup
  end
  
  path = reference.path
  
  while true
    node = @trie.lookup(lexical_path)
    
    if node.children[path.first]
      if target = node.lookup(path)
        return reference.best(target.values)
      else
        return nil
      end
    end
    
    break if lexical_path.empty?
    lexical_path.pop
  end
end

#update(paths) ⇒ Object

Updates the index by parsing the specified files. All extracted definitions are merged into the existing index.

Parameters:

  • paths (Array(String))

    The source file paths.



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/decode/index.rb', line 53

def update(paths)
  paths.each do |path|
    if source = Source.for?(path)
      @sources[path] = source
      
      source.definitions do |symbol|
        # $stderr.puts "Adding #{symbol.qualified_name} to #{symbol.lexical_path.join(' -> ')}"
        
        @definitions[symbol.qualified_name] = symbol
        @trie.insert(symbol.path, symbol)
      end
    end
  end
end