Separate class expressions from class declarations and their symbols like defuns

This commit is contained in:
Fábio Santos
2015-11-21 09:17:32 +00:00
parent bb6b3a773a
commit 69da8e53e0
2 changed files with 23 additions and 7 deletions

View File

@@ -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);

View File

@@ -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_,