google / google/closure-compiler

Static getter on ES6 class keeps the code live

Open
#2,607 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
7.7k
Forks
1.2k
Avg merge
2d 12h
Merged PRs (30d)
6

Description

1. Try this [example](https://closure-compiler.appspot.com/home#code%3D%252F%252F%2520%253D%253DClosureCompiler%253D%253D%250A%252F%252F%2520%2540compilation_level%2520ADVANCED_OPTIMIZATIONS%250A%252F%252F%2520%2540output_file_name%2520default.js%250A%252F%252F%2520%2540language_out%2520ES5%250A%252F%252F%2520%2540formatting%2520pretty_print%252Cprint_input_delimiter%250A%252F%252F%2520%253D%253D%252FClosureCompiler%253D%253D%250A%250A%252F%252F%2520ADD%2520YOUR%2520CODE%2520HERE%250A%250Afunction%2520stringify(v)%2520%257Breturn%2520v%253B%257D%250Afunction%2520resolveForwardRef(v)%2520%257B%2520return%2520v%253B%257D%250A%250Aclass%2520ReflectiveKey%2520%257B%250A%2520%2520%2520%2520constructor(token%252C%2520id)%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520this.token%2520%253D%2520token%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520this.id%2520%253D%2520id%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520if%2520(!token)%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520throw%2520new%2520Error('Token%2520must%2520be%2520defined!')%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520get%2520displayName()%2520%257B%2520return%2520stringify(this.token)%253B%2520%257D%250A%2520%2520%2520%2520static%2520get(token)%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520return%2520globalKeyRegistry().getKey(resolveForwardRef(token))%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520%252F%252F%2520Commenting%2520the%2520next%2520line%2520treeshakes%2520all%2520code.%2520Why%253F%250A%2520%2520%2520%2520static%2520get%2520numberOfKeys()%2520%257B%2520return%2520globalKeyRegistry().numberOfKeys2%253B%2520%257D%250A%257D%250Aclass%2520KeyRegistry%2520%257B%250A%2520%2520%2520%2520constructor()%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520this._allKeys%2520%253D%2520new%2520Map()%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520getKey(token)%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520if%2520(token%2520instanceof%2520ReflectiveKey)%250A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520token%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520if%2520(this._allKeys.has(token))%2520%257B%250A%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520%2520return%2520((this._allKeys.get(token)))%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520%2520%2520%2520%2520const%2520%252F**%2520%2540type%2520%257B%253F%257D%2520*%252F%2520newKey%2520%253D%2520new%2520ReflectiveKey(token%252C%2520ReflectiveKey.numberOfKeys)%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520this._allKeys.set(token%252C%2520newKey)%253B%250A%2520%2520%2520%2520%2520%2520%2520%2520return%2520newKey%253B%250A%2520%2520%2520%2520%257D%250A%2520%2520%2520%2520get%2520numberOfKeys2()%2520%257B%2520return%2520this._allKeys.size%253B%2520%257D%250A%257D%250Alet%2520_globalKeyRegistry%253B%250Afunction%2520globalKeyRegistry()%2520%257B%250A%2520%2520%2520%2520return%2520_globalKeyRegistry%2520%253F%2520_globalKeyRegistry%2520%253A%2520_globalKeyRegistry%2520%253D%2520new%2520KeyRegistry()%253B%250A%257D%250A)
2. Set `Optimization` to advanced
3. `Compile` and notice that code gets retained.
4. Comment out `static get numberOfKeys() { return globalKeyRegistry().numberOfKeys2; }`
5. `Compile` and notice that all code was tree shaken away.

This is rather strange. Why?

```
// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @language_out ES5
// @formatting pretty_print,print_input_delimiter
// ==/ClosureCompiler==

// ADD YOUR CODE HERE

function stringify(v) {return v;}
function resolveForwardRef(v) { return v;}

class ReflectiveKey {
constructor(token, id) {
this.token = token;
this.id = id;
if (!token) {
throw new Error('Token must be defined!');
}
}
get displayName() { return stringify(this.token); }
static get(token) {
return globalKeyRegistry().getKey(resolveForwardRef(token));
}
// Commenting the next line treeshakes all code. Why?
static get numberOfKeys() { return globalKeyRegistry().numberOfKeys2; }
}
class KeyRegistry {
constructor() {
this._allKeys = new Map();
}
getKey(token) {
if (token instanceof ReflectiveKey)
return token;
if (this._allKeys.has(token)) {
return ((this._allKeys.get(token)));
}
const /** @type {?} */ newKey = new ReflectiveKey(token, ReflectiveKey.numberOfKeys);
this._allKeys.set(token, newKey);
return newKey;
}
get numberOfKeys2() { return this._allKeys.size; }
}
let _globalKeyRegistry;
function globalKeyRegistry() {
return _globalKeyRegistry ? _globalKeyRegistry : _globalKeyRegistry = new KeyRegistry();
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.