This commit is contained in:
Zirak 2017-04-10 15:19:51 +00:00 committed by GitHub
commit b3ca7877e2
2 changed files with 159 additions and 0 deletions

View File

@ -105,6 +105,7 @@ function mangle_properties(ast, options) {
var names_to_mangle = [];
var unmangleable = [];
var ignored = {};
var function_reserved = Object.create(null);
// step 1: find candidates to mangle
ast.walk(new TreeWalker(function(node){
@ -125,6 +126,15 @@ function mangle_properties(ast, options) {
// step 2: transform the tree, renaming properties
return ast.transform(new TreeTransformer(function(node){
if (node instanceof AST_Defun) {
function_reserved = Object.create(function_reserved);
var reserve_props = parse_reserve_comments(node.start.comments_before);
reserve_props.forEach(function(prop) {
function_reserved[prop] = true;
});
}
if (node instanceof AST_ObjectKeyVal) {
if (!(ignore_quoted && node.quote))
node.key = mangle(node.key);
@ -152,6 +162,10 @@ function mangle_properties(ast, options) {
// );
// }
// }
}, function(node) {
if (node instanceof AST_Defun) {
function_reserved = Object.getPrototypeOf(function_reserved);
}
}));
// only function declarations after this line
@ -170,6 +184,8 @@ function mangle_properties(ast, options) {
if (ignore_quoted && name in ignored) return false;
if (regex && !regex.test(name)) return false;
if (reserved.indexOf(name) >= 0) return false;
if (name in function_reserved) return false;
return cache.props.has(name)
|| names_to_mangle.indexOf(name) >= 0;
}
@ -261,4 +277,21 @@ function mangle_properties(ast, options) {
}));
}
function parse_reserve_comments(comments) {
var props = [];
comments.forEach(function(comment) {
var text = comment.value;
var reserveRe = /^\s*uglify-reserve (.+)/gm,
match;
while (match = reserveRe.exec(text)) {
match[1].split(/\s+/).forEach(function(prop) {
push_uniq(props, prop);
});
}
});
return props;
}
}

View File

@ -0,0 +1,126 @@
reserve_single_line: {
mangle_props = true
input: {
// noise
// uglify-reserve keepme andme
// noise
function foo() {
window.notme = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, butnotme: 0 };
}
// noise
// uglify-reserve keepme
//uglify-reserve andme
// noise
function bar() {
window.notme = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, butnotme: 0 };
}
}
expect: {
function foo() {
window.a = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, b: 0 };
}
function bar() {
window.a = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, b: 0 };
}
}
}
reserve_multi_line: {
mangle_props = true
input: {
/* uglify-reserve keepme andme*/
function foo() {
window.notme = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, butnotme: 0 };
}
/* noise
uglify-reserve keepme
uglify-reserve andme
noise */
function bar() {
window.notme = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, butnotme: 0 };
}
}
expect: {
function foo() {
window.a = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, b: 0 };
}
function bar() {
window.a = 0;
window.keepme = 1;
window["andme"] = 1;
return { andme: 1, "keepme": 1, b: 0 };
}
}
}
reserve_propagation: {
mangle_props = true
input: {
// uglify-reserve thisguy
function foo() {
// uglify-reserve thatguy
function bar() {
return {
notme: 0,
thisguy: 1,
thatguy: 1
};
}
return {
whome: 0,
thisguy: 1,
thatguy: 0
};
}
var o = {
whome: 0,
thisguy: 0,
thatguy: 0
};
}
expect: {
function foo() {
function bar() {
return {
a: 0,
thisguy: 1,
thatguy: 1
};
}
return {
b: 0,
thisguy: 1,
c: 0
};
}
var o = {
b: 0,
d: 0,
c: 0
};
}
}