diff options
author | Claude Brisson <cbrisson@apache.org> | 2019-04-16 09:22:58 +0000 |
---|---|---|
committer | Claude Brisson <cbrisson@apache.org> | 2019-04-16 09:22:58 +0000 |
commit | 8705542a685ae3eb4417a7ba2182a1892efcc6c8 (patch) | |
tree | 042901906a62e77512e83a0aa18ba5e2463b4319 | |
parent | 0b2e0213a25fba6a96613bdbd2e892afd196e838 (diff) | |
download | apache-velocity-engine-8705542a685ae3eb4417a7ba2182a1892efcc6c8.tar.gz |
[engine] Fix VELOCITY-912 : hyphen in identifiers for subproperties
git-svn-id: https://svn.apache.org/repos/asf/velocity/engine/trunk@1857633 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | velocity-engine-core/src/main/parser/Parser.jjt | 54 | ||||
-rw-r--r-- | velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java | 5 |
2 files changed, 40 insertions, 19 deletions
diff --git a/velocity-engine-core/src/main/parser/Parser.jjt b/velocity-engine-core/src/main/parser/Parser.jjt index 720643d9..6f1626bd 100644 --- a/velocity-engine-core/src/main/parser/Parser.jjt +++ b/velocity-engine-core/src/main/parser/Parser.jjt @@ -152,6 +152,12 @@ public class Parser */ public boolean strictEscape = false; + /** + * Set to true if the propoerty + * RuntimeConstants.PARSER_HYPHEN_ALLOWED is set to true + */ + public boolean hyphenAllowedInIdentifiers = false; + VelocityCharStream velcharstream = null; private RuntimeServices rsvc = null; @@ -196,6 +202,9 @@ public class Parser strictEscape = rs.getBoolean(RuntimeConstants.RUNTIME_REFERENCES_STRICT_ESCAPE, false); + hyphenAllowedInIdentifiers = + rs.getBoolean(RuntimeConstants.PARSER_HYPHEN_ALLOWED, false); + /* * and save the RuntimeServices */ @@ -675,13 +684,13 @@ TOKEN : } /* In all other states, drop the zero-width whitespace */ -<REFERENCE,REFMODIFIER,REFMOD3,REFINDEX,DIRECTIVE,REFMOD2,DEFAULT,REFMOD,IN_TEXTBLOCK,IN_MULTILINE_COMMENT,IN_FORMAL_COMMENT,IN_SINGLE_LINE_COMMENT> +<REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD3,REFINDEX,DIRECTIVE,REFMOD2,DEFAULT,REFMOD,IN_TEXTBLOCK,IN_MULTILINE_COMMENT,IN_FORMAL_COMMENT,IN_SINGLE_LINE_COMMENT> SKIP : { <BEFORE_EOF: "\u200B"> } -<REFERENCE, REFMODIFIER, REFMOD3> +<REFERENCE, REFMODIFIER, OLD_REFMODIFIER, REFMOD3> TOKEN: { <INDEX_LBRACKET: "["> @@ -756,7 +765,7 @@ TOKEN : } } -<DIRECTIVE,REFMODIFIER> +<DIRECTIVE,REFMODIFIER,OLD_REFMODIFIER> TOKEN: { <LPAREN: "("> @@ -769,7 +778,7 @@ TOKEN: * to REFMOD2 -> Modifier() */ - if (curLexState == REFMODIFIER ) + if (curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER ) switchTo( REFMOD2 ); } } @@ -842,7 +851,7 @@ TOKEN: * http://www.engr.mun.ca/~theo/JavaCC-FAQ/javacc-faq-ie.htm#tth_sEc3.12 * */ -<DEFAULT, PRE_REFERENCE, PRE_OLD_REFERENCE, REFERENCE, REFMODIFIER, REFMOD2, REFMOD3> +<DEFAULT, PRE_REFERENCE, PRE_OLD_REFERENCE, REFERENCE, REFMODIFIER, OLD_REFMODIFIER, REFMOD2, REFMOD3> TOKEN: { <SET_DIRECTIVE: ("#set" | "#{set}") (" "|"\t")* "("> @@ -869,7 +878,7 @@ TOKEN: * to REFMOD2 -> Modifier() */ - if (curLexState == REFMODIFIER ) + if (curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER ) switchTo( REFMOD2 ); } } @@ -896,7 +905,7 @@ MORE : stateStackPop(); } - int preReferenceState = parser.getRuntimeServices().isHyphenAllowedInIdentifiers() ? PRE_OLD_REFERENCE : PRE_REFERENCE; + int preReferenceState = parser.hyphenAllowedInIdentifiers ? PRE_OLD_REFERENCE : PRE_REFERENCE; trace( " $ : going to " + lexStateNames[preReferenceState]); @@ -923,7 +932,7 @@ MORE : stateStackPop(); } - int preReferenceState = parser.getRuntimeServices().isHyphenAllowedInIdentifiers() ? PRE_OLD_REFERENCE : PRE_REFERENCE; + int preReferenceState = parser.hyphenAllowedInIdentifiers ? PRE_OLD_REFERENCE : PRE_REFERENCE; trace( " $ : going to " + lexStateNames[preReferenceState]); @@ -990,7 +999,7 @@ MORE : * you are going into DIRECTIVE while in REFERENCE. -gmj */ - if (curLexState == REFERENCE || curLexState == PRE_REFERENCE || curLexState == PRE_OLD_REFERENCE || curLexState == REFMODIFIER ) + if (curLexState == REFERENCE || curLexState == PRE_REFERENCE || curLexState == PRE_OLD_REFERENCE || curLexState == REFMODIFIER || curLexState == OLD_REFMODIFIER ) { stateStackPop(); } @@ -1009,7 +1018,7 @@ MORE : // treat the single line comment case separately // to avoid ##<EOF> errors -<DEFAULT,PRE_DIRECTIVE,DIRECTIVE,REFERENCE,PRE_REFERENCE,PRE_OLD_REFERENCE,REFMOD2,REFMOD3,REFMODIFIER> +<DEFAULT,PRE_DIRECTIVE,DIRECTIVE,REFERENCE,PRE_REFERENCE,PRE_OLD_REFERENCE,REFMOD2,REFMOD3,REFMODIFIER,OLD_REFMODIFIER> TOKEN : { <SINGLE_LINE_COMMENT_START: "##"> @@ -1173,7 +1182,7 @@ TOKEN : } } -<REFERENCE,DIRECTIVE,REFMODIFIER,REFMOD2,REFINDEX,ALT_VAL> +<REFERENCE,DIRECTIVE,REFMODIFIER,OLD_REFMODIFIER,REFMOD2,REFINDEX,ALT_VAL> TOKEN: { <TRUE: "true"> @@ -1315,6 +1324,7 @@ TOKEN: * |________________> REFERENCE : state initiated by the identifier. Continues * | | | until end of the reference, or the . character. * |_____________ > REFMODIFIER : state switched to when the <DOT> is encountered. + * | | (or OLD_REFMODIFIER if '-' is allowed in identifiers) * | | note that this is a switch, not a push. See notes at bottom. * |_________ > REFMOD2 : state switch to when the LPAREN is encountered. * | again, this is a switch, not a push. @@ -1339,19 +1349,22 @@ TOKEN : } } -<PRE_OLD_REFERENCE> +<PRE_OLD_REFERENCE,OLD_REFMODIFIER> TOKEN : { <#OLD_ALPHA_CHAR: ["a"-"z", "A"-"Z", "_"] > | <#OLD_IDENTIFIER_CHAR: [ "a"-"z", "A"-"Z", "0"-"9", "_", "-" ] > | <OLD_IDENTIFIER: ( <OLD_ALPHA_CHAR> ) (<OLD_IDENTIFIER_CHAR>)* > { - switchTo(REFERENCE); + if (curLexState == PRE_OLD_REFERENCE) + { + switchTo(REFERENCE); + } } } -<REFERENCE,REFMODIFIER,REFMOD2,REFMOD3> +<REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD2,REFMOD3> TOKEN: { <DOT: "." <ALPHA_CHAR>> @@ -1370,13 +1383,15 @@ TOKEN: matchedToken.image = "."; - trace("DOT : switching to " + REFMODIFIER); - switchTo(REFMODIFIER); + int refModifierState = parser.hyphenAllowedInIdentifiers ? OLD_REFMODIFIER : REFMODIFIER; + + trace("DOT : switching to " + lexStateNames[refModifierState]); + switchTo(refModifierState); } } -<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,REFMOD3> +<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD3> TOKEN : { <LCURLY: "{"> @@ -1403,7 +1418,7 @@ TOKEN : } } -<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,REFMOD,REFMOD3> +<PRE_REFERENCE,PRE_OLD_REFERENCE,REFERENCE,REFMODIFIER,OLD_REFMODIFIER,REFMOD,REFMOD3> SPECIAL_TOKEN : { <REFERENCE_TERMINATOR: ~[] > @@ -2471,7 +2486,8 @@ void PrimaryExpression() #void : {} REFERENCE : Triggered by the <IDENTIFIER> - REFMODIFIER : Triggered by .<alpha> when in REFERENCE, REFMODIFIER or REFMOD3 + REFMODIFIER : Triggered by .<alpha> when in REFERENCE, REFMODIFIER or REFMOD3. When '-' + is allowed in identifiers, this state is called OLD_REFMODIFIER. REFMOD2 : Triggered by '(' when in REFMODIFIER diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java index 4ab2b8b2..e1fdce19 100644 --- a/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java +++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/HyphenInIdentifiersTestCase.java @@ -42,4 +42,9 @@ public class HyphenInIdentifiersTestCase extends BaseTestCase { assertEvalEquals("6","#set($var-1 = 7)#set($var-2 = $var-1 - 1)$var-2"); } + + public void testHyphenInCollection() + { + assertEvalEquals("foofoofoo","#set($map = {'name-with-hyphen':'foo'})$map.name-with-hyphen${map.name-with-hyphen}${map.get('name-with-hyphen')}"); + } } |