DecodeSourceDecodeLanguages

class Languages

Represents a context for looking up languages based on file extension or name.

Definitions

def self.all

Create a new languages context with all supported languages.

Signature

returns Languages

A languages context with Ruby support enabled.

Implementation

def self.all
	self.new.tap do |languages|
		languages.add(Language::Ruby.new)
	end
end

def initialize

Initialize a new languages context.

Implementation

def initialize
	@named = {}
	@extensions = {}
end

def freeze

Freeze the languages context to prevent further modifications.

Implementation

def freeze
	return unless frozen?
	
	@named.freeze
	@extensions.freeze
	
	super
end

def add(language)

Add a language to this context.

Signature

parameter language Language::Generic

The language to add.

Implementation

def add(language)
	# Register by name:
	language.names.each do |name|
		@named[name] = language
	end
	
	# Register by file extension:
	language.extensions.each do |extension|
		@extensions[extension] = language
	end
end

def fetch(name)

Fetch a language by name, creating a generic language if needed.

Signature

parameter name String

The name of the language to fetch.

returns Language::Generic

The language instance for the given name.

Implementation

def fetch(name)
	@named.fetch(name) do
		unless @named.frozen?
			@named[name] = Language::Generic.new(name)
		end
	end
end

def source_for(path)

Create a source object for the given file path.

Signature

parameter path String

The file system path to create a source for.

returns Source | Nil

A source object if the file extension is supported, nil otherwise.

Implementation

def source_for(path)
	extension = File.extname(path)
	
	if language = @extensions[extension]
		Source.new(path, language)
	end
end

def parse_reference(text, default_language: nil)

Parse a language agnostic reference.

Signature

parameter text String

The text to parse (e.g., "ruby MyModule::MyClass").

parameter default_language Language::Generic

The default language to use if none specified.

returns Language::Reference | Nil

The parsed reference, or nil if parsing fails.

Implementation

def parse_reference(text, default_language: nil)
	if match = REFERENCE.match(text)
		language = self.fetch(match[:name]) || default_language
		
		return language.reference_for(match[:identifier])
	elsif default_language
		return default_language.reference_for(text)
	end
end

def reference_for(name, identifier)

Create a reference for the given language and identifier.

Signature

parameter name String

The name of the language.

parameter identifier String

The identifier to create a reference for.

returns Language::Reference

The created reference.

Implementation

def reference_for(name, identifier)
	self.fetch(name).reference_for(identifier)
end