add AST_Accessor and AST_SymbolAccessor node types

AST_Accessor will represent the function for a setter or getter.  Since they
are not mangleable, and they should not introduce a name in scope, we have a
new node for their name (AST_SymbolAccessor) which doesn't inherit from
AST_SymbolDeclaration.

fix #37
This commit is contained in:
Mihai Bazon
2012-11-07 12:43:27 +02:00
parent a1ae0c8609
commit 5276a4a873
3 changed files with 19 additions and 7 deletions

View File

@@ -345,6 +345,10 @@ var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments", {
} }
}, AST_Scope); }, AST_Scope);
var AST_Accessor = DEFNODE("Accessor", null, {
$documentation: "A setter/getter function"
}, AST_Lambda);
var AST_Function = DEFNODE("Function", null, { var AST_Function = DEFNODE("Function", null, {
$documentation: "A function expression" $documentation: "A function expression"
}, AST_Lambda); }, AST_Lambda);
@@ -758,6 +762,10 @@ var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
$documentation: "Base class for all symbols", $documentation: "Base class for all symbols",
}); });
var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
$documentation: "The name of a property accessor (setter/getter function)"
}, AST_Symbol);
var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", { var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
$documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)", $documentation: "A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",
$propdoc: { $propdoc: {

View File

@@ -883,6 +883,8 @@ function parse($TEXT, options) {
var function_ = function(in_statement, ctor) { var function_ = function(in_statement, ctor) {
var name = is("name") ? as_symbol(in_statement var name = is("name") ? as_symbol(in_statement
? AST_SymbolDefun ? AST_SymbolDefun
: ctor === AST_Accessor
? AST_SymbolAccessor
: AST_SymbolLambda) : null; : AST_SymbolLambda) : null;
if (in_statement && !name) if (in_statement && !name)
unexpected(); unexpected();
@@ -1158,7 +1160,7 @@ function parse($TEXT, options) {
a.push(new AST_ObjectGetter({ a.push(new AST_ObjectGetter({
start : start, start : start,
key : name, key : name,
value : function_(false, AST_Lambda), value : function_(false, AST_Accessor),
end : prev() end : prev()
})); }));
continue; continue;
@@ -1167,7 +1169,7 @@ function parse($TEXT, options) {
a.push(new AST_ObjectSetter({ a.push(new AST_ObjectSetter({
start : start, start : start,
key : name, key : name,
value : function_(false, AST_Lambda), value : function_(false, AST_Accessor),
end : prev() end : prev()
})); }));
continue; continue;

View File

@@ -312,6 +312,11 @@ AST_Symbol.DEFMETHOD("unmangleable", function(options){
return this.definition().unmangleable(options); return this.definition().unmangleable(options);
}); });
// property accessors are not mangleable
AST_SymbolAccessor.DEFMETHOD("unmangleable", function(){
return true;
});
// labels are always mangleable // labels are always mangleable
AST_Label.DEFMETHOD("unmangleable", function(){ AST_Label.DEFMETHOD("unmangleable", function(){
return false; return false;
@@ -363,12 +368,9 @@ AST_Toplevel.DEFMETHOD("mangle_names", function(options){
} }
if (node instanceof AST_Scope) { if (node instanceof AST_Scope) {
var p = tw.parent(); var p = tw.parent();
var is_setget = p instanceof AST_ObjectSetter || p instanceof AST_ObjectGetter;
node.variables.each(function(symbol){ node.variables.each(function(symbol){
if (!(is_setget && symbol instanceof AST_SymbolLambda)) { if (options.except.indexOf(symbol.name) < 0) {
if (options.except.indexOf(symbol.name) < 0) { to_mangle.push(symbol);
to_mangle.push(symbol);
}
} }
}); });
return; return;