Class: PrettyPrint::IndentLevel

Inherits:
Object
  • Object
show all
Defined in:
lib/syntax_tree/prettyprint.rb

Overview

This object represents the current level of indentation within the printer. It has the ability to generate new levels of indentation through the #align and #indent methods.

Defined Under Namespace

Classes: NumberAlignPart, StringAlignPart

Constant Summary collapse

IndentPart =
Object.new
DedentPart =
Object.new

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(genspace:, value: genspace.call(0), length: 0, queue: [], root: nil) ⇒ IndentLevel



505
506
507
508
509
510
511
512
513
514
515
516
517
# File 'lib/syntax_tree/prettyprint.rb', line 505

def initialize(
  genspace:,
  value: genspace.call(0),
  length: 0,
  queue: [],
  root: nil
)
  @genspace = genspace
  @value = value
  @length = length
  @queue = queue
  @root = root
end

Instance Attribute Details

#genspaceObject (readonly)

Returns the value of attribute genspace.



503
504
505
# File 'lib/syntax_tree/prettyprint.rb', line 503

def genspace
  @genspace
end

#lengthObject (readonly)

Returns the value of attribute length.



503
504
505
# File 'lib/syntax_tree/prettyprint.rb', line 503

def length
  @length
end

#queueObject (readonly)

Returns the value of attribute queue.



503
504
505
# File 'lib/syntax_tree/prettyprint.rb', line 503

def queue
  @queue
end

#rootObject (readonly)

Returns the value of attribute root.



503
504
505
# File 'lib/syntax_tree/prettyprint.rb', line 503

def root
  @root
end

#valueObject (readonly)

Returns the value of attribute value.



503
504
505
# File 'lib/syntax_tree/prettyprint.rb', line 503

def value
  @value
end

Instance Method Details

#align(n) ⇒ Object

This can accept a whole lot of different kinds of objects, due to the nature of the flexibility of the Align node.



521
522
523
524
525
526
527
528
529
530
# File 'lib/syntax_tree/prettyprint.rb', line 521

def align(n)
  case n
  when NilClass
    self
  when String
    indent(StringAlignPart.new(n))
  else
    indent(n < 0 ? DedentPart : NumberAlignPart.new(n))
  end
end

#indent(part = IndentPart) ⇒ Object



532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
# File 'lib/syntax_tree/prettyprint.rb', line 532

def indent(part = IndentPart)
  next_value = genspace.call(0)
  next_length = 0
  next_queue = (part == DedentPart ? queue[0...-1] : [*queue, part])

  last_spaces = 0

  add_spaces = ->(count) do
    next_value << genspace.call(count)
    next_length += count
  end

  flush_spaces = -> do
    add_spaces[last_spaces] if last_spaces > 0
    last_spaces = 0
  end

  next_queue.each do |part|
    case part
    when IndentPart
      flush_spaces.call
      add_spaces.call(2)
    when StringAlignPart
      flush_spaces.call
      next_value += part.n
      next_length += part.n.length
    when NumberAlignPart
      last_spaces += part.n
    end
  end

  flush_spaces.call

  IndentLevel.new(
    genspace: genspace,
    value: next_value,
    length: next_length,
    queue: next_queue,
    root: root
  )
end