Class: SyntaxTree::When
Overview
When represents a when clause in a case chain.
case value
when predicate
end
Defined Under Namespace
Classes: Separator
Constant Summary collapse
- SEPARATOR =
We’re going to keep a single instance of this separator around so we don’t have to allocate a new one every time we format a when clause.
Separator.new.freeze
Instance Attribute Summary collapse
-
#arguments ⇒ Object
readonly
- Args
-
the arguments to the when clause.
-
#comments ⇒ Object
readonly
- Array[ Comment | EmbDoc ]
-
the comments attached to this node.
-
#consequent ⇒ Object
readonly
- nil | Else | When
-
the next clause in the chain.
-
#statements ⇒ Object
readonly
- Statements
-
the expressions to be executed.
Attributes inherited from Node
Instance Method Summary collapse
- #===(other) ⇒ Object
- #accept(visitor) ⇒ Object
- #child_nodes ⇒ Object (also: #deconstruct)
- #copy(arguments: nil, statements: nil, consequent: nil, location: nil) ⇒ Object
- #deconstruct_keys(_keys) ⇒ Object
- #format(q) ⇒ Object
-
#initialize(arguments:, statements:, consequent:, location:) ⇒ When
constructor
A new instance of When.
Methods inherited from Node
#construct_keys, #end_char, #pretty_print, #start_char, #to_json, #to_mermaid
Constructor Details
#initialize(arguments:, statements:, consequent:, location:) ⇒ When
Returns a new instance of When.
11784 11785 11786 11787 11788 11789 11790 |
# File 'lib/syntax_tree/node.rb', line 11784 def initialize(arguments:, statements:, consequent:, location:) @arguments = arguments @statements = statements @consequent = consequent @location = location @comments = [] end |
Instance Attribute Details
#arguments ⇒ Object (readonly)
- Args
-
the arguments to the when clause
11773 11774 11775 |
# File 'lib/syntax_tree/node.rb', line 11773 def arguments @arguments end |
#comments ⇒ Object (readonly)
- Array[ Comment | EmbDoc ]
-
the comments attached to this node
11782 11783 11784 |
# File 'lib/syntax_tree/node.rb', line 11782 def comments @comments end |
#consequent ⇒ Object (readonly)
- nil | Else | When
-
the next clause in the chain
11779 11780 11781 |
# File 'lib/syntax_tree/node.rb', line 11779 def consequent @consequent end |
#statements ⇒ Object (readonly)
- Statements
-
the expressions to be executed
11776 11777 11778 |
# File 'lib/syntax_tree/node.rb', line 11776 def statements @statements end |
Instance Method Details
#===(other) ⇒ Object
11876 11877 11878 11879 |
# File 'lib/syntax_tree/node.rb', line 11876 def ===(other) other.is_a?(When) && arguments === other.arguments && statements === other.statements && consequent === other.consequent end |
#accept(visitor) ⇒ Object
11792 11793 11794 |
# File 'lib/syntax_tree/node.rb', line 11792 def accept(visitor) visitor.visit_when(self) end |
#child_nodes ⇒ Object Also known as: deconstruct
11796 11797 11798 |
# File 'lib/syntax_tree/node.rb', line 11796 def child_nodes [arguments, statements, consequent] end |
#copy(arguments: nil, statements: nil, consequent: nil, location: nil) ⇒ Object
11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 |
# File 'lib/syntax_tree/node.rb', line 11800 def copy(arguments: nil, statements: nil, consequent: nil, location: nil) node = When.new( arguments: arguments || self.arguments, statements: statements || self.statements, consequent: consequent || self.consequent, location: location || self.location ) node.comments.concat(comments.map(&:copy)) node end |
#deconstruct_keys(_keys) ⇒ Object
11815 11816 11817 11818 11819 11820 11821 11822 11823 |
# File 'lib/syntax_tree/node.rb', line 11815 def deconstruct_keys(_keys) { arguments: arguments, statements: statements, consequent: consequent, location: location, comments: comments } end |
#format(q) ⇒ Object
11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 |
# File 'lib/syntax_tree/node.rb', line 11841 def format(q) keyword = "when " q.group do q.group do q.text(keyword) q.nest(keyword.length) do if arguments.comments.any? q.format(arguments) else q.seplist(arguments.parts, SEPARATOR) { |part| q.format(part) } end # Very special case here. If you're inside of a when clause and the # last argument to the predicate is and endless range, then you are # forced to use the "then" keyword to make it parse properly. last = arguments.parts.last q.text(" then") if last.is_a?(RangeNode) && !last.right end end unless statements.empty? q.indent do q.breakable_force q.format(statements) end end if consequent q.breakable_force q.format(consequent) end end end |