javascript - Closure Compiler: @enum, property collapsing and JSC_UNSAFE_NAMESPACE -
initial situation
i have following code:
var ns = {}; // namespace ns.myenum = { foo: 1, bar: 2 }; var extendedns = object.create(ns); extendedns.myalert = function (x) { alert(x); }; extendedns.myalert(extendedns.myenum.foo);
it compiles command (no warnings or errors):
java -jar compiler-20150609.jar --js test.js --compilation_level advanced --warning_level verbose
question 1
according docs jsc_unsafe_namespace
, think advanced optimisations may replace ns.myenum
ns$myenum
, , remove ns
.
so why compiler not raise warning line?
var extendedns = object.create(ns);
isn't unsafe reference namespace ns
? shouldn't compiler warn: "incomplete alias created namespace ns
"?
@enum type breaks compiled output
i mark ns.myenum
enum:
/** * @enum {number} */ ns.myenum = { foo: 1, bar: 2 };
according this old answer, "the compiler expects collapse enum value single variables". think compiler may collapse ns.myenum
to:
ns$myenum$foo = 1; ns$myenum$bar = 2;
the compiler raises warning:
warning - incomplete alias created namespace ns var extendedns = object.create(ns); ^
i think understand why: advanced optimisations may have removed ns
after collapsing enum's values.
the compiled output indeed broken:
var = object.create({}); a.a = function() { alert(a.c.b); // a.c.b doesn't exist, runtime error occur }; a.a();
question 2
i add @nocollapse
tag enum ("denotes property should not collapsed compiler variable. if annotate property object @nocollapse
, properties remain uncollapsed."):
/** * @enum {number} * @nocollapse */ ns.myenum = { foo: 1, bar: 2 };
the compiled output valid code:
var = object.create({c:{a:1, f:2}}); a.b = function() { alert(a.c.a); // a.c.a exist }; a.b();
but compiler still raises jsc_unsafe_namespace
warning:
warning - incomplete alias created namespace ns var extended = object.create(ns); ^
why? there tag need add ns.myenum
prevent warning?
(note: i'd prefer not @suppress
warning. i'd understand , fix cause of warning.)
the core issue comes down fact traditionally, @enum
properties have been collapsed - warning when @enum
annotation added code broken (and in first example).
@nocollapse
block enum collapsing , warning incorrectly emitted when annotation present. can file bug if wish, low priority issue.
in general case, enums designed used more constants , using them proto object not intended/supported behavior.
the rules , cases surrounding property collapsing complex. best way understand them through unit tests see specific patterns trigger warning.
Comments
Post a Comment