From a0648a3ec2dc18b290ee71b9a857fd5d049d09a8 Mon Sep 17 00:00:00 2001 From: Lukas Neubert Date: Tue, 6 Apr 2021 15:16:19 +0200 Subject: [PATCH] all: fixes related to Node.pos (#9613) --- vlib/v/ast/ast.v | 20 ++++++++++++++++---- vlib/v/fmt/tests/empty_lines_keep.vv | 22 ++++++++++++++++++++++ vlib/v/parser/comptime.v | 2 ++ vlib/v/parser/parser.v | 5 +++-- vlib/v/parser/struct.v | 2 +- vlib/v/scanner/scanner.v | 4 +++- 6 files changed, 47 insertions(+), 8 deletions(-) diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index 0e1657e54f..95623fa8be 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -1477,10 +1477,16 @@ pub fn (expr Expr) position() token.Position { } NodeError, ArrayDecompose, ArrayInit, AsCast, Assoc, AtExpr, BoolLiteral, CallExpr, CastExpr, ChanInit, CharLiteral, ConcatExpr, Comment, ComptimeCall, ComptimeSelector, EnumVal, DumpExpr, - FloatLiteral, GoExpr, Ident, IfExpr, IndexExpr, IntegerLiteral, Likely, LockExpr, MapInit, - MatchExpr, None, OffsetOf, OrExpr, ParExpr, PostfixExpr, PrefixExpr, RangeExpr, SelectExpr, - SelectorExpr, SizeOf, SqlExpr, StringInterLiteral, StringLiteral, StructInit, TypeNode, - TypeOf, UnsafeExpr { + FloatLiteral, GoExpr, Ident, IfExpr, IntegerLiteral, Likely, LockExpr, MapInit, MatchExpr, + None, OffsetOf, OrExpr, ParExpr, PostfixExpr, PrefixExpr, RangeExpr, SelectExpr, SelectorExpr, + SizeOf, SqlExpr, StringInterLiteral, StringLiteral, StructInit, TypeNode, TypeOf, UnsafeExpr + { + return expr.pos + } + IndexExpr { + if expr.or_expr.kind != .absent { + return expr.or_expr.pos + } return expr.pos } IfGuardExpr { @@ -1597,6 +1603,12 @@ pub fn (node Node) position() token.Position { pos = pos.extend(sym.pos) } } + if node is AssignStmt { + return pos.extend(node.right.last().position()) + } + if node is AssertStmt { + return pos.extend(node.expr.position()) + } return pos } Expr { diff --git a/vlib/v/fmt/tests/empty_lines_keep.vv b/vlib/v/fmt/tests/empty_lines_keep.vv index 48da308d0a..afcd1e55df 100644 --- a/vlib/v/fmt/tests/empty_lines_keep.vv +++ b/vlib/v/fmt/tests/empty_lines_keep.vv @@ -74,3 +74,25 @@ fn between_orm_blocks() { select from Upper where id == 1 } } + +fn no_empty_lines() { + _ := $embed_file('testy.v') + mut files := map[string][]FileData{} + code := 'foo +bar' + params[0] = { + ...params[0] + typ: params[0].typ.set_nr_muls(1) + } + env_value = environ()[env_lit] or { + return error('the environment variable "$env_lit" does not exist.') + } + assert '$mr_one_two()' == "(One{ + value: 'one' +}, Two{ + value: 'two' +})" + r := m[key] ? + compile_time_env := $env('ENV_VAR') + func() +} diff --git a/vlib/v/parser/comptime.v b/vlib/v/parser/comptime.v index de4ea64df9..b839d7864f 100644 --- a/vlib/v/parser/comptime.v +++ b/vlib/v/parser/comptime.v @@ -74,6 +74,7 @@ fn (mut p Parser) comp_call() ast.ComptimeCall { args_var: s is_env: true env_pos: spos + pos: spos.extend(p.prev_tok.position()) } } p.check(.lpar) @@ -121,6 +122,7 @@ fn (mut p Parser) comp_call() ast.ComptimeCall { rpath: literal_string_param apath: epath } + pos: start_pos.extend(p.prev_tok.position()) } } // Compile vweb html template to V code, parse that V code and embed the resulting V function diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index e365d80ae1..21ea88b100 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -1850,7 +1850,7 @@ pub fn (mut p Parser) name_expr() ast.Expr { } return ast.MapInit{ typ: map_type - pos: p.tok.position() + pos: p.prev_tok.position() } } // `chan typ{...}` @@ -2138,8 +2138,9 @@ fn (mut p Parser) index_expr(left ast.Expr) ast.IndexExpr { } // `a[i] ?` if p.tok.kind == .question { - p.next() + or_pos = p.tok.position() or_kind = .propagate + p.next() } } return ast.IndexExpr{ diff --git a/vlib/v/parser/struct.v b/vlib/v/parser/struct.v index 87e15664ec..1bcf0ad181 100644 --- a/vlib/v/parser/struct.v +++ b/vlib/v/parser/struct.v @@ -425,7 +425,7 @@ fn (mut p Parser) struct_init(short_syntax bool) ast.StructInit { update_expr_comments: update_expr_comments has_update_expr: has_update_expr name_pos: first_pos - pos: first_pos.extend(p.prev_tok.position()) + pos: first_pos.extend(if short_syntax { p.tok.position() } else { p.prev_tok.position() }) is_short: no_keys pre_comments: pre_comments } diff --git a/vlib/v/scanner/scanner.v b/vlib/v/scanner/scanner.v index 73e37c18f2..3812ffef3b 100644 --- a/vlib/v/scanner/scanner.v +++ b/vlib/v/scanner/scanner.v @@ -758,8 +758,10 @@ fn (mut s Scanner) text_scan() token.Token { return s.new_token(.question, '', 1) } scanner.single_quote, scanner.double_quote { + start_line := s.line_nr ident_string := s.ident_string() - return s.new_token(.string, ident_string, ident_string.len + 2) // + two quotes + return s.new_multiline_token(.string, ident_string, ident_string.len + 2, + start_line) // + two quotes } `\`` { // ` // apostrophe balance comment. do not remove