[generation] Expand "comments" in string literals

Extend test generation tool to recognize and expand interpolation
patterns within string literals.
This commit is contained in:
Mike Pennisi 2016-03-08 16:24:07 -05:00
parent 3723e7caeb
commit b0b41775e5
5 changed files with 23 additions and 7 deletions

View File

@ -78,6 +78,13 @@ class Template:
for region in self.regions: for region in self.regions:
whitespace = indentPattern.match(lines[region['lineno']]).group(1) whitespace = indentPattern.match(lines[region['lineno']]).group(1)
value = context['regions'].get(region['name'], '') value = context['regions'].get(region['name'], '')
str_char = region.get('in_string')
if str_char:
safe_char = '"' if str_char == '\'' else '\''
value = value.replace(str_char, safe_char)
value = value.replace('\n', '\\\n')
source = source[:region['firstchar']] + \ source = source[:region['firstchar']] + \
indent(value, whitespace).lstrip() + \ indent(value, whitespace).lstrip() + \
source[region['lastchar']:] source[region['lastchar']:]

View File

@ -4,6 +4,7 @@
def find_comments(source): def find_comments(source):
'''Parse input string describing JavaScript source and yield dictionaries '''Parse input string describing JavaScript source and yield dictionaries
describing the JavaScript comments in the order they appear in the source. describing the JavaScript comments in the order they appear in the source.
This includes comment patterns within string literals.
Each dictionary defines the following attributes: Each dictionary defines the following attributes:
@ -11,6 +12,9 @@ def find_comments(source):
- firstchar: the zero-indexed position of the token that begins the comment - firstchar: the zero-indexed position of the token that begins the comment
- lastchar: the zero-indexed position of the token that closes the comment - lastchar: the zero-indexed position of the token that closes the comment
- lineno: the zero-indexed offset of the line on which the comment appears - lineno: the zero-indexed offset of the line on which the comment appears
- in_string: `False` if the comment is a true JavaScript comment, one of
'\'' (single quote), '"' (double quote), or '`' (back tick) if
the comment pattern appears within a string literal.
''' '''
in_string = False in_string = False
in_s_comment = False in_s_comment = False
@ -37,6 +41,7 @@ def find_comments(source):
source=comment[1:], source=comment[1:],
firstchar=idx - len(comment) - 1, firstchar=idx - len(comment) - 1,
lastchar=idx, lastchar=idx,
in_string=in_string,
lineno=lineno) lineno=lineno)
continue continue
elif in_m_comment: elif in_m_comment:
@ -46,6 +51,7 @@ def find_comments(source):
source=comment[1:-1], source=comment[1:-1],
firstchar=idx - len(comment) - 1, firstchar=idx - len(comment) - 1,
lastchar=idx + 1, lastchar=idx + 1,
in_string=in_string,
lineno=lineno) lineno=lineno)
continue continue
elif in_string: elif in_string:
@ -53,7 +59,6 @@ def find_comments(source):
in_string = False in_string = False
elif source[idx] == '\n' and in_string != '`' and not follows_escape: elif source[idx] == '\n' and in_string != '`' and not follows_escape:
in_string = False in_string = False
continue
if in_m_comment or in_s_comment: if in_m_comment or in_s_comment:
comment += source[idx] comment += source[idx]

View File

@ -25,9 +25,10 @@ The following should not be expanded:
*/*{ first }*/ */*{ first }*/
//*{ first }*/ //*{ first }*/
// /*{ first }*/ // /*{ first }*/
"/*{ first }*/" Quote characters: " ' `
'/*{ first }*/' "Quote characters: ' ' `"
'Quote characters: " " `'
` `
/*{ first }*/` Quote characters: " ' '`
'This is "teardown" code.'; 'This is "teardown" code.';

View File

@ -23,5 +23,7 @@ First value
Second value Second value
//- third //- third
Third value Third value
//- fourth
Quote characters: " ' `
//- teardown //- teardown
'This is "teardown" code.'; 'This is "teardown" code.';

View File

@ -21,7 +21,8 @@ The following should not be expanded:
*/*{ first }*/ */*{ first }*/
//*{ first }*/ //*{ first }*/
// /*{ first }*/ // /*{ first }*/
"/*{ first }*/" /*{ fourth }*/
'/*{ first }*/' "/*{ fourth }*/"
'/*{ fourth }*/'
` `
/*{ first }*/` /*{ fourth }*/`