Class: Prism::Relocation::Repository

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#entriesObject (readonly)

The entries that have been saved on this repository.



366
367
368
# File 'lib/prism/relocation.rb', line 366

def entries
  @entries
end

#fieldsObject (readonly)

The fields that have been configured on this repository.



363
364
365
# File 'lib/prism/relocation.rb', line 363

def fields
  @fields
end

#sourceObject (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_columnsObject

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_offsetsObject

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

#columnsObject

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

#commentsObject

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

#filepathObject

Configure the filepath field for this repository and return self.

Raises:



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_commentsObject

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

#linesObject

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

#offsetsObject

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_commentsObject

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