diff --git a/pmd-dart/src/main/antlr4/net/sourceforge/pmd/lang/dart/antlr4/Dart2.g4 b/pmd-dart/src/main/antlr4/net/sourceforge/pmd/lang/dart/antlr4/Dart2.g4 index 7d8793edab..01bef8c093 100644 --- a/pmd-dart/src/main/antlr4/net/sourceforge/pmd/lang/dart/antlr4/Dart2.g4 +++ b/pmd-dart/src/main/antlr4/net/sourceforge/pmd/lang/dart/antlr4/Dart2.g4 @@ -351,16 +351,16 @@ SingleLineString fragment StringContentDQ - : ~('\\' | '"' /*| '$'*/ | '\n' | '\r') + : ~('\\' | '"' | '$' | '\n' | '\r') | '\\' ~('\n' | '\r') - //| stringInterpolation + | StringInterpolation ; fragment StringContentSQ - : ~('\\' | '\'' /*| '$'*/ | '\n' | '\r') + : ~('\\' | '\'' | '$' | '\n' | '\r') | '\\' ~('\n' | '\r') - //| stringInterpolation + | StringInterpolation ; MultiLineString @@ -372,15 +372,16 @@ MultiLineString fragment StringContentTDQ - : ~('\\' | '"' /*| '$'*/) + : ~('\\' | '"' | '$') | '"' ~'"' | '""' ~'"' - //| stringInterpolation + | StringInterpolation ; -fragment StringContentTSQ - : ~('\\' | '\'' /*| '$'*/) +fragment +StringContentTSQ + : ~('\\' | '\'' | '$') | '\'' ~'\'' | '\'\'' ~'\'' - //| stringInterpolation + | StringInterpolation ; NEWLINE @@ -390,10 +391,17 @@ NEWLINE ; // 16.5.1 String Interpolation -stringInterpolation -// : '$' IDENTIFIER_NO_DOLLAR - : '$' identifier// FIXME - | '${' expression '}' +fragment +StringInterpolation + : '$' IDENTIFIER_NO_DOLLAR + | '${' StringInterpolationContent* '}' + ; + +fragment +StringInterpolationContent + : ~('$' | '{' | '}') + | '$' IDENTIFIER_NO_DOLLAR + | '${' StringInterpolationContent* '}' ; // 16.6 Symbols diff --git a/pmd-dart/src/test/java/net/sourceforge/pmd/cpd/DartTokenizerTest.java b/pmd-dart/src/test/java/net/sourceforge/pmd/cpd/DartTokenizerTest.java index ec4a769c7e..72e0defad7 100644 --- a/pmd-dart/src/test/java/net/sourceforge/pmd/cpd/DartTokenizerTest.java +++ b/pmd-dart/src/test/java/net/sourceforge/pmd/cpd/DartTokenizerTest.java @@ -54,7 +54,10 @@ public class DartTokenizerTest extends CpdTextComparisonTest { doTest("imports"); } - + @Test + public void testStringInterpolation() { + doTest("string_interpolation"); + } @Test public void testRegex() { diff --git a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.dart b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.dart index 7d70500426..995f806682 100644 --- a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.dart +++ b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.dart @@ -1,3 +1,3 @@ var newline = '\n'; -var dollar = '$'; +var dollar = '$newLine'; var escaped_dollar = "\$"; \ No newline at end of file diff --git a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.txt b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.txt index 12c378a8a6..54e5712200 100644 --- a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.txt +++ b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/escape_sequences.txt @@ -8,7 +8,7 @@ L2 [var] 1 3 [dollar] 5 10 [=] 12 12 - ['$'] 14 16 + ['$newLine'] 14 23 L3 [var] 1 3 [escaped_dollar] 5 18 diff --git a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.dart b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.dart new file mode 100644 index 0000000000..2926939dbd --- /dev/null +++ b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.dart @@ -0,0 +1,2 @@ +var stringInStringUnicode = "${"∆"}"; +var stringInStringNewline = "${"\n")}"; diff --git a/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.txt b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.txt new file mode 100644 index 0000000000..cace985d1f --- /dev/null +++ b/pmd-dart/src/test/resources/net/sourceforge/pmd/cpd/testdata/string_interpolation.txt @@ -0,0 +1,12 @@ + [Image] or [Truncated image[ Bcol Ecol +L1 + [var] 1 3 + [stringInStringUnicode] 5 25 + [=] 27 27 + ["${"∆"}"] 29 36 +L2 + [var] 1 3 + [stringInStringNewline] 5 25 + [=] 27 27 + ["${"\\n")}"] 29 38 +EOF