diff --git a/lib/output.js b/lib/output.js index 54611184..479aaacd 100644 --- a/lib/output.js +++ b/lib/output.js @@ -644,7 +644,6 @@ function OutputStream(options) { * ==> 20 (side effect, set a := 10 and b := 20) */ || p instanceof AST_Arrow // x => (x, x) || p instanceof AST_DefaultAssign // x => (x = (0, function(){})) - || (p instanceof AST_Class && p.extends === this) // class D extends (calls++, C) {} ; }); @@ -1474,8 +1473,12 @@ function OutputStream(options) { output.space(); } if (self.extends) { - var parens = self.extends instanceof AST_Binary || - self.extends instanceof AST_Conditional; + var parens = ( + !(self.extends instanceof AST_SymbolRef) + && !(self.extends instanceof AST_PropAccess) + && !(self.extends instanceof AST_ClassExpression) + && !(self.extends instanceof AST_Function) + ); output.print("extends"); if (parens) { output.print("("); diff --git a/test/compress/harmony.js b/test/compress/harmony.js index 15df5349..f92668ab 100644 --- a/test/compress/harmony.js +++ b/test/compress/harmony.js @@ -534,14 +534,52 @@ issue_1753_disable: { } } -class_extends_expression: { +class_extends: { options = { - evaluate: true + evaluate: true, } input: { - class bin extends (a || b) {} - class seq extends (a, b) {} - class ter extends (a ? b : c) {} + function f() { + class foo extends bar {} + class pro extends some.prop {} + class arr extends stuff[1 - 1] {} + class bin extends (a || b) {} + class seq extends (a, b) {} + class ter extends (a ? b : c) {} + class uni extends (!0) {} + } } - expect_exact: "class bin extends(a||b){}class seq extends(a,b){}class ter extends(a?b:c){}" + expect_exact: "function f(){class foo extends bar{}class pro extends some.prop{}class arr extends stuff[0]{}class bin extends(a||b){}class seq extends(a,b){}class ter extends(a?b:c){}class uni extends(!0){}}" +} + +class_extends_class: { + options = { + } + input: { + class anon extends class {} {} + class named extends class base {} {} + } + expect_exact: "class anon extends class{}{}class named extends class base{}{}" +} + +class_extends_function: { + options = { + } + input: { + class anon extends function(){} {} + class named extends function base(){} {} + } + expect_exact: "class anon extends function(){}{}class named extends function base(){}{}" +} + +class_extends_regex: { + options = { + } + input: { + function f() { + class rx1 extends (/rx/) {} + // class rx2 extends /rx/ {} // FIXME - parse error + } + } + expect_exact: "function f(){class rx1 extends(/rx/){}}" }