Class: Decode::Index
- Inherits:
-
Object
- Object
- Decode::Index
- Defined in:
- lib/decode/index.rb
Instance Attribute Summary collapse
-
#paths ⇒ Object
readonly
Returns the value of attribute paths.
-
#sources ⇒ Object
readonly
Returns the value of attribute sources.
-
#symbols ⇒ Object
readonly
Returns the value of attribute symbols.
-
#trie ⇒ Object
readonly
Returns the value of attribute trie.
Instance Method Summary collapse
-
#initialize(paths) ⇒ Index
constructor
A new instance of Index.
- #lookup(reference, relative_to: nil) ⇒ Object
- #update! ⇒ Object
Constructor Details
#initialize(paths) ⇒ Index
Returns a new instance of Index.
26 27 28 29 30 31 32 33 |
# File 'lib/decode/index.rb', line 26 def initialize(paths) @paths = paths @sources = {} @symbols = {} # This is essentially a prefix tree: @trie = Trie.new end |
Instance Attribute Details
#paths ⇒ Object (readonly)
Returns the value of attribute paths.
35 36 37 |
# File 'lib/decode/index.rb', line 35 def paths @paths end |
#sources ⇒ Object (readonly)
Returns the value of attribute sources.
36 37 38 |
# File 'lib/decode/index.rb', line 36 def sources @sources end |
#symbols ⇒ Object (readonly)
Returns the value of attribute symbols.
37 38 39 |
# File 'lib/decode/index.rb', line 37 def symbols @symbols end |
#trie ⇒ Object (readonly)
Returns the value of attribute trie.
39 40 41 |
# File 'lib/decode/index.rb', line 39 def trie @trie end |
Instance Method Details
#lookup(reference, relative_to: nil) ⇒ Object
54 55 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/decode/index.rb', line 54 def lookup(reference, relative_to: nil) if reference.absolute? || relative_to.nil? lexical_path = [] else lexical_path = relative_to.lexical_path end path = reference.path while true node = @trie.match(lexical_path) if node.children[path.first] if target = node.lookup(path) if reference.kind return target.values.select{|symbol| symbol.kind == reference.kind} else return target.values end else return nil end end break if lexical_path.empty? lexical_path.pop end end |
#update! ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/decode/index.rb', line 41 def update! @paths.each do |path| source = Source.new(path) @sources[path.relative_path] = Source.new(path) source.parse do |definition| @symbols[definition.qualified_name] = definition @trie.insert(definition.lexical_path, definition) end end end |