Skip to content

Commit 2d596c4

Browse files
tadeeganblickly
authored andcommitted
Some clean ups in PureFunctionIdentifier.
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=128831817
1 parent ef541b7 commit 2d596c4

13 files changed

+189
-313
lines changed

src/com/google/javascript/jscomp/CallGraph.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,15 @@ private DiGraph<Function, Callsite> constructDirectedGraph(boolean forward) {
495495
*/
496496
private Collection<Definition> lookupDefinitionsForTargetsOfCall(
497497
Node callsite, DefinitionProvider definitionProvider) {
498-
Preconditions.checkArgument(callsite.isCall()
499-
|| callsite.isNew());
498+
Preconditions.checkArgument(
499+
NodeUtil.isCallOrNew(callsite), "Expected CALL or NEW. Got:", callsite);
500500

501501
Node targetExpression = callsite.getFirstChild();
502502

503+
if (!targetExpression.isName() && !targetExpression.isGetProp()) {
504+
return null;
505+
}
506+
503507
Collection<Definition> definitions =
504508
definitionProvider.getDefinitionsReferencedAt(targetExpression);
505509

src/com/google/javascript/jscomp/CheckJSDoc.java

+23-2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ final class CheckJSDoc extends AbstractPostOrderCallback implements HotSwapCompi
5555
"JSC_DEFAULT_PARAM_MUST_BE_MARKED_OPTIONAL",
5656
"Inline JSDoc on default parameters must be marked as optional");
5757

58+
public static final DiagnosticType INVALID_NO_SIDE_EFFECT_ANNOTATION =
59+
DiagnosticType.error(
60+
"JSC_INVALID_NO_SIDE_EFFECT_ANNOTATION",
61+
"@nosideeffects may only appear in externs files.");
62+
63+
public static final DiagnosticType INVALID_MODIFIES_ANNOTATION =
64+
DiagnosticType.error(
65+
"JSC_INVALID_MODIFIES_ANNOTATION", "@modifies may only appear in externs files.");
66+
5867
private final AbstractCompiler compiler;
5968

6069
CheckJSDoc(AbstractCompiler compiler) {
@@ -453,8 +462,20 @@ private void validateDefaultValue(Node n, JSDocInfo info) {
453462
* Check that @nosideeeffects annotations are only present in externs.
454463
*/
455464
private void validateNoSideEffects(Node n, JSDocInfo info) {
456-
if (info != null && info.isNoSideEffects() && !n.isFromExterns()) {
457-
reportMisplaced(n, "nosideeffects", "@nosideeffects is only supported in externs.");
465+
// Cannot have @modifies or @nosideeffects in regular (non externs) js. Report errors.
466+
if (info == null) {
467+
return;
468+
}
469+
470+
if (n.isFromExterns()) {
471+
return;
472+
}
473+
474+
if (info.hasSideEffectsArgumentsAnnotation() || info.modifiesThis()) {
475+
report(n, INVALID_MODIFIES_ANNOTATION);
476+
}
477+
if (info.isNoSideEffects()) {
478+
report(n, INVALID_NO_SIDE_EFFECT_ANNOTATION);
458479
}
459480
}
460481
}

src/com/google/javascript/jscomp/DefinitionUseSiteFinder.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public Collection<UseSite> getUseSites(Definition definition) {
6262
private class UseSiteGatheringCallback extends AbstractPostOrderCallback {
6363
@Override
6464
public void visit(NodeTraversal traversal, Node node, Node parent) {
65+
if (!node.isGetProp() && !node.isName()) {
66+
return;
67+
}
6568

6669
Collection<Definition> defs = getDefinitionsReferencedAt(node);
6770
if (defs == null) {
@@ -160,12 +163,12 @@ private boolean isExported(Definition definition) {
160163
*/
161164
void removeReferences(Node node) {
162165
if (DefinitionsRemover.isDefinitionNode(node)) {
163-
DefinitionSite defSite = definitionSiteMap.get(node);
166+
DefinitionSite defSite = definitionNodeByDefinitionSite.get(node);
164167
if (defSite != null) {
165168
Definition def = defSite.definition;
166169
String name = getSimplifiedName(def.getLValue());
167170
if (name != null) {
168-
this.definitionSiteMap.remove(node);
171+
this.definitionNodeByDefinitionSite.remove(node);
169172
this.nameDefinitionMultimap.remove(name, node);
170173
}
171174
}

src/com/google/javascript/jscomp/MarkNoSideEffectCalls.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,6 @@ private class GatherNoSideEffectFunctions extends AbstractPostOrderCallback {
111111

112112
@Override
113113
public void visit(NodeTraversal traversal, Node node, Node parent) {
114-
if (!inExterns && hasNoSideEffectsAnnotation(node)) {
115-
traversal.report(node, PureFunctionIdentifier.INVALID_NO_SIDE_EFFECT_ANNOTATION);
116-
}
117-
118114
if (node.isGetProp()) {
119115
if (parent.isExprResult() &&
120116
hasNoSideEffectsAnnotation(node)) {
@@ -165,12 +161,16 @@ private class SetNoSideEffectCallProperty extends AbstractPostOrderCallback {
165161

166162
@Override
167163
public void visit(NodeTraversal traversal, Node node, Node parent) {
168-
if (!node.isCall() && !node.isNew()) {
164+
if (!NodeUtil.isCallOrNew(node)) {
165+
return;
166+
}
167+
Node nameNode = node.getFirstChild();
168+
// This is the result of an anonymous function execution. function() {}();
169+
if (!nameNode.isName() && !nameNode.isGetProp()) {
169170
return;
170171
}
171172

172-
Collection<Definition> definitions =
173-
defFinder.getDefinitionsReferencedAt(node.getFirstChild());
173+
Collection<Definition> definitions = defFinder.getDefinitionsReferencedAt(nameNode);
174174
if (definitions == null) {
175175
return;
176176
}

src/com/google/javascript/jscomp/NameBasedDefinitionProvider.java

+11-14
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
*/
4646
public class NameBasedDefinitionProvider implements DefinitionProvider, CompilerPass {
4747
protected final Multimap<String, Definition> nameDefinitionMultimap = LinkedHashMultimap.create();
48-
protected final Map<Node, DefinitionSite> definitionSiteMap = new LinkedHashMap<>();
48+
protected final Map<Node, DefinitionSite> definitionNodeByDefinitionSite = new LinkedHashMap<>();
4949
protected final AbstractCompiler compiler;
5050

5151
protected boolean hasProcessBeenRun = false;
@@ -66,7 +66,8 @@ public void process(Node externs, Node source) {
6666
@Override
6767
public Collection<Definition> getDefinitionsReferencedAt(Node useSite) {
6868
Preconditions.checkState(hasProcessBeenRun, "The process was not run");
69-
if (definitionSiteMap.containsKey(useSite)) {
69+
Preconditions.checkArgument(useSite.isGetProp() || useSite.isName());
70+
if (definitionNodeByDefinitionSite.containsKey(useSite)) {
7071
return null;
7172
}
7273

@@ -80,14 +81,9 @@ public Collection<Definition> getDefinitionsReferencedAt(Node useSite) {
8081
String name = getSimplifiedName(useSite);
8182
if (name != null) {
8283
Collection<Definition> defs = nameDefinitionMultimap.get(name);
83-
if (!defs.isEmpty()) {
84-
return defs;
85-
} else {
86-
return null;
87-
}
88-
} else {
89-
return null;
84+
return defs.isEmpty() ? null : defs;
9085
}
86+
return null;
9187
}
9288

9389
private class DefinitionGatheringCallback implements Callback {
@@ -157,7 +153,7 @@ public void visit(NodeTraversal traversal, Node node, Node parent) {
157153
}
158154

159155
nameDefinitionMultimap.put(name, def);
160-
definitionSiteMap.put(
156+
definitionNodeByDefinitionSite.put(
161157
node,
162158
new DefinitionSite(
163159
node, def, traversal.getModule(), traversal.inGlobalScope(), inExterns));
@@ -190,7 +186,7 @@ public void visit(NodeTraversal traversal, Node node, Node parent) {
190186
// Incomplete definition
191187
Definition definition = new ExternalNameOnlyDefinition(node);
192188
nameDefinitionMultimap.put(name, definition);
193-
definitionSiteMap.put(
189+
definitionNodeByDefinitionSite.put(
194190
node,
195191
new DefinitionSite(
196192
node, definition, traversal.getModule(), traversal.inGlobalScope(), inExterns));
@@ -212,7 +208,7 @@ private boolean jsdocContainsDeclarations(Node node) {
212208
* higher chances of name collisions.
213209
*
214210
* <p>TODO(user) revisit. it would be helpful to at least use fully qualified names in the case of
215-
* namespaces. Might not matter as much if this pass runs after "collapsing properties".
211+
* namespaces. Might not matter as much if this pass runs after {@link CollapseProperties}.
216212
*/
217213
protected static String getSimplifiedName(Node node) {
218214
if (node.isName()) {
@@ -235,12 +231,13 @@ protected static String getSimplifiedName(Node node) {
235231
* @return definition site collection.
236232
*/
237233
public Collection<DefinitionSite> getDefinitionSites() {
238-
return definitionSiteMap.values();
234+
Preconditions.checkState(hasProcessBeenRun, "The process was not run");
235+
return definitionNodeByDefinitionSite.values();
239236
}
240237

241238
public DefinitionSite getDefinitionForFunction(Node function) {
242239
Preconditions.checkState(hasProcessBeenRun, "The process was not run");
243240
Preconditions.checkState(function.isFunction());
244-
return definitionSiteMap.get(NodeUtil.getNameNode(function));
241+
return definitionNodeByDefinitionSite.get(NodeUtil.getNameNode(function));
245242
}
246243
}

src/com/google/javascript/jscomp/NodeUtil.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.google.javascript.rhino.dtoa.DToA;
3636
import com.google.javascript.rhino.jstype.JSType;
3737
import com.google.javascript.rhino.jstype.TernaryValue;
38-
3938
import java.util.ArrayList;
4039
import java.util.Collection;
4140
import java.util.Collections;
@@ -44,7 +43,6 @@
4443
import java.util.List;
4544
import java.util.Map;
4645
import java.util.Set;
47-
4846
import javax.annotation.Nullable;
4947

5048
/**
@@ -1200,9 +1198,7 @@ && checkForStateChangeHelper(member.getFirstChild(), checkForNewObjects, compile
12001198
* @param callNode - constructor call node
12011199
*/
12021200
static boolean constructorCallHasSideEffects(Node callNode) {
1203-
if (!callNode.isNew()) {
1204-
throw new IllegalStateException("Expected NEW node, got " + callNode.getType());
1205-
}
1201+
Preconditions.checkArgument(callNode.isNew(), "Expected NEW node, got %s", callNode.getType());
12061202

12071203
if (callNode.isNoSideEffectsCall()) {
12081204
return false;

0 commit comments

Comments
 (0)