diff --git a/lib/coffee-script/nodes.js b/lib/coffee-script/nodes.js index f5eb7656..fb42441a 100644 --- a/lib/coffee-script/nodes.js +++ b/lib/coffee-script/nodes.js @@ -1311,7 +1311,7 @@ indent += TAB; } if (prop instanceof Assign && prop.variable instanceof Value && prop.variable.hasProperties()) { - prop.variable.error('Invalid object key'); + prop.variable.error('invalid object key'); } if (prop instanceof Value && prop["this"]) { prop = new Assign(prop.properties[0].name, prop, 'object'); diff --git a/lib/coffee-script/rewriter.js b/lib/coffee-script/rewriter.js index 0511e15b..43722a26 100644 --- a/lib/coffee-script/rewriter.js +++ b/lib/coffee-script/rewriter.js @@ -284,7 +284,7 @@ startImplicitCall(i + 1); return forward(2); } - if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT', null, ':') > -1 && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) { + if (indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.indexOfTag(i + 1, 'INDENT') > -1 && this.looksObjectish(i + 2) && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) { startImplicitCall(i + 1); stack.push(['INDENT', i + 2]); return forward(3); diff --git a/src/nodes.coffee b/src/nodes.coffee index 973f4309..a9bf83e3 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -952,7 +952,7 @@ exports.Obj = class Obj extends Base indent = if prop instanceof Comment then '' else idt indent += TAB if hasDynamic and i < dynamicIndex if prop instanceof Assign and prop.variable instanceof Value and prop.variable.hasProperties() - prop.variable.error 'Invalid object key' + prop.variable.error 'invalid object key' if prop instanceof Value and prop.this prop = new Assign prop.properties[0].name, prop, 'object' if prop not instanceof Comment diff --git a/src/rewriter.coffee b/src/rewriter.coffee index d3ce77b3..fddd5df7 100644 --- a/src/rewriter.coffee +++ b/src/rewriter.coffee @@ -254,7 +254,7 @@ class exports.Rewriter # Furthermore don't allow this in literal arrays, as # that creates grammatical ambiguities. if tag in IMPLICIT_FUNC and - @indexOfTag(i + 1, 'INDENT', null, ':') > -1 and + @indexOfTag(i + 1, 'INDENT') > -1 and @looksObjectish(i + 2) and not @findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL']) startImplicitCall i + 1 diff --git a/test/error_messages.coffee b/test/error_messages.coffee index d1d79679..7c64f790 100644 --- a/test/error_messages.coffee +++ b/test/error_messages.coffee @@ -751,3 +751,20 @@ test "unexpected object keys", -> {a: 1, [[]]: 2} ^ ''' + +test "invalid object keys", -> + assertErrorFormat ''' + @a: 1 + ''', ''' + [stdin]:1:1: error: invalid object key + @a: 1 + ^^ + ''' + assertErrorFormat ''' + f + @a: 1 + ''', ''' + [stdin]:2:3: error: invalid object key + @a: 1 + ^^ + ''' diff --git a/test/function_invocation.coffee b/test/function_invocation.coffee index 82464518..7baf0b09 100644 --- a/test/function_invocation.coffee +++ b/test/function_invocation.coffee @@ -695,3 +695,14 @@ test 'implicit invocation with implicit object literal', -> else "a": 1 eq 2, obj.a + + # #3935: Implicit call when the first key of an implicit object has interpolation. + a = 'a' + f + "#{a}": 1 + obj = + if f + "#{a}": 2 + else + "#{a}": 1 + eq 2, obj.a