Sha256: a08061f4570bb42d1a5b5e2baa60f74b54c7366c9a6e23ae4124f696da12edc9

Contents?: true

Size: 1.92 KB

Versions: 8

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2020, by Samuel Williams.

module Decode
	module Language
		# An reference which can be resolved to zero or more definitions.
		class Reference
			# Initialize the reference.
			# @parameter identifier [String] The identifier part of the reference.
			def initialize(identifier, language, lexical_path = nil)
				@identifier = identifier
				@language = language
				
				@lexical_path = lexical_path
				@path = nil
			end
			
			def to_s
				"{#{self.language} #{self.identifier}}"
			end
			
			def inspect
				"\#<#{self.class} {#{self.identifier}}>"
			end
			
			# The identifier part of the reference.
			# @attribute [String]
			attr :identifier
			
			# The language associated with this reference.
			# @attribute [Language::Generic]
			attr :language
			
			# Whether the reference starts at the base of the lexical tree.
			def absolute?
				!self.relative?
			end
			
			def relative?
				prefix, name = self.lexical_path.first
				
				return prefix.nil?
			end
			
			def split(identifier)
				identifier.scan(/(\W+)?(\w+)/)
			end
			
			def lexical_path
				@lexical_path ||= self.split(@identifier)
			end
			
			def priority(definition, prefix)
				if prefix.nil?
					return 1
				elsif definition.start_with?(prefix)
					return 0
				else
					return 2
				end
			end
			
			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
			
			# The lexical path of the reference.
			# @returns [Array(String)]
			def path
				@path ||= self.lexical_path.map{|_, name| name.to_sym}
			end
		end
	end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
decode-0.21.3 lib/decode/language/reference.rb
decode-0.21.2 lib/decode/language/reference.rb
decode-0.21.1 lib/decode/language/reference.rb
decode-0.21.0 lib/decode/language/reference.rb
decode-0.20.2 lib/decode/language/reference.rb
decode-0.20.1 lib/decode/language/reference.rb
decode-0.20.0 lib/decode/language/reference.rb
decode-0.19.0 lib/decode/language/reference.rb