# Visitor used to produce a HTML tree based on a AST on a `Source`
class AbstractHighlightVisitor
# The first line to generate, null if start at the first line
var first_line: nullable Int = null is writable
# The last line to generate, null if finish at the last line
var last_line: nullable Int = null is writable
# When highlighting a node, show its messages (errors, warnings), if any.
#
# default: true
var show_messages = true is writable
# When highlighting a node, also consider the loose tokens around it.
#
# Loose tokens are tokens discarded from the AST but attached before
# or after some non-loose tokens. See `Token::is_loose`.
#
# When this flag is set to `true`, the loose tokens that are before the
# first token and after the last token are also highlighted.
#
# Default: false.
var include_loose_tokens = false is writable
# When highlighting a node, the first and the last lines are fully included.
#
# If the highlighted node starts (or ends) in the middle of a line,
# this flags forces the whole line to be highlighted.
#
# Default: false
var include_whole_lines = false is writable
# Highlight a AST element.
fun highlight_node(n: ANode)
do
n.parentize_tokens
var f
var l
if n isa Token then
f = n
l = n
else
assert n isa Prod
f = n.first_token
if f == null then return
l = n.last_token
if l == null then return
end
if include_loose_tokens then
if f.prev_looses.not_empty then f = f.prev_looses.first
if l.next_looses.not_empty then l = l.next_looses.last
end
var line = first_line
if line != null then
while f.location.line_start < line do
f = f.next_token
if f == null then return
end
end
line = last_line
if line != null then
while l.location.line_end > line do
l = l.prev_token
if l == null then return
end
end
if include_whole_lines then
f = f.first_real_token_in_line
l = l.last_real_token_in_line
end
do_highlight(f, l)
end
# Highlight a full lexed source file.
#
# REQUIRE `source.first_token != null`
fun highlight_source(source: SourceFile)
do
do_highlight(source.first_token.as(not null), null)
end
# Low-level highlighting between 2 tokens
protected fun do_highlight(first_token: Token, last_token: nullable Token) is abstract
end
src/highlight.nit:22,1--112,3