private void visitFunction(NodeTraversal t, Node function, Node parent) { JSDocInfo jsDoc = NodeUtil.getBestJSDocInfo(function); if (jsDoc == null && !hasAnyInlineJsDoc(function)) { checkMissingJsDoc(t, function); } else { if (t.inGlobalScope() || hasAnyInlineJsDoc(function) || !jsDoc.getParameterNames().isEmpty() || jsDoc.hasReturnType()) { checkParams(t, function, jsDoc); } checkReturn(t, function, jsDoc); } if (parent.isMemberFunctionDef() && "constructor".equals(parent.getString()) && jsDoc != null && !jsDoc.getVisibility().equals(Visibility.INHERITED)) { t.report(function, CONSTRUCTOR_DISALLOWED_JSDOC); } }
private void checkOverriddenPropertyVisibilityMismatch( Visibility overriding, Visibility overridden, @Nullable Visibility fileOverview, NodeTraversal t, Node getprop) { if (overriding == Visibility.INHERITED && overriding != overridden && fileOverview != null && fileOverview != Visibility.INHERITED) { String propertyName = getprop.getLastChild().getString(); compiler.report( t.makeError(getprop, BAD_PROPERTY_OVERRIDE_IN_FILE_WITH_FILEOVERVIEW_VISIBILITY, propertyName, fileOverview.name())); } }
} else if (info.getVisibility() != null && info.getVisibility() != Visibility.INHERITED) { parts.add("@" + info.getVisibility().toString().toLowerCase());
} else if (info.getVisibility() != null && info.getVisibility() != Visibility.INHERITED) { parts.add("@" + info.getVisibility().toString().toLowerCase());
visibility.toString().toLowerCase()); success = false; break;
enforceCodingConventions ? compiler.getCodingConvention() : null); Visibility effectiveCtorVisibility = annotatedCtorVisibility.equals(Visibility.INHERITED) ? Visibility.PUBLIC : annotatedCtorVisibility;
Ascii.toLowerCase(visibility.toString())); success = false; break;
private void checkOverriddenPropertyVisibility( NodeTraversal t, PropertyReference propRef, Visibility visibility, Visibility fileOverviewVisibility, JSType objectType, boolean sameInput) { Visibility overridingVisibility = propRef.isOverride() ? propRef.getJSDocInfo().getVisibility() : Visibility.INHERITED; // Check that: // (a) the property *can* be overridden, // (b) the visibility of the override is the same as the // visibility of the original property, // (c) the visibility is explicitly redeclared if the override is in // a file with default visibility in the @fileoverview block. if (visibility == Visibility.PRIVATE && !sameInput) { compiler.report( t.makeError(propRef.getSourceNode(), PRIVATE_OVERRIDE, objectType.toString())); } else if (overridingVisibility != Visibility.INHERITED && overridingVisibility != visibility && fileOverviewVisibility == null) { compiler.report( t.makeError( propRef.getSourceNode(), VISIBILITY_MISMATCH, visibility.name(), objectType.toString(), overridingVisibility.name())); } }
private void checkStyleForPrivateProperties(NodeTraversal t, Node n) { JSDocInfo jsDoc = NodeUtil.getBestJSDocInfo(n); checkForAtSignCodePresence(t, n, jsDoc); String name; if (n.isMemberFunctionDef() || n.isGetterDef() || n.isSetterDef()) { name = n.getString(); } else { checkState(n.isAssign()); Node lhs = n.getFirstChild(); if (!lhs.isGetProp()) { return; } name = lhs.getLastChild().getString(); } if (name.equals("constructor")) { return; } if (jsDoc != null && name != null) { if (compiler.getCodingConvention().isPrivate(name) && !jsDoc.getVisibility().equals(Visibility.PRIVATE)) { t.report(n, MUST_BE_PRIVATE, name); } else if (compiler.getCodingConvention().hasPrivacyConvention() && !compiler.getCodingConvention().isPrivate(name) && jsDoc.getVisibility().equals(Visibility.PRIVATE)) { t.report(n, MUST_HAVE_TRAILING_UNDERSCORE, name); } } }
private void checkStyleForPrivateProperties(NodeTraversal t, Node n) { JSDocInfo jsDoc = NodeUtil.getBestJSDocInfo(n); String name; if (n.isMemberFunctionDef() || n.isGetterDef() || n.isSetterDef()) { name = n.getString(); } else { Preconditions.checkState(n.isAssign()); Node lhs = n.getFirstChild(); if (!lhs.isGetProp()) { return; } name = lhs.getLastChild().getString(); } if (name.equals("constructor")) { return; } if (jsDoc != null && name != null) { if (compiler.getCodingConvention().isPrivate(name) && !jsDoc.getVisibility().equals(Visibility.PRIVATE)) { t.report(n, MUST_BE_PRIVATE, name); } else if (compiler.getCodingConvention().hasPrivacyConvention() && !compiler.getCodingConvention().isPrivate(name) && jsDoc.getVisibility().equals(Visibility.PRIVATE)) { t.report(n, MUST_HAVE_TRAILING_UNDERSCORE, name); } } } private void checkSuppressionsOnNonFunction(NodeTraversal t, Node n, JSDocInfo jsDoc) {
private void visitFunctionNode(Node n, Node parent) { // TODO(user): Use isPrivate method below to recognize all functions. Node name = null; JSDocInfo info = parent.getJSDocInfo(); if (info != null && info.isConstructor()) { name = parent.getFirstChild(); } else { // look to the child, maybe it's a named function info = n.getJSDocInfo(); if (info != null && info.isConstructor()) { name = n.getFirstChild(); } } if (name != null && name.isQualifiedName()) { String qualifiedName = name.getQualifiedName(); if (!this.convention.isPrivate(qualifiedName)) { Visibility visibility = info.getVisibility(); if (!visibility.equals(JSDocInfo.Visibility.PRIVATE)) { ctors.put(qualifiedName, name); } } } }
private void visitFunctionNode(Node n, Node parent) { // TODO(user): Use isPrivate method below to recognize all functions. Node name = null; JSDocInfo info = parent.getJSDocInfo(); if (info != null && info.isConstructor()) { name = parent.getFirstChild(); } else { // look to the child, maybe it's a named function info = n.getJSDocInfo(); if (info != null && info.isConstructor()) { name = n.getFirstChild(); } } if (name != null && name.isQualifiedName()) { String qualifiedName = name.getQualifiedName(); if (!this.convention.isPrivate(qualifiedName)) { Visibility visibility = info.getVisibility(); if (!visibility.equals(JSDocInfo.Visibility.PRIVATE)) { ctors.put(qualifiedName, name); } } } }
@Override public void visit(NodeTraversal t, Node n, Node parent) { JSDocInfo bestJSDocInfo = NodeUtil.getBestJSDocInfo(n); if (bestJSDocInfo == null) { return; } // Add visibility for private and protected. if (Visibility.PRIVATE.equals(bestJSDocInfo.getVisibility())) { n.putProp(Node.ACCESS_MODIFIER, Visibility.PRIVATE); } else if (Visibility.PROTECTED.equals(bestJSDocInfo.getVisibility())) { n.putProp(Node.ACCESS_MODIFIER, Visibility.PROTECTED); } // Change variable declarations to constants if (bestJSDocInfo.isConstant() && (n.isVar() || n.isLet())) { n.setToken(Token.CONST); } } }
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( t.makeError( propRef.getSourceNode(), BAD_PROPERTY_OVERRIDE_IN_FILE_WITH_FILEOVERVIEW_VISIBILITY, propRef.getName(), fileOverview.name())); } }
static boolean isPrivate(@Nullable JSDocInfo jsdoc) { return jsdoc != null && jsdoc.getVisibility().equals(Visibility.PRIVATE); }
/** Moves the access modifier from the original declaration to the constructor parameter */ void moveAccessModifier(ClassMemberDeclaration declaration, Node param) { if (Visibility.PRIVATE.equals(declaration.jsDoc.getVisibility())) { param.putProp(Node.ACCESS_MODIFIER, Visibility.PRIVATE); } else if (Visibility.PROTECTED.equals(declaration.jsDoc.getVisibility())) { param.putProp(Node.ACCESS_MODIFIER, Visibility.PROTECTED); } else { param.putProp(Node.ACCESS_MODIFIER, Visibility.PUBLIC); } }
private boolean isPrivate(Node classOrFn) { JSDocInfo info = NodeUtil.getBestJSDocInfo(classOrFn); if (info != null && info.getVisibility().equals(JSDocInfo.Visibility.PRIVATE)) { return true; } return compiler.getCodingConvention().isPrivate(NodeUtil.getName(classOrFn)); }
private void maybeAddAccessibilityModifier(Node n) { Visibility access = (Visibility) n.getProp(Node.ACCESS_MODIFIER); if (access != null) { add(access.toString().toLowerCase() + " "); } }
private boolean isPrivate(Node classOrFn) { JSDocInfo info = NodeUtil.getBestJSDocInfo(classOrFn); if (info != null && info.getVisibility().equals(JSDocInfo.Visibility.PRIVATE)) { return true; } return compiler.getCodingConvention().isPrivate(NodeUtil.getName(classOrFn)); }