From 5d1d4031e6e2e5e39dba792aed21fb68cc96d0ec Mon Sep 17 00:00:00 2001 From: Sergey Date: Tue, 11 Apr 2017 16:34:01 -0700 Subject: [PATCH] Adding inner comment support for scripts --- pmd-visualforce/etc/grammar/VfParser.jjt | 42 +++++++++++++------ pmd-visualforce/src/main/ant/alljavacc.xml | 2 +- .../lang/vf/ast/VfParserVisitorAdapter.java | 4 ++ .../pmd/lang/vf/rule/AbstractVfRule.java | 4 ++ .../pmd/lang/vf/ast/VfDocStyleTest.java | 22 +++++++++- 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/pmd-visualforce/etc/grammar/VfParser.jjt b/pmd-visualforce/etc/grammar/VfParser.jjt index f3508abbce..2c98f612ca 100644 --- a/pmd-visualforce/etc/grammar/VfParser.jjt +++ b/pmd-visualforce/etc/grammar/VfParser.jjt @@ -15,7 +15,7 @@ PARSER_BEGIN(VfParser) package net.sourceforge.pmd.lang.vf.ast; import net.sourceforge.pmd.lang.ast.CharStream; -import net.sourceforge.pmd.lang.ast.TokenMgrError; +import net.sourceforge.pmd.lang.vf.ast.TokenMgrError; public class VfParser { @@ -115,7 +115,7 @@ PARSER_END(VfParser) TOKEN : { - + | | | @@ -161,22 +161,23 @@ PARSER_END(VfParser) TOKEN : { - )? > : AttrValueBetweenSingleQuotesState + )? > : AttrValueBetweenSingleQuotesState } TOKEN : -{ - )? > : AttrValueBetweenDoubleQuotesState +{ + )? > : AttrValueBetweenDoubleQuotesState } TOKEN : { - )? > : AttrValueNoQuotesState + )? > : AttrValueNoQuotesState } TOKEN : { - )? > : HtmlScriptContentState + : InlineCommentStateScript + | )? > : HtmlScriptContentState } TOKEN : @@ -231,7 +232,7 @@ PARSER_END(VfParser) { : InTagState | )? > : ElAttribTagStateNQ - | + | } @@ -257,6 +258,12 @@ PARSER_END(VfParser) | < COMMENT_TEXT: (~[]) > } + TOKEN : +{ + < COMMENT_CLOSE_SCRIPT: ("*/" ) > : ElInScriptState +| < COMMENT_INNER_TEXT_SCRIPT: (~[]) > +} + TOKEN : { " > : AfterTagState @@ -401,7 +408,8 @@ void ElExpression() : void Expression() : {} { - ConditionalExpression() [ AssignmentOperator() Expression() ] + ConditionalExpression() [ AssignmentOperator() Expression() ] +| InlineCommentExpression() ( ConditionalExpression() | InlineCommentExpression() )* } void AssignmentOperator() #void : @@ -481,17 +489,25 @@ void UnaryExpressionNotPlusMinus() #void : void PrimaryExpression() #void : {} { - PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* + PrimaryPrefix() ( LOOKAHEAD(2) PrimarySuffix() )* +} + +void InlineCommentExpression() : +{ + StringBuffer content = new StringBuffer(); + Token t; +} +{ + ( t = { content.append(t.image); })* { jjtThis.setImage(content.toString()); } } void PrimaryPrefix() #void : {} { - Literal() - | Identifier() + Literal() + | Identifier() | Expression() | Expression() ( Expression())* - } void PrimarySuffix() #void : diff --git a/pmd-visualforce/src/main/ant/alljavacc.xml b/pmd-visualforce/src/main/ant/alljavacc.xml index 251113ff86..db23e5fb21 100644 --- a/pmd-visualforce/src/main/ant/alljavacc.xml +++ b/pmd-visualforce/src/main/ant/alljavacc.xml @@ -34,6 +34,7 @@ - diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java index 53d69e42b9..b60b979111 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java @@ -89,4 +89,8 @@ public class VfParserVisitorAdapter implements VfParserVisitor { return visit((VfNode) node, data); } + @Override + public Object visit(ASTInlineCommentExpression node, Object data) { + return visit((VfNode) node, data); + } } diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java index 7754a121d1..6ed7a384dc 100644 --- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java +++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java @@ -28,6 +28,7 @@ import net.sourceforge.pmd.lang.vf.ast.ASTElement; import net.sourceforge.pmd.lang.vf.ast.ASTExpression; import net.sourceforge.pmd.lang.vf.ast.ASTHtmlScript; import net.sourceforge.pmd.lang.vf.ast.ASTIdentifier; +import net.sourceforge.pmd.lang.vf.ast.ASTInlineCommentExpression; import net.sourceforge.pmd.lang.vf.ast.ASTLiteral; import net.sourceforge.pmd.lang.vf.ast.ASTText; import net.sourceforge.pmd.lang.vf.ast.VfNode; @@ -132,4 +133,7 @@ public abstract class AbstractVfRule extends AbstractRule implements VfParserVis return visit((VfNode) node, data); } + public Object visit(ASTInlineCommentExpression node, Object data) { + return visit((VfNode) node, data); + } } diff --git a/pmd-visualforce/src/test/java/net/sourceforge/pmd/lang/vf/ast/VfDocStyleTest.java b/pmd-visualforce/src/test/java/net/sourceforge/pmd/lang/vf/ast/VfDocStyleTest.java index d5c6238171..2962610166 100644 --- a/pmd-visualforce/src/test/java/net/sourceforge/pmd/lang/vf/ast/VfDocStyleTest.java +++ b/pmd-visualforce/src/test/java/net/sourceforge/pmd/lang/vf/ast/VfDocStyleTest.java @@ -168,6 +168,25 @@ public class VfDocStyleTest extends AbstractVfNodesTest { assertEquals("Correct EL content expected!", "elInScript", id.getImage()); } + + /** + * Test parsing of inline comment in EL. + */ + @Test + public void testInlineCommentInEL() { + Set scripts = getNodes(ASTHtmlScript.class, TEST_EL_IN_HTML_SCRIPT_WITH_COMMENT); + assertEquals("One script expected!", 1, scripts.size()); + ASTHtmlScript script = scripts.iterator().next(); + ASTText text = script.getFirstChildOfType(ASTText.class); + assertEquals("Correct script content expected!", "vartext=", text.getImage()); + ASTElExpression el = script.getFirstChildOfType(ASTElExpression.class); + List comments = el.findDescendantsOfType(ASTInlineCommentExpression.class); + assertEquals("Correct comment size expected!", 2, comments.size()); + ASTIdentifier id = el.getFirstDescendantOfType(ASTIdentifier.class); + assertEquals("Correct EL content expected!", "elInScript", id.getImage()); + } + + /** * Test parsing of quoted EL in HTML <script> element. */ @@ -653,8 +672,9 @@ public class VfDocStyleTest extends AbstractVfNodesTest { private static final String TEST_ATTRIBUTE_VALUE_CONTAINING_HASH = " foo "; private static final String TEST_HTML_SCRIPT = ""; - + private static final String TEST_EL_IN_HTML_SCRIPT = ""; + private static final String TEST_EL_IN_HTML_SCRIPT_WITH_COMMENT = ""; private static final String TEST_QUOTED_EL_IN_HTML_SCRIPT = "";