From 4b9605bb987cac70030b79e09f300ef0d686f665 Mon Sep 17 00:00:00 2001 From: Julian Rosse Date: Mon, 26 Jun 2017 14:18:08 -0500 Subject: [PATCH 1/2] support multiple accesses after super [Fixes #4591] --- lib/coffeescript/grammar.js | 4 +++- lib/coffeescript/parser.js | 4 ++-- src/grammar.coffee | 2 +- test/classes.coffee | 16 ++++++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/coffeescript/grammar.js b/lib/coffeescript/grammar.js index ec4b82fc34..fe2fd958c7 100644 --- a/lib/coffeescript/grammar.js +++ b/lib/coffeescript/grammar.js @@ -237,7 +237,9 @@ return new Value($1); }), o('Range', function() { return new Value($1); - }), o('This'), o('Super') + }), o('This'), o('Super', function() { + return new Value($1); + }) ], Super: [ o('SUPER . Property', function() { diff --git a/lib/coffeescript/parser.js b/lib/coffeescript/parser.js index 10980ceeec..67d49cd671 100755 --- a/lib/coffeescript/parser.js +++ b/lib/coffeescript/parser.js @@ -98,7 +98,7 @@ break; case 5: this.$ = $$[$0-1]; break; -case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 38: case 43: case 45: case 59: case 60: case 61: case 62: case 63: case 64: case 76: case 77: case 87: case 88: case 89: case 90: case 95: case 96: case 99: case 103: case 104: case 112: case 193: case 194: case 196: case 226: case 227: case 245: case 251: +case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 38: case 43: case 45: case 59: case 60: case 61: case 62: case 63: case 64: case 76: case 77: case 87: case 88: case 89: case 90: case 95: case 96: case 99: case 103: case 112: case 193: case 194: case 196: case 226: case 227: case 245: case 251: this.$ = $$[$0]; break; case 13: @@ -170,7 +170,7 @@ break; case 53: this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1])); break; -case 54: case 92: case 97: case 98: case 100: case 101: case 102: case 228: case 229: +case 54: case 92: case 97: case 98: case 100: case 101: case 102: case 104: case 228: case 229: this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0])); break; case 55: diff --git a/src/grammar.coffee b/src/grammar.coffee index c9f615a428..3b0a8cdbdf 100644 --- a/src/grammar.coffee +++ b/src/grammar.coffee @@ -309,7 +309,7 @@ grammar = o 'Parenthetical', -> new Value $1 o 'Range', -> new Value $1 o 'This' - o 'Super' + o 'Super', -> new Value $1 ] # A `super`-based expression that can be used as a value. diff --git a/test/classes.coffee b/test/classes.coffee index 192b9d0886..3e2e06334d 100644 --- a/test/classes.coffee +++ b/test/classes.coffee @@ -1808,3 +1808,19 @@ test 'Bound method of immediately instantiated class with expression base class {derivedBound} = a eq derivedBound(), 3 + +test "#4591: super.x.y, super['x'].y", -> + class A + x: + y: 1 + + class B extends A + constructor: -> + super() + + @w = super.x.y + @v = super['x'].y + + b = new B + eq 1, b.w + eq 1, b.v From 5451f89b6103f8f45c5281adc31971ecb045444e Mon Sep 17 00:00:00 2001 From: Julian Rosse Date: Sun, 2 Jul 2017 12:07:36 -0500 Subject: [PATCH 2/2] addtl tests from code review --- test/classes.coffee | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/classes.coffee b/test/classes.coffee index 3e2e06334d..c4366f215a 100644 --- a/test/classes.coffee +++ b/test/classes.coffee @@ -1813,6 +1813,7 @@ test "#4591: super.x.y, super['x'].y", -> class A x: y: 1 + z: -> 2 class B extends A constructor: -> @@ -1820,7 +1821,15 @@ test "#4591: super.x.y, super['x'].y", -> @w = super.x.y @v = super['x'].y + @u = super.x['y'] + @t = super.x.z() + @s = super['x'].z() + @r = super.x['z']() b = new B eq 1, b.w eq 1, b.v + eq 1, b.u + eq 2, b.t + eq 2, b.s + eq 2, b.r