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.
-
#languages ⇒ Object
All supported languages for this index.
-
#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(languages = Languages.all) ⇒ 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
Instance Attribute Details
#definitions ⇒ Object (readonly)
All definitions which have been parsed.
50 51 52 |
# File 'lib/decode/index.rb', line 50 def definitions @definitions end |
#languages ⇒ Object
All supported languages for this index.
42 43 44 |
# File 'lib/decode/index.rb', line 42 def languages @languages end |
#sources ⇒ Object (readonly)
All source files that have been parsed.
46 47 48 |
# File 'lib/decode/index.rb', line 46 def sources @sources end |
#trie ⇒ Object (readonly)
A (prefix) trie of lexically scoped definitions.
55 56 57 |
# File 'lib/decode/index.rb', line 55 def trie @trie end |
Instance Method Details
#lookup(reference, relative_to: nil) ⇒ Object
Lookup the specified reference and return matching definitions.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/decode/index.rb', line 80 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.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/decode/index.rb', line 61 def update(paths) paths.each do |path| if source = @languages.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 |