Class: Decode::Index
- Inherits:
-
Object
- Object
- Decode::Index
- Defined in:
- lib/decode/index.rb
Overview
A list of definitions organised for quick lookup and lexical enumeration.
Instance Attribute Summary collapse
-
#definitions ⇒ Object
readonly
All definitions which have been parsed.
-
#sources ⇒ Object
readonly
All source files that have been parsed.
-
#trie ⇒ Object
readonly
A (prefix) trie of lexically scoped definitions.
Instance Method Summary collapse
-
#initialize ⇒ Index
constructor
Initialize an empty index.
-
#lookup(reference, relative_to: nil) ⇒ Object
Lookup the specified reference and return matching definitions.
-
#update(paths) ⇒ Object
Updates the index by parsing the specified files.
Constructor Details
#initialize ⇒ Index
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
#definitions ⇒ Object (readonly)
All definitions which have been parsed.
42 43 44 |
# File 'lib/decode/index.rb', line 42 def definitions @definitions end |
#sources ⇒ Object (readonly)
All source files that have been parsed.
38 39 40 |
# File 'lib/decode/index.rb', line 38 def sources @sources end |
#trie ⇒ Object (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.
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.
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 |