diff --git a/src/com/google/javascript/jscomp/DeadAssignmentsElimination.java b/src/com/google/javascript/jscomp/DeadAssignmentsElimination.java index eeadbc697d7..9e930a27a26 100644 --- a/src/com/google/javascript/jscomp/DeadAssignmentsElimination.java +++ b/src/com/google/javascript/jscomp/DeadAssignmentsElimination.java @@ -236,7 +236,7 @@ private void tryRemoveAssignment(NodeTraversal t, Node n, Node exprRoot, String name = lhs.getString(); checkState(t.getScope().isFunctionBlockScope()); Scope functionBlockScope = t.getScope(); - if (!functionBlockScope.isDeclaredSloppy(name, false)) { + if (!functionBlockScope.isDeclaredInFunctionBlockOrParameter(name)) { return; } Var var = functionBlockScope.getVar(name); diff --git a/src/com/google/javascript/jscomp/Es6RenameReferences.java b/src/com/google/javascript/jscomp/Es6RenameReferences.java index faa5797d0a5..1b99730246a 100644 --- a/src/com/google/javascript/jscomp/Es6RenameReferences.java +++ b/src/com/google/javascript/jscomp/Es6RenameReferences.java @@ -64,7 +64,7 @@ private void renameReference(NodeTraversal t, Node n) { n.setString(newName); t.reportCodeChange(); return; - } else if (current.isDeclaredSloppy(oldName, false)) { + } else if (current.isDeclared(oldName, false)) { return; } else { current = current.getParent(); diff --git a/src/com/google/javascript/jscomp/LiveVariablesAnalysis.java b/src/com/google/javascript/jscomp/LiveVariablesAnalysis.java index 9815a0814ec..aa44d0897a1 100644 --- a/src/com/google/javascript/jscomp/LiveVariablesAnalysis.java +++ b/src/com/google/javascript/jscomp/LiveVariablesAnalysis.java @@ -279,7 +279,7 @@ private void computeGenKill(Node n, BitSet gen, BitSet kill, private void addToSetIfLocal(Node node, BitSet set) { checkState(node.isName()); String name = node.getString(); - if (!jsScope.isDeclaredSloppy(name, false)) { + if (!jsScope.isDeclared(name, false)) { return; } Var var = jsScope.getVar(name); @@ -301,6 +301,6 @@ void markAllParametersEscaped() { private boolean isArgumentsName(Node n) { return n.isName() && n.getString().equals(ARGUMENT_ARRAY_ALIAS) - && !jsScope.isDeclaredSloppy(ARGUMENT_ARRAY_ALIAS, false); + && !jsScope.isDeclared(ARGUMENT_ARRAY_ALIAS, false); } } diff --git a/src/com/google/javascript/jscomp/LiveVariablesAnalysisEs6.java b/src/com/google/javascript/jscomp/LiveVariablesAnalysisEs6.java index e31ba48dbca..33d8319c717 100644 --- a/src/com/google/javascript/jscomp/LiveVariablesAnalysisEs6.java +++ b/src/com/google/javascript/jscomp/LiveVariablesAnalysisEs6.java @@ -334,10 +334,16 @@ private void computeGenKill(Node n, BitSet gen, BitSet kill, boolean conditional private void addToSetIfLocal(Node node, BitSet set) { checkState(node.isName(), node); String name = node.getString(); + boolean local; // add to the local set if the variable is declared in the function or function body because // ES6 separates the scope but hoists variables to the function scope - if (jsScope.isDeclaredSloppy(name, false)) { + if (jsScope.isFunctionBlockScope()) { + local = jsScope.isDeclaredInFunctionBlockOrParameter(name); + } else { + local = jsScope.isDeclared(name, false); + } + if (local) { Var var = jsScope.getVar(name); if (!escaped.contains(var)) { set.set(getVarIndex(var.getName())); @@ -383,6 +389,6 @@ private boolean isArgumentsName(Node n) { } return n.isName() && n.getString().equals(ARGUMENT_ARRAY_ALIAS) - && (!jsScope.isDeclaredSloppy(ARGUMENT_ARRAY_ALIAS, false) || !childDeclared); + && (!jsScope.isDeclared(ARGUMENT_ARRAY_ALIAS, false) || !childDeclared); } } diff --git a/src/com/google/javascript/jscomp/Scope.java b/src/com/google/javascript/jscomp/Scope.java index 612a9b1e564..48c6df1e150 100644 --- a/src/com/google/javascript/jscomp/Scope.java +++ b/src/com/google/javascript/jscomp/Scope.java @@ -188,22 +188,15 @@ public Var getArgumentsVar() { } /** - * @deprecated use #isDeclared instead + * Use only when in a function block scope and want to tell if a name is either at the top of the + * function block scope or the function parameter scope */ - @Deprecated - public boolean isDeclaredSloppy(String name, boolean recurse) { + public boolean isDeclaredInFunctionBlockOrParameter(String name) { // In ES6, we create a separate "function parameter scope" above the function block scope to // handle default parameters. Since nothing in the function block scope is allowed to shadow // the variables in the function scope, we treat the two scopes as one in this method. - checkState(recurse == false); - if (!isDeclared(name, false)) { - if (parent != null && isFunctionBlockScope()) { - return parent.isDeclared(name, false); - } - return false; - } else { - return true; - } + checkState(isFunctionBlockScope()); + return isDeclared(name, false) || parent.isDeclared(name, false); } /** diff --git a/src/com/google/javascript/jscomp/TypedScope.java b/src/com/google/javascript/jscomp/TypedScope.java index 4a645edb821..ab6cce4e6dd 100644 --- a/src/com/google/javascript/jscomp/TypedScope.java +++ b/src/com/google/javascript/jscomp/TypedScope.java @@ -201,13 +201,10 @@ public Var getArgumentsVar() { throw new IllegalStateException("Method getArgumentsVar cannot be called on typed scopes."); } - /** - * @deprecated use #isDeclared instead - */ - @Deprecated @Override - public boolean isDeclaredSloppy(String name, boolean recurse) { - return isDeclared(name, false); + public boolean isDeclaredInFunctionBlockOrParameter(String name) { + throw new IllegalStateException( + "Method isDeclaredInFunctionBlockOrParameter cannot be called on typed scopes."); } @Override diff --git a/test/com/google/javascript/jscomp/Es6SyntacticScopeCreatorTest.java b/test/com/google/javascript/jscomp/Es6SyntacticScopeCreatorTest.java index bba3fa43e0d..4a796f51d2e 100644 --- a/test/com/google/javascript/jscomp/Es6SyntacticScopeCreatorTest.java +++ b/test/com/google/javascript/jscomp/Es6SyntacticScopeCreatorTest.java @@ -557,7 +557,7 @@ public void testFunctionArgument() { Scope fBlockScope = scopeCreator.createScope(functionBlock, functionScope); assertFalse(fBlockScope.isDeclared("x", false)); - assertTrue(fBlockScope.isDeclaredSloppy("x", false)); + assertTrue(fBlockScope.isDeclaredInFunctionBlockOrParameter("x")); assertFalse(fBlockScope.isDeclared("y", false)); Node ifBlock = functionBlock.getLastChild().getLastChild(); @@ -699,7 +699,7 @@ public void testSimpleFunctionParam() { Node fBlock = NodeUtil.getFunctionBody(fNode); Scope fBlockScope = scopeCreator.createScope(fBlock, fScope); assertFalse(fBlockScope.isDeclared("x", false)); - assertTrue(fBlockScope.isDeclaredSloppy("x", false)); + assertTrue(fBlockScope.isDeclaredInFunctionBlockOrParameter("x")); } public void testOnlyOneDeclaration() { @@ -713,7 +713,7 @@ public void testOnlyOneDeclaration() { Node fBlock = fNode.getLastChild(); Scope fBlockScope = scopeCreator.createScope(fBlock, fScope); assertFalse(fBlockScope.isDeclared("x", false)); - assertTrue(fBlockScope.isDeclaredSloppy("x", false)); + assertTrue(fBlockScope.isDeclaredInFunctionBlockOrParameter("x")); Node ifBlock = fBlock.getFirstChild().getLastChild(); Scope ifBlockScope = scopeCreator.createScope(ifBlock, fBlockScope);