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", {
|
var AST_Class = DEFNODE("Class", "name extends properties", {
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[AST_SymbolClassName?] optional class name.",
|
name: "[AST_SymbolClass|AST_SymbolDefClass?] optional class name.",
|
||||||
extends: "[AST_Node]? optional parent class",
|
extends: "[AST_Node]? optional parent class",
|
||||||
properties: "[AST_ObjectProperty*] array of properties"
|
properties: "[AST_ObjectProperty*] array of properties"
|
||||||
},
|
},
|
||||||
@@ -986,6 +986,14 @@ var AST_Class = DEFNODE("Class", "name extends properties", {
|
|||||||
},
|
},
|
||||||
}, AST_Scope);
|
}, 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", {
|
var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
|
||||||
$propdoc: {
|
$propdoc: {
|
||||||
name: "[string] name of this symbol",
|
name: "[string] name of this symbol",
|
||||||
@@ -1030,7 +1038,11 @@ var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
|
|||||||
$documentation: "Symbol naming a function expression",
|
$documentation: "Symbol naming a function expression",
|
||||||
}, AST_SymbolDeclaration);
|
}, 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."
|
$documentation: "Symbol naming a class's name. Lexically scoped to the class."
|
||||||
}, AST_SymbolDeclaration);
|
}, AST_SymbolDeclaration);
|
||||||
|
|
||||||
|
|||||||
14
lib/parse.js
14
lib/parse.js
@@ -856,7 +856,7 @@ function parse($TEXT, options) {
|
|||||||
return for_();
|
return for_();
|
||||||
|
|
||||||
case "class":
|
case "class":
|
||||||
return class_();
|
return class_(AST_DefClass);
|
||||||
|
|
||||||
case "function":
|
case "function":
|
||||||
return function_(AST_Defun);
|
return function_(AST_Defun);
|
||||||
@@ -1379,7 +1379,7 @@ function parse($TEXT, options) {
|
|||||||
}
|
}
|
||||||
if (is("keyword", "class")) {
|
if (is("keyword", "class")) {
|
||||||
next();
|
next();
|
||||||
var cls = class_();
|
var cls = class_(AST_ClassExpression);
|
||||||
cls.start = start;
|
cls.start = start;
|
||||||
cls.end = prev();
|
cls.end = prev();
|
||||||
return subscripts(cls, allow_calls);
|
return subscripts(cls, allow_calls);
|
||||||
@@ -1497,11 +1497,15 @@ function parse($TEXT, options) {
|
|||||||
return new AST_Object({ properties: a })
|
return new AST_Object({ properties: a })
|
||||||
});
|
});
|
||||||
|
|
||||||
function class_() {
|
function class_(KindOfClass) {
|
||||||
var start, method, class_name, name, extends_, a = [];
|
var start, method, class_name, name, extends_, a = [];
|
||||||
|
|
||||||
if (S.token.type == "name" && S.token.value != "extends") {
|
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") {
|
if (S.token.value == "extends") {
|
||||||
@@ -1523,7 +1527,7 @@ function parse($TEXT, options) {
|
|||||||
|
|
||||||
next();
|
next();
|
||||||
|
|
||||||
return new AST_Class({
|
return new KindOfClass({
|
||||||
start: start,
|
start: start,
|
||||||
name: class_name,
|
name: class_name,
|
||||||
extends: extends_,
|
extends: extends_,
|
||||||
|
|||||||
Reference in New Issue
Block a user