diff options
| author | Vexu <git@vexu.eu> | 2020-01-14 21:24:39 +0200 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-01-15 14:20:48 -0500 |
| commit | 0ea96c11ef5eca9cfd19233b6d51b00ba33da716 (patch) | |
| tree | db54183a1c733a3e69da728cb4bc1501297bdf93 /lib/std | |
| parent | 0a410519559788598fcf698013c1b6389d80c67c (diff) | |
| download | zig-0ea96c11ef5eca9cfd19233b6d51b00ba33da716.tar.gz zig-0ea96c11ef5eca9cfd19233b6d51b00ba33da716.zip | |
disallow multiline strings in test and library names
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/zig/parse.zig | 26 | ||||
| -rw-r--r-- | lib/std/zig/parser_test.zig | 10 |
2 files changed, 13 insertions, 23 deletions
diff --git a/lib/std/zig/parse.zig b/lib/std/zig/parse.zig index 604de516c4..1b6afc1c1a 100644 --- a/lib/std/zig/parse.zig +++ b/lib/std/zig/parse.zig @@ -183,10 +183,10 @@ fn parseContainerDocComments(arena: *Allocator, it: *TokenIterator, tree: *Tree) return &node.base; } -/// TestDecl <- KEYWORD_test STRINGLITERAL Block +/// TestDecl <- KEYWORD_test STRINGLITERALSINGLE Block fn parseTestDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { const test_token = eatToken(it, .Keyword_test) orelse return null; - const name_node = try expectNode(arena, it, tree, parseStringLiteral, AstError{ + const name_node = try expectNode(arena, it, tree, parseStringLiteralSingle, AstError{ .ExpectedStringLiteral = AstError.ExpectedStringLiteral{ .token = it.index }, }); const block_node = try expectNode(arena, it, tree, parseBlock, AstError{ @@ -225,15 +225,15 @@ fn parseTopLevelComptime(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?* } /// TopLevelDecl -/// <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block) -/// / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? KEYWORD_threadlocal? VarDecl +/// <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block) +/// / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl /// / KEYWORD_usingnamespace Expr SEMICOLON fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { var lib_name: ?*Node = null; const extern_export_inline_token = blk: { if (eatToken(it, .Keyword_export)) |token| break :blk token; if (eatToken(it, .Keyword_extern)) |token| { - lib_name = try parseStringLiteral(arena, it, tree); + lib_name = try parseStringLiteralSingle(arena, it, tree); break :blk token; } if (eatToken(it, .Keyword_inline)) |token| break :blk token; @@ -285,12 +285,7 @@ fn parseTopLevelDecl(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node if (extern_export_inline_token) |token| { if (lib_name) |string_literal_node| - if (string_literal_node.cast(Node.StringLiteral)) |single| { - putBackToken(it, single.token); - } else if (string_literal_node.cast(Node.MultilineStringLiteral)) |multi| { - while (multi.lines.pop()) |line| - putBackToken(it, line); - } else unreachable; + putBackToken(it, string_literal_node.cast(Node.StringLiteral).?.token); putBackToken(it, token); return null; } @@ -2776,8 +2771,7 @@ fn createLiteral(arena: *Allocator, comptime T: type, token: TokenIndex) !*Node return &result.base; } -// string literal or multiline string literal -fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { +fn parseStringLiteralSingle(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { if (eatToken(it, .StringLiteral)) |token| { const node = try arena.create(Node.StringLiteral); node.* = Node.StringLiteral{ @@ -2785,6 +2779,12 @@ fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Nod }; return &node.base; } + return null; +} + +// string literal or multiline string literal +fn parseStringLiteral(arena: *Allocator, it: *TokenIterator, tree: *Tree) !?*Node { + if (try parseStringLiteralSingle(arena, it, tree)) |node| return node; if (eatToken(it, .MultilineStringLiteralLine)) |first_line| { const node = try arena.create(Node.MultilineStringLiteral); diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 1ebef6a114..c57540ade9 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -2721,16 +2721,6 @@ test "zig fmt: extern without container keyword returns error" { ); } -test "zig fmt: extern multiline lib name" { - try testError( - \\extern \\super - \\ \\long - \\ \\library - \\ \\name - \\ - ); -} - const std = @import("std"); const mem = std.mem; const warn = std.debug.warn; |
