Mark vars with /** @const */ pragma as consts so they can be eliminated.

Fixes older browser support for consts and allows more flexibility
in dead code removal.
This commit is contained in:
Samuel Reed
2016-01-19 13:12:32 -06:00
parent 57e0fafd5c
commit 8b71c6559b
2 changed files with 57 additions and 1 deletions

View File

@@ -154,7 +154,7 @@ AST_Toplevel.DEFMETHOD("figure_out_scope", function(options){
else if (node instanceof AST_SymbolVar
|| node instanceof AST_SymbolConst) {
var def = defun.def_variable(node);
def.constant = node instanceof AST_SymbolConst;
def.constant = node instanceof AST_SymbolConst || node.has_const_pragma();
def.init = tw.parent().value;
}
else if (node instanceof AST_SymbolCatch) {
@@ -357,6 +357,16 @@ AST_Symbol.DEFMETHOD("global", function(){
return this.definition().global;
});
AST_Symbol.DEFMETHOD("has_const_pragma", function() {
var token = this.scope.body[0] && this.scope.body[0].start;
var comments = token && token.comments_before;
if (comments && comments.length > 0) {
var last = comments[comments.length - 1];
return /@const/.test(last.value);
}
return false;
})
AST_Toplevel.DEFMETHOD("_default_mangler_options", function(options){
return defaults(options, {
except : [],

View File

@@ -87,3 +87,49 @@ dead_code_constant_boolean_should_warn_more: {
var moo;
}
}
dead_code_const_declaration: {
options = {
dead_code : true,
loops : true,
booleans : true,
conditionals : true,
evaluate : true
};
input: {
const CONST_FOO = false;
if (CONST_FOO) {
console.log("unreachable");
var moo;
function bar() {}
}
}
expect: {
const CONST_FOO = !1;
var moo;
function bar() {}
}
}
dead_code_const_annotation: {
options = {
dead_code : true,
loops : true,
booleans : true,
conditionals : true,
evaluate : true
};
input: {
/** @const*/ var CONST_FOO_ANN = false;
if (CONST_FOO_ANN) {
console.log("unreachable");
var moo;
function bar() {}
}
}
expect: {
var CONST_FOO_ANN = !1;
var moo;
function bar() {}
}
}