diff --git a/lib/ast.js b/lib/ast.js index b78a85b2..faae55fd 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -966,7 +966,7 @@ var AST_ObjectGetter = DEFNODE("ObjectGetter", "static", { var AST_Class = DEFNODE("Class", "name extends properties", { $propdoc: { - name: "[AST_SymbolClassName?] optional class name.", + name: "[AST_SymbolClass|AST_SymbolDefClass?] optional class name.", extends: "[AST_Node]? optional parent class", properties: "[AST_ObjectProperty*] array of properties" }, @@ -986,6 +986,14 @@ var AST_Class = DEFNODE("Class", "name extends properties", { }, }, AST_Scope); +var AST_DefClass = DEFNODE("DefClass", null, { + $documentation: "A class definition", +}, AST_Class); + +var AST_ClassExpression = DEFNODE("ClassExpression", null, { + $documentation: "A class expression." +}, AST_Class); + var AST_Symbol = DEFNODE("Symbol", "scope name thedef", { $propdoc: { name: "[string] name of this symbol", @@ -1030,7 +1038,11 @@ var AST_SymbolLambda = DEFNODE("SymbolLambda", null, { $documentation: "Symbol naming a function expression", }, AST_SymbolDeclaration); -var AST_SymbolClassName = DEFNODE("SymbolClassName", null, { +var AST_SymbolDefClass = DEFNODE("SymbolDefClass", null, { + $documentation: "Symbol naming a class's name in a class declaration. Lexically scoped to its containing scope, and accessible within the class." +}, AST_SymbolDeclaration); + +var AST_SymbolClass = DEFNODE("SymbolClass", null, { $documentation: "Symbol naming a class's name. Lexically scoped to the class." }, AST_SymbolDeclaration); diff --git a/lib/parse.js b/lib/parse.js index 5aee6017..9341ad39 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -856,7 +856,7 @@ function parse($TEXT, options) { return for_(); case "class": - return class_(); + return class_(AST_DefClass); case "function": return function_(AST_Defun); @@ -1379,7 +1379,7 @@ function parse($TEXT, options) { } if (is("keyword", "class")) { next(); - var cls = class_(); + var cls = class_(AST_ClassExpression); cls.start = start; cls.end = prev(); return subscripts(cls, allow_calls); @@ -1497,11 +1497,15 @@ function parse($TEXT, options) { return new AST_Object({ properties: a }) }); - function class_() { + function class_(KindOfClass) { var start, method, class_name, name, extends_, a = []; if (S.token.type == "name" && S.token.value != "extends") { - class_name = as_symbol(AST_SymbolClassName) + class_name = as_symbol(KindOfClass === AST_DefClass ? AST_SymbolDefClass : AST_SymbolClass); + } + + if (KindOfClass === AST_DefClass && !class_name) { + croak(); } if (S.token.value == "extends") { @@ -1523,7 +1527,7 @@ function parse($TEXT, options) { next(); - return new AST_Class({ + return new KindOfClass({ start: start, name: class_name, extends: extends_,