From 04dde5a8a9e5d7841361eb6a7606ce3c240e5f36 Mon Sep 17 00:00:00 2001 From: domnit Date: Tue, 12 Feb 2019 10:44:31 -0800 Subject: [PATCH] Automated rollback *** Reason for rollback *** Broke project *** Original change description *** Deletes redundant `NodeTraversal::makeError` methods. This change also cleans up the many unnecessary parameters/args that were used to call these methods. *** ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=233635502 --- .../google/javascript/jscomp/AngularPass.java | 14 +- .../jscomp/CheckAccessControls.java | 104 +++--- .../javascript/jscomp/CheckGlobalThis.java | 4 +- .../jscomp/CheckMissingAndExtraRequires.java | 12 +- .../jscomp/CheckMissingGetCssName.java | 5 +- .../javascript/jscomp/CheckMissingReturn.java | 2 +- .../jscomp/CheckSuspiciousCode.java | 6 +- .../jscomp/CheckUnreachableCode.java | 2 +- .../google/javascript/jscomp/ConstCheck.java | 14 +- .../javascript/jscomp/ConstParamCheck.java | 2 +- .../jscomp/CreateSyntheticBlocks.java | 10 +- .../javascript/jscomp/Es6CheckModule.java | 4 +- .../javascript/jscomp/Es6RewriteModules.java | 2 +- .../jscomp/FindExportableNodes.java | 4 +- .../jscomp/ImplicitNullabilityCheck.java | 9 +- .../javascript/jscomp/J2clChecksPass.java | 13 +- .../javascript/jscomp/JsMessageVisitor.java | 21 +- .../javascript/jscomp/LineNumberCheck.java | 8 +- .../javascript/jscomp/NodeTraversal.java | 23 ++ .../jscomp/ProcessClosurePrimitives.java | 207 ++++++----- .../jscomp/ProcessCommonJSModules.java | 10 +- .../javascript/jscomp/ProcessDefines.java | 23 +- .../javascript/jscomp/ProcessTweaks.java | 16 +- .../javascript/jscomp/ReplaceCssNames.java | 35 +- .../jscomp/ReplaceIdGenerators.java | 18 +- .../jscomp/RewriteClosureImports.java | 2 +- .../jscomp/RewriteJsonToModule.java | 10 +- .../javascript/jscomp/ScopedAliases.java | 31 +- .../google/javascript/jscomp/TypeCheck.java | 336 ++++++++++-------- .../jscomp/lint/CheckArrayWithGoogObject.java | 5 +- .../jscomp/lint/CheckNullableReturn.java | 5 +- .../jscomp/lint/CheckPrototypeProperties.java | 5 +- 32 files changed, 535 insertions(+), 427 deletions(-) diff --git a/src/com/google/javascript/jscomp/AngularPass.java b/src/com/google/javascript/jscomp/AngularPass.java index d0e6ef17aa5..a1af706bc10 100644 --- a/src/com/google/javascript/jscomp/AngularPass.java +++ b/src/com/google/javascript/jscomp/AngularPass.java @@ -200,19 +200,19 @@ private List createStringsFromParamList(Node params) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { JSDocInfo docInfo = n.getJSDocInfo(); if (docInfo != null && docInfo.isNgInject()) { - addNode(n); + addNode(n, t); } } /** * Add node to the list of injectables. - * * @param n node to add. + * @param t node traversal instance. */ - private void addNode(Node n) { + private void addNode(Node n, NodeTraversal t) { Node target = null; Node fn = null; String name = null; @@ -223,7 +223,7 @@ private void addNode(Node n) { // a = b = c = function() {} case ASSIGN: if (!n.getFirstChild().isQualifiedName()) { - compiler.report(JSError.make(n, INJECTED_FUNCTION_ON_NON_QNAME)); + compiler.report(t.makeError(n, INJECTED_FUNCTION_ON_NON_QNAME)); return; } name = n.getFirstChild().getQualifiedName(); @@ -289,14 +289,14 @@ private void addNode(Node n) { } if (fn == null || !fn.isFunction()) { - compiler.report(JSError.make(n, INJECT_NON_FUNCTION_ERROR)); + compiler.report(t.makeError(n, INJECT_NON_FUNCTION_ERROR)); return; } // report an error if the function declaration did not take place in a block or global scope if (!target.getParent().isScript() && !target.getParent().isBlock() && !target.getParent().isModuleBody()) { - compiler.report(JSError.make(n, INJECT_IN_NON_GLOBAL_OR_BLOCK_ERROR)); + compiler.report(t.makeError(n, INJECT_IN_NON_GLOBAL_OR_BLOCK_ERROR)); return; } // checks that name is present, which must always be the case unless the diff --git a/src/com/google/javascript/jscomp/CheckAccessControls.java b/src/com/google/javascript/jscomp/CheckAccessControls.java index 27e27e14d98..acee042cb6b 100644 --- a/src/com/google/javascript/jscomp/CheckAccessControls.java +++ b/src/com/google/javascript/jscomp/CheckAccessControls.java @@ -344,10 +344,10 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { @Nullable PropertyReference propRef = createPropertyReference(node); checkDeprecation(node, propRef, identifierBehaviour, traversal); - checkVisibility(node, propRef, identifierBehaviour, traversal.getScope()); - checkConstantProperty(propRef, identifierBehaviour); + checkVisibility(node, propRef, identifierBehaviour, traversal); + checkConstantProperty(propRef, identifierBehaviour, traversal); - checkFinalClassOverrides(node); + checkFinalClassOverrides(node, traversal); @Nullable Node accessControlRoot = primaryAccessControlScopeRootFor(node); if (accessControlRoot != null) { @@ -389,13 +389,13 @@ private void checkVisibility( Node node, @Nullable PropertyReference propRef, IdentifierBehaviour identifierBehaviour, - Scope scope) { + NodeTraversal traversal) { if (identifierBehaviour.equals(IdentifierBehaviour.ES6_CLASS_INVOCATION)) { - checkEs6ConstructorInvocationVisibility(node); + checkEs6ConstructorInvocationVisibility(node, traversal); } if (!identifierBehaviour.equals(IdentifierBehaviour.ES5_CLASS_NAMESPACE)) { - checkNameVisibility(scope, node); + checkNameVisibility(traversal, node); } if (node.getParent().isObjectLit()) { @@ -408,7 +408,7 @@ private void checkVisibility( case GETTER_DEF: case SETTER_DEF: case MEMBER_FUNCTION_DEF: - checkKeyVisibilityConvention(node, node.getParent()); + checkKeyVisibilityConvention(traversal, node, node.getParent()); break; default: @@ -417,7 +417,7 @@ private void checkVisibility( } if (propRef != null && !identifierBehaviour.equals(IdentifierBehaviour.ES5_CLASS_NAMESPACE)) { - checkPropertyVisibility(propRef); + checkPropertyVisibility(traversal, propRef); } } @@ -439,7 +439,7 @@ private void checkTypeDeprecation(NodeTraversal t, Node n) { } DiagnosticType message = deprecationInfo.isEmpty() ? DEPRECATED_CLASS : DEPRECATED_CLASS_REASON; - compiler.report(JSError.make(n, message, instanceType.toString(), deprecationInfo)); + compiler.report(t.makeError(n, message, instanceType.toString(), deprecationInfo)); } /** Checks the given NAME node to ensure that access restrictions are obeyed. */ @@ -458,9 +458,11 @@ private void checkNameDeprecation(NodeTraversal t, Node n) { if (docInfo != null && docInfo.isDeprecated()) { if (docInfo.getDeprecationReason() != null) { compiler.report( - JSError.make(n, DEPRECATED_NAME_REASON, n.getString(), docInfo.getDeprecationReason())); + t.makeError(n, DEPRECATED_NAME_REASON, n.getString(), + docInfo.getDeprecationReason())); } else { - compiler.report(JSError.make(n, DEPRECATED_NAME, n.getString())); + compiler.report( + t.makeError(n, DEPRECATED_NAME, n.getString())); } } } @@ -487,7 +489,7 @@ private void checkPropertyDeprecation(NodeTraversal t, PropertyReference propRef if (!deprecationInfo.isEmpty()) { compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), DEPRECATED_PROP_REASON, propertyName, @@ -495,7 +497,7 @@ private void checkPropertyDeprecation(NodeTraversal t, PropertyReference propRef deprecationInfo)); } else { compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), DEPRECATED_PROP, propertyName, @@ -513,9 +515,10 @@ private boolean isPrivateByConvention(String name) { /** * Determines whether the given OBJECTLIT property visibility violates the coding convention. * + * @param t The current traversal. * @param key The objectlit key node (STRING_KEY, GETTER_DEF, SETTER_DEF, MEMBER_FUNCTION_DEF). */ - private void checkKeyVisibilityConvention(Node key, Node parent) { + private void checkKeyVisibilityConvention(NodeTraversal t, Node key, Node parent) { JSDocInfo info = key.getJSDocInfo(); if (info == null) { return; @@ -536,22 +539,22 @@ private void checkKeyVisibilityConvention(Node key, Node parent) { // Visibility is declared to be something other than private. if (declaredVisibility != Visibility.INHERITED && declaredVisibility != Visibility.PRIVATE) { - compiler.report(JSError.make(key, CONVENTION_MISMATCH)); + compiler.report(t.makeError(key, CONVENTION_MISMATCH)); } } /** * Reports an error if the given name is not visible in the current context. * - * @param scope The current scope. + * @param t The current traversal. * @param name The name node. */ - private void checkNameVisibility(Scope scope, Node name) { + private void checkNameVisibility(NodeTraversal t, Node name) { if (!name.isName()) { return; } - Var var = scope.getVar(name.getString()); + Var var = t.getScope().getVar(name.getString()); if (var == null) { return; } @@ -564,21 +567,15 @@ private void checkNameVisibility(Scope scope, Node name) { case PACKAGE: if (!isPackageAccessAllowed(var, name)) { compiler.report( - JSError.make( - name, - BAD_PACKAGE_PROPERTY_ACCESS, - name.getString(), - var.getSourceFile().getName())); + t.makeError(name, BAD_PACKAGE_PROPERTY_ACCESS, + name.getString(), var.getSourceFile().getName())); } break; case PRIVATE: if (!isPrivateAccessAllowed(var, name)) { compiler.report( - JSError.make( - name, - BAD_PRIVATE_GLOBAL_ACCESS, - name.getString(), - var.getSourceFile().getName())); + t.makeError(name, BAD_PRIVATE_GLOBAL_ACCESS, + name.getString(), var.getSourceFile().getName())); } break; default: @@ -633,13 +630,14 @@ private void checkOverriddenPropertyVisibilityMismatch( Visibility overriding, Visibility overridden, @Nullable Visibility fileOverview, + NodeTraversal t, PropertyReference propRef) { if (overriding == Visibility.INHERITED && overriding != overridden && fileOverview != null && fileOverview != Visibility.INHERITED) { compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), BAD_PROPERTY_OVERRIDE_IN_FILE_WITH_FILEOVERVIEW_VISIBILITY, propRef.getName(), @@ -656,7 +654,7 @@ private static Visibility getOverridingPropertyVisibility(PropertyReference prop } /** Checks if a constructor is trying to override a final class. */ - private void checkFinalClassOverrides(Node ctor) { + private void checkFinalClassOverrides(Node ctor, NodeTraversal t) { if (!isFunctionOrClass(ctor)) { return; } @@ -666,7 +664,7 @@ private void checkFinalClassOverrides(Node ctor) { JSType finalParentClass = getSuperClassInstanceIfFinal(bestInstanceTypeForMethodOrCtor(ctor)); if (finalParentClass != null) { compiler.report( - JSError.make( + t.makeError( ctor, EXTEND_FINAL_CLASS, type.getDisplayName(), @@ -677,7 +675,9 @@ private void checkFinalClassOverrides(Node ctor) { /** Determines whether the given constant property got reassigned */ private void checkConstantProperty( - @Nullable PropertyReference propRef, IdentifierBehaviour identifierBehaviour) { + @Nullable PropertyReference propRef, + IdentifierBehaviour identifierBehaviour, + NodeTraversal t) { if (propRef == null || identifierBehaviour.equals(IdentifierBehaviour.ES5_CLASS_NAMESPACE)) { return; } @@ -695,8 +695,7 @@ private void checkConstantProperty( // Check whether constant properties are reassigned if (isConstant) { if (propRef.isDeletion()) { - compiler.report( - JSError.make(propRef.getSourceNode(), CONST_PROPERTY_DELETED, propertyName)); + compiler.report(t.makeError(propRef.getSourceNode(), CONST_PROPERTY_DELETED, propertyName)); return; } @@ -715,7 +714,7 @@ private void checkConstantProperty( || initializedConstantProperties.containsEntry( getCanonicalInstance(oType), propertyName)) { compiler.report( - JSError.make(propRef.getSourceNode(), CONST_PROPERTY_REASSIGNED_VALUE, propertyName)); + t.makeError(propRef.getSourceNode(), CONST_PROPERTY_REASSIGNED_VALUE, propertyName)); break; } oType = oType.getImplicitPrototype(); @@ -761,7 +760,7 @@ private ObjectType boxedOrUnknown(@Nullable JSType type) { } /** Reports an error if the given property is not visible in the current context. */ - private void checkPropertyVisibility(PropertyReference propRef) { + private void checkPropertyVisibility(NodeTraversal t, PropertyReference propRef) { JSType rawReferenceType = typeOrUnknown(propRef.getReceiverType()).autobox(); ObjectType referenceType = castToObject(rawReferenceType); @@ -769,7 +768,7 @@ private void checkPropertyVisibility(PropertyReference propRef) { boolean isPrivateByConvention = isPrivateByConvention(propertyName); if (isPrivateByConvention && propertyIsDeclaredButNotPrivate(propRef)) { - compiler.report(JSError.make(propRef.getSourceNode(), CONVENTION_MISMATCH)); + compiler.report(t.makeError(propRef.getSourceNode(), CONVENTION_MISMATCH)); return; } @@ -797,7 +796,7 @@ private void checkPropertyVisibility(PropertyReference propRef) { Visibility overriding = getOverridingPropertyVisibility(propRef); if (overriding != null) { checkOverriddenPropertyVisibilityMismatch( - overriding, visibility, fileOverviewVisibility, propRef); + overriding, visibility, fileOverviewVisibility, t, propRef); } } @@ -823,10 +822,10 @@ private void checkPropertyVisibility(PropertyReference propRef) { boolean sameInput = referenceSource != null && referenceSource.getName().equals(definingSource.getName()); checkOverriddenPropertyVisibility( - propRef, visibility, fileOverviewVisibility, reportType, sameInput); + t, propRef, visibility, fileOverviewVisibility, reportType, sameInput); } else { checkNonOverriddenPropertyVisibility( - propRef, visibility, reportType, referenceSource, definingSource); + t, propRef, visibility, reportType, referenceSource, definingSource); } } @@ -835,7 +834,7 @@ private void checkPropertyVisibility(PropertyReference propRef) { * *

Precondition: {@code target} has an ES6 class {@link JSType}. */ - private void checkEs6ConstructorInvocationVisibility(Node target) { + private void checkEs6ConstructorInvocationVisibility(Node target, NodeTraversal traversal) { FunctionType ctorType = target.getJSType().toMaybeFunctionType(); ObjectType prototypeType = ctorType.getPrototype(); @@ -877,6 +876,7 @@ private void checkEs6ConstructorInvocationVisibility(Node target) { : annotatedCtorVisibility; checkNonOverriddenPropertyVisibility( + traversal, fauxCtorRef, effectiveCtorVisibility, ctorType, @@ -898,6 +898,7 @@ private static boolean propertyIsDeclaredButNotPrivate(PropertyReference propRef } private void checkOverriddenPropertyVisibility( + NodeTraversal t, PropertyReference propRef, Visibility visibility, Visibility fileOverviewVisibility, @@ -914,12 +915,12 @@ private void checkOverriddenPropertyVisibility( // a file with default visibility in the @fileoverview block. if (visibility == Visibility.PRIVATE && !sameInput) { compiler.report( - JSError.make(propRef.getSourceNode(), PRIVATE_OVERRIDE, objectType.toString())); + t.makeError(propRef.getSourceNode(), PRIVATE_OVERRIDE, objectType.toString())); } else if (overridingVisibility != Visibility.INHERITED && overridingVisibility != visibility && fileOverviewVisibility == null) { compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), VISIBILITY_MISMATCH, visibility.name(), @@ -929,6 +930,7 @@ private void checkOverriddenPropertyVisibility( } private void checkNonOverriddenPropertyVisibility( + NodeTraversal t, PropertyReference propRef, Visibility visibility, JSType objectType, @@ -945,13 +947,13 @@ private void checkNonOverriddenPropertyVisibility( switch (visibility) { case PACKAGE: - checkPackagePropertyVisibility(propRef, referenceSource, definingSource); + checkPackagePropertyVisibility(t, propRef, referenceSource, definingSource); break; case PRIVATE: - checkPrivatePropertyVisibility(propRef, ownerType); + checkPrivatePropertyVisibility(t, propRef, ownerType); break; case PROTECTED: - checkProtectedPropertyVisibility(propRef, ownerType); + checkProtectedPropertyVisibility(t, propRef, ownerType); break; default: break; @@ -959,6 +961,7 @@ private void checkNonOverriddenPropertyVisibility( } private void checkPackagePropertyVisibility( + NodeTraversal t, PropertyReference propRef, StaticSourceFile referenceSource, StaticSourceFile definingSource) { @@ -969,7 +972,7 @@ private void checkPackagePropertyVisibility( || defPackage == null || !refPackage.equals(defPackage)) { compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), BAD_PACKAGE_PROPERTY_ACCESS, propRef.getName(), @@ -978,6 +981,7 @@ private void checkPackagePropertyVisibility( } private void checkPrivatePropertyVisibility( + NodeTraversal t, PropertyReference propRef, @Nullable ObjectType ownerType) { @@ -989,7 +993,7 @@ private void checkPrivatePropertyVisibility( ? propRef.getReadableTypeNameOrDefault() : ownerType.toString(); compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), BAD_PRIVATE_PROPERTY_ACCESS, propRef.getName(), @@ -997,7 +1001,7 @@ private void checkPrivatePropertyVisibility( } private void checkProtectedPropertyVisibility( - PropertyReference propRef, @Nullable ObjectType ownerType) { + NodeTraversal t, PropertyReference propRef, @Nullable ObjectType ownerType) { // There are 3 types of legal accesses of a protected property: // 1) Accesses in the same file // 2) Overriding the property in a subclass @@ -1014,7 +1018,7 @@ private void checkProtectedPropertyVisibility( } compiler.report( - JSError.make( + t.makeError( propRef.getSourceNode(), BAD_PROTECTED_PROPERTY_ACCESS, propRef.getName(), diff --git a/src/com/google/javascript/jscomp/CheckGlobalThis.java b/src/com/google/javascript/jscomp/CheckGlobalThis.java index 44856e88168..bb12af32001 100644 --- a/src/com/google/javascript/jscomp/CheckGlobalThis.java +++ b/src/com/google/javascript/jscomp/CheckGlobalThis.java @@ -159,9 +159,9 @@ public boolean shouldTraverse(NodeTraversal t, Node n, Node parent) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if (n.isThis() && shouldReportThis(n)) { - compiler.report(JSError.make(n, GLOBAL_THIS)); + compiler.report(t.makeError(n, GLOBAL_THIS)); } if (n == assignLhsChild) { assignLhsChild = null; diff --git a/src/com/google/javascript/jscomp/CheckMissingAndExtraRequires.java b/src/com/google/javascript/jscomp/CheckMissingAndExtraRequires.java index 1e47afc254f..061952c2a9c 100644 --- a/src/com/google/javascript/jscomp/CheckMissingAndExtraRequires.java +++ b/src/com/google/javascript/jscomp/CheckMissingAndExtraRequires.java @@ -228,7 +228,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { visitCallNode(t, n, parent); break; case SCRIPT: - visitScriptNode(); + visitScriptNode(t); reset(); break; case NEW: @@ -255,7 +255,7 @@ private void reset() { this.googScopeBlock = null; } - private void visitScriptNode() { + private void visitScriptNode(NodeTraversal t) { if (mode == Mode.SINGLE_FILE && requires.isEmpty() && closurizedNamespaces.isEmpty()) { // Likely a file that isn't using Closure at all. return; @@ -288,15 +288,15 @@ private void visitScriptNode() { ? namespace.substring(0, namespace.lastIndexOf('.')) : namespace; String nameToReport = Iterables.getFirst(getClassNames(namespace), defaultName); - compiler.report(JSError.make(node, MISSING_REQUIRE_STRICT_WARNING, nameToReport)); + compiler.report(t.makeError(node, MISSING_REQUIRE_STRICT_WARNING, nameToReport)); } else if (node.getParent().isName() && node.getParent().getGrandparent() == googScopeBlock) { - compiler.report(JSError.make(node, MISSING_REQUIRE_FOR_GOOG_SCOPE, namespace)); + compiler.report(t.makeError(node, MISSING_REQUIRE_FOR_GOOG_SCOPE, namespace)); } else { if (node.isGetProp() && !node.getParent().isClass()) { - compiler.report(JSError.make(node, MISSING_REQUIRE_STRICT_WARNING, namespace)); + compiler.report(t.makeError(node, MISSING_REQUIRE_STRICT_WARNING, namespace)); } else { - compiler.report(JSError.make(node, MISSING_REQUIRE_WARNING, namespace)); + compiler.report(t.makeError(node, MISSING_REQUIRE_WARNING, namespace)); } } namespaces.add(namespace); diff --git a/src/com/google/javascript/jscomp/CheckMissingGetCssName.java b/src/com/google/javascript/jscomp/CheckMissingGetCssName.java index 7c114d2eab7..64fa7ecaa5f 100644 --- a/src/com/google/javascript/jscomp/CheckMissingGetCssName.java +++ b/src/com/google/javascript/jscomp/CheckMissingGetCssName.java @@ -56,7 +56,7 @@ public void process(Node externs, Node root) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if ((n.isString() || n.isTemplateLitString()) && !parent.isGetProp() && !parent.isRegExp()) { String s = n.isString() ? n.getString() : n.getCookedString(); @@ -78,7 +78,8 @@ public void visit(NodeTraversal unused, Node n, Node parent) { if (insideAssignmentToIdConstant(n)) { continue; } - compiler.report(JSError.make(n, level, MISSING_GETCSSNAME, blacklist.group())); + compiler.report(t.makeError(n, level, MISSING_GETCSSNAME, + blacklist.group())); } } } diff --git a/src/com/google/javascript/jscomp/CheckMissingReturn.java b/src/com/google/javascript/jscomp/CheckMissingReturn.java index f1bf5bf629f..71faaed8c32 100644 --- a/src/com/google/javascript/jscomp/CheckMissingReturn.java +++ b/src/com/google/javascript/jscomp/CheckMissingReturn.java @@ -127,7 +127,7 @@ public void enterScope(NodeTraversal t) { if (!test.allPathsSatisfyPredicate()) { compiler.report( - JSError.make(t.getScopeRoot(), MISSING_RETURN_STATEMENT, returnType.toString())); + t.makeError(t.getScopeRoot(), MISSING_RETURN_STATEMENT, returnType.toString())); } } diff --git a/src/com/google/javascript/jscomp/CheckSuspiciousCode.java b/src/com/google/javascript/jscomp/CheckSuspiciousCode.java index 5e1dba4663a..938809c22bc 100644 --- a/src/com/google/javascript/jscomp/CheckSuspiciousCode.java +++ b/src/com/google/javascript/jscomp/CheckSuspiciousCode.java @@ -107,7 +107,8 @@ private static void reportIfWasEmpty(NodeTraversal t, Node block) { // annotating it with EMPTY_BLOCK. Blocks without children are // usually intentional, especially with loops. if (!block.hasChildren() && block.isAddedBlock()) { - t.getCompiler().report(JSError.make(block, SUSPICIOUS_SEMICOLON)); + t.getCompiler().report( + t.makeError(block, SUSPICIOUS_SEMICOLON)); } } @@ -131,7 +132,8 @@ private void checkNaN(NodeTraversal t, Node n) { private static void reportIfNaN(NodeTraversal t, Node n) { if (NodeUtil.isNaN(n)) { - t.getCompiler().report(JSError.make(n.getParent(), SUSPICIOUS_COMPARISON_WITH_NAN)); + t.getCompiler().report( + t.makeError(n.getParent(), SUSPICIOUS_COMPARISON_WITH_NAN)); } } diff --git a/src/com/google/javascript/jscomp/CheckUnreachableCode.java b/src/com/google/javascript/jscomp/CheckUnreachableCode.java index a27de3d4bfa..b8192b35f91 100644 --- a/src/com/google/javascript/jscomp/CheckUnreachableCode.java +++ b/src/com/google/javascript/jscomp/CheckUnreachableCode.java @@ -61,7 +61,7 @@ public boolean shouldTraverse(NodeTraversal t, Node n, Node parent) { if (n.getLineno() != -1 && // Allow spurious semi-colons and spurious breaks. !n.isEmpty() && !n.isBreak()) { - compiler.report(JSError.make(n, UNREACHABLE_CODE)); + compiler.report(t.makeError(n, UNREACHABLE_CODE)); // From now on, we are going to assume the user fixed the error and not // give more warning related to code section reachable from this node. new GraphReachability<>(t.getControlFlowGraph()).recompute(n); diff --git a/src/com/google/javascript/jscomp/ConstCheck.java b/src/com/google/javascript/jscomp/ConstCheck.java index 4fef346ac0b..fae97aa0a5d 100644 --- a/src/com/google/javascript/jscomp/ConstCheck.java +++ b/src/com/google/javascript/jscomp/ConstCheck.java @@ -70,7 +70,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { initializedConstants.add(var); } else if (n.hasChildren()) { if (!initializedConstants.add(var)) { - reportError(n, var, name); + reportError(t, n, var, name); } } } @@ -96,7 +96,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { String name = lhs.getString(); Var var = t.getScope().getVar(name); if (var.isConst() || (isConstant(var) && !initializedConstants.add(var))) { - reportError(n, var, name); + reportError(t, n, var, name); } } break; @@ -110,7 +110,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { String name = lhs.getString(); Var var = t.getScope().getVar(name); if (var.isConst() || isConstant(var)) { - reportError(n, var, name); + reportError(t, n, var, name); } } break; @@ -128,13 +128,15 @@ private static boolean isConstant(Var var) { return var != null && var.isInferredConst(); } - /** Reports a reassigned constant error. */ - void reportError(Node n, Var var, String name) { + /** + * Reports a reassigned constant error. + */ + void reportError(NodeTraversal t, Node n, Var var, String name) { JSDocInfo info = NodeUtil.getBestJSDocInfo(n); if (info == null || !info.getSuppressions().contains("const")) { Node declNode = var.getNode(); String declaredPosition = declNode.getSourceFileName() + ":" + declNode.getLineno(); - compiler.report(JSError.make(n, CONST_REASSIGNED_VALUE_ERROR, name, declaredPosition)); + compiler.report(t.makeError(n, CONST_REASSIGNED_VALUE_ERROR, name, declaredPosition)); } } } diff --git a/src/com/google/javascript/jscomp/ConstParamCheck.java b/src/com/google/javascript/jscomp/ConstParamCheck.java index aef42bc1f90..0d41c373888 100644 --- a/src/com/google/javascript/jscomp/ConstParamCheck.java +++ b/src/com/google/javascript/jscomp/ConstParamCheck.java @@ -94,7 +94,7 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { if (name.matchesQualifiedName(CONST_FUNCTION_NAME) || name.matchesQualifiedName(CONST_FUNCTION_NAME_COLLAPSED)) { if (!isSafeValue(traversal.getScope(), argument)) { - compiler.report(JSError.make(argument, CONST_NOT_STRING_LITERAL_ERROR)); + compiler.report(traversal.makeError(argument, CONST_NOT_STRING_LITERAL_ERROR)); } } } diff --git a/src/com/google/javascript/jscomp/CreateSyntheticBlocks.java b/src/com/google/javascript/jscomp/CreateSyntheticBlocks.java index c5f919b254f..c65bb2516c7 100644 --- a/src/com/google/javascript/jscomp/CreateSyntheticBlocks.java +++ b/src/com/google/javascript/jscomp/CreateSyntheticBlocks.java @@ -140,7 +140,7 @@ private void moveSiblingExclusive(Node dest, Node start, Node end) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if (!n.isCall() || !n.getFirstChild().isName()) { return; } @@ -150,7 +150,7 @@ public void visit(NodeTraversal unused, Node n, Node parent) { if (startMarkerName.equals(callName)) { if (!parent.isExprResult()) { - compiler.report(JSError.make(n, INVALID_MARKER_USAGE, startMarkerName)); + compiler.report(t.makeError(n, INVALID_MARKER_USAGE, startMarkerName)); return; } markerStack.push(parent); @@ -163,19 +163,19 @@ public void visit(NodeTraversal unused, Node n, Node parent) { Node endMarkerNode = parent; if (!endMarkerNode.isExprResult()) { - compiler.report(JSError.make(n, INVALID_MARKER_USAGE, endMarkerName)); + compiler.report(t.makeError(n, INVALID_MARKER_USAGE, endMarkerName)); return; } if (markerStack.isEmpty()) { - compiler.report(JSError.make(n, UNMATCHED_END_MARKER, startMarkerName, endMarkerName)); + compiler.report(t.makeError(n, UNMATCHED_END_MARKER, startMarkerName, endMarkerName)); return; } Node startMarkerNode = markerStack.pop(); if (endMarkerNode.getParent() != startMarkerNode.getParent()) { // The end marker isn't in the same block as the start marker. - compiler.report(JSError.make(n, UNMATCHED_END_MARKER, startMarkerName, endMarkerName)); + compiler.report(t.makeError(n, UNMATCHED_END_MARKER, startMarkerName, endMarkerName)); return; } diff --git a/src/com/google/javascript/jscomp/Es6CheckModule.java b/src/com/google/javascript/jscomp/Es6CheckModule.java index f1e102eeda5..70734a38159 100644 --- a/src/com/google/javascript/jscomp/Es6CheckModule.java +++ b/src/com/google/javascript/jscomp/Es6CheckModule.java @@ -66,7 +66,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (nameNode != null && nameNode.isImportStar()) { // import * as M from ''; // M.x = 2; - compiler.report(JSError.make(n, IMPORT_CANNOT_BE_REASSIGNED, nameNode.getString())); + compiler.report(t.makeError(n, IMPORT_CANNOT_BE_REASSIGNED, nameNode.getString())); } } } @@ -80,7 +80,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (NodeUtil.isImportedName(nameNode)) { // import { x } from ''; // x = 2; - compiler.report(JSError.make(n, IMPORT_CANNOT_BE_REASSIGNED, nameNode.getString())); + compiler.report(t.makeError(n, IMPORT_CANNOT_BE_REASSIGNED, nameNode.getString())); } } } diff --git a/src/com/google/javascript/jscomp/Es6RewriteModules.java b/src/com/google/javascript/jscomp/Es6RewriteModules.java index 42836d28b96..41a321d7e5a 100644 --- a/src/com/google/javascript/jscomp/Es6RewriteModules.java +++ b/src/com/google/javascript/jscomp/Es6RewriteModules.java @@ -481,7 +481,7 @@ private void visitImport(NodeTraversal t, Node importDecl, Node parent) { // Namespace imports cannot be imported "as *". if (isNamespaceImport) { compiler.report( - JSError.make( + t.makeError( importDecl, NAMESPACE_IMPORT_CANNOT_USE_STAR, child.getString(), moduleName)); } maybeAddAliasToSymbolTable(child, t.getSourceName()); diff --git a/src/com/google/javascript/jscomp/FindExportableNodes.java b/src/com/google/javascript/jscomp/FindExportableNodes.java index 2e08ee33b55..57e0f387505 100644 --- a/src/com/google/javascript/jscomp/FindExportableNodes.java +++ b/src/com/google/javascript/jscomp/FindExportableNodes.java @@ -193,9 +193,9 @@ else if (!(n.isGetProp() && parent.isExprResult())) { // Don't produce extra warnings for functions values of object literals if (!n.isFunction() || !NodeUtil.mayBeObjectLitKey(parent)) { if (allowLocalExports) { - compiler.report(JSError.make(n, EXPORT_ANNOTATION_NOT_ALLOWED)); + compiler.report(t.makeError(n, EXPORT_ANNOTATION_NOT_ALLOWED)); } else { - compiler.report(JSError.make(n, NON_GLOBAL_ERROR)); + compiler.report(t.makeError(n, NON_GLOBAL_ERROR)); } } } diff --git a/src/com/google/javascript/jscomp/ImplicitNullabilityCheck.java b/src/com/google/javascript/jscomp/ImplicitNullabilityCheck.java index 4f832995060..cfc0c202484 100644 --- a/src/com/google/javascript/jscomp/ImplicitNullabilityCheck.java +++ b/src/com/google/javascript/jscomp/ImplicitNullabilityCheck.java @@ -121,11 +121,18 @@ public void visit(Node node) { } JSType type = registry.createTypeFromCommentNode(node); if (type.isNullable()) { - compiler.report(JSError.make(node, IMPLICITLY_NULLABLE_JSDOC, typeName)); + reportWarning(t, node, typeName); } } }, Predicates.alwaysTrue()); } } + + /** + * Reports an implicitly nullable name in JSDoc warning. + */ + void reportWarning(NodeTraversal t, Node n, String name) { + compiler.report(t.makeError(n, IMPLICITLY_NULLABLE_JSDOC, name)); + } } diff --git a/src/com/google/javascript/jscomp/J2clChecksPass.java b/src/com/google/javascript/jscomp/J2clChecksPass.java index 04f036e172b..a26b09f6f50 100644 --- a/src/com/google/javascript/jscomp/J2clChecksPass.java +++ b/src/com/google/javascript/jscomp/J2clChecksPass.java @@ -46,14 +46,17 @@ public class J2clChecksPass extends AbstractPostOrderCallback implements Compile } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { for (String typeName : REFERENCE_EQUALITY_TYPE_PATTERNS.keySet()) { - checkReferenceEquality(n, typeName, REFERENCE_EQUALITY_TYPE_PATTERNS.get(typeName)); + checkReferenceEquality(t, n, typeName, REFERENCE_EQUALITY_TYPE_PATTERNS.get(typeName)); } } - /** Reports an error if the node is a reference equality check of the specified type. */ - private void checkReferenceEquality(Node n, String typeName, String fileName) { + /** + * Reports an error if the node is a reference equality check of the specified type. + */ + private void checkReferenceEquality( + NodeTraversal t, Node n, String typeName, String fileName) { if (n.getToken() == Token.SHEQ || n.getToken() == Token.EQ || n.getToken() == Token.SHNE @@ -63,7 +66,7 @@ private void checkReferenceEquality(Node n, String typeName, String fileName) { boolean hasType = isType(firstJsType, fileName) || isType(lastJsType, fileName); boolean hasNullType = isNullType(firstJsType) || isNullType(lastJsType); if (hasType && !hasNullType) { - compiler.report(JSError.make(n, J2CL_REFERENCE_EQUALITY, typeName)); + compiler.report(t.makeError(n, J2CL_REFERENCE_EQUALITY, typeName)); } } } diff --git a/src/com/google/javascript/jscomp/JsMessageVisitor.java b/src/com/google/javascript/jscomp/JsMessageVisitor.java index 1c187457bf7..d8e31e74b8f 100644 --- a/src/com/google/javascript/jscomp/JsMessageVisitor.java +++ b/src/com/google/javascript/jscomp/JsMessageVisitor.java @@ -252,7 +252,8 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { } if (msgNode == null) { - compiler.report(JSError.make(node, MESSAGE_HAS_NO_VALUE, messageKey)); + compiler.report( + traversal.makeError(node, MESSAGE_HAS_NO_VALUE, messageKey)); return; } @@ -272,7 +273,8 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { } else if (style != JsMessage.Style.LEGACY) { // TODO(johnlenz): promote this to an error once existing conflicts have been // cleaned up. - compiler.report(JSError.make(node, MESSAGE_NOT_INITIALIZED_USING_NEW_SYNTAX)); + compiler.report(traversal.makeError(node, + MESSAGE_NOT_INITIALIZED_USING_NEW_SYNTAX)); if (style == JsMessage.Style.CLOSURE) { // Don't extract the message if we aren't accepting LEGACY messages return; @@ -299,7 +301,8 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { extractMessageFrom(builder, msgNode, node); } } catch (MalformedException ex) { - compiler.report(JSError.make(ex.getNode(), MESSAGE_TREE_MALFORMED, ex.getMessage())); + compiler.report(traversal.makeError(ex.getNode(), + MESSAGE_TREE_MALFORMED, ex.getMessage())); return; } @@ -316,7 +319,8 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { if (extractedMessage.isEmpty()) { // value of the message is an empty string. Translators do not like it. - compiler.report(JSError.make(node, MESSAGE_HAS_NO_TEXT, messageKey)); + compiler.report(traversal.makeError(node, MESSAGE_HAS_NO_TEXT, + messageKey)); } // New-style messages must have descriptions. We don't emit a warning @@ -327,7 +331,8 @@ public void visit(NodeTraversal traversal, Node node, Node parent) { if (isNewStyleMessage && (desc == null || desc.trim().isEmpty()) && !extractedMessage.isExternal()) { - compiler.report(JSError.make(node, MESSAGE_HAS_NO_DESCRIPTION, messageKey)); + compiler.report(traversal.makeError(node, MESSAGE_HAS_NO_DESCRIPTION, + messageKey)); } JsMessageDefinition msgDefinition = new JsMessageDefinition(msgNode); @@ -823,7 +828,7 @@ private void visitFallbackFunctionCall(NodeTraversal t, Node call) { if (call.getChildCount() != 3 || !call.getSecondChild().isName() || !call.getLastChild().isName()) { - compiler.report(JSError.make(call, BAD_FALLBACK_SYNTAX)); + compiler.report(t.makeError(call, BAD_FALLBACK_SYNTAX)); return; } @@ -834,7 +839,7 @@ private void visitFallbackFunctionCall(NodeTraversal t, Node call) { } JsMessage firstMessage = getTrackedMessage(t, name); if (firstMessage == null) { - compiler.report(JSError.make(firstArg, FALLBACK_ARG_ERROR, name)); + compiler.report(t.makeError(firstArg, FALLBACK_ARG_ERROR, name)); return; } @@ -845,7 +850,7 @@ private void visitFallbackFunctionCall(NodeTraversal t, Node call) { } JsMessage secondMessage = getTrackedMessage(t, name); if (secondMessage == null) { - compiler.report(JSError.make(secondArg, FALLBACK_ARG_ERROR, name)); + compiler.report(t.makeError(secondArg, FALLBACK_ARG_ERROR, name)); return; } diff --git a/src/com/google/javascript/jscomp/LineNumberCheck.java b/src/com/google/javascript/jscomp/LineNumberCheck.java index 92b50e9ad0f..9da8b5d1ac2 100644 --- a/src/com/google/javascript/jscomp/LineNumberCheck.java +++ b/src/com/google/javascript/jscomp/LineNumberCheck.java @@ -55,7 +55,7 @@ public void process(Node externs, Node root) { } @Override - public boolean shouldTraverse(NodeTraversal unused, Node n, Node parent) { + public boolean shouldTraverse(NodeTraversal t, Node n, Node parent) { // Each JavaScript file is rooted in a script node, so we'll only // have line number information inside the script node. if (n.isScript()) { @@ -65,14 +65,16 @@ public boolean shouldTraverse(NodeTraversal unused, Node n, Node parent) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if (n.isScript()) { requiresLineNumbers = false; } else if (requiresLineNumbers) { if (n.getLineno() == -1) { // The tree version of the node is really the best diagnostic // info we have to offer here. - compiler.report(JSError.make(n, MISSING_LINE_INFO, n.toStringTree())); + compiler.report( + t.makeError(n, MISSING_LINE_INFO, + n.toStringTree())); } } } diff --git a/src/com/google/javascript/jscomp/NodeTraversal.java b/src/com/google/javascript/jscomp/NodeTraversal.java index 89f73e70248..2a278942f5d 100644 --- a/src/com/google/javascript/jscomp/NodeTraversal.java +++ b/src/com/google/javascript/jscomp/NodeTraversal.java @@ -1403,6 +1403,29 @@ InputId getInputId() { return inputId; } + /** + * Creates a JSError during NodeTraversal. + * + * @param n Determines the line and char position within the source file name + * @param type The DiagnosticType + * @param arguments Arguments to be incorporated into the message + */ + public JSError makeError(Node n, CheckLevel level, DiagnosticType type, + String... arguments) { + return JSError.make(n, level, type, arguments); + } + + /** + * Creates a JSError during NodeTraversal. + * + * @param n Determines the line and char position within the source file name + * @param type The DiagnosticType + * @param arguments Arguments to be incorporated into the message + */ + public JSError makeError(Node n, DiagnosticType type, String... arguments) { + return JSError.make(n, type, arguments); + } + private String getBestSourceFileName(Node n) { return n == null ? sourceName : n.getSourceFileName(); } diff --git a/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java b/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java index 6a38c3d5d4c..9d41b31f036 100644 --- a/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java +++ b/src/com/google/javascript/jscomp/ProcessClosurePrimitives.java @@ -336,7 +336,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; case "forwardDeclare": if (validateAliasiablePrimitiveCall(t, n, methodName)) { - processForwardDeclare(n, parent); + processForwardDeclare(t, n, parent); } break; case "addDependency": @@ -345,13 +345,13 @@ public void visit(NodeTraversal t, Node n, Node parent) { } break; case "setCssNameMapping": - processSetCssNameMapping(n, parent); + processSetCssNameMapping(t, n, parent); break; default: // fall out } } else if (left.getLastChild().getString().equals("base")) { // maybe an "base" setup by goog.inherits - maybeProcessClassBaseCall(n); + maybeProcessClassBaseCall(t, n); } } break; @@ -359,7 +359,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case ASSIGN: case NAME: if (n.isName() && n.getString().equals("CLOSURE_DEFINES")) { - handleClosureDefinesValues(n); + handleClosureDefinesValues(t, n); } else { // If this is an assignment to a provided name, remove the provided // object. @@ -376,7 +376,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { String name = n.getFirstChild().getString(); ProvidedName pn = providedNames.get(name); if (pn != null) { - compiler.report(JSError.make(n, CLASS_NAMESPACE_ERROR, name)); + compiler.report(t.makeError(n, CLASS_NAMESPACE_ERROR, name)); } } break; @@ -388,7 +388,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { String name = n.getFirstChild().getString(); ProvidedName pn = providedNames.get(name); if (pn != null) { - compiler.report(JSError.make(n, FUNCTION_NAMESPACE_ERROR, name)); + compiler.report(t.makeError(n, FUNCTION_NAMESPACE_ERROR, name)); } } break; @@ -399,7 +399,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { && !parent.isAssign() && n.matchesQualifiedName("goog.base") && !n.getSourceFileName().endsWith("goog.js")) { - reportBadGoogBaseUse(n, "May only be called directly."); + reportBadGoogBaseUse(t, n, "May only be called directly."); } break; default: @@ -440,17 +440,17 @@ private boolean validatePrimitiveCallWithMessage( } if (!t.inGlobalHoistScope()) { - compiler.report(JSError.make(n, INVALID_CLOSURE_CALL_SCOPE_ERROR)); + compiler.report(t.makeError(n, INVALID_CLOSURE_CALL_SCOPE_ERROR)); return false; } else if (!n.getParent().isExprResult() && !"goog.define".equals(methodName)) { // If the call is in the global hoist scope, but the result is used - compiler.report(JSError.make(n, invalidAliasingError, GOOG + "." + methodName)); + compiler.report(t.makeError(n, invalidAliasingError, GOOG + "." + methodName)); return false; } return true; } - private void handleClosureDefinesValues(Node n) { + private void handleClosureDefinesValues(NodeTraversal t, Node n) { // var CLOSURE_DEFINES = {}; if (NodeUtil.isNameDeclaration(n.getParent()) && n.hasOneChild() @@ -463,7 +463,7 @@ private void handleClosureDefinesValues(Node n) { && isValidDefineValue(c.getFirstChild())) { builder.put(c.getString(), c.getFirstChild().cloneTree()); } else { - reportBadClosureCommonDefinesDefinition(c); + reportBadClosureCommonDefinesDefinition(t, c); } } compiler.setDefaultDefineValues(ImmutableMap.copyOf(builder)); @@ -489,7 +489,7 @@ private void processRequireCall(NodeTraversal t, Node n, Node parent) { Node left = n.getFirstChild(); Node arg = left.getNext(); String method = left.getFirstChild().getNext().getString(); - if (verifyLastArgumentIsString(left, arg)) { + if (verifyLastArgumentIsString(t, left, arg)) { String ns = arg.getString(); ProvidedName provided = providedNames.get(ns); if (provided == null || !provided.isExplicitlyProvided()) { @@ -508,8 +508,9 @@ private void processRequireCall(NodeTraversal t, Node n, Node parent) { && !moduleGraph.dependsOn(module, providedModule) && !method.equals("requireType")) { compiler.report( - JSError.make( - n, XMODULE_REQUIRE_ERROR, ns, providedModule.getName(), module.getName())); + t.makeError(n, XMODULE_REQUIRE_ERROR, ns, + providedModule.getName(), + module.getName())); } } } @@ -535,7 +536,7 @@ private void processProvideCall(NodeTraversal t, Node n, Node parent) { checkState(n.isCall()); Node left = n.getFirstChild(); Node arg = left.getNext(); - if (verifyProvide(left, arg)) { + if (verifyProvide(t, left, arg)) { String ns = arg.getString(); maybeAddToSymbolTable(left); @@ -547,7 +548,7 @@ private void processProvideCall(NodeTraversal t, Node n, Node parent) { previouslyProvided.addProvide(parent, t.getModule(), true); } else { String explicitSourceName = previouslyProvided.explicitNode.getSourceFileName(); - compiler.report(JSError.make(n, DUPLICATE_NAMESPACE_ERROR, ns, explicitSourceName)); + compiler.report(t.makeError(n, DUPLICATE_NAMESPACE_ERROR, ns, explicitSourceName)); } } else { registerAnyProvidedPrefixes(ns, parent, t.getModule()); @@ -663,20 +664,20 @@ private void processBaseClassCall(NodeTraversal t, Node n) { t.report(n, USE_OF_GOOG_BASE); if (baseUsedInClass(n)){ - reportBadGoogBaseUse(n, "goog.base in ES6 class is not allowed. Use super instead."); + reportBadGoogBaseUse(t, n, "goog.base in ES6 class is not allowed. Use super instead."); return; } Node callee = n.getFirstChild(); Node thisArg = callee.getNext(); if (thisArg == null || !thisArg.isThis()) { - reportBadGoogBaseUse(n, "First argument must be 'this'."); + reportBadGoogBaseUse(t, n, "First argument must be 'this'."); return; } Node enclosingFnNameNode = getEnclosingDeclNameNode(n); if (enclosingFnNameNode == null) { - reportBadGoogBaseUse(n, "Could not find enclosing method."); + reportBadGoogBaseUse(t, n, "Could not find enclosing method."); return; } @@ -698,7 +699,8 @@ private void processBaseClassCall(NodeTraversal t, Node n) { } if (baseClassNode == null) { - reportBadGoogBaseUse(n, "Could not find goog.inherits for base class"); + reportBadGoogBaseUse( + t, n, "Could not find goog.inherits for base class"); return; } @@ -712,14 +714,15 @@ private void processBaseClassCall(NodeTraversal t, Node n) { // Handle methods. Node methodNameNode = thisArg.getNext(); if (methodNameNode == null || !methodNameNode.isString()) { - reportBadGoogBaseUse(n, "Second argument must name a method."); + reportBadGoogBaseUse(t, n, "Second argument must name a method."); return; } String methodName = methodNameNode.getString(); String ending = ".prototype." + methodName; if (enclosingQname == null || !enclosingQname.endsWith(ending)) { - reportBadGoogBaseUse(n, "Enclosing method does not match " + methodName); + reportBadGoogBaseUse( + t, n, "Enclosing method does not match " + methodName); return; } @@ -737,7 +740,7 @@ private void processBaseClassCall(NodeTraversal t, Node n) { } } - private void maybeProcessClassBaseCall(Node n) { + private void maybeProcessClassBaseCall(NodeTraversal t, Node n) { // Two things must hold for every base call: // 1) We must be calling it on "this". // 2) We must be calling it on a prototype method of the same name as @@ -777,16 +780,14 @@ private void maybeProcessClassBaseCall(Node n) { if (enclosingFnNameNode == null || !enclosingFnNameNode.isUnscopedQualifiedName()) { // some unknown container method. if (knownClosureSubclasses.contains(baseContainer)) { - reportBadBaseMethodUse(n, baseContainer, "Could not find enclosing method."); + reportBadBaseMethodUse(t, n, baseContainer, "Could not find enclosing method."); } else if (baseUsedInClass(n)) { Node clazz = NodeUtil.getEnclosingClass(n); if ((clazz.getFirstChild().isName() && clazz.getFirstChild().getString().equals(baseContainer)) || (clazz.getSecondChild().isName() && clazz.getSecondChild().getString().equals(baseContainer))) { - reportBadBaseMethodUse( - n, - clazz.getFirstChild().getString(), + reportBadBaseMethodUse(t, n, clazz.getFirstChild().getString(), "base method is not allowed in ES6 class. Use super instead."); } } @@ -794,7 +795,7 @@ private void maybeProcessClassBaseCall(Node n) { } if (baseUsedInClass(n)) { - reportBadGoogBaseUse(n, "goog.base in ES6 class is not allowed. Use super instead."); + reportBadGoogBaseUse(t, n, "goog.base in ES6 class is not allowed. Use super instead."); return; } @@ -806,8 +807,8 @@ private void maybeProcessClassBaseCall(Node n) { if (!enclosingQname.equals(baseContainer)) { // Report misuse of "base" methods from other known classes. if (knownClosureSubclasses.contains(baseContainer)) { - reportBadBaseMethodUse( - n, baseContainer, "Must be used within " + baseContainer + " methods"); + reportBadBaseMethodUse(t, n, baseContainer, "Must be used within " + + baseContainer + " methods"); } return; } @@ -841,7 +842,8 @@ private void maybeProcessClassBaseCall(Node n) { Node callee = n.getFirstChild(); Node thisArg = callee.getNext(); if (thisArg == null || !thisArg.isThis()) { - reportBadBaseMethodUse(n, baseContainer, "First argument must be 'this'."); + reportBadBaseMethodUse(t, n, baseContainer, + "First argument must be 'this'."); return; } @@ -850,7 +852,8 @@ private void maybeProcessClassBaseCall(Node n) { if (methodNameNode == null || !methodNameNode.isString() || !methodNameNode.getString().equals("constructor")) { - reportBadBaseMethodUse(n, baseContainer, "Second argument must be 'constructor'."); + reportBadBaseMethodUse(t, n, baseContainer, + "Second argument must be 'constructor'."); return; } @@ -874,8 +877,8 @@ private void maybeProcessClassBaseCall(Node n) { getFirstFirstChild().matchesQualifiedName(baseContainer); if (misuseOfBase) { // Report misuse of "base" methods from other known classes. - reportBadBaseMethodUse( - n, baseContainer, "Must be used within " + baseContainer + " methods"); + reportBadBaseMethodUse(t, n, baseContainer, "Must be used within " + + baseContainer + " methods"); return; } @@ -883,21 +886,24 @@ private void maybeProcessClassBaseCall(Node n) { Node callee = n.getFirstChild(); Node thisArg = callee.getNext(); if (thisArg == null || !thisArg.isThis()) { - reportBadBaseMethodUse(n, baseContainer, "First argument must be 'this'."); + reportBadBaseMethodUse(t, n, baseContainer, + "First argument must be 'this'."); return; } // Handle methods. Node methodNameNode = thisArg.getNext(); if (methodNameNode == null || !methodNameNode.isString()) { - reportBadBaseMethodUse(n, baseContainer, "Second argument must name a method."); + reportBadBaseMethodUse(t, n, baseContainer, + "Second argument must name a method."); return; } String methodName = methodNameNode.getString(); String ending = ".prototype." + methodName; if (enclosingQname == null || !enclosingQname.endsWith(ending)) { - reportBadBaseMethodUse(n, baseContainer, "Enclosing method does not match " + methodName); + reportBadBaseMethodUse(t, n, baseContainer, + "Enclosing method does not match " + methodName); return; } @@ -948,18 +954,21 @@ private boolean baseUsedInClass(Node n){ } /** Reports an incorrect use of super-method calling. */ - private void reportBadGoogBaseUse(Node n, String extraMessage) { - compiler.report(JSError.make(n, GOOG_BASE_CLASS_ERROR, extraMessage)); + private void reportBadGoogBaseUse( + NodeTraversal t, Node n, String extraMessage) { + compiler.report(t.makeError(n, GOOG_BASE_CLASS_ERROR, extraMessage)); } /** Reports an incorrect use of super-method calling. */ - private void reportBadBaseMethodUse(Node n, String className, String extraMessage) { - compiler.report(JSError.make(n, BASE_CLASS_ERROR, className, extraMessage)); + private void reportBadBaseMethodUse( + NodeTraversal t, Node n, String className, String extraMessage) { + compiler.report(t.makeError(n, BASE_CLASS_ERROR, className, extraMessage)); } /** Reports an incorrect CLOSURE_DEFINES definition. */ - private void reportBadClosureCommonDefinesDefinition(Node n) { - compiler.report(JSError.make(n, CLOSURE_DEFINES_ERROR)); + private void reportBadClosureCommonDefinesDefinition( + NodeTraversal t, Node n) { + compiler.report(t.makeError(n, CLOSURE_DEFINES_ERROR)); } /** @@ -1005,16 +1014,16 @@ private void processProvideFromPreviousPass( } /** - * Processes a call to goog.setCssNameMapping(). Either the argument to goog.setCssNameMapping() - * is valid, in which case it will be used to create a CssRenamingMap for the compiler of this - * CompilerPass, or it is invalid and a JSCompiler error will be reported. - * + * Processes a call to goog.setCssNameMapping(). Either the argument to + * goog.setCssNameMapping() is valid, in which case it will be used to create + * a CssRenamingMap for the compiler of this CompilerPass, or it is invalid + * and a JSCompiler error will be reported. * @see #visit(NodeTraversal, Node, Node) */ - private void processSetCssNameMapping(Node n, Node parent) { + private void processSetCssNameMapping(NodeTraversal t, Node n, Node parent) { Node left = n.getFirstChild(); Node arg = left.getNext(); - if (verifySetCssNameMapping(left, arg)) { + if (verifySetCssNameMapping(t, left, arg)) { // Translate OBJECTLIT into SubstitutionMap. All keys and // values must be strings, or an error will be thrown. final Map cssNames = new HashMap<>(); @@ -1025,7 +1034,9 @@ private void processSetCssNameMapping(Node n, Node parent) { if (!key.isStringKey() || value == null || !value.isString()) { - compiler.report(JSError.make(n, NON_STRING_PASSED_TO_SET_CSS_NAME_MAPPING_ERROR)); + compiler.report( + t.makeError(n, + NON_STRING_PASSED_TO_SET_CSS_NAME_MAPPING_ERROR)); return; } cssNames.put(key.getString(), value.getString()); @@ -1040,7 +1051,8 @@ private void processSetCssNameMapping(Node n, Node parent) { try { style = CssRenamingMap.Style.valueOf(styleStr); } catch (IllegalArgumentException e) { - compiler.report(JSError.make(n, INVALID_STYLE_ERROR, styleStr)); + compiler.report( + t.makeError(n, INVALID_STYLE_ERROR, styleStr)); return; } @@ -1053,7 +1065,8 @@ private void processSetCssNameMapping(Node n, Node parent) { } } if (!errors.isEmpty()) { - compiler.report(JSError.make(n, INVALID_CSS_RENAMING_MAP, errors.toString())); + compiler.report( + t.makeError(n, INVALID_CSS_RENAMING_MAP, errors.toString())); } } else if (style == CssRenamingMap.Style.BY_WHOLE) { // Verifying things is a lot trickier here. We just do a quick @@ -1074,7 +1087,8 @@ private void processSetCssNameMapping(Node n, Node parent) { } } if (!errors.isEmpty()) { - compiler.report(JSError.make(n, INVALID_CSS_RENAMING_MAP, errors.toString())); + compiler.report( + t.makeError(n, INVALID_CSS_RENAMING_MAP, errors.toString())); } } @@ -1100,24 +1114,21 @@ public CssRenamingMap.Style getStyle() { } /** - * Verifies that a provide method call has exactly one argument, and that it's a string literal - * and that the contents of the string are valid JS tokens. Reports a compile error if it doesn't. + * Verifies that a provide method call has exactly one argument, + * and that it's a string literal and that the contents of the string are + * valid JS tokens. Reports a compile error if it doesn't. * * @return Whether the argument checked out okay */ - private boolean verifyProvide(Node methodName, Node arg) { - if (!verifyLastArgumentIsString(methodName, arg)) { + private boolean verifyProvide(NodeTraversal t, Node methodName, Node arg) { + if (!verifyLastArgumentIsString(t, methodName, arg)) { return false; } if (!NodeUtil.isValidQualifiedName( compiler.getOptions().getLanguageIn().toFeatureSet(), arg.getString())) { - compiler.report( - JSError.make( - arg, - INVALID_PROVIDE_ERROR, - arg.getString(), - compiler.getOptions().getLanguageIn().toString())); + compiler.report(t.makeError(arg, INVALID_PROVIDE_ERROR, + arg.getString(), compiler.getOptions().getLanguageIn().toString())); return false; } @@ -1135,7 +1146,7 @@ private boolean verifyDefine(NodeTraversal t, Node parent, Node methodName, Node // validate(Un)aliasablePrimitiveCall. // TODO(sdh): loosen this restriction if the results are assigned? if (!compiler.getOptions().shouldPreserveGoogModule() && !t.inGlobalHoistScope()) { - compiler.report(JSError.make(methodName.getParent(), INVALID_CLOSURE_CALL_SCOPE_ERROR)); + compiler.report(t.makeError(methodName.getParent(), INVALID_CLOSURE_CALL_SCOPE_ERROR)); return false; } @@ -1145,33 +1156,33 @@ private boolean verifyDefine(NodeTraversal t, Node parent, Node methodName, Node } else if (parent.isName() && NodeUtil.isNameDeclaration(parent.getParent())) { parent = parent.getParent(); } else if (!parent.isExprResult()) { - compiler.report(JSError.make(methodName.getParent(), INVALID_CLOSURE_CALL_SCOPE_ERROR)); + compiler.report(t.makeError(methodName.getParent(), INVALID_CLOSURE_CALL_SCOPE_ERROR)); return false; } // Verify first arg Node arg = args; - if (!verifyNotNull(methodName, arg) || !verifyOfType(methodName, arg, Token.STRING)) { + if (!verifyNotNull(t, methodName, arg) || !verifyOfType(t, methodName, arg, Token.STRING)) { return false; } // Verify second arg arg = arg.getNext(); if (!args.isFromExterns() - && (!verifyNotNull(methodName, arg) || !verifyIsLast(methodName, arg))) { + && (!verifyNotNull(t, methodName, arg) || !verifyIsLast(t, methodName, arg))) { return false; } String name = args.getString(); if (!NodeUtil.isValidQualifiedName( compiler.getOptions().getLanguageIn().toFeatureSet(), name)) { - compiler.report(JSError.make(args, INVALID_DEFINE_NAME_ERROR, name)); + compiler.report(t.makeError(args, INVALID_DEFINE_NAME_ERROR, name)); return false; } JSDocInfo info = (parent.isExprResult() ? parent.getFirstChild() : parent).getJSDocInfo(); if (info == null || !info.isDefine()) { - compiler.report(JSError.make(parent, MISSING_DEFINE_ANNOTATION)); + compiler.report(t.makeError(parent, MISSING_DEFINE_ANNOTATION)); return false; } return true; @@ -1200,8 +1211,11 @@ private void processAddDependency(Node n, Node parent) { compiler.reportChangeToEnclosingScope(emptyNode); } - /** Process a goog.forwardDeclare() call and record the specified forward declaration. */ - private void processForwardDeclare(Node n, Node parent) { + /** + * Process a goog.forwardDeclare() call and record the specified forward + * declaration. + */ + private void processForwardDeclare(NodeTraversal t, Node n, Node parent) { CodingConvention convention = compiler.getCodingConvention(); String typeDeclaration = null; @@ -1210,7 +1224,7 @@ private void processForwardDeclare(Node n, Node parent) { convention.identifyTypeDeclarationCall(n)); } catch (NullPointerException | NoSuchElementException | IllegalArgumentException e) { compiler.report( - JSError.make( + t.makeError( n, INVALID_FORWARD_DECLARE, "A single type could not identified for the goog.forwardDeclare statement")); @@ -1225,41 +1239,53 @@ private void processForwardDeclare(Node n, Node parent) { } /** - * Verifies that a method call has exactly one argument, and that it's a string literal. Reports a - * compile error if it doesn't. + * Verifies that a method call has exactly one argument, and that it's a + * string literal. Reports a compile error if it doesn't. * * @return Whether the argument checked out okay */ - private boolean verifyLastArgumentIsString(Node methodName, Node arg) { - return verifyNotNull(methodName, arg) - && verifyOfType(methodName, arg, Token.STRING) - && verifyIsLast(methodName, arg); + private boolean verifyLastArgumentIsString( + NodeTraversal t, Node methodName, Node arg) { + return verifyNotNull(t, methodName, arg) + && verifyOfType(t, methodName, arg, Token.STRING) + && verifyIsLast(t, methodName, arg); } - /** @return Whether the argument checked out okay */ - private boolean verifyNotNull(Node methodName, Node arg) { + /** + * @return Whether the argument checked out okay + */ + private boolean verifyNotNull(NodeTraversal t, Node methodName, Node arg) { if (arg == null) { - compiler.report(JSError.make(methodName, NULL_ARGUMENT_ERROR, methodName.getQualifiedName())); + compiler.report( + t.makeError(methodName, + NULL_ARGUMENT_ERROR, methodName.getQualifiedName())); return false; } return true; } - /** @return Whether the argument checked out okay */ - private boolean verifyOfType(Node methodName, Node arg, Token desiredType) { + /** + * @return Whether the argument checked out okay + */ + private boolean verifyOfType(NodeTraversal t, Node methodName, + Node arg, Token desiredType) { if (arg.getToken() != desiredType) { compiler.report( - JSError.make(methodName, INVALID_ARGUMENT_ERROR, methodName.getQualifiedName())); + t.makeError(methodName, + INVALID_ARGUMENT_ERROR, methodName.getQualifiedName())); return false; } return true; } - /** @return Whether the argument checked out okay */ - private boolean verifyIsLast(Node methodName, Node arg) { + /** + * @return Whether the argument checked out okay + */ + private boolean verifyIsLast(NodeTraversal t, Node methodName, Node arg) { if (arg.getNext() != null) { compiler.report( - JSError.make(methodName, TOO_MANY_ARGUMENTS_ERROR, methodName.getQualifiedName())); + t.makeError(methodName, + TOO_MANY_ARGUMENTS_ERROR, methodName.getQualifiedName())); return false; } return true; @@ -1270,7 +1296,8 @@ private boolean verifyIsLast(Node methodName, Node arg) { * * @return Whether the arguments checked out okay */ - private boolean verifySetCssNameMapping(Node methodName, Node firstArg) { + private boolean verifySetCssNameMapping(NodeTraversal t, Node methodName, + Node firstArg) { DiagnosticType diagnostic = null; if (firstArg == null) { diagnostic = NULL_ARGUMENT_ERROR; @@ -1285,7 +1312,9 @@ private boolean verifySetCssNameMapping(Node methodName, Node firstArg) { } } if (diagnostic != null) { - compiler.report(JSError.make(methodName, diagnostic, methodName.getQualifiedName())); + compiler.report( + t.makeError(methodName, + diagnostic, methodName.getQualifiedName())); return false; } return true; diff --git a/src/com/google/javascript/jscomp/ProcessCommonJSModules.java b/src/com/google/javascript/jscomp/ProcessCommonJSModules.java index b9b9ebe97e9..332601a8666 100644 --- a/src/com/google/javascript/jscomp/ProcessCommonJSModules.java +++ b/src/com/google/javascript/jscomp/ProcessCommonJSModules.java @@ -671,7 +671,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { } else if (!this.hasGoogProvideOrModule && (v == null || (v.getNameNode() == null && v.getNameNode().getFirstChild() != n))) { - errors.add(JSError.make(qNameRoot, SUSPICIOUS_EXPORTS_ASSIGNMENT)); + errors.add(t.makeError(qNameRoot, SUSPICIOUS_EXPORTS_ASSIGNMENT)); } } else { exports.add(new ExportInfo(n, t.getScope())); @@ -731,7 +731,7 @@ private void visitRequireCall(NodeTraversal t, Node require, Node parent) { private void visitRequireEnsureCall(NodeTraversal t, Node call) { if (call.getChildCount() != 3) { compiler.report( - JSError.make( + t.makeError( call, UNKNOWN_REQUIRE_ENSURE, "Expected the function to have 2 arguments but instead found {0}", @@ -742,7 +742,7 @@ private void visitRequireEnsureCall(NodeTraversal t, Node call) { Node dependencies = call.getSecondChild(); if (!dependencies.isArrayLit()) { compiler.report( - JSError.make( + t.makeError( dependencies, UNKNOWN_REQUIRE_ENSURE, "The first argument must be an array literal of string literals.")); @@ -752,7 +752,7 @@ private void visitRequireEnsureCall(NodeTraversal t, Node call) { for (Node dep : dependencies.children()) { if (!dep.isString()) { compiler.report( - JSError.make( + t.makeError( dep, UNKNOWN_REQUIRE_ENSURE, "The first argument must be an array literal of string literals.")); @@ -765,7 +765,7 @@ private void visitRequireEnsureCall(NodeTraversal t, Node call) { && callback.getSecondChild().getFirstChild().isName() && "require".equals(callback.getSecondChild().getFirstChild().getString()))) { compiler.report( - JSError.make( + t.makeError( callback, UNKNOWN_REQUIRE_ENSURE, "The second argument must be a function" diff --git a/src/com/google/javascript/jscomp/ProcessDefines.java b/src/com/google/javascript/jscomp/ProcessDefines.java index 7b2080bb37f..906b3452856 100644 --- a/src/com/google/javascript/jscomp/ProcessDefines.java +++ b/src/com/google/javascript/jscomp/ProcessDefines.java @@ -337,8 +337,8 @@ public void visit(NodeTraversal t, Node n, Node parent) { // For defines, it's an error if a simple name is assigned // before it's declared Node errNode = val == null ? valParent : val; - compiler.report(JSError.make(errNode, INVALID_DEFINE_INIT_ERROR, fullName)); - } else if (processDefineAssignment(fullName, val, valParent)) { + compiler.report(t.makeError(errNode, INVALID_DEFINE_INIT_ERROR, fullName)); + } else if (processDefineAssignment(t, fullName, val, valParent)) { // remove the assignment so that the variable is still declared, // but no longer assigned to a value, e.g., // DEF_FOO = 5; // becomes "5;" @@ -366,7 +366,8 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (!t.inGlobalScope() && n.getJSDocInfo() != null && n.getJSDocInfo().isDefine()) { // warn about @define annotations in local scopes - compiler.report(JSError.make(n, NON_GLOBAL_DEFINE_INIT_ERROR, "")); + compiler.report( + t.makeError(n, NON_GLOBAL_DEFINE_INIT_ERROR, "")); } if (lvalueToRemoveLater == n) { @@ -444,19 +445,22 @@ private boolean isAssignAllowed() { /** * Tracks the given define. * + * @param t The current traversal, for context. * @param name The full name for this define. * @param value The value assigned to the define. * @param valueParent The parent node of value. * @return Whether we should remove this assignment from the parse tree. */ - private boolean processDefineAssignment(String name, Node value, Node valueParent) { + private boolean processDefineAssignment(NodeTraversal t, + String name, Node value, Node valueParent) { boolean fromExterns = valueParent.isFromExterns(); if (!fromExterns && (value == null || !NodeUtil.isValidDefineValue(value, allDefines.keySet()))) { Node errNode = value == null ? valueParent : value; - compiler.report(JSError.make(errNode, INVALID_DEFINE_INIT_ERROR, name)); + compiler.report(t.makeError(errNode, INVALID_DEFINE_INIT_ERROR, name)); } else if (!isAssignAllowed()) { - compiler.report(JSError.make(valueParent, NON_GLOBAL_DEFINE_INIT_ERROR, name)); + compiler.report( + t.makeError(valueParent, NON_GLOBAL_DEFINE_INIT_ERROR, name)); } else { DefineInfo info = allDefines.get(name); if (info == null) { @@ -472,11 +476,8 @@ private boolean processDefineAssignment(String name, Node value, Node valueParen // The define was already initialized, and this is an unsafe // re-assignment. compiler.report( - JSError.make( - valueParent, - DEFINE_NOT_ASSIGNABLE_ERROR, - name, - info.getReasonWhyNotAssignable())); + t.makeError(valueParent, DEFINE_NOT_ASSIGNABLE_ERROR, + name, info.getReasonWhyNotAssignable())); } } diff --git a/src/com/google/javascript/jscomp/ProcessTweaks.java b/src/com/google/javascript/jscomp/ProcessTweaks.java index b12a10fc191..e705a8ff4a5 100644 --- a/src/com/google/javascript/jscomp/ProcessTweaks.java +++ b/src/com/google/javascript/jscomp/ProcessTweaks.java @@ -358,7 +358,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { // Ensure the first parameter (the tweak ID) is a string literal. Node tweakIdNode = n.getSecondChild(); if (!tweakIdNode.isString()) { - compiler.report(JSError.make(tweakIdNode, NON_LITERAL_TWEAK_ID_ERROR)); + compiler.report(t.makeError(tweakIdNode, NON_LITERAL_TWEAK_ID_ERROR)); return; } String tweakId = tweakIdNode.getString(); @@ -376,18 +376,20 @@ public void visit(NodeTraversal t, Node n, Node parent) { case REGISTER_STRING: // Ensure the ID contains only valid characters. if (!ID_MATCHER.matchesAllOf(tweakId)) { - compiler.report(JSError.make(tweakIdNode, INVALID_TWEAK_ID_ERROR)); + compiler.report(t.makeError(tweakIdNode, INVALID_TWEAK_ID_ERROR)); } // Ensure tweaks are registered in the global scope. if (!t.inGlobalHoistScope()) { - compiler.report(JSError.make(n, NON_GLOBAL_TWEAK_INIT_ERROR, tweakId)); + compiler.report( + t.makeError(n, NON_GLOBAL_TWEAK_INIT_ERROR, tweakId)); break; } // Ensure tweaks are registered only once. if (tweakInfo.isRegistered()) { - compiler.report(JSError.make(n, TWEAK_MULTIPLY_REGISTERED_ERROR, tweakId)); + compiler.report( + t.makeError(n, TWEAK_MULTIPLY_REGISTERED_ERROR, tweakId)); break; } @@ -398,12 +400,14 @@ public void visit(NodeTraversal t, Node n, Node parent) { case OVERRIDE_DEFAULT_VALUE: // Ensure tweaks overrides occur in the global scope. if (!t.inGlobalScope()) { - compiler.report(JSError.make(n, NON_GLOBAL_TWEAK_INIT_ERROR, tweakId)); + compiler.report( + t.makeError(n, NON_GLOBAL_TWEAK_INIT_ERROR, tweakId)); break; } // Ensure tweak overrides occur before the tweak is registered. if (tweakInfo.isRegistered()) { - compiler.report(JSError.make(n, TWEAK_OVERRIDE_AFTER_REGISTERED_ERROR, tweakId)); + compiler.report( + t.makeError(n, TWEAK_OVERRIDE_AFTER_REGISTERED_ERROR, tweakId)); break; } diff --git a/src/com/google/javascript/jscomp/ReplaceCssNames.java b/src/com/google/javascript/jscomp/ReplaceCssNames.java index b2399690574..7b651b12caa 100644 --- a/src/com/google/javascript/jscomp/ReplaceCssNames.java +++ b/src/com/google/javascript/jscomp/ReplaceCssNames.java @@ -155,13 +155,13 @@ public void visit(NodeTraversal t, Node n, Node parent) { case 2: // Replace the function call with the processed argument. if (first.isString()) { - processStringNode(first); + processStringNode(t, first); n.removeChild(first); parent.replaceChild(n, first); t.reportCodeChange(); } else { compiler.report( - JSError.make(n, STRING_LITERAL_EXPECTED_ERROR, first.getToken().toString())); + t.makeError(n, STRING_LITERAL_EXPECTED_ERROR, first.getToken().toString())); } break; @@ -173,13 +173,13 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (!second.isString()) { compiler.report( - JSError.make(n, STRING_LITERAL_EXPECTED_ERROR, second.getToken().toString())); + t.makeError(n, STRING_LITERAL_EXPECTED_ERROR, second.getToken().toString())); } else if (first.isString()) { - compiler.report( - JSError.make( - n, UNEXPECTED_STRING_LITERAL_ERROR, first.getString(), second.getString())); + compiler.report(t.makeError( + n, UNEXPECTED_STRING_LITERAL_ERROR, + first.getString(), second.getString())); } else { - processStringNode(second); + processStringNode(t, second); n.removeChild(first); Node replacement = IR.add(first, IR.string("-" + second.getString()) @@ -192,21 +192,24 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; default: - compiler.report(JSError.make(n, INVALID_NUM_ARGUMENTS_ERROR, String.valueOf(count))); + compiler.report(t.makeError( + n, INVALID_NUM_ARGUMENTS_ERROR, String.valueOf(count))); } } } /** - * Processes a string argument to goog.getCssName(). The string will be renamed based off the - * symbol map. If there is no map or any part of the name can't be renamed, a warning is - * reported to the compiler and the node is left unchanged. + * Processes a string argument to goog.getCssName(). The string will be + * renamed based off the symbol map. If there is no map or any part of the + * name can't be renamed, a warning is reported to the compiler and the node + * is left unchanged. * - *

If the type is unexpected then an error is reported to the compiler. + * If the type is unexpected then an error is reported to the compiler. * + * @param t The node traversal. * @param n The string node to process. */ - private void processStringNode(Node n) { + private void processStringNode(NodeTraversal t, Node n) { String name = n.getString(); if (whitelist != null && whitelist.contains(name)) { // We apply the whitelist before splitting on dashes, and not after. @@ -220,7 +223,8 @@ private void processStringNode(Node n) { case BY_WHOLE: replacement = symbolMap.get(name); if (replacement == null) { - compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, name, name)); + compiler.report( + t.makeError(n, UNKNOWN_SYMBOL_WARNING, name, name)); return; } break; @@ -230,7 +234,8 @@ private void processStringNode(Node n) { String part = symbolMap.get(parts[i]); if (part == null) { // If we can't encode all parts, don't encode any of it. - compiler.report(JSError.make(n, UNKNOWN_SYMBOL_WARNING, parts[i], name)); + compiler.report( + t.makeError(n, UNKNOWN_SYMBOL_WARNING, parts[i], name)); return; } replaced[i] = part; diff --git a/src/com/google/javascript/jscomp/ReplaceIdGenerators.java b/src/com/google/javascript/jscomp/ReplaceIdGenerators.java index 0a882d9bf7e..9f4f6e5d069 100644 --- a/src/com/google/javascript/jscomp/ReplaceIdGenerators.java +++ b/src/com/google/javascript/jscomp/ReplaceIdGenerators.java @@ -259,7 +259,7 @@ private static NameSupplier createNameSupplier( private class GatherGenerators extends AbstractPostOrderCallback { @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { JSDocInfo doc = n.getJSDocInfo(); if (doc == null) { return; @@ -275,7 +275,7 @@ public void visit(NodeTraversal unused, Node n, Node parent) { if (numGeneratorAnnotations == 0) { return; } else if (numGeneratorAnnotations > 1) { - compiler.report(JSError.make(n, CONFLICTING_GENERATOR_TYPE)); + compiler.report(t.makeError(n, CONFLICTING_GENERATOR_TYPE)); } String name = null; @@ -311,7 +311,7 @@ name, createNameSupplier( NameSupplier supplier = nameGenerators.get(name); if (supplier == null || supplier.getRenameStrategy() != RenameStrategy.MAPPED) { - compiler.report(JSError.make(n, MISSING_NAME_MAP_FOR_GENERATOR)); + compiler.report(t.makeError(n, MISSING_NAME_MAP_FOR_GENERATOR)); // skip registering the name in the list of Generators if there no // mapping. return; @@ -347,7 +347,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (!t.inGlobalHoistScope() && nameGenerator.getRenameStrategy() == RenameStrategy.INCONSISTENT) { // Warn about calls not in the global scope. - compiler.report(JSError.make(n, NON_GLOBAL_ID_GENERATOR_CALL)); + compiler.report(t.makeError(n, NON_GLOBAL_ID_GENERATOR_CALL)); return; } @@ -355,7 +355,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { for (Node ancestor : n.getAncestors()) { if (NodeUtil.isControlStructure(ancestor)) { // Warn about conditional calls. - compiler.report(JSError.make(n, CONDITIONAL_ID_GENERATOR_CALL)); + compiler.report(t.makeError(n, CONDITIONAL_ID_GENERATOR_CALL)); return; } } @@ -363,7 +363,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { Node arg = n.getSecondChild(); if (arg == null) { - compiler.report(JSError.make(n, INVALID_GENERATOR_PARAMETER)); + compiler.report(t.makeError(n, INVALID_GENERATOR_PARAMETER)); } else if (arg.isString()) { String rename = getObfuscatedName( arg, callName, nameGenerator, arg.getString()); @@ -372,11 +372,11 @@ public void visit(NodeTraversal t, Node n, Node parent) { } else if (arg.isObjectLit()) { for (Node key : arg.children()) { if (key.isMemberFunctionDef()) { - compiler.report(JSError.make(n, SHORTHAND_FUNCTION_NOT_SUPPORTED_IN_ID_GEN)); + compiler.report(t.makeError(n, SHORTHAND_FUNCTION_NOT_SUPPORTED_IN_ID_GEN)); return; } if (key.isComputedProp()) { - compiler.report(JSError.make(n, COMPUTED_PROP_NOT_SUPPORTED_IN_ID_GEN)); + compiler.report(t.makeError(n, COMPUTED_PROP_NOT_SUPPORTED_IN_ID_GEN)); return; } @@ -390,7 +390,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { parent.replaceChild(n, arg); t.reportCodeChange(); } else { - compiler.report(JSError.make(n, INVALID_GENERATOR_PARAMETER)); + compiler.report(t.makeError(n, INVALID_GENERATOR_PARAMETER)); } } diff --git a/src/com/google/javascript/jscomp/RewriteClosureImports.java b/src/com/google/javascript/jscomp/RewriteClosureImports.java index ba9f404787b..c287544f07a 100644 --- a/src/com/google/javascript/jscomp/RewriteClosureImports.java +++ b/src/com/google/javascript/jscomp/RewriteClosureImports.java @@ -325,7 +325,7 @@ private void visitForwardDeclare( typeDeclaration = Iterables.getOnlyElement(convention.identifyTypeDeclarationCall(n)); } catch (NullPointerException | NoSuchElementException | IllegalArgumentException e) { compiler.report( - JSError.make( + t.makeError( n, INVALID_FORWARD_DECLARE, "A single type could not identified for the goog.forwardDeclare statement")); diff --git a/src/com/google/javascript/jscomp/RewriteJsonToModule.java b/src/com/google/javascript/jscomp/RewriteJsonToModule.java index 925a52a18f3..3d8d05bf940 100644 --- a/src/com/google/javascript/jscomp/RewriteJsonToModule.java +++ b/src/com/google/javascript/jscomp/RewriteJsonToModule.java @@ -70,7 +70,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { switch (n.getToken()) { case SCRIPT: if (!n.hasOneChild()) { - compiler.report(JSError.make(n, JSON_UNEXPECTED_TOKEN)); + compiler.report(t.makeError(n, JSON_UNEXPECTED_TOKEN)); } else { visitScript(t, n); } @@ -87,18 +87,18 @@ public void visit(NodeTraversal t, Node n, Node parent) { case STRING_KEY: if (!n.isQuotedString() || !n.hasOneChild()) { - compiler.report(JSError.make(n, JSON_UNEXPECTED_TOKEN)); + compiler.report(t.makeError(n, JSON_UNEXPECTED_TOKEN)); } break; case EXPR_RESULT: if (!parent.isScript()) { - compiler.report(JSError.make(n, JSON_UNEXPECTED_TOKEN)); + compiler.report(t.makeError(n, JSON_UNEXPECTED_TOKEN)); } break; default: - compiler.report(JSError.make(n, JSON_UNEXPECTED_TOKEN)); + compiler.report(t.makeError(n, JSON_UNEXPECTED_TOKEN)); break; } @@ -119,7 +119,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { */ private void visitScript(NodeTraversal t, Node n) { if (!n.hasOneChild() || !n.getFirstChild().isExprResult()) { - compiler.report(JSError.make(n, JSON_UNEXPECTED_TOKEN)); + compiler.report(t.makeError(n, JSON_UNEXPECTED_TOKEN)); return; } diff --git a/src/com/google/javascript/jscomp/ScopedAliases.java b/src/com/google/javascript/jscomp/ScopedAliases.java index f548667db6c..938c2d28884 100644 --- a/src/com/google/javascript/jscomp/ScopedAliases.java +++ b/src/com/google/javascript/jscomp/ScopedAliases.java @@ -404,14 +404,14 @@ public void enterScope(NodeTraversal t) { if (inGoogScopeBody()) { Scope hoistedScope = t.getClosestHoistScope().untyped(); if (isGoogScopeFunctionBody(hoistedScope.getRootNode())) { - findAliases(hoistedScope); + findAliases(t, hoistedScope); } } Node scopeMethodCall = findScopeMethodCall(t.getScopeRoot()); if (scopeMethodCall != null) { transformation = transformationHandler.logAliasTransformation( scopeMethodCall.getSourceFileName(), getSourceRegion(scopeMethodCall)); - findAliases(t.getScope()); + findAliases(t, t.getScope()); scopeFunctionBody = scopeMethodCall.getLastChild().getLastChild(); } } @@ -444,7 +444,7 @@ private void reportInvalidVariables(NodeTraversal t) { // Disallow block-scoped function declarations that leak into the goog.scope // function body. Technically they shouldn't leak in ES6 but the browsers don't agree // on that yet. - report(v.getNode(), GOOG_SCOPE_INVALID_VARIABLE, v.getName()); + report(t, v.getNode(), GOOG_SCOPE_INVALID_VARIABLE, v.getName()); } } } @@ -467,12 +467,13 @@ private SourcePosition getSourceRegion(Node n) { return pos; } - private void report(Node n, DiagnosticType error, String... arguments) { - compiler.report(JSError.make(n, error, arguments)); + private void report(NodeTraversal t, Node n, DiagnosticType error, + String... arguments) { + compiler.report(t.makeError(n, error, arguments)); hasErrors = true; } - private void findAliases(Scope scope) { + private void findAliases(NodeTraversal t, Scope scope) { for (Var v : scope.getVarIterable()) { Node n = v.getNode(); Node parent = n.getParent(); @@ -581,7 +582,7 @@ private void findAliases(Scope scope) { recordAlias(v); } else { // Do not other kinds of local symbols, like catch params. - report(n, GOOG_SCOPE_NON_ALIAS_LOCAL, n.getString()); + report(t, n, GOOG_SCOPE_NON_ALIAS_LOCAL, n.getString()); } } } @@ -663,21 +664,21 @@ private void validateScopeCall(NodeTraversal t, Node n, Node parent) { preprocessorSymbolTable.addReference(n.getFirstChild()); } if (!parent.isExprResult()) { - report(n, GOOG_SCOPE_MUST_BE_ALONE); + report(t, n, GOOG_SCOPE_MUST_BE_ALONE); } if (t.getEnclosingFunction() != null) { - report(n, GOOG_SCOPE_MUST_BE_IN_GLOBAL_SCOPE); + report(t, n, GOOG_SCOPE_MUST_BE_IN_GLOBAL_SCOPE); } if (!n.hasTwoChildren()) { // The goog.scope call should have exactly 1 parameter. The first // child is the "goog.scope" and the second should be the parameter. - report(n, GOOG_SCOPE_HAS_BAD_PARAMETERS); + report(t, n, GOOG_SCOPE_HAS_BAD_PARAMETERS); } else { Node anonymousFnNode = n.getSecondChild(); if (!anonymousFnNode.isFunction() || NodeUtil.getName(anonymousFnNode) != null || NodeUtil.getFunctionParameters(anonymousFnNode).hasChildren()) { - report(anonymousFnNode, GOOG_SCOPE_HAS_BAD_PARAMETERS); + report(t, anonymousFnNode, GOOG_SCOPE_HAS_BAD_PARAMETERS); } else { scopeCalls.add(n); } @@ -718,16 +719,16 @@ public void visit(NodeTraversal t, Node n, Node parent) { // twice. return; } else { - report(n, GOOG_SCOPE_ALIAS_REDEFINED, n.getString()); + report(t, n, GOOG_SCOPE_ALIAS_REDEFINED, n.getString()); } } if (type == Token.RETURN) { - report(n, GOOG_SCOPE_USES_RETURN); + report(t, n, GOOG_SCOPE_USES_RETURN); } else if (type == Token.THIS) { - report(n, GOOG_SCOPE_REFERENCES_THIS); + report(t, n, GOOG_SCOPE_REFERENCES_THIS); } else if (type == Token.THROW) { - report(n, GOOG_SCOPE_USES_THROW); + report(t, n, GOOG_SCOPE_USES_THROW); } } diff --git a/src/com/google/javascript/jscomp/TypeCheck.java b/src/com/google/javascript/jscomp/TypeCheck.java index b053db7a0a6..328a2e31882 100644 --- a/src/com/google/javascript/jscomp/TypeCheck.java +++ b/src/com/google/javascript/jscomp/TypeCheck.java @@ -461,8 +461,9 @@ void check(Node node, boolean externs) { } } - private void report(Node n, DiagnosticType diagnosticType, String... arguments) { - compiler.report(JSError.make(n, diagnosticType, arguments)); + private void report(NodeTraversal t, Node n, DiagnosticType diagnosticType, + String... arguments) { + t.report(n, diagnosticType, arguments); } @Override @@ -491,7 +492,7 @@ public boolean shouldTraverse(NodeTraversal t, Node n, Node parent) { // redeclarations of built-in types generates spurious warnings. && !(var.getType() instanceof FunctionType) && !TypeValidator.hasDuplicateDeclarationSuppression(compiler, var.getNameNode())) { - report(n, FUNCTION_MASKS_VARIABLE, var.getName()); + report(t, n, FUNCTION_MASKS_VARIABLE, var.getName()); } // TODO(user): Only traverse the function's body. The function's @@ -556,6 +557,10 @@ public void visit(NodeTraversal t, Node n, Node parent) { ensureTyped(n, t.getTypedScope().getTypeOfThis()); break; + case SUPER: + ensureTyped(n); + break; + case NULL: ensureTyped(n, NULL_TYPE); break; @@ -598,7 +603,11 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; case NEW: - visitNew(n); + visitNew(t, n); + break; + + case NEW_TARGET: + ensureTyped(n); break; case CALL: @@ -615,8 +624,6 @@ public void visit(NodeTraversal t, Node n, Node parent) { visitYield(t, n); break; - case SUPER: - case NEW_TARGET: case AWAIT: ensureTyped(n); break; @@ -624,7 +631,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case DEC: case INC: left = n.getFirstChild(); - checkPropCreation(left); + checkPropCreation(t, left); validator.expectNumber(left, getJSType(left), "increment/decrement"); ensureTyped(n, NUMBER_TYPE); break; @@ -635,20 +642,23 @@ public void visit(NodeTraversal t, Node n, Node parent) { case STRING: case TYPEOF: + ensureTyped(n, STRING_TYPE); + break; + case TEMPLATELIT: case TEMPLATELIT_STRING: ensureTyped(n, STRING_TYPE); break; case TAGGED_TEMPLATELIT: - visitTaggedTemplateLit(n); + visitTaggedTemplateLit(t, n); ensureTyped(n); break; case BITNOT: childType = getJSType(n.getFirstChild()); if (!childType.matchesNumberContext()) { - report(n, BIT_OPERATION, NodeUtil.opToStr(n.getToken()), childType.toString()); + report(t, n, BIT_OPERATION, NodeUtil.opToStr(n.getToken()), childType.toString()); } else { this.validator.expectNumberStrict(n, childType, "bitwise NOT"); } @@ -711,6 +721,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (result != TernaryValue.UNKNOWN) { report( + t, n, DETERMINISTIC_TEST, leftType.toString(), @@ -766,7 +777,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { validator.expectStringOrSymbol(left, getJSType(left), "left side of 'in'"); validator.expectObject(n, rightType, "'in' requires an object"); if (rightType.isStruct()) { - report(right, IN_USED_WITH_STRUCT); + report(t, right, IN_USED_WITH_STRUCT); } ensureTyped(n, BOOLEAN_TYPE); break; @@ -797,7 +808,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case ASSIGN_ADD: case ASSIGN_MUL: case ASSIGN_EXPONENT: - checkPropCreation(n.getFirstChild()); + checkPropCreation(t, n.getFirstChild()); // fall through case LSH: @@ -812,7 +823,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case ADD: case MUL: case EXPONENT: - visitBinaryOperator(n.getToken(), n); + visitBinaryOperator(n.getToken(), t, n); break; case TRUE: @@ -838,11 +849,11 @@ public void visit(NodeTraversal t, Node n, Node parent) { } case FUNCTION: - visitFunction(n); + visitFunction(t, n); break; case CLASS: - visitClass(n); + visitClass(t, n); break; // These nodes have no interesting type behavior. @@ -883,7 +894,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; case OBJECT_PATTERN: - visitObjectPattern(n); + visitObjectPattern(t, n); break; case DEFAULT_VALUE: @@ -915,7 +926,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case CLASS_MEMBERS: { JSType typ = parent.getJSType().toMaybeFunctionType().getInstanceType(); for (Node child = n.getFirstChild(); child != null; child = child.getNext()) { - visitObjectOrClassLiteralKey(child, n.getParent(), typ); + visitObjectOrClassLiteralKey(t, child, n.getParent(), typ); } typeable = false; break; @@ -924,7 +935,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { case FOR_IN: Node obj = n.getSecondChild(); if (getJSType(obj).isStruct()) { - report(obj, IN_USED_WITH_STRUCT); + report(t, obj, IN_USED_WITH_STRUCT); } typeable = false; break; @@ -944,7 +955,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { ensureTyped(n); } else { // If this is an enum, then give that type to the objectlit as well. - if (n.isObjectLit() && (parent.getJSType() instanceof EnumType)) { + if ((n.isObjectLit()) && (parent.getJSType() instanceof EnumType)) { ensureTyped(n, parent.getJSType()); } else { ensureTyped(n); @@ -953,7 +964,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { if (n.isObjectLit()) { JSType typ = getJSType(n); for (Node key : n.children()) { - visitObjectOrClassLiteralKey(key, n, typ); + visitObjectOrClassLiteralKey(t, key, n, typ); } } break; @@ -964,7 +975,7 @@ public void visit(NodeTraversal t, Node n, Node parent) { break; default: - report(n, UNEXPECTED_TOKEN, n.getToken().toString()); + report(t, n, UNEXPECTED_TOKEN, n.getToken().toString()); ensureTyped(n); break; } @@ -986,10 +997,10 @@ public void visit(NodeTraversal t, Node n, Node parent) { typeable = typeable && !inExterns; if (typeable) { - doPercentTypedAccounting(n); + doPercentTypedAccounting(t, n); } - checkJsdocInfoContainsObjectWithBadKey(n); + checkJsdocInfoContainsObjectWithBadKey(t, n); } private void checkSpread(Node spreadNode) { @@ -1020,16 +1031,15 @@ private void checkTypeofString(Node n, String s) { /** * Counts the given node in the typed statistics. - * * @param n a node that should be typed */ - private void doPercentTypedAccounting(Node n) { + private void doPercentTypedAccounting(NodeTraversal t, Node n) { JSType type = n.getJSType(); if (type == null) { nullCount++; } else if (type.isUnknownType()) { if (reportUnknownTypes) { - compiler.report(JSError.make(n, UNKNOWN_EXPR_TYPE)); + compiler.report(t.makeError(n, UNKNOWN_EXPR_TYPE)); } unknownCount++; } else { @@ -1118,12 +1128,12 @@ private void checkCanAssignToNameGetpropOrGetelem( if (object.isGetProp()) { JSType jsType = getJSType(object.getFirstChild()); if (jsType.isInterface() && object.getLastChild().getString().equals("prototype")) { - visitInterfacePropertyAssignment(object, lvalue); + visitInterfacePropertyAssignment(t, object, lvalue); } } checkEnumAlias(t, info, rightType, nodeToWarn); - checkPropCreation(lvalue); + checkPropCreation(t, lvalue); // Prototype assignments are special, because they actually affect // the definition of a class. These are mostly validated @@ -1141,7 +1151,7 @@ private void checkCanAssignToNameGetpropOrGetelem( JSType expectedPropertyType = getPropertyTypeIfDeclared(objectCastType, pname); checkPropertyInheritanceOnGetpropAssign( - nodeToWarn, object, pname, info, expectedPropertyType); + t, nodeToWarn, object, pname, info, expectedPropertyType); // If we successfully found a non-unknown declared type, validate the assignment and don't do // any further checks. @@ -1186,7 +1196,7 @@ private void checkCanAssignToNameGetpropOrGetelem( validator.expectCanAssignTo(nodeToWarn, rightType, leftType, msg); } - private void checkPropCreation(Node lvalue) { + private void checkPropCreation(NodeTraversal t, Node lvalue) { if (lvalue.isGetProp()) { JSType objType = getJSType(lvalue.getFirstChild()); if (!objType.isEmptyType() && !objType.isUnknownType()) { @@ -1195,7 +1205,7 @@ private void checkPropCreation(Node lvalue) { PropDefinitionKind kind = typeRegistry.canPropertyBeDefined(objType, propName); if (!kind.equals(PropDefinitionKind.KNOWN)) { if (objType.isStruct()) { - report(prop, ILLEGAL_PROPERTY_CREATION); + report(t, prop, ILLEGAL_PROPERTY_CREATION); } else { // null checks are reported elsewhere if (!objType.isNoType() && !objType.isUnknownType() @@ -1204,7 +1214,7 @@ private void checkPropCreation(Node lvalue) { } reportMissingProperty( - lvalue.getFirstChild(), objType, lvalue.getSecondChild(), kind, true); + lvalue.getFirstChild(), objType, lvalue.getSecondChild(), kind, t, true); } } } @@ -1212,7 +1222,8 @@ private void checkPropCreation(Node lvalue) { } private void checkPropertyInheritanceOnGetpropAssign( - Node assign, Node object, String property, JSDocInfo info, JSType propertyType) { + NodeTraversal t, Node assign, Node object, String property, + JSDocInfo info, JSType propertyType) { // Inheritance checks for prototype properties. // // TODO(nicksantos): This isn't the right place to do this check. We @@ -1233,8 +1244,9 @@ private void checkPropertyInheritanceOnGetpropAssign( if (jsType.isFunctionType()) { FunctionType functionType = jsType.toMaybeFunctionType(); if (functionType.isConstructor() || functionType.isInterface()) { - checkDeclaredPropertyInheritance(assign, functionType, property, info, propertyType); - checkAbstractMethodInConcreteClass(assign, functionType, info); + checkDeclaredPropertyInheritance( + t, assign, functionType, property, info, propertyType); + checkAbstractMethodInConcreteClass(t, assign, functionType, info); } } } @@ -1242,7 +1254,7 @@ private void checkPropertyInheritanceOnGetpropAssign( } private void checkPropertyInheritanceOnPrototypeLitKey( - Node key, String propertyName, ObjectType type) { + NodeTraversal t, Node key, String propertyName, ObjectType type) { // Inheritance checks for prototype objlit properties. // // TODO(nicksantos): This isn't the right place to do this check. We @@ -1254,11 +1266,11 @@ private void checkPropertyInheritanceOnPrototypeLitKey( // As-is, this misses many other ways to override a property. // // object.prototype = { key: function() {} }; - checkPropertyInheritance(key, propertyName, type.getOwnerFunction(), type); + checkPropertyInheritance(t, key, propertyName, type.getOwnerFunction(), type); } private void checkPropertyInheritanceOnClassMember( - Node key, String propertyName, FunctionType ctorType) { + NodeTraversal t, Node key, String propertyName, FunctionType ctorType) { if (key.isStaticMember()) { // TODO(sdh): Handle static members later - will probably need to add an extra boolean // parameter to checkDeclaredPropertyInheritance, as well as an extra case to getprop @@ -1267,18 +1279,15 @@ private void checkPropertyInheritanceOnClassMember( return; } ObjectType owner = key.isStaticMember() ? ctorType : ctorType.getInstanceType(); - checkPropertyInheritance(key, propertyName, ctorType, owner); + checkPropertyInheritance(t, key, propertyName, ctorType, owner); } private void checkPropertyInheritance( - Node key, String propertyName, FunctionType ctorType, ObjectType type) { + NodeTraversal t, Node key, String propertyName, FunctionType ctorType, ObjectType type) { if (ctorType != null && (ctorType.isConstructor() || ctorType.isInterface())) { checkDeclaredPropertyInheritance( - key.getFirstChild(), - ctorType, - propertyName, - key.getJSDocInfo(), - type.getPropertyType(propertyName)); + t, key.getFirstChild(), ctorType, propertyName, + key.getJSDocInfo(), type.getPropertyType(propertyName)); } } @@ -1288,7 +1297,7 @@ private void checkPropertyInheritance( *

Validating the types assigned to any lhs nodes in the pattern is done at the ASSIGN/VAR/ * PARAM_LIST/etc. node */ - private void visitObjectPattern(Node pattern) { + private void visitObjectPattern(NodeTraversal t, Node pattern) { JSType patternType = getJSType(pattern); validator.expectObject(pattern, patternType, "cannot destructure 'null' or 'undefined'"); for (Node child : pattern.children()) { @@ -1302,14 +1311,14 @@ private void visitObjectPattern(Node pattern) { Node stringKey = target.getStringKey(); if (!stringKey.isQuotedString()) { if (patternType.isDict()) { - report(stringKey, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "unquoted", "dict"); + report(t, stringKey, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "unquoted", "dict"); } // check for missing properties given `const {a} = obj;` but not `const {'a': a} = obj;` checkPropertyAccessForDestructuring( - pattern, patternType, stringKey, getJSType(target.getNode())); + t, pattern, patternType, stringKey, getJSType(target.getNode())); } else if (patternType.isStruct()) { // check that we are not accessing a struct with a quoted string - report(stringKey, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "quoted", "struct"); + report(t, stringKey, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "quoted", "struct"); } } } @@ -1326,7 +1335,8 @@ private void visitObjectPattern(Node pattern) { * @param owner the parent node, either OBJECTLIT or CLASS_MEMBERS * @param ownerType the instance type of the enclosing object/class */ - private void visitObjectOrClassLiteralKey(Node key, Node owner, JSType ownerType) { + private void visitObjectOrClassLiteralKey( + NodeTraversal t, Node key, Node owner, JSType ownerType) { // Semicolons in a CLASS_MEMBERS body will produce EMPTY nodes: skip them. if (key.isEmpty()) { return; @@ -1351,7 +1361,7 @@ private void visitObjectOrClassLiteralKey(Node key, Node owner, JSType ownerType // properties, getters, and setters. // See also https://github.com/google/closure-compiler/issues/3071 if (ownerType.isStruct()) { - report(key, owner.isClass() ? ILLEGAL_CLASS_KEY : ILLEGAL_OBJLIT_KEY, "struct"); + report(t, key, owner.isClass() ? ILLEGAL_CLASS_KEY : ILLEGAL_OBJLIT_KEY, "struct"); } } else { // we have either a non-quoted string or a member function def @@ -1359,7 +1369,7 @@ private void visitObjectOrClassLiteralKey(Node key, Node owner, JSType ownerType if (ownerType.isDict() && !NodeUtil.isEs6ConstructorMemberFunctionDef(key)) { // Object literals annotated as @dict may only have // If you annotate a class with @dict, only the constructor can be a non-computed property. - report(key, owner.isClass() ? ILLEGAL_CLASS_KEY : ILLEGAL_OBJLIT_KEY, "dict"); + report(t, key, owner.isClass() ? ILLEGAL_CLASS_KEY : ILLEGAL_OBJLIT_KEY, "dict"); } } @@ -1409,9 +1419,9 @@ private void visitObjectOrClassLiteralKey(Node key, Node owner, JSType ownerType if (type != null) { String property = NodeUtil.getObjectLitKeyName(key); if (owner.isClass()) { - checkPropertyInheritanceOnClassMember(key, property, type.toMaybeFunctionType()); + checkPropertyInheritanceOnClassMember(t, key, property, type.toMaybeFunctionType()); } else { - checkPropertyInheritanceOnPrototypeLitKey(key, property, type); + checkPropertyInheritanceOnPrototypeLitKey(t, key, property, type); } // TODO(lharker): add a unit test for the following if case or remove it. // Removing the check doesn't break any unit tests, but it does have coverage in @@ -1440,12 +1450,14 @@ private static boolean propertyIsImplicitCast(ObjectType type, String prop) { } /** - * Given a constructor type and a property name, check that the property has the JSDoc - * annotation @override iff the property is declared on a superclass. Several checks regarding - * inheritance correctness are also performed. + * Given a constructor type and a property name, check that the property has + * the JSDoc annotation @override iff the property is declared on a + * superclass. Several checks regarding inheritance correctness are also + * performed. */ private void checkDeclaredPropertyInheritance( - Node n, FunctionType ctorType, String propertyName, JSDocInfo info, JSType propertyType) { + NodeTraversal t, Node n, FunctionType ctorType, String propertyName, + JSDocInfo info, JSType propertyType) { // If the supertype doesn't resolve correctly, we've warned about this // already. if (hasUnknownOrEmptySupertype(ctorType)) { @@ -1491,7 +1503,7 @@ private void checkDeclaredPropertyInheritance( && !"constructor".equals(propertyName)) { // @override not present, but the property does override an interface property compiler.report( - JSError.make( + t.makeError( n, HIDDEN_INTERFACE_PROPERTY, propertyName, @@ -1523,7 +1535,7 @@ private void checkDeclaredPropertyInheritance( // @override not present, but the property does override a superclass // property compiler.report( - JSError.make(n, HIDDEN_SUPERCLASS_PROPERTY, propertyName, topInstanceType.toString())); + t.makeError(n, HIDDEN_SUPERCLASS_PROPERTY, propertyName, topInstanceType.toString())); } // @override is present and we have to check that it is ok @@ -1540,13 +1552,9 @@ private void checkDeclaredPropertyInheritance( if (!propertyType.isSubtype(superClassPropType, this.subtypingMode)) { compiler.report( - JSError.make( - n, - HIDDEN_SUPERCLASS_PROPERTY_MISMATCH, - propertyName, - topInstanceType.toString(), - superClassPropType.toString(), - propertyType.toString())); + t.makeError(n, HIDDEN_SUPERCLASS_PROPERTY_MISMATCH, + propertyName, topInstanceType.toString(), + superClassPropType.toString(), propertyType.toString())); } } else if (superInterfaceHasDeclaredProperty) { // there is an super interface property @@ -1558,11 +1566,8 @@ private void checkDeclaredPropertyInheritance( topInstanceType = interfaceType.getConstructor(). getTopMostDefiningType(propertyName); compiler.report( - JSError.make( - n, - HIDDEN_SUPERCLASS_PROPERTY_MISMATCH, - propertyName, - topInstanceType.toString(), + t.makeError(n, HIDDEN_SUPERCLASS_PROPERTY_MISMATCH, + propertyName, topInstanceType.toString(), superPropertyType.toString(), propertyType.toString())); } @@ -1573,17 +1578,19 @@ private void checkDeclaredPropertyInheritance( && !superInterfaceHasProperty) { // there is no superclass nor interface implementation compiler.report( - JSError.make(n, UNKNOWN_OVERRIDE, propertyName, ctorType.getInstanceType().toString())); + t.makeError(n, UNKNOWN_OVERRIDE, + propertyName, ctorType.getInstanceType().toString())); } } - private void checkAbstractMethodInConcreteClass(Node n, FunctionType ctorType, JSDocInfo info) { + private void checkAbstractMethodInConcreteClass( + NodeTraversal t, Node n, FunctionType ctorType, JSDocInfo info) { if (info == null || !info.isAbstract()) { return; } if (ctorType.isConstructor() && !ctorType.isAbstract()) { - report(n, ABSTRACT_METHOD_IN_CONCRETE_CLASS); + report(t, n, ABSTRACT_METHOD_IN_CONCRETE_CLASS); } } @@ -1656,10 +1663,10 @@ static JSType getObjectLitKeyTypeFromValueType(Node key, JSType valueType) { * interface.prototype.property = ...; * */ - private void visitInterfacePropertyAssignment(Node object, Node lvalue) { + private void visitInterfacePropertyAssignment(NodeTraversal t, Node object, Node lvalue) { if (!lvalue.getParent().isAssign()) { // assignments to interface properties cannot be in destructuring patterns or for-of loops - reportInvalidInterfaceMemberDeclaration(object); + reportInvalidInterfaceMemberDeclaration(t, object); return; } Node assign = lvalue.getParent(); @@ -1673,21 +1680,21 @@ private void visitInterfacePropertyAssignment(Node object, Node lvalue) { // someinterface.prototype.nonMethodProperty; // which is why we enforce that `rvalueType.isFunctionType()`. if (!rvalueType.isFunctionType()) { - reportInvalidInterfaceMemberDeclaration(object); + reportInvalidInterfaceMemberDeclaration(t, object); } if (rvalue.isFunction() && !NodeUtil.isEmptyBlock(NodeUtil.getFunctionBody(rvalue))) { String abstractMethodName = compiler.getCodingConvention().getAbstractMethodName(); - compiler.report(JSError.make(object, INTERFACE_METHOD_NOT_EMPTY, abstractMethodName)); + compiler.report(t.makeError(object, INTERFACE_METHOD_NOT_EMPTY, abstractMethodName)); } } - private void reportInvalidInterfaceMemberDeclaration(Node interfaceNode) { + private void reportInvalidInterfaceMemberDeclaration(NodeTraversal t, Node interfaceNode) { String abstractMethodName = compiler.getCodingConvention().getAbstractMethodName(); // This is bad i18n style but we don't localize our compiler errors. String abstractMethodMessage = (abstractMethodName != null) ? ", or " + abstractMethodName : ""; compiler.report( - JSError.make(interfaceNode, INVALID_INTERFACE_MEMBER_DECLARATION, abstractMethodMessage)); + t.makeError(interfaceNode, INVALID_INTERFACE_MEMBER_DECLARATION, abstractMethodMessage)); } /** @@ -1808,27 +1815,27 @@ private void visitGetProp(NodeTraversal t, Node n) { JSType childType = getJSType(objNode); if (childType.isDict()) { - report(property, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "'.'", "dict"); + report(t, property, TypeValidator.ILLEGAL_PROPERTY_ACCESS, "'.'", "dict"); } else if (validator.expectNotNullOrUndefined(t, n, childType, "No properties on this expression", getNativeType(OBJECT_TYPE))) { - checkPropertyAccessForGetProp(n); + checkPropertyAccessForGetProp(t, n); } ensureTyped(n); } - private void checkPropertyAccessForGetProp(Node getProp) { + private void checkPropertyAccessForGetProp(NodeTraversal t, Node getProp) { checkArgument(getProp.isGetProp(), getProp); Node objNode = getProp.getFirstChild(); JSType objType = getJSType(objNode); Node propNode = getProp.getSecondChild(); JSType propType = getJSType(getProp); - checkAbstractPropertyAccess(getProp); - checkPropertyAccess(objType, getProp, propType, propNode, objNode); + checkAbstractPropertyAccess(t, getProp); + checkPropertyAccess(objType, t, getProp, propType, propNode, objNode); } private void checkPropertyAccessForDestructuring( - Node pattern, JSType objectType, Node stringKey, JSType inferredPropType) { + NodeTraversal t, Node pattern, JSType objectType, Node stringKey, JSType inferredPropType) { checkArgument(pattern.isDestructuringPattern(), pattern); checkArgument(stringKey.isStringKey(), stringKey); @@ -1844,7 +1851,7 @@ private void checkPropertyAccessForDestructuring( && pattern.getNext() != null) { objNode = pattern.getNext(); } - checkPropertyAccess(objectType, /* getProp= */ null, inferredPropType, stringKey, objNode); + checkPropertyAccess(objectType, t, /* getProp= */ null, inferredPropType, stringKey, objNode); } /** @@ -1867,7 +1874,7 @@ private void checkPropertyAccessForDestructuring( *

  • (c) the function is transpiled from a goog.base superclass reference * */ - private void checkAbstractPropertyAccess(Node method) { + private void checkAbstractPropertyAccess(NodeTraversal t, Node method) { if (NodeUtil.isLhsOfAssign(method)) { // Allow declaring abstract methods. (This assumes they are never re-assigned) @@ -1888,12 +1895,12 @@ private void checkAbstractPropertyAccess(Node method) { // `super.foo()` definitely refers to `Superclass.prototype.foo`, not an override. // At parse time, `Subclass.prototype` becomes a lower bound for what `super` evaluates to, // even if the `this` object changes. So `super` will never resolve to a concrete subclass. - report(method, ABSTRACT_SUPER_METHOD_NOT_USABLE, methodType.getDisplayName()); + report(t, method, ABSTRACT_SUPER_METHOD_NOT_USABLE, methodType.getDisplayName()); } else if (objectNode.isGetProp()) { String objectProp = objectNode.getSecondChild().getString(); if (objectProp.equals("prototype") // case (b), e.g. `Foo.prototype.bar` || compiler.getCodingConvention().isSuperClassReference(objectProp)) { // case (c) - report(method, ABSTRACT_SUPER_METHOD_NOT_USABLE, methodType.getDisplayName()); + report(t, method, ABSTRACT_SUPER_METHOD_NOT_USABLE, methodType.getDisplayName()); } } } @@ -1915,6 +1922,7 @@ private void checkAbstractPropertyAccess(Node method) { */ private void checkPropertyAccess( JSType childType, + NodeTraversal t, @Nullable Node getProp, JSType propType, Node propNode, @@ -1930,17 +1938,17 @@ private void checkPropertyAccess( if (!objectType.hasProperty(propName) || objectType.isEquivalentTo(typeRegistry.getNativeType(UNKNOWN_TYPE))) { if (objectType instanceof EnumType) { - report(getProp != null ? getProp : propNode, INEXISTENT_ENUM_ELEMENT, propName); + report(t, getProp != null ? getProp : propNode, INEXISTENT_ENUM_ELEMENT, propName); } else { - checkPropertyAccessHelper(objectType, propNode, objNode, getProp, false); + checkPropertyAccessHelper(objectType, propNode, objNode, t, getProp, false); } } } else { - checkPropertyAccessHelper(childType, propNode, objNode, getProp, false); + checkPropertyAccessHelper(childType, propNode, objNode, t, getProp, false); } } else if (childType.isUnionType() && getProp != null && !isLValueGetProp(getProp)) { // NOTE: strict property assignment checks are done on assignment. - checkPropertyAccessHelper(childType, propNode, objNode, getProp, true); + checkPropertyAccessHelper(childType, propNode, objNode, t, getProp, true); } } @@ -1959,6 +1967,7 @@ private void checkPropertyAccessHelper( JSType objectType, Node propNode, @Nullable Node objNode, + NodeTraversal t, Node getProp, boolean strictCheck) { if (!reportMissingProperties @@ -1993,7 +2002,7 @@ private void checkPropertyAccessHelper( boolean strictReport = strictCheck || isLooselyAssociated || loosePropertyDeclaration || maybePropExistenceCheck; - reportMissingProperty(objNode, objectType, propNode, kind, strictReport); + reportMissingProperty(objNode, objectType, propNode, kind, t, strictReport); } private void reportMissingProperty( @@ -2001,6 +2010,7 @@ private void reportMissingProperty( JSType objectType, Node propNode, PropDefinitionKind kind, + NodeTraversal t, boolean strictReport) { String propName = propNode.getString(); boolean isObjectType = objectType.isEquivalentTo(getNativeType(OBJECT_TYPE)); @@ -2020,6 +2030,7 @@ private void reportMissingProperty( reportType = INEXISTENT_PROPERTY_WITH_SUGGESTION; } report( + t, propNode, reportType, propName, @@ -2039,6 +2050,7 @@ private void reportMissingProperty( reportType = INEXISTENT_PROPERTY; } report( + t, propNode, reportType, propName, @@ -2119,13 +2131,15 @@ private void visitVar(NodeTraversal t, Node n) { } } - /** Visits a NEW node. */ - private void visitNew(Node n) { + /** + * Visits a NEW node. + */ + private void visitNew(NodeTraversal t, Node n) { Node constructor = n.getFirstChild(); JSType type = getJSType(constructor).restrictByNotNullOrUndefined(); if (!couldBeAConstructor(type) || type.isEquivalentTo(typeRegistry.getNativeType(SYMBOL_OBJECT_FUNCTION_TYPE))) { - report(n, NOT_A_CONSTRUCTOR); + report(t, n, NOT_A_CONSTRUCTOR); ensureTyped(n); return; } @@ -2134,9 +2148,9 @@ private void visitNew(Node n) { if (fnType != null && fnType.hasInstanceType()) { FunctionType ctorType = fnType.getInstanceType().getConstructor(); if (ctorType != null && ctorType.isAbstract()) { - report(n, INSTANTIATE_ABSTRACT_CLASS); + report(t, n, INSTANTIATE_ABSTRACT_CLASS); } - visitArgumentList(n, fnType); + visitArgumentList(t, n, fnType); ensureTyped(n, fnType.getInstanceType()); } else { ensureTyped(n); @@ -2148,18 +2162,19 @@ private boolean couldBeAConstructor(JSType type) { } /** - * Check whether there's any property conflict for for a particular super interface - * + * Check whether there's any property conflict for for a particular super + * interface + * @param t The node traversal object that supplies context * @param n The node being visited * @param functionName The function name being checked - * @param properties The property names in the super interfaces that have been visited - * @param currentProperties The property names in the super interface that have been visited + * @param properties The property names in the super interfaces that have + * been visited + * @param currentProperties The property names in the super interface + * that have been visited * @param interfaceType The super interface that is being visited */ - private void checkInterfaceConflictProperties( - Node n, - String functionName, - Map properties, + private void checkInterfaceConflictProperties(NodeTraversal t, Node n, + String functionName, Map properties, Map currentProperties, ObjectType interfaceType) { ObjectType implicitProto = interfaceType.getImplicitPrototype(); @@ -2187,35 +2202,35 @@ private void checkInterfaceConflictProperties( continue; } compiler.report( - JSError.make( - n, - INCOMPATIBLE_EXTENDED_PROPERTY_TYPE, - functionName, - name, - oType.toString(), + t.makeError(n, INCOMPATIBLE_EXTENDED_PROPERTY_TYPE, + functionName, name, oType.toString(), interfaceType.toString())); } } for (ObjectType iType : interfaceType.getCtorExtendedInterfaces()) { - checkInterfaceConflictProperties(n, functionName, properties, currentProperties, iType); + checkInterfaceConflictProperties(t, n, functionName, properties, + currentProperties, iType); } } /** * Visits a {@link Token#FUNCTION} node. * + * @param t The node traversal object that supplies context, such as the + * scope chain to use in name lookups as well as error reporting. * @param n The node being visited. */ - private void visitFunction(Node n) { + private void visitFunction(NodeTraversal t, Node n) { FunctionType functionType = JSType.toMaybeFunctionType(n.getJSType()); if (functionType.isConstructor()) { - checkConstructor(n, functionType); + checkConstructor(t, n, functionType); } else if (functionType.isInterface()) { - checkInterface(n, functionType); + checkInterface(t, n, functionType); } else if (n.isAsyncGeneratorFunction()) { // An async generator function must return a AsyncGenerator or supertype of AsyncGenerator JSType returnType = functionType.getReturnType(); validator.expectAsyncGeneratorSupertype( + n, returnType, "An async generator function must return a (supertype of) AsyncGenerator"); @@ -2233,7 +2248,7 @@ private void visitFunction(Node n) { } /** Visits a CLASS node. */ - private void visitClass(Node n) { + private void visitClass(NodeTraversal t, Node n) { FunctionType functionType = JSType.toMaybeFunctionType(n.getJSType()); Node extendsClause = n.getSecondChild(); if (!extendsClause.isEmpty()) { @@ -2245,7 +2260,7 @@ private void visitClass(Node n) { } else if (!superType.isUnknownType()) { // Only give this error for supertypes *known* to be wrong - unresolved types are OK here. compiler.report( - JSError.make( + t.makeError( n, CONFLICTING_EXTENDED_TYPE, functionType.isConstructor() ? "constructor" : "interface", @@ -2253,9 +2268,9 @@ private void visitClass(Node n) { } } if (functionType.isConstructor()) { - checkConstructor(n, functionType); + checkConstructor(t, n, functionType); } else if (functionType.isInterface()) { - checkInterface(n, functionType); + checkInterface(t, n, functionType); } else { throw new IllegalStateException( "CLASS node's type must be either constructor or interface: " + functionType); @@ -2263,14 +2278,14 @@ private void visitClass(Node n) { } /** Checks a constructor, which may be either an ES5-style FUNCTION node, or a CLASS node. */ - private void checkConstructor(Node n, FunctionType functionType) { + private void checkConstructor(NodeTraversal t, Node n, FunctionType functionType) { FunctionType baseConstructor = functionType.getSuperClassConstructor(); if (!Objects.equals(baseConstructor, getNativeType(OBJECT_FUNCTION_TYPE)) && baseConstructor != null && baseConstructor.isInterface()) { // Warn if a class extends an interface. compiler.report( - JSError.make(n, CONFLICTING_EXTENDED_TYPE, "constructor", getBestFunctionName(n))); + t.makeError(n, CONFLICTING_EXTENDED_TYPE, "constructor", getBestFunctionName(n))); } else { if (n.isFunction() && baseConstructor != null @@ -2279,7 +2294,7 @@ private void checkConstructor(Node n, FunctionType functionType) { && !functionType.getSource().isEs6Class()) { // Warn if an ES5 class extends an ES6 class. compiler.report( - JSError.make( + t.makeError( n, ES5_CLASS_EXTENDING_ES6_CLASS, functionType.getDisplayName(), @@ -2300,7 +2315,7 @@ private void checkConstructor(Node n, FunctionType functionType) { badImplementedType = true; } if (badImplementedType) { - report(n, BAD_IMPLEMENTED_TYPE, getBestFunctionName(n)); + report(t, n, BAD_IMPLEMENTED_TYPE, getBestFunctionName(n)); } } // check properties @@ -2312,12 +2327,12 @@ private void checkConstructor(Node n, FunctionType functionType) { } /** Checks an interface, which may be either an ES5-style FUNCTION node, or a CLASS node. */ - private void checkInterface(Node n, FunctionType functionType) { + private void checkInterface(NodeTraversal t, Node n, FunctionType functionType) { // Interface must extend only interfaces for (ObjectType extInterface : functionType.getExtendedInterfaces()) { if (extInterface.getConstructor() != null && !extInterface.getConstructor().isInterface()) { compiler.report( - JSError.make(n, CONFLICTING_EXTENDED_TYPE, "interface", getBestFunctionName(n))); + t.makeError(n, CONFLICTING_EXTENDED_TYPE, "interface", getBestFunctionName(n))); } } @@ -2328,8 +2343,8 @@ private void checkInterface(Node n, FunctionType functionType) { LinkedHashMap currentProperties = new LinkedHashMap<>(); for (ObjectType interfaceType : functionType.getExtendedInterfaces()) { currentProperties.clear(); - checkInterfaceConflictProperties( - n, getBestFunctionName(n), properties, currentProperties, interfaceType); + checkInterfaceConflictProperties(t, n, getBestFunctionName(n), + properties, currentProperties, interfaceType); properties.putAll(currentProperties); } } @@ -2341,8 +2356,8 @@ private void checkInterface(Node n, FunctionType functionType) { strPath += loopPath.get(i).getDisplayName() + " -> "; } strPath += Iterables.getLast(loopPath).getDisplayName(); - compiler.report( - JSError.make(n, INTERFACE_EXTENDS_LOOP, loopPath.get(0).getDisplayName(), strPath)); + compiler.report(t.makeError(n, INTERFACE_EXTENDS_LOOP, + loopPath.get(0).getDisplayName(), strPath)); } } @@ -2390,7 +2405,7 @@ private void visitCall(NodeTraversal t, Node n) { JSType childType = getJSType(child).restrictByNotNullOrUndefined(); if (!childType.canBeCalled()) { - report(n, NOT_CALLABLE, childType.toString()); + report(t, n, NOT_CALLABLE, childType.toString()); ensureTyped(n); return; } @@ -2407,7 +2422,7 @@ private void visitCall(NodeTraversal t, Node n) { && (functionType.getReturnType().isUnknownType() || functionType.getReturnType().isVoidType()) && !n.getFirstChild().isSuper()) { - report(n, CONSTRUCTOR_NOT_CALLABLE, childType.toString()); + report(t, n, CONSTRUCTOR_NOT_CALLABLE, childType.toString()); } // Functions with explicit 'this' types must be called in a GETPROP @@ -2417,10 +2432,10 @@ private void visitCall(NodeTraversal t, Node n) { && !(functionType.getTypeOfThis().toObjectType() != null && functionType.getTypeOfThis().toObjectType().isNativeObjectType()) && !(child.isGetElem() || child.isGetProp())) { - report(n, EXPECTED_THIS_TYPE, functionType.toString()); + report(t, n, EXPECTED_THIS_TYPE, functionType.toString()); } - visitArgumentList(n, functionType); + visitArgumentList(t, n, functionType); ensureTyped(n, functionType.getReturnType()); } else { ensureTyped(n); @@ -2432,10 +2447,10 @@ private void visitCall(NodeTraversal t, Node n) { } /** Visits the parameters of a CALL or a NEW node. */ - private void visitArgumentList(Node call, FunctionType functionType) { + private void visitArgumentList(NodeTraversal t, Node call, FunctionType functionType) { Iterator parameters = functionType.getParameters().iterator(); Iterator arguments = NodeUtil.getInvocationArgsAsIterable(call).iterator(); - checkArgumentsMatchParameters(call, functionType, arguments, parameters, 0); + checkArgumentsMatchParameters(t, call, functionType, arguments, parameters, 0); } /** @@ -2448,6 +2463,7 @@ private void visitArgumentList(Node call, FunctionType functionType) { * function type's parameter list. */ private void checkArgumentsMatchParameters( + NodeTraversal t, Node call, FunctionType functionType, Iterator arguments, @@ -2502,6 +2518,7 @@ private void checkArgumentsMatchParameters( // least tell if there are more arguments than the function can handle even ignoring the // spreads. report( + t, call, WRONG_ARGUMENT_COUNT, typeRegistry.getReadableTypeNameNoDeref(call.getFirstChild()), @@ -2512,6 +2529,7 @@ private void checkArgumentsMatchParameters( } else { if (minArity > normalArgumentCount || maxArity < normalArgumentCount) { report( + t, call, WRONG_ARGUMENT_COUNT, typeRegistry.getReadableTypeNameNoDeref(call.getFirstChild()), @@ -2670,18 +2688,19 @@ private void visitYield(NodeTraversal t, Node n) { // verifying validator.expectCanAssignTo( + valueNode, actualYieldType, declaredYieldType, "Yielded type does not match declared return type."); } - private void visitTaggedTemplateLit(Node n) { + private void visitTaggedTemplateLit(NodeTraversal t, Node n) { Node tag = n.getFirstChild(); JSType tagType = tag.getJSType().restrictByNotNullOrUndefined(); if (!tagType.canBeCalled()) { - report(n, NOT_CALLABLE, tagType.toString()); + report(t, n, NOT_CALLABLE, tagType.toString()); return; } else if (!tagType.isFunctionType()) { // A few types, like the unknown, regexp, and bottom types, can be called as if they are @@ -2699,6 +2718,7 @@ private void visitTaggedTemplateLit(Node n) { // Validate that the tag function takes at least one parameter if (!parameters.hasNext()) { report( + t, n, WRONG_ARGUMENT_COUNT, typeRegistry.getReadableTypeNameNoDeref(tag), @@ -2718,19 +2738,20 @@ private void visitTaggedTemplateLit(Node n) { // Validate the remaining parameters (the template literal substitutions) checkArgumentsMatchParameters( - n, tagFnType, NodeUtil.getInvocationArgsAsIterable(n).iterator(), parameters, 1); + t, n, tagFnType, NodeUtil.getInvocationArgsAsIterable(n).iterator(), parameters, 1); } /** - * This function unifies the type checking involved in the core binary operators and the - * corresponding assignment operators. The representation used internally is such that common code - * can handle both kinds of operators easily. + * This function unifies the type checking involved in the core binary + * operators and the corresponding assignment operators. The representation + * used internally is such that common code can handle both kinds of + * operators easily. * * @param op The operator. * @param t The traversal object, needed to report errors. * @param n The node being checked. */ - private void visitBinaryOperator(Token op, Node n) { + private void visitBinaryOperator(Token op, NodeTraversal t, Node n) { Node left = n.getFirstChild(); JSType leftType = getJSType(left); Node right = n.getLastChild(); @@ -2744,12 +2765,12 @@ private void visitBinaryOperator(Token op, Node n) { case URSH: String opStr = NodeUtil.opToStr(n.getToken()); if (!leftType.matchesNumberContext()) { - report(left, BIT_OPERATION, opStr, leftType.toString()); + report(t, left, BIT_OPERATION, opStr, leftType.toString()); } else { this.validator.expectNumberStrict(n, leftType, "operator " + opStr); } if (!rightType.matchesNumberContext()) { - report(right, BIT_OPERATION, opStr, rightType.toString()); + report(t, right, BIT_OPERATION, opStr, rightType.toString()); } else { this.validator.expectNumberStrict(n, rightType, "operator " + opStr); } @@ -2784,7 +2805,7 @@ private void visitBinaryOperator(Token op, Node n) { break; default: - report(n, UNEXPECTED_TOKEN, op.toString()); + report(t, n, UNEXPECTED_TOKEN, op.toString()); } ensureTyped(n); } @@ -2818,6 +2839,7 @@ private void checkEnumAlias( JSType valueEnumPrimitiveType = valueEnumType.getElementsType().getPrimitiveType(); validator.expectCanAssignTo( + nodeToWarn, valueEnumPrimitiveType, declInfo.getEnumParameterType().evaluate(t.getTypedScope(), typeRegistry), @@ -2897,27 +2919,27 @@ private JSType getNativeType(JSTypeNative typeId) { /** * Checks if current node contains js docs and checks all types specified in the js doc whether - * they have Objects with potentially invalid keys. For example: {@code Object}. - * If such type is found, a warning is reported for the current node. + * they have Objects with potentially invalid keys. For example: {@code + * Object}. If such type is found, a warning is reported for the current node. */ - private void checkJsdocInfoContainsObjectWithBadKey(Node n) { + private void checkJsdocInfoContainsObjectWithBadKey(NodeTraversal t, Node n) { if (n.getJSDocInfo() != null) { JSDocInfo info = n.getJSDocInfo(); - checkTypeContainsObjectWithBadKey(n, info.getType()); - checkTypeContainsObjectWithBadKey(n, info.getReturnType()); - checkTypeContainsObjectWithBadKey(n, info.getTypedefType()); + checkTypeContainsObjectWithBadKey(t, n, info.getType()); + checkTypeContainsObjectWithBadKey(t, n, info.getReturnType()); + checkTypeContainsObjectWithBadKey(t, n, info.getTypedefType()); for (String param : info.getParameterNames()) { - checkTypeContainsObjectWithBadKey(n, info.getParameterType(param)); + checkTypeContainsObjectWithBadKey(t, n, info.getParameterType(param)); } } } - private void checkTypeContainsObjectWithBadKey(Node n, JSTypeExpression type) { + private void checkTypeContainsObjectWithBadKey(NodeTraversal t, Node n, JSTypeExpression type) { if (type != null && type.getRoot().getJSType() != null) { JSType realType = type.getRoot().getJSType(); JSType objectWithBadKey = findObjectWithNonStringifiableKey(realType, new HashSet()); if (objectWithBadKey != null){ - compiler.report(JSError.make(n, NON_STRINGIFIABLE_OBJECT_KEY, objectWithBadKey.toString())); + compiler.report(t.makeError(n, NON_STRINGIFIABLE_OBJECT_KEY, objectWithBadKey.toString())); } } } diff --git a/src/com/google/javascript/jscomp/lint/CheckArrayWithGoogObject.java b/src/com/google/javascript/jscomp/lint/CheckArrayWithGoogObject.java index c2521a86b99..0f44a9efcf0 100644 --- a/src/com/google/javascript/jscomp/lint/CheckArrayWithGoogObject.java +++ b/src/com/google/javascript/jscomp/lint/CheckArrayWithGoogObject.java @@ -19,7 +19,6 @@ import com.google.javascript.jscomp.AbstractCompiler; import com.google.javascript.jscomp.DiagnosticType; import com.google.javascript.jscomp.HotSwapCompilerPass; -import com.google.javascript.jscomp.JSError; import com.google.javascript.jscomp.NodeTraversal; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.jstype.JSType; @@ -111,10 +110,10 @@ private boolean containsArray(JSType type) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if (isGoogObjectIterationOverArray(n)) { compiler.report( - JSError.make(n, ARRAY_PASSED_TO_GOOG_OBJECT, n.getFirstChild().getQualifiedName())); + t.makeError(n, ARRAY_PASSED_TO_GOOG_OBJECT, n.getFirstChild().getQualifiedName())); } } diff --git a/src/com/google/javascript/jscomp/lint/CheckNullableReturn.java b/src/com/google/javascript/jscomp/lint/CheckNullableReturn.java index 21973248c40..5b6b1c61ab0 100644 --- a/src/com/google/javascript/jscomp/lint/CheckNullableReturn.java +++ b/src/com/google/javascript/jscomp/lint/CheckNullableReturn.java @@ -22,7 +22,6 @@ import com.google.javascript.jscomp.ControlFlowGraph; import com.google.javascript.jscomp.DiagnosticType; import com.google.javascript.jscomp.HotSwapCompilerPass; -import com.google.javascript.jscomp.JSError; import com.google.javascript.jscomp.NodeTraversal; import com.google.javascript.jscomp.NodeUtil; import com.google.javascript.rhino.JSDocInfo; @@ -82,9 +81,9 @@ public void visit(NodeTraversal t, Node n, Node parent) { && !canReturnNull(t.getControlFlowGraph())) { String fnName = NodeUtil.getNearestFunctionName(parent); if (fnName != null && !fnName.isEmpty()) { - compiler.report(JSError.make(parent, NULLABLE_RETURN_WITH_NAME, fnName)); + compiler.report(t.makeError(parent, NULLABLE_RETURN_WITH_NAME, fnName)); } else { - compiler.report(JSError.make(parent, NULLABLE_RETURN)); + compiler.report(t.makeError(parent, NULLABLE_RETURN)); } } } diff --git a/src/com/google/javascript/jscomp/lint/CheckPrototypeProperties.java b/src/com/google/javascript/jscomp/lint/CheckPrototypeProperties.java index 48c7e91388f..970e57b4544 100644 --- a/src/com/google/javascript/jscomp/lint/CheckPrototypeProperties.java +++ b/src/com/google/javascript/jscomp/lint/CheckPrototypeProperties.java @@ -18,7 +18,6 @@ import com.google.javascript.jscomp.AbstractCompiler; import com.google.javascript.jscomp.DiagnosticType; import com.google.javascript.jscomp.HotSwapCompilerPass; -import com.google.javascript.jscomp.JSError; import com.google.javascript.jscomp.NodeTraversal; import com.google.javascript.jscomp.NodeUtil; import com.google.javascript.rhino.JSDocInfo; @@ -62,7 +61,7 @@ public void hotSwapScript(Node scriptRoot, Node originalRoot) { } @Override - public void visit(NodeTraversal unused, Node n, Node parent) { + public void visit(NodeTraversal t, Node n, Node parent) { if (NodeUtil.isPrototypePropertyDeclaration(n)) { Node assign = n.getFirstChild(); Node rhs = assign.getLastChild(); @@ -74,7 +73,7 @@ public void visit(NodeTraversal unused, Node n, Node parent) { return; } String propName = assign.getFirstChild().getLastChild().getString(); - compiler.report(JSError.make(assign, ILLEGAL_PROTOTYPE_MEMBER, propName)); + compiler.report(t.makeError(assign, ILLEGAL_PROTOTYPE_MEMBER, propName)); } } }