[315051] [translation]Empty Custom tag within Custom tag gives compilation error
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 99dc945..2c4dba0 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
@@ -887,6 +887,10 @@ return fJspTextBuffer.toString(); } + + protected void addTaglibVariables(String tagToAdd, ITextRegionCollection customTag) { + addTaglibVariables(tagToAdd, customTag, -1); + } /** * Add the server-side scripting variables used by this tag, along with * any scoping. @@ -894,12 +898,12 @@ * @param tagToAdd * @param customTag */ - protected void addTaglibVariables(String tagToAdd, ITextRegionCollection customTag) { + protected void addTaglibVariables(String tagToAdd, ITextRegionCollection customTag, int index) { if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_TAG_OPEN)) { /* * Start tag */ - addStartTagVariable(tagToAdd, customTag); + addStartTagVariable(tagToAdd, customTag,index); } else if (customTag.getFirstRegion().getType().equals(DOMRegionContext.XML_END_TAG_OPEN)) { /* @@ -942,7 +946,7 @@ fTranslationProblems.add(missingStartTag); } } - private void addStartTagVariable(String tagToAdd,ITextRegionCollection customTag){ + private void addStartTagVariable(String tagToAdd,ITextRegionCollection customTag, int index){ IFile f = getFile(); if (f == null || !f.exists()) @@ -962,7 +966,11 @@ appendToBuffer(decl, fUserCode, false, customTag); } } - boolean isEmptyTag = isEmptyTag(customTag); + boolean isEmptyTag = false; + if (index != -1) + isEmptyTag= isEmptyTag(customTag, index); + else + isEmptyTag= isEmptyTag(customTag); /* * Add a single { to limit the scope of NESTED variables @@ -1012,6 +1020,21 @@ } + private boolean isEmptyTag(ITextRegionCollection customTag, int index) { + String type = null; + // custom tag is embedded + ITextRegionList regions = customTag.getRegions(); + ITextRegion nextRegion = regions.get(index); + int size = customTag.getNumberOfRegions() ; + type = nextRegion.getType(); + while (index <= size && !(DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type) || DOMRegionContext.XML_TAG_NAME.equals(type) || DOMRegionContext.XML_TAG_CLOSE.equals(type) )) { + nextRegion = regions.get(++index); + type = nextRegion.getType(); + } + + return DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(type); + } + private boolean isEmptyTag(ITextRegionCollection customTag) { ITextRegion lastRegion = customTag.getLastRegion(); // custom tag is embedded @@ -1026,7 +1049,7 @@ return DOMRegionContext.XML_EMPTY_TAG_CLOSE.equals(lastRegion.getType()); } - private void addCustomTaglibVariables(String tagToAdd, ITextRegionCollection customTag, ITextRegion prevRegion) { + private void addCustomTaglibVariables(String tagToAdd, ITextRegionCollection customTag, ITextRegion prevRegion, int index) { //Can't judge by first region as start and end tag are part of same ContextRegionContainer if (prevRegion != null && prevRegion.getType().equals(DOMRegionContext.XML_END_TAG_OPEN)) { /* @@ -1038,7 +1061,7 @@ /* * Start tag */ - addStartTagVariable(tagToAdd,customTag); + addStartTagVariable(tagToAdd,customTag, index); } } @@ -1453,7 +1476,7 @@ { String fullTagName = container.getText(r); if (fullTagName.indexOf(':') > -1 && !fullTagName.startsWith(JSP_PREFIX)) { - addTaglibVariables(fullTagName, container); // it + addTaglibVariables(fullTagName, container,-1); // it // may // be a // custom @@ -1875,7 +1898,7 @@ ITextRegion prevRegion =null; if (i>0) prevRegion = embeddedRegions.get(i-1); - addCustomTaglibVariables(fullTagName, embeddedContainer,prevRegion); // it may be a custom tag + addCustomTaglibVariables(fullTagName, embeddedContainer,prevRegion,i+1); // it may be a custom tag } } if(type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE || type == DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE