Class: Haml::RubyExpression
- Inherits:
-
Object
- Object
- Haml::RubyExpression
- Defined in:
- lib/haml/ruby_expression.rb
Constant Summary collapse
- CHAR_LITERAL_OPENING =
A character literal (
?a) is a StringNode for Prism, but it has no quotes to split on, so it must not be reported as a string literal. '?'
- PARSE_OPTIONS =
A template is compiled into a method body, so a jump like
yieldis valid here even though it would not be at the top level of a script. { partial_script: true }.freeze
Class Method Summary collapse
- .string_literal?(code) ⇒ Boolean
-
.string_literal_node(code) ⇒ Prism::Node?
- the node of a string literal StringSplitter can split, if any.
- .syntax_error?(code) ⇒ Boolean
Class Method Details
.string_literal?(code) ⇒ Boolean
18 19 20 |
# File 'lib/haml/ruby_expression.rb', line 18
def self.string_literal?(code)
!string_literal_node(code).nil?
end
|
.string_literal_node(code) ⇒ Prism::Node?
Returns - the node of a string literal StringSplitter can split, if any.
Its locations are byte offsets into code as given, so code must not be stripped here.
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/haml/ruby_expression.rb', line 24
def self.string_literal_node(code)
result = Prism.parse(code, **PARSE_OPTIONS)
return if result.failure?
statements = result.value.statements.body
return if statements.size > 1
case (node = statements.first)
when Prism::StringNode, Prism::InterpolatedStringNode
# Adjacent concatenation (`"a" "b"`) is one node without an opening
# delimiter of its own, and each of its parts keeps its own quotes.
node if !node.opening.nil? && node.opening != CHAR_LITERAL_OPENING
end
end
|
.syntax_error?(code) ⇒ Boolean
14 15 16 |
# File 'lib/haml/ruby_expression.rb', line 14
def self.syntax_error?(code)
Prism.parse_failure?(code, **PARSE_OPTIONS)
end
|