Class: Prism::Relocation::Repository
- Inherits:
-
Object
- Object
- Prism::Relocation::Repository
- Defined in:
- lib/prism/relocation.rb
Overview
A repository is a configured collection of fields and a set of entries that knows how to reparse a source and reify the values.
Defined Under Namespace
Classes: ConfigurationError
Instance Attribute Summary collapse
-
#entries ⇒ Object
readonly
The entries that have been saved on this repository.
-
#fields ⇒ Object
readonly
The fields that have been configured on this repository.
-
#source ⇒ Object
readonly
The source associated with this repository.
Instance Method Summary collapse
-
#character_columns ⇒ Object
Configure the character columns field for this repository and return self.
-
#character_offsets ⇒ Object
Configure the character offsets field for this repository and return self.
-
#code_unit_columns(encoding) ⇒ Object
Configure the code unit columns field for this repository for a specific encoding and return self.
-
#code_unit_offsets(encoding) ⇒ Object
Configure the code unit offsets field for this repository for a specific encoding and return self.
-
#code_units_cache(encoding) ⇒ Object
Create a code units cache for the given encoding from the source.
-
#columns ⇒ Object
Configure the columns field for this repository and return self.
-
#comments ⇒ Object
Configure both the leading and trailing comment fields for this repository and return self.
-
#enter(node_id, field_name) ⇒ Object
This method is called from nodes and locations when they want to enter themselves into the repository.
-
#filepath ⇒ Object
Configure the filepath field for this repository and return self.
-
#initialize(source) ⇒ Repository
constructor
Initialize a new repository with the given source.
-
#leading_comments ⇒ Object
Configure the leading comments field for this repository and return self.
-
#lines ⇒ Object
Configure the lines field for this repository and return self.
-
#offsets ⇒ Object
Configure the offsets field for this repository and return self.
-
#reify! ⇒ Object
This method is called from the entries in the repository when they need to reify their values.
-
#trailing_comments ⇒ Object
Configure the trailing comments field for this repository and return self.
Constructor Details
#initialize(source) ⇒ Repository
Initialize a new repository with the given source.
369 370 371 372 373 |
# File 'lib/prism/relocation.rb', line 369 def initialize(source) @source = source @fields = {} @entries = Hash.new { |hash, node_id| hash[node_id] = {} } end |
Instance Attribute Details
#entries ⇒ Object (readonly)
The entries that have been saved on this repository.
366 367 368 |
# File 'lib/prism/relocation.rb', line 366 def entries @entries end |
#fields ⇒ Object (readonly)
The fields that have been configured on this repository.
363 364 365 |
# File 'lib/prism/relocation.rb', line 363 def fields @fields end |
#source ⇒ Object (readonly)
The source associated with this repository. This will be either a SourceFilepath (the most common use case) or a SourceString.
360 361 362 |
# File 'lib/prism/relocation.rb', line 360 def source @source end |
Instance Method Details
#character_columns ⇒ Object
Configure the character columns field for this repository and return self.
415 416 417 |
# File 'lib/prism/relocation.rb', line 415 def character_columns field(:character_columns, CharacterColumnsField.new) end |
#character_offsets ⇒ Object
Configure the character offsets field for this repository and return self.
398 399 400 |
# File 'lib/prism/relocation.rb', line 398 def character_offsets field(:character_offsets, CharacterOffsetsField.new) end |
#code_unit_columns(encoding) ⇒ Object
Configure the code unit columns field for this repository for a specific encoding and return self.
421 422 423 |
# File 'lib/prism/relocation.rb', line 421 def code_unit_columns(encoding) field(:code_unit_columns, CodeUnitColumnsField.new(self, encoding)) end |
#code_unit_offsets(encoding) ⇒ Object
Configure the code unit offsets field for this repository for a specific encoding and return self.
404 405 406 |
# File 'lib/prism/relocation.rb', line 404 def code_unit_offsets(encoding) field(:code_unit_offsets, CodeUnitOffsetsField.new(self, encoding)) end |
#code_units_cache(encoding) ⇒ Object
Create a code units cache for the given encoding from the source.
376 377 378 |
# File 'lib/prism/relocation.rb', line 376 def code_units_cache(encoding) source.code_units_cache(encoding) end |
#columns ⇒ Object
Configure the columns field for this repository and return self.
409 410 411 |
# File 'lib/prism/relocation.rb', line 409 def columns field(:columns, ColumnsField.new) end |
#comments ⇒ Object
Configure both the leading and trailing comment fields for this repository and return self.
439 440 441 |
# File 'lib/prism/relocation.rb', line 439 def comments leading_comments.trailing_comments end |
#enter(node_id, field_name) ⇒ Object
This method is called from nodes and locations when they want to enter themselves into the repository. It it internal-only and meant to be called from the #save* APIs.
446 447 448 449 450 |
# File 'lib/prism/relocation.rb', line 446 def enter(node_id, field_name) # :nodoc: entry = Entry.new(self) @entries[node_id][field_name] = entry entry end |
#filepath ⇒ Object
Configure the filepath field for this repository and return self.
381 382 383 384 |
# File 'lib/prism/relocation.rb', line 381 def filepath raise ConfigurationError, "Can only specify filepath for a filepath source" unless source.is_a?(SourceFilepath) field(:filepath, FilepathField.new(source.value)) end |
#leading_comments ⇒ Object
Configure the leading comments field for this repository and return self.
427 428 429 |
# File 'lib/prism/relocation.rb', line 427 def leading_comments field(:leading_comments, LeadingCommentsField.new) end |
#lines ⇒ Object
Configure the lines field for this repository and return self.
387 388 389 |
# File 'lib/prism/relocation.rb', line 387 def lines field(:lines, LinesField.new) end |
#offsets ⇒ Object
Configure the offsets field for this repository and return self.
392 393 394 |
# File 'lib/prism/relocation.rb', line 392 def offsets field(:offsets, OffsetsField.new) end |
#reify! ⇒ Object
This method is called from the entries in the repository when they need to reify their values. It is internal-only and meant to be called from the various value APIs.
455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 |
# File 'lib/prism/relocation.rb', line 455 def reify! # :nodoc: result = source.result # Attach the comments if they have been requested as part of the # configuration of this repository. if fields.key?(:leading_comments) || fields.key?(:trailing_comments) result.attach_comments! end queue = [result.value] #: Array[Prism::node] while (node = queue.shift) @entries[node.node_id].each do |field_name, entry| value = node.public_send(field_name) values = {} #: Hash[Symbol, untyped] fields.each_value do |field| values.merge!(field.fields(value)) end entry.reify!(values) end queue.concat(node.compact_child_nodes) end @entries.clear end |
#trailing_comments ⇒ Object
Configure the trailing comments field for this repository and return self.
433 434 435 |
# File 'lib/prism/relocation.rb', line 433 def trailing_comments field(:trailing_comments, TrailingCommentsField.new) end |