From 1ebc711c3075861af1dceb35544eb2e56294419e Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Tue, 22 Dec 2015 16:00:50 -0800 Subject: [PATCH] Allow call and unary expressions as map keys. --- src/vm/wren_compiler.c | 2 +- test/language/map/bad_key_precedence.wren | 3 +++ test/language/map/precedence.wren | 26 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test/language/map/bad_key_precedence.wren create mode 100644 test/language/map/precedence.wren diff --git a/src/vm/wren_compiler.c b/src/vm/wren_compiler.c index 0df716d7..14ff8781 100644 --- a/src/vm/wren_compiler.c +++ b/src/vm/wren_compiler.c @@ -1987,7 +1987,7 @@ static void map(Compiler* compiler, bool allowAssignment) if (peek(compiler) == TOKEN_RIGHT_BRACE) break; // The key. - parsePrecedence(compiler, false, PREC_PRIMARY); + parsePrecedence(compiler, false, PREC_UNARY); consume(compiler, TOKEN_COLON, "Expect ':' after map key."); ignoreNewlines(compiler); diff --git a/test/language/map/bad_key_precedence.wren b/test/language/map/bad_key_precedence.wren new file mode 100644 index 00000000..15411dc6 --- /dev/null +++ b/test/language/map/bad_key_precedence.wren @@ -0,0 +1,3 @@ +var map = { + 1 + 2: "bad key" // expect error +} diff --git a/test/language/map/precedence.wren b/test/language/map/precedence.wren new file mode 100644 index 00000000..7b8c3a8a --- /dev/null +++ b/test/language/map/precedence.wren @@ -0,0 +1,26 @@ +var name = "value" + +var map = { + // Primary. + name: name, + 1: true, + + // Call. + name.count: name.count, + name[0]: name[1], + + // Unary. + -1: -2, + ~3: !false, + + // Allow any expression for a value. + "key": true ? 1 : 2 +} + +System.print(map[name]) // expect: value +System.print(map[1]) // expect: true +System.print(map[name.count]) // expect: 5 +System.print(map[name[0]]) // expect: a +System.print(map[-1]) // expect: -2 +System.print(map[~3]) // expect: true +System.print(map["key"]) // expect: 1