Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Commit a8615dea authored by Ary Borenszweig's avatar Ary Borenszweig
Browse files

Added special location pragma to lexer: #<loc:"filename",line,column> to...

Added special location pragma to lexer: #<loc:"filename",line,column> to override's a lexer's filename/line/column in the middle of tokenization (useful for ecr and other templates)
parent 60880fbf
No related merge requests found
......@@ -36,4 +36,36 @@ describe "Lexer: location" do
assert_token_column_number lexer, :NEWLINE, 16
assert_token_column_number lexer, :NUMBER, 1
end
it "overrides location with pragma" do
lexer = Lexer.new %(1 + #<loc:"foo",12,34>2)
lexer.filename = "bar"
token = lexer.next_token
token.type.should eq(:NUMBER)
token.line_number.should eq(1)
token.column_number.should eq(1)
token.filename.should eq("bar")
token = lexer.next_token
token.type.should eq(:SPACE)
token.line_number.should eq(1)
token.column_number.should eq(2)
token = lexer.next_token
token.type.should eq(:"+")
token.line_number.should eq(1)
token.column_number.should eq(3)
token = lexer.next_token
token.type.should eq(:SPACE)
token.line_number.should eq(1)
token.column_number.should eq(4)
token = lexer.next_token
token.type.should eq(:NUMBER)
token.line_number.should eq(12)
token.column_number.should eq(34)
token.filename.should eq("foo")
end
end
......@@ -37,8 +37,20 @@ module Crystal
# Skip comments
if current_char == '#'
char = next_char_no_column_increment
while char != '\n' && char != '0'
char = next_char_no_column_increment
# Check #<loc:"file",line,column> pragma comment
if char == '<' &&
(char = next_char_no_column_increment) == 'l' &&
(char = next_char_no_column_increment) == 'o' &&
(char = next_char_no_column_increment) == 'c' &&
(char = next_char_no_column_increment) == ':' &&
(char = next_char_no_column_increment) == '"'
next_char_no_column_increment
consume_loc_pragma
else
while char != '\n' && char != '0'
char = next_char_no_column_increment
end
end
end
......@@ -1557,6 +1569,63 @@ module Crystal
@token
end
def consume_loc_pragma
filename_pos = current_pos
while true
case current_char
when '"'
break
when '0'
raise "unexpected end of file in loc pragma"
else
next_char_no_column_increment
end
end
filename = string_range(filename_pos)
# skip '"'
next_char
unless current_char == ','
raise "expected ',' in loc pragma after filename"
end
next_char
line_number = 0
while true
case current_char
when '0' .. '9'
line_number = 10 * line_number + (current_char - '0').to_i
when ','
next_char
break
else
raise "expected digit or ',' in loc pragma for line number"
end
next_char
end
column_number = 0
while true
case current_char
when '0' .. '9'
column_number = 10 * column_number + (current_char - '0').to_i
when '>'
next_char
break
else
raise "expected digit or '>' in loc pragma for column_number number"
end
next_char
end
@token.filename = @filename = filename
@token.line_number = @line_number = line_number
@token.column_number = @column_number = column_number
end
def next_char_no_column_increment
@reader.next_char
end
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment