First class block scope

- Make let, const, and class symbols be declared in a block scope.
- Piggy back on existing catch symbol implementation to get block-aware mangling working
- Make sure unused block-scoped declarations can be dropped
- Don't eliminate a block if it has a block-scoped declaration
- Remove silly empty anonymous blocks left over from drop_unused
- AST_Toplevel now gets to call drop_unused too, since block-scoped variables aren't global!
- Don't consider block declarations global
This commit is contained in:
Fábio Santos
2016-02-28 14:06:51 +00:00
committed by Richard van Velzen
parent 6702cae918
commit 634f231b78
7 changed files with 266 additions and 30 deletions

View File

@@ -1214,11 +1214,14 @@ function parse($TEXT, options) {
});
};
function vardefs(no_in, in_const) {
function vardefs(no_in, kind) {
var a = [];
var def;
for (;;) {
var sym_type = in_const ? AST_SymbolConst : AST_SymbolVar;
var sym_type =
kind === "var" ? AST_SymbolVar :
kind === "const" ? AST_SymbolConst :
kind === "let" ? AST_SymbolLet : null;
if (is("punc", "{") || is("punc", "[")) {
def = new AST_VarDef({
start: S.token,
@@ -1287,7 +1290,7 @@ function parse($TEXT, options) {
var var_ = function(no_in) {
return new AST_Var({
start : prev(),
definitions : vardefs(no_in, false),
definitions : vardefs(no_in, "var"),
end : prev()
});
};
@@ -1295,7 +1298,7 @@ function parse($TEXT, options) {
var let_ = function(no_in) {
return new AST_Let({
start : prev(),
definitions : vardefs(no_in, false),
definitions : vardefs(no_in, "let"),
end : prev()
});
};
@@ -1303,7 +1306,7 @@ function parse($TEXT, options) {
var const_ = function() {
return new AST_Const({
start : prev(),
definitions : vardefs(false, true),
definitions : vardefs(false, "const"),
end : prev()
});
};