Property definitions

nitc $ AbstractHighlightVisitor :: defaultinit
# 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