Index: Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/AstUtil.java |
diff --git a/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/AstUtil.java b/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/AstUtil.java |
index a85680b86f6827f49c961018c22f9598840b581b..e930753e756c595a39c5cb44173d26b6c2f51aff 100644 |
--- a/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/AstUtil.java |
+++ b/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/AstUtil.java |
@@ -3,10 +3,14 @@ package org.chromium.devtools.jsdoc.checks; |
import com.google.javascript.rhino.head.Token; |
import com.google.javascript.rhino.head.ast.Assignment; |
import com.google.javascript.rhino.head.ast.AstNode; |
+import com.google.javascript.rhino.head.ast.Comment; |
import com.google.javascript.rhino.head.ast.FunctionNode; |
+import com.google.javascript.rhino.head.ast.ObjectProperty; |
public class AstUtil { |
+ private static final String PROTOTYPE_SUFFIX = ".prototype"; |
+ |
static boolean hasParentOfType(AstNode node, int tokenType) { |
AstNode parent = node.getParent(); |
if (parent == null) { |
@@ -21,6 +25,10 @@ public class AstUtil { |
return nameNode; |
} |
+ if (AstUtil.hasParentOfType(functionNode, Token.COLON)) { |
+ return ((ObjectProperty) functionNode.getParent()).getLeft(); |
+ } |
+ |
if (AstUtil.hasParentOfType(functionNode, Token.ASSIGN)) { |
Assignment assignment = (Assignment) functionNode.getParent(); |
if (assignment.getRight() == functionNode) { |
@@ -30,5 +38,55 @@ public class AstUtil { |
return null; |
} |
+ static String getTypeNameFromPrototype(String value) { |
+ return value.substring(0, value.length() - PROTOTYPE_SUFFIX.length()); |
+ } |
+ |
+ static boolean isPrototypeName(String typeName) { |
+ return typeName.endsWith(PROTOTYPE_SUFFIX); |
+ } |
+ |
+ static AstNode getAssignedTypeNameNode(Assignment assignment) { |
+ AstNode typeNameNode = assignment.getLeft(); |
+ if (typeNameNode.getType() != Token.GETPROP && typeNameNode.getType() != Token.NAME) { |
+ return null; |
+ } |
+ return typeNameNode; |
+ } |
+ |
+ static Comment getJsDocNode(AstNode node) { |
+ if (node.getType() == Token.FUNCTION) { |
+ return getJsDocNode((FunctionNode) node); |
+ } else { |
+ return node.getJsDocNode(); |
+ } |
+ } |
+ |
+ static Comment getJsDocNode(FunctionNode functionNode) { |
+ Comment jsDocNode = functionNode.getJsDocNode(); |
+ if (jsDocNode != null) { |
+ return jsDocNode; |
+ } |
+ |
+ // reader.onloadend = function() {...} |
+ if (hasParentOfType(functionNode, Token.ASSIGN)) { |
+ Assignment assignment = (Assignment) functionNode.getParent(); |
+ if (assignment.getRight() == functionNode) { |
+ jsDocNode = assignment.getJsDocNode(); |
+ if (jsDocNode != null) { |
+ return jsDocNode; |
+ } |
+ } |
+ } |
+ |
+ if (hasParentOfType(functionNode, Token.COLON)) { |
+ jsDocNode = ((ObjectProperty) functionNode.getParent()).getLeft().getJsDocNode(); |
+ if (jsDocNode != null) { |
+ return jsDocNode; |
+ } |
+ } |
+ return null; |
+ } |
+ |
private AstUtil() {} |
} |