class Decode::Language::Reference

An reference which can be resolved to zero or more definitions.

Attributes

identifier[R]

The identifier part of the reference. @attribute [String]

language[R]

The language associated with this reference. @attribute [Language::Generic]

Public Class Methods

new(identifier, language, lexical_path = nil) click to toggle source

Initialize the reference. @parameter identifier [String] The identifier part of the reference.

# File lib/decode/language/reference.rb, line 27
def initialize(identifier, language, lexical_path = nil)
        @identifier = identifier
        @language = language
        
        @lexical_path = lexical_path
        @path = nil
end

Public Instance Methods

absolute?() click to toggle source

Whether the reference starts at the base of the lexical tree.

# File lib/decode/language/reference.rb, line 52
def absolute?
        !self.relative?
end
best(definitions) click to toggle source
# File lib/decode/language/reference.rb, line 80
def best(definitions)
        prefix, name = lexical_path.last
        
        first = nil
        without_prefix = nil
        
        definitions.each do |definition|
                first ||= definition
                
                next unless definition.language == @language
                
                if prefix.nil?
                        without_prefix ||= definition
                elsif definition.start_with?(prefix)
                        return definition
                end
        end
        
        return without_prefix || first
end
inspect() click to toggle source
# File lib/decode/language/reference.rb, line 39
def inspect
        "\#<#{self.class} {#{self.identifier}}>"
end
lexical_path() click to toggle source
# File lib/decode/language/reference.rb, line 66
def lexical_path
        @lexical_path ||= self.split(@identifier)
end
path() click to toggle source

The lexical path of the reference. @returns [Array(String)]

# File lib/decode/language/reference.rb, line 103
def path
        @path ||= self.lexical_path.map{|_, name| name.to_sym}
end
priority(definition, prefix) click to toggle source
# File lib/decode/language/reference.rb, line 70
def priority(definition, prefix)
        if prefix.nil?
                return 1
        elsif definition.start_with?(prefix)
                return 0
        else
                return 2
        end
end
relative?() click to toggle source
# File lib/decode/language/reference.rb, line 56
def relative?
        prefix, name = self.lexical_path.first
        
        return prefix.nil?
end
split(identifier) click to toggle source
# File lib/decode/language/reference.rb, line 62
def split(identifier)
        identifier.scan(/(\W+)?(\w+)/)
end
to_s() click to toggle source
# File lib/decode/language/reference.rb, line 35
def to_s
        "{#{self.language} #{self.identifier}}"
end