Separate class expressions from class declarations and their symbols like defuns
This commit is contained in:
16
lib/ast.js
16
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);
|
||||
|
||||
|
||||
14
lib/parse.js
14
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_,
|
||||
|
||||
Reference in New Issue
Block a user