Skip to content
This repository was archived by the owner on Mar 25, 2021. It is now read-only.

Commit c657baa

Browse files
aervin_ajafff
authored andcommitted
no-invalid-template-strings logic errors (#3131)
1 parent b6e4328 commit c657baa

File tree

2 files changed

+32
-24
lines changed

2 files changed

+32
-24
lines changed

src/rules/noInvalidTemplateStringsRule.ts

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,28 +50,18 @@ function walk(ctx: Lint.WalkContext<void>) {
5050
});
5151

5252
function check(node: ts.StringLiteral): void {
53-
/**
54-
* Finds instances of '${'
55-
*/
56-
const findTemplateString = new RegExp(/\$\{/);
57-
58-
const index = node.text.search(findTemplateString);
59-
if (index !== -1) {
60-
/**
61-
* Support for ignoring case: '\${template-expression}'
62-
*/
63-
const unescapedText = node.getFullText();
64-
const preceedingCharacter = unescapedText.substr(unescapedText.search(findTemplateString) - 1, 1);
65-
if (isBackslash(preceedingCharacter)) {
66-
return;
53+
const text = node.getText(ctx.sourceFile);
54+
const findTemplateStrings = /\\*\$\{/g;
55+
let instance = findTemplateStrings.exec(text);
56+
while (instance !== null) {
57+
const matchLength = instance[0].length;
58+
const backslashCount = matchLength - 2;
59+
const instanceIsEscaped = backslashCount % 2 === 1;
60+
if (!instanceIsEscaped) {
61+
const start = node.getStart() + (instance.index + backslashCount);
62+
ctx.addFailureAt(start, 2, Rule.FAILURE_STRING);
6763
}
68-
69-
const textStart = node.getStart() + 1;
70-
ctx.addFailureAt(textStart + index, 2, Rule.FAILURE_STRING);
64+
instance = findTemplateStrings.exec(text);
7165
}
7266
}
7367
}
74-
75-
function isBackslash(character: string): boolean {
76-
return character === "\\";
77-
}

test/rules/no-invalid-template-strings/test.ts.lint

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
1-
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\${which}></div>',Tab.mixins.AlwaysHasData())))
1+
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\${a}></div>',Tab.mixins.AlwaysHasData())))
22

3-
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\${which}></div>',Tab.mixins.AlwaysHasData('\${which}'))))
3+
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\${b}></div>',Tab.mixins.AlwaysHasData('\${c}'))))
44

5-
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\\\\\\${which}></div>',Tab.mixins.AlwaysHasData())))
5+
Tab.mixins.Templated('<div mbr-comment-tab=\${which}></div>',Tab.mixins.AlwaysHasData('\\${d}'))
6+
~~ [0]
7+
8+
Tab.mixins.Templated(`<div mbr-comment-tab=\${e}></div>`,Tab.mixins.AlwaysHasData('${f}'))
9+
~~ [0]
10+
11+
Tab.mixins.Templated('<div mbr-comment-tab=${g}></div>',Tab.mixins.AlwaysHasData('${h}'), Tab.mixin.SomeMethod('${i}'))
12+
~~ [0]
13+
~~ [0]
14+
~~ [0]
15+
16+
new (Tab.mixins.Controlled('MemberComments',Tab.mixins.Templated('<div mbr-comment-tab=\\${j}></div>',Tab.mixins.AlwaysHasData())))
17+
~~ [0]
18+
19+
new (Tab.mixins.Templated('<div mbr-comment-tab=\\\\\${b}></div>',Tab.mixins.AlwaysHasData('\\\\${c}'))))
20+
~~ [0]
21+
22+
"\${a} = ${a}";
23+
~~ [0]
624

725
"One plus one is ${1 + 1}.";
826
~~ [0]

0 commit comments

Comments
 (0)