XPath compiler support for local-name()

This commit is contained in:
Yorick Peterse 2015-08-18 13:55:52 +02:00
parent 49a7c2c782
commit 25e2f57a8d
1 changed files with 39 additions and 0 deletions

View File

@ -846,6 +846,20 @@ module Oga
block_given? ? ast : ast.followed_by(matched)
end
# @param [Oga::Ruby::Node] input
# @param [AST::Node] arg
# @return [Oga::Ruby::Node]
def on_call_local_name(input, arg = nil)
first_node_or_argument(input, arg) do |arg_var|
arg_var
.if_true do
ensure_element_or_attribute(arg_var)
.followed_by { block_given? ? yield : arg_var.name }
end
.else { string('') }
end
end
##
# Delegates type tests to specific handlers.
#
@ -918,6 +932,13 @@ module Oga
Ruby::Node.new(:send, [nil, name.to_s, *args])
end
# @param [Class] klass
# @param [String] message
# @return [Oga::Ruby::Node]
def raise_message(klass, message)
send_message(:raise, literal(klass), string(message))
end
# @return [Oga::Ruby::Node]
def nil
@nil ||= literal(:nil)
@ -987,6 +1008,24 @@ module Oga
end
end
# @param [Oga::Ruby::Node] input
# @return [Oga::Ruby::Node]
def ensure_element_or_attribute(input)
element_or_attribute(input).not.if_true do
raise_message(TypeError, 'argument is not an Element or Attribute')
end
end
# @param [Oga::Ruby::Node] input
# @param [AST::Ruby] arg
# @return [Oga::Ruby::Node]
def first_node_or_argument(input, arg = nil)
arg_ast = arg ? try_match_first_node(arg, input) : input
arg_var = unique_literal(:first_node_or_argument)
arg_var.assign(arg_ast).followed_by { yield arg_var }
end
##
# Generates the code for an operator.
#