diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart index 1f81c6bc3e7..189f05843ca 100644 --- a/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart +++ b/pkg/_fe_analyzer_shared/lib/src/scanner/abstract_scanner.dart @@ -1632,7 +1632,7 @@ abstract class AbstractScanner implements Scanner { if (($A <= next && next <= $Z) || ($0 <= next && next <= $9) || identical(next, $_) || - identical(next, $$)) { + (allowDollar && identical(next, $$))) { return tokenizeIdentifier(next, start, allowDollar); } else { appendKeywordToken(keyword); diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart index f44dd000b52..9547c1426cd 100644 --- a/pkg/analyzer/test/dart/ast/ast_test.dart +++ b/pkg/analyzer/test/dart/ast/ast_test.dart @@ -1783,6 +1783,37 @@ final v = """a${bb}ccc"""; expect(node.isSingleQuoted, isFalse); } } + + void test_this_followedByDollar() { + final parseResult = parseStringWithErrors(r''' +class C { + void m(int foo) { + '$this$foo'; + } +} +'''); + parseResult.assertNoErrors(); + var node = parseResult.findNode.stringInterpolation('this'); + assertParsedNodeText(node, r''' +StringInterpolation + elements + InterpolationString + contents: ' + InterpolationExpression + leftBracket: $ + expression: ThisExpression + thisKeyword: this + InterpolationString + contents: + InterpolationExpression + leftBracket: $ + expression: SimpleIdentifier + token: foo + InterpolationString + contents: ' + stringValue: null +'''); + } } @reflectiveTest