Bug 578919 - [18][javadoc] provide support for reporting invalid
snippets in javadoc

Change-Id: Ieaa0c9da32374dd32b310d6b731a95b066595c75
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/191104
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavadocContentAccess2.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavadocContentAccess2.java
index b3fbdf0..524ed87 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavadocContentAccess2.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/javadoc/JavadocContentAccess2.java
@@ -1507,7 +1507,7 @@
 		else if (isCode || isLiteral)
 			handleContentElements(node.fragments(), true);
 		else if (isSnippet) {
-			handleSnippet(node.fragments());
+			handleSnippet(node);
 		}
 		else if (handleInheritDoc(node) || handleDocRoot(node)) {
 			// Handled
@@ -1921,29 +1921,42 @@
 		}
 	}
 
-	private void handleSnippet(List<? extends ASTNode> fragments) {
-		int fs= fragments.size();
-		if (fs > 0) {
-			fBuf.append("<pre><code>"); //$NON-NLS-1$
-			fBuf.append(BlOCK_TAG_ENTRY_START);
-			for(ASTNode fragment : fragments) {
-				if (fragment instanceof  TextElement) {
-					TextElement memberRef= (TextElement) fragment;
-					fBuf.append(memberRef.getText());
-				} else if (fragment instanceof TagElement) {
-					TagElement tagElem= (TagElement) fragment;
-					String name= tagElem.getTagName();
-					if (TagElement.TAG_HIGHLIGHT.equals(name)) {
-						handleSnippetHighlight(tagElem.fragments(), tagElem.tagProperties());
-					} else if (TagElement.TAG_REPLACE.equals(name)) {
-						handleSnippetReplace(tagElem.fragments(), tagElem.tagProperties());
+	private void handleSnippet(TagElement node) {
+		if (node != null) {
+			Object val = node.getProperty(TagProperty.TAG_PROPERTY_SNIPPET_IS_VALID);
+			if (val instanceof Boolean
+					&& ((Boolean)val).booleanValue()) {
+				int fs= node.fragments().size();
+				if (fs > 0) {
+					fBuf.append("<pre><code>"); //$NON-NLS-1$
+					fBuf.append(BlOCK_TAG_ENTRY_START);
+					for(Object fragment : node.fragments()) {
+						if (fragment instanceof  TextElement) {
+							TextElement memberRef= (TextElement) fragment;
+							fBuf.append(memberRef.getText());
+						} else if (fragment instanceof TagElement) {
+							TagElement tagElem= (TagElement) fragment;
+							String name= tagElem.getTagName();
+							if (TagElement.TAG_HIGHLIGHT.equals(name)) {
+								handleSnippetHighlight(tagElem.fragments(), tagElem.tagProperties());
+							} else if (TagElement.TAG_REPLACE.equals(name)) {
+								handleSnippetReplace(tagElem.fragments(), tagElem.tagProperties());
+							}
+						}
 					}
+					fBuf.append(BlOCK_TAG_ENTRY_END);
 				}
+			} else {
+				handleInvalidSnippet();
 			}
-			fBuf.append(BlOCK_TAG_ENTRY_END);
 		}
 	}
 
+	private void handleInvalidSnippet() {
+		fBuf.append("<pre><code>\n"); //$NON-NLS-1$
+		fBuf.append("<mark>invalid @Snippet</mark>"); //$NON-NLS-1$
+	}
+
 	private void handleSnippetReplace(List<? extends ASTNode> fragments, List<? extends ASTNode> tagProperties) {
 		try {
 			int fs= fragments.size();