computed properties
This commit is contained in:
10
lib/ast.js
10
lib/ast.js
@@ -921,6 +921,16 @@ var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
|
||||
}
|
||||
}, AST_ObjectProperty);
|
||||
|
||||
var AST_ObjectComputedKeyVal = DEFNODE("ObjectComputedKeyVal", null, {
|
||||
$documentation: "An object property whose key is computed. Like `[Symbol.iterator]: function...` or `[routes.homepage]: renderHomepage`",
|
||||
_walk: function(visitor) {
|
||||
return visitor._visit(this, function(){
|
||||
this.key._walk(visitor);
|
||||
this.value._walk(visitor);
|
||||
});
|
||||
}
|
||||
}, AST_ObjectProperty);
|
||||
|
||||
var AST_ObjectSymbol = DEFNODE("ObjectSymbol", "symbol", {
|
||||
$propdoc: {
|
||||
symbol: "[AST_SymbolRef] what symbol it is"
|
||||
|
||||
@@ -952,6 +952,9 @@ merge(Compressor.prototype, {
|
||||
return false;
|
||||
});
|
||||
def(AST_ObjectProperty, function(compressor){
|
||||
if (this instanceof AST_ObjectComputedKeyVal &&
|
||||
this.key.has_side_effects(compressor))
|
||||
return true;
|
||||
return this.value.has_side_effects(compressor);
|
||||
});
|
||||
def(AST_Array, function(compressor){
|
||||
|
||||
@@ -1203,6 +1203,13 @@ function OutputStream(options) {
|
||||
self.key.print(output);
|
||||
self.value._do_print(output, true);
|
||||
});
|
||||
DEFPRINT(AST_ObjectComputedKeyVal, function(self, output) {
|
||||
output.print("[");
|
||||
self.key.print(output);
|
||||
output.print("]:");
|
||||
output.space();
|
||||
self.value.print(output);
|
||||
});
|
||||
DEFPRINT(AST_Symbol, function(self, output){
|
||||
var def = self.definition();
|
||||
output.print_name(def ? def.mangled_name || def.name : self.name);
|
||||
|
||||
15
lib/parse.js
15
lib/parse.js
@@ -1466,6 +1466,15 @@ function parse($TEXT, options) {
|
||||
}
|
||||
}
|
||||
|
||||
if (type == "punc" && start.value == "[") {
|
||||
expect(":");
|
||||
a.push(new AST_ObjectComputedKeyVal({
|
||||
key: name,
|
||||
value: expression(false)
|
||||
}));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!is("punc", ":")) {
|
||||
// It's one of those object destructurings, the value is its own name
|
||||
a.push(new AST_ObjectSymbol({
|
||||
@@ -1495,6 +1504,12 @@ function parse($TEXT, options) {
|
||||
var tmp = S.token;
|
||||
next();
|
||||
switch (tmp.type) {
|
||||
case "punc":
|
||||
if (tmp.value === "[") {
|
||||
var ex = expression(false);
|
||||
expect("]");
|
||||
return ex;
|
||||
} else unexpected();
|
||||
case "num":
|
||||
case "string":
|
||||
case "name":
|
||||
|
||||
@@ -36,6 +36,13 @@ regression_arrow_functions_and_hoist: {
|
||||
expect_exact: "a=>b;"
|
||||
}
|
||||
|
||||
computed_property_names: {
|
||||
input: {
|
||||
obj({ ["x" + "x"]: 6 });
|
||||
}
|
||||
expect_exact: "obj({[\"x\"+\"x\"]:6});"
|
||||
}
|
||||
|
||||
typeof_arrow_functions: {
|
||||
options = {
|
||||
evaluate: true
|
||||
|
||||
Reference in New Issue
Block a user