/** * Checks a set of tags for matching throws. * * @param tags the tags to check * @param throwsList the throws to check * @param reportExpectedTags whether we should report if do not find expected tag */ private void checkThrowsTags( List<JavadocTag> tags, List<ExceptionInfo> throwsList, boolean reportExpectedTags) { // Loop over the tags, checking to see they exist in the throws. // The foundThrows used for performance only final Set<String> foundThrows = Sets.newHashSet(); final ListIterator<JavadocTag> tagIt = tags.listIterator(); while (tagIt.hasNext()) { final JavadocTag tag = tagIt.next(); if (!tag.isThrowsTag()) { continue; } tagIt.remove(); // Loop looking for matching throw final String documentedEx = tag.getFirstArg(); final Token token = new Token(tag.getFirstArg(), tag.getLineNo(), tag.getColumnNo()); final AbstractClassInfo documentedCI = createClassInfo(token, getCurrentClassName()); final boolean found = foundThrows.contains(documentedEx) || isInThrows(throwsList, documentedCI, foundThrows); // Handle extra JavadocTag. if (!found) { boolean reqd = true; if (allowUndeclaredRTE) { reqd = !isUnchecked(documentedCI.getClazz()); } if (reqd && validateThrows) { log( tag.getLineNo(), tag.getColumnNo(), MSG_UNUSED_TAG, JavadocTagInfo.THROWS.getText(), tag.getFirstArg()); } } } // Now dump out all throws without tags :- unless // the user has chosen to suppress these problems if (!allowMissingThrowsTags && reportExpectedTags) { for (ExceptionInfo ei : throwsList) { if (!ei.isFound()) { final Token fi = ei.getName(); log( fi.getLineNo(), fi.getColumnNo(), MSG_EXCPECTED_TAG, JavadocTagInfo.THROWS.getText(), fi.getText()); } } } }
@Override protected final void logLoadError(Token ident) { logLoadErrorImpl( ident.getLineNo(), ident.getColumnNo(), MSG_CLASS_INFO, JavadocTagInfo.THROWS.getText(), ident.getText()); }