diff --git a/lib/hooks.js b/lib/hooks.js index 864e65e..fea255a 100644 --- a/lib/hooks.js +++ b/lib/hooks.js @@ -18,7 +18,7 @@ exports.AssignmentExpression = require('./hooks/AssignmentExpression'); exports.BinaryExpression = require('./hooks/BinaryExpression'); exports.CallExpression = exports.NewExpression = require('./hooks/CallExpression'); exports.CatchClause = require('./hooks/CatchClause'); -exports.ClassDeclaration = require('./hooks/ClassDeclaration'); +exports.ClassDeclaration = exports.ClassExpression = require('./hooks/ClassDeclarationAndExpression'); exports.ConditionalExpression = require('./hooks/ConditionalExpression'); exports.DoWhileStatement = require('./hooks/DoWhileStatement'); exports.ExportAllDeclaration = require('./hooks/ExportAllDeclaration'); diff --git a/lib/hooks/ClassDeclaration.js b/lib/hooks/ClassDeclarationAndExpression.js similarity index 75% rename from lib/hooks/ClassDeclaration.js rename to lib/hooks/ClassDeclarationAndExpression.js index 9889595..1794fdf 100644 --- a/lib/hooks/ClassDeclaration.js +++ b/lib/hooks/ClassDeclarationAndExpression.js @@ -1,10 +1,12 @@ 'use strict'; +// this file handles both ClassDeclaration and ClassExpression + var tk = require('rocambole-token'); var ws = require('rocambole-whitespace'); var limit = require('../limit'); -exports.format = function ClassDeclaration(node) { +exports.format = function ClassDeclarationAndExpression(node) { var classKeyword = node.startToken; var opening = tk.findNext(node.startToken, '{'); var closing = node.endToken; @@ -17,8 +19,8 @@ exports.format = function ClassDeclaration(node) { ws.limit(extendsKeyword, 1); } - limit.around(opening, 'ClassDeclarationOpeningBrace'); - limit.around(closing, 'ClassDeclarationClosingBrace'); + limit.around(opening, 'ClassOpeningBrace'); + limit.around(closing, 'ClassClosingBrace'); }; exports.getIndentEdges = function(node) { diff --git a/lib/preset/default.json b/lib/preset/default.json index 0996763..939788a 100644 --- a/lib/preset/default.json +++ b/lib/preset/default.json @@ -22,6 +22,7 @@ "ConditionalExpression": 1, "CommentInsideEmptyBlock": 1, "ClassDeclaration": 1, + "ClassExpression": 1, "DoWhileStatement": 1, "ForInStatement": 1, "ForOfStatement": 1, @@ -70,8 +71,9 @@ "CallExpressionOpeningParentheses" : 0, "CallExpressionClosingParentheses" : -1, "ClassDeclaration" : ">=1", - "ClassDeclarationOpeningBrace" : 0, - "ClassDeclarationClosingBrace" : ">=1", + "ClassExpression" : ">=1", + "ClassOpeningBrace" : 0, + "ClassClosingBrace" : ">=1", "ConditionalExpression" : ">=1", "CatchOpeningBrace" : 0, "CatchClosingBrace" : ">=1", @@ -162,8 +164,9 @@ "CallExpressionOpeningParentheses" : -1, "CallExpressionClosingParentheses" : -1, "ClassDeclaration" : ">=1", - "ClassDeclarationOpeningBrace" : ">=1", - "ClassDeclarationClosingBrace" : ">=1", + "ClassExpression" : ">=1", + "ClassOpeningBrace" : ">=1", + "ClassClosingBrace" : ">=1", "CatchOpeningBrace" : ">=1", "CatchClosingBrace" : ">=0", "CatchKeyword": 0, @@ -266,8 +269,8 @@ "CatchClosingBrace" : 1, "CatchKeyword" : 1, "CommaOperator" : 0, - "ClassDeclarationOpeningBrace" : 1, - "ClassDeclarationClosingBrace" : 1, + "ClassOpeningBrace" : 1, + "ClassClosingBrace" : 1, "ConditionalExpressionConsequent" : 1, "ConditionalExpressionAlternate" : 1, "DoWhileStatementOpeningBrace" : 1, @@ -365,8 +368,8 @@ "CatchOpeningBrace" : 1, "CatchClosingBrace" : 1, "CatchKeyword" : 1, - "ClassDeclarationOpeningBrace" : 1, - "ClassDeclarationClosingBrace" : 1, + "ClasOpeningBrace" : 1, + "ClassClosingBrace" : 1, "CommaOperator" : 1, "ConditionalExpressionConsequent" : 1, "ConditionalExpressionTest" : 1, diff --git a/test/compare/default/class_expression-in.js b/test/compare/default/class_expression-in.js new file mode 100644 index 0000000..b3bb849 --- /dev/null +++ b/test/compare/default/class_expression-in.js @@ -0,0 +1,47 @@ +var foo = class Foo extends Bar { + constructor (properties, name = 'lorem', ...extra) +{ + this.properties = properties; + this.name = name; + this.extra = extra; + } + static + log ( msg , level = 'log' ) { +console[level](msg); +} toObject () { return this.properties; } } +let bar = class Foo extends Bar { +// empty lines in between the MethodDefinition are valid/kept + +constructor(properties) { +this.properties = properties; +} + +get prop() { +return 'getter'; +} + +set prop(val) { +Foo.log('setting: ', val) +} + +static log(msg, level = 'log') { +console[level]('[Foo]', msg); +} + +toObject() { +return this.properties; +} + +} + +// Multi line declaration +let dolor = class +Foo +extends +Bar +{ +} +// The value to be extended can be produced by an arbitrary expression. +var amet = class Foo extends BarNamespace.Bar{} +let ipsum = class Foo extends BarNamespace['Bar'].Bar["Bar"]('bar').Bar("bar", "bar"){} +const ullamcor = class Foo extends(BarNamespace.bar)(){} diff --git a/test/compare/default/class_expression-out.js b/test/compare/default/class_expression-out.js new file mode 100644 index 0000000..0037ed0 --- /dev/null +++ b/test/compare/default/class_expression-out.js @@ -0,0 +1,48 @@ +var foo = class Foo extends Bar { + constructor(properties, name = 'lorem', ...extra) { + this.properties = properties; + this.name = name; + this.extra = extra; + } + static log(msg, level = 'log') { + console[level](msg); + } + toObject() { + return this.properties; + } +} +let bar = class Foo extends Bar { + // empty lines in between the MethodDefinition are valid/kept + + constructor(properties) { + this.properties = properties; + } + + get prop() { + return 'getter'; + } + + set prop(val) { + Foo.log('setting: ', val) + } + + static log(msg, level = 'log') { + console[level]('[Foo]', msg); + } + + toObject() { + return this.properties; + } + +} + +// Multi line declaration +let dolor = class Foo extends Bar { +} +// The value to be extended can be produced by an arbitrary expression. +var amet = class Foo extends BarNamespace.Bar { +} +let ipsum = class Foo extends BarNamespace['Bar'].Bar["Bar"]('bar').Bar("bar", "bar") { +} +const ullamcor = class Foo extends (BarNamespace.bar)() { +}