Property definitions

nitcc_runtime $ Position :: defaultinit
# A position into a input stream
# Used to give position to tokens
class Position
	serialize

	var pos_start: Int
	var pos_end: Int
	var line_start: Int
	var line_end: Int
	var col_start: Int
	var col_end: Int

	redef fun to_s do return "{line_start}:{col_start}-{line_end}:{col_end}"

	# Extract the content from the given source
	fun extract(source: String): String
	do
		return source.substring(pos_start, pos_end-pos_start+1)
	end

	# Get the lines covered by `self` and underline the target columns.
	#
	# This is useful for pretty printing errors or debug the output
	#
	# ~~~
	# var src = "var Foo = new Array[Int]"
	# var pos = new Position(0,0, 1, 1, 5, 8)
	#
	# assert pos.underline(src) == """
	# var Foo = new Array[Int]
	#     ^^^"""
	# ~~~
	fun underline(source: Text): String
	do
		var res = new FlatBuffer

		# All the concerned lines
		var lines = source.split("\n")
		for line in [line_start..line_end] do
			res.append lines[line-1]
			res.append "\n"
		end

		# Cover all columns, no matter their lines
		var col_start = col_start.min(col_end)
		var col_end = self.col_start.max(col_end)

		# "           ^^^^"
		var ptr = " "*(col_start-1).max(0) + "^"*(col_end-col_start)
		res.append ptr

		return res.to_s
	end
end
lib/nitcc_runtime/nitcc_runtime.nit:305,1--358,3