[332295] [parser] Tags are not properly handled inside comment
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
index f79f43e..bf31f9f 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
@@ -1577,7 +1577,7 @@
 					}
 				}
 				else {
-					checkAllAttributeValueContainers(regions);
+					checkAllAttributeValueContainers(container,regions);
 				}
 			}
 		}
@@ -1588,15 +1588,23 @@
 	 * 
 	 * @param regions
 	 */
-	private void checkAllAttributeValueContainers(Iterator regions) {
+	private void checkAllAttributeValueContainers(ITextRegionCollection container, Iterator regions) {
 		// tag name is not jsp
 		// handle embedded jsp attributes...
 		ITextRegion embedded = null;
 		// Iterator attrRegions = null;
 		// ITextRegion attrChunk = null;
+		ITextRegion prevRegion = null;
 		while (regions.hasNext()) {
 			embedded = (ITextRegion) regions.next();
-			if (embedded instanceof ITextRegionContainer) {
+			if (embedded.getType() == DOMRegionContext.XML_TAG_NAME || embedded.getType() == DOMJSPRegionContexts.JSP_DIRECTIVE_NAME) {
+				String fullTagName = container.getText(embedded);
+				if (fullTagName.indexOf(':') > -1 && !fullTagName.startsWith(JSP_PREFIX)) {
+					if (prevRegion != null)
+					addCustomTaglibVariables(fullTagName, container,prevRegion,-1); // it may be a custom tag
+				}
+			}
+			else if (embedded instanceof ITextRegionContainer) {
 				// parse out container
 
 				// https://bugs.eclipse.org/bugs/show_bug.cgi?id=130606
@@ -1624,6 +1632,7 @@
 				// }
 				// }
 			}
+			prevRegion = embedded;
 		}
 	}
 
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
index ca663e2..b2b4952 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/parser/internal/JSPTokenizer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.2.2 on 10/29/10 4:24 PM */
+/* The following code was generated by JFlex 1.2.2 on 12/16/10 12:41 PM */
 
 /*******************************************************************************
  * Copyright (c) 2004, 2010 IBM Corporation and others.
@@ -36,7 +36,7 @@
 /**
  * This class is a scanner generated by 
  * <a href="http://www.informatik.tu-muenchen.de/~kleing/jflex/">JFlex</a> 1.2.2
- * on 10/29/10 4:24 PM from the specification file
+ * on 12/16/10 12:41 PM from the specification file
  * <tt>file:/C:/dev/workspaces/indigo/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex</tt>
  */
 public class JSPTokenizer implements BlockTokenizer, DOMJSPRegionContexts {
@@ -1165,6 +1165,9 @@
 				// determine if a block tag scan is necessary
 				if (internalContext == XML_TAG_NAME) {
 					internalTagName = yytext();
+					if (endTagName != null && endTagName.length() == 0){
+						endTagName = internalTagName;
+					}
 					if(!isNestable(internalTagName)) {
 						internalTagName = null;
 						// snagged a tag name we shouldn't have
@@ -1453,16 +1456,27 @@
 					return searchContext;
 				}
 				// 4) XML tag 
-				else if(allowTag && checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 
-						yy_buffer[yy_currentPos - searchStringLength] == '<') {
-					fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
-					yy_currentPos = yy_markedPos + 1;
-					int resumeState = yystate();
-					yybegin(ST_XML_TAG_NAME);
-					if(yy_markedPos == yy_startRead) {
-						String jspContext = primGetNextToken();
-						yybegin(resumeState);
-						return jspContext;
+				else if(allowTag && checkJSPs && yy_currentPos > searchStringLength && yy_buffer[yy_currentPos - searchStringLength] == '<') {
+					String buffer = String.copyValueOf(yy_buffer);
+					int jspSepIndex = buffer.indexOf(':',yy_currentPos );
+					if (jspSepIndex >= 0 ){
+						int endTagIndex = buffer.indexOf('>', jspSepIndex +1);
+						if (endTagIndex != -1 && (buffer.indexOf(searchString, jspSepIndex) != (endTagIndex -searchStringLength+1) )){
+							fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;
+							yy_currentPos = yy_markedPos + 1;
+							if(yy_markedPos == yy_startRead) {
+								int resumeState = yystate();
+								yybegin(ST_XML_TAG_NAME);
+								fStateStack.push(resumeState);
+								String jspContext = primGetNextToken();
+								yybegin(resumeState);
+								return jspContext;
+							}
+							
+							return searchContext;
+						}
+							
+						
 					}
 					return searchContext;
 				}
@@ -3474,6 +3488,14 @@
           { 
 	if(Debug.debugTokenizer)
 		dump("\nstart tag open");//$NON-NLS-1$
+	if (!fStateStack.empty() && fStateStack.peek()== ST_XML_COMMENT){
+		fStateStack.pop();
+		fEmbeddedHint = XML_COMMENT_TEXT;
+		yybegin(ST_XML_TAG_NAME);
+		String tagName = "";
+		assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?
+		return PROXY_CONTEXT;
+	}
 	fEmbeddedHint = XML_TAG_NAME;
 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;
         yybegin(ST_XML_TAG_NAME);
diff --git a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
index 5ca0c2c..7c2bbe8 100644
--- a/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
+++ b/bundles/org.eclipse.wst.sse.core/DevTimeSupport/SedModel/HTMLTokenizer/devel/JSPTokenizer.jflex
@@ -224,6 +224,9 @@
 				// determine if a block tag scan is necessary

 				if (internalContext == XML_TAG_NAME) {

 					internalTagName = yytext();

+					if (endTagName != null && endTagName.length() == 0){

+						endTagName = internalTagName;

+					}

 					if(!isNestable(internalTagName)) {

 						internalTagName = null;

 						// snagged a tag name we shouldn't have

@@ -512,16 +515,27 @@
 					return searchContext;

 				}

 				// 4) XML tag 

-				else if(allowTag && checkJSPs && yy_currentPos > searchStringLength && yy_currentPos - searchStringLength != fLastInternalBlockStart && 

-						yy_buffer[yy_currentPos - searchStringLength] == '<') {

-					fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;

-					yy_currentPos = yy_markedPos + 1;

-					int resumeState = yystate();

-					yybegin(ST_XML_TAG_NAME);

-					if(yy_markedPos == yy_startRead) {

-						String jspContext = primGetNextToken();

-						yybegin(resumeState);

-						return jspContext;

+				else if(allowTag && checkJSPs && yy_currentPos > searchStringLength && yy_buffer[yy_currentPos - searchStringLength] == '<') {

+					String buffer = String.copyValueOf(yy_buffer);

+					int jspSepIndex = buffer.indexOf(':',yy_currentPos );

+					if (jspSepIndex >= 0 ){

+						int endTagIndex = buffer.indexOf('>', jspSepIndex +1);

+						if (endTagIndex != -1 && (buffer.indexOf(searchString, jspSepIndex) != (endTagIndex -searchStringLength+1) )){

+							fLastInternalBlockStart = yy_markedPos = yy_currentPos - searchStringLength;

+							yy_currentPos = yy_markedPos + 1;

+							if(yy_markedPos == yy_startRead) {

+								int resumeState = yystate();

+								yybegin(ST_XML_TAG_NAME);

+								fStateStack.push(resumeState);

+								String jspContext = primGetNextToken();

+								yybegin(resumeState);

+								return jspContext;

+							}

+							

+							return searchContext;

+						}

+							

+						

 					}

 					return searchContext;

 				}

@@ -1399,6 +1413,14 @@
 <YYINITIAL, ST_XML_TAG_NAME, ST_XML_EQUALS, ST_XML_ATTRIBUTE_NAME, ST_XML_DECLARATION, ST_JSP_DIRECTIVE_NAME, ST_JSP_DIRECTIVE_NAME_WHITESPACE, ST_JSP_DIRECTIVE_ATTRIBUTE_NAME, ST_JSP_DIRECTIVE_EQUALS, ST_JSP_DIRECTIVE_ATTRIBUTE_VALUE> {genericTagOpen} {

 	if(Debug.debugTokenizer)

 		dump("\nstart tag open");//$NON-NLS-1$

+	if (!fStateStack.empty() && fStateStack.peek()== ST_XML_COMMENT){

+		fStateStack.pop();

+		fEmbeddedHint = XML_COMMENT_TEXT;

+		yybegin(ST_XML_TAG_NAME);

+		String tagName = "";

+		assembleEmbeddedTagSequence(XML_TAG_OPEN, tagName); // ?

+		return PROXY_CONTEXT;

+	}

 	fEmbeddedHint = XML_TAG_NAME;

 	fEmbeddedPostState = ST_XML_ATTRIBUTE_NAME;

         yybegin(ST_XML_TAG_NAME);