Chromium Code Reviews| Index: Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/MethodAnnotationChecker.java |
| diff --git a/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/MethodAnnotationChecker.java b/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/MethodAnnotationChecker.java |
| index 4ec6b728b398d26a90c76d3e4adabf0d1719a3d7..ad0f5d1e075cc4b6c520517ab574d0d0bea86ddf 100644 |
| --- a/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/MethodAnnotationChecker.java |
| +++ b/Source/devtools/scripts/jsdoc-validator/src/org/chromium/devtools/jsdoc/checks/MethodAnnotationChecker.java |
| @@ -17,7 +17,10 @@ import java.util.regex.Pattern; |
| public final class MethodAnnotationChecker extends ContextTrackingChecker { |
| private static final Pattern PARAM_PATTERN = |
| - Pattern.compile("@param\\s+\\{.+\\}\\s+([^\\s]+)(?:[^}]*)$", Pattern.MULTILINE); |
| + Pattern.compile("@param\\s+(\\{.+\\}\\s+)?([^\\s]+).*$", Pattern.MULTILINE); |
|
aandrey
2014/06/05 15:03:16
\\s+ -> \\s
(let's be more strict and allow exac
apavlov
2014/06/05 15:31:51
Technically, this is a valid annotation understood
|
| + |
| + private static final Pattern INVALID_RETURN_PATTERN = |
| + Pattern.compile("@return(?:s.*|\\s+[^{]*)$", Pattern.MULTILINE); |
|
aandrey
2014/06/05 15:03:16
"@return(?:s|\\s[^{]|\\s*$)"
this will also handl
apavlov
2014/06/05 15:31:51
Right, this is INVALID_RETURN_PATTERN :)
|
| private final Set<FunctionRecord> valueReturningFunctions = new HashSet<>(); |
| private final Set<FunctionRecord> throwingFunctions = new HashSet<>(); |
| @@ -68,8 +71,14 @@ public final class MethodAnnotationChecker extends ContextTrackingChecker { |
| String jsDoc = getContext().getNodeText(jsDocNode); |
| Matcher m = PARAM_PATTERN.matcher(jsDoc); |
| while (m.find()) { |
| - String jsDocParam = m.group(1); |
| - paramNames.remove(jsDocParam); |
| + String paramType = m.group(1); |
| + if (paramType == null) { |
| + getContext().reportErrorInNode(jsDocNode, m.start(2), String.format( |
| + "Invalid @param annotation found -" |
| + + " should be \"@param {<type>} paramName\"")); |
| + } else { |
| + paramNames.remove(m.group(2)); |
| + } |
| } |
| return paramNames.toArray(new String[paramNames.size()]); |
| } |
| @@ -130,13 +139,14 @@ public final class MethodAnnotationChecker extends ContextTrackingChecker { |
| boolean isInterfaceFunction = |
| function.enclosingType != null && function.enclosingType.isInterface; |
| int invalidAnnotationIndex = |
| - invalidReturnsAnnotationIndex(getState().getNodeText(jsDocNode)); |
| + invalidReturnAnnotationIndex(getState().getNodeText(jsDocNode)); |
| if (invalidAnnotationIndex != -1) { |
| String suggestedResolution = (isReturningFunction || isInterfaceFunction) |
| - ? "should be @return instead" |
| + ? "should be \"@return {<type>}\"" |
| : "please remove, as function does not return value"; |
| getContext().reportErrorInNode(jsDocNode, invalidAnnotationIndex, |
| - String.format("invalid @returns annotation found - %s", suggestedResolution)); |
| + String.format( |
| + "invalid return type annotation found - %s", suggestedResolution)); |
| return; |
| } |
| AstNode functionNameNode = getFunctionNameNode(function.functionNode); |
| @@ -172,8 +182,12 @@ public final class MethodAnnotationChecker extends ContextTrackingChecker { |
| return nameNode == null ? null : getState().getNodeText(nameNode); |
| } |
| - private static int invalidReturnsAnnotationIndex(String jsDoc) { |
| - return jsDoc == null ? -1 : jsDoc.indexOf("@returns"); |
| + private static int invalidReturnAnnotationIndex(String jsDoc) { |
| + if (jsDoc == null) { |
| + return -1; |
| + } |
| + Matcher m = INVALID_RETURN_PATTERN.matcher(jsDoc); |
| + return m.find() ? m.start() : -1; |
| } |
| private static AstNode getFunctionNameNode(FunctionNode functionNode) { |