| @@ 1458-1531 (lines=74) @@ | ||
| 1455 | return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 |
|
| 1456 | ||
| 1457 | ||
| 1458 | def CleanseRawStrings(raw_lines): |
|
| 1459 | """Removes C++11 raw strings from lines. |
|
| 1460 | ||
| 1461 | Before: |
|
| 1462 | static const char kData[] = R"( |
|
| 1463 | multi-line string |
|
| 1464 | )"; |
|
| 1465 | ||
| 1466 | After: |
|
| 1467 | static const char kData[] = "" |
|
| 1468 | (replaced by blank line) |
|
| 1469 | ""; |
|
| 1470 | ||
| 1471 | Args: |
|
| 1472 | raw_lines: list of raw lines. |
|
| 1473 | ||
| 1474 | Returns: |
|
| 1475 | list of lines with C++11 raw strings replaced by empty strings. |
|
| 1476 | """ |
|
| 1477 | ||
| 1478 | delimiter = None |
|
| 1479 | lines_without_raw_strings = [] |
|
| 1480 | for line in raw_lines: |
|
| 1481 | if delimiter: |
|
| 1482 | # Inside a raw string, look for the end |
|
| 1483 | end = line.find(delimiter) |
|
| 1484 | if end >= 0: |
|
| 1485 | # Found the end of the string, match leading space for this |
|
| 1486 | # line and resume copying the original lines, and also insert |
|
| 1487 | # a "" on the last line. |
|
| 1488 | leading_space = Match(r'^(\s*)\S', line) |
|
| 1489 | line = leading_space.group(1) + '""' + line[end + len(delimiter):] |
|
| 1490 | delimiter = None |
|
| 1491 | else: |
|
| 1492 | # Haven't found the end yet, append a blank line. |
|
| 1493 | line = '""' |
|
| 1494 | ||
| 1495 | # Look for beginning of a raw string, and replace them with |
|
| 1496 | # empty strings. This is done in a loop to handle multiple raw |
|
| 1497 | # strings on the same line. |
|
| 1498 | while delimiter is None: |
|
| 1499 | # Look for beginning of a raw string. |
|
| 1500 | # See 2.14.15 [lex.string] for syntax. |
|
| 1501 | # |
|
| 1502 | # Once we have matched a raw string, we check the prefix of the |
|
| 1503 | # line to make sure that the line is not part of a single line |
|
| 1504 | # comment. It's done this way because we remove raw strings |
|
| 1505 | # before removing comments as opposed to removing comments |
|
| 1506 | # before removing raw strings. This is because there are some |
|
| 1507 | # cpplint checks that requires the comments to be preserved, but |
|
| 1508 | # we don't want to check comments that are inside raw strings. |
|
| 1509 | matched = Match(r'^(.*?)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) |
|
| 1510 | if (matched and |
|
| 1511 | not Match(r'^([^\'"]|\'(\\.|[^\'])*\'|"(\\.|[^"])*")*//', |
|
| 1512 | matched.group(1))): |
|
| 1513 | delimiter = ')' + matched.group(2) + '"' |
|
| 1514 | ||
| 1515 | end = matched.group(3).find(delimiter) |
|
| 1516 | if end >= 0: |
|
| 1517 | # Raw string ended on same line |
|
| 1518 | line = (matched.group(1) + '""' + |
|
| 1519 | matched.group(3)[end + len(delimiter):]) |
|
| 1520 | delimiter = None |
|
| 1521 | else: |
|
| 1522 | # Start of a multi-line raw string |
|
| 1523 | line = matched.group(1) + '""' |
|
| 1524 | else: |
|
| 1525 | break |
|
| 1526 | ||
| 1527 | lines_without_raw_strings.append(line) |
|
| 1528 | ||
| 1529 | # TODO(unknown): if delimiter is not None here, we might want to |
|
| 1530 | # emit a warning for unterminated string. |
|
| 1531 | return lines_without_raw_strings |
|
| 1532 | ||
| 1533 | ||
| 1534 | def FindNextMultiLineCommentStart(lines, lineix): |
|
| @@ 1458-1531 (lines=74) @@ | ||
| 1455 | return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1 |
|
| 1456 | ||
| 1457 | ||
| 1458 | def CleanseRawStrings(raw_lines): |
|
| 1459 | """Removes C++11 raw strings from lines. |
|
| 1460 | ||
| 1461 | Before: |
|
| 1462 | static const char kData[] = R"( |
|
| 1463 | multi-line string |
|
| 1464 | )"; |
|
| 1465 | ||
| 1466 | After: |
|
| 1467 | static const char kData[] = "" |
|
| 1468 | (replaced by blank line) |
|
| 1469 | ""; |
|
| 1470 | ||
| 1471 | Args: |
|
| 1472 | raw_lines: list of raw lines. |
|
| 1473 | ||
| 1474 | Returns: |
|
| 1475 | list of lines with C++11 raw strings replaced by empty strings. |
|
| 1476 | """ |
|
| 1477 | ||
| 1478 | delimiter = None |
|
| 1479 | lines_without_raw_strings = [] |
|
| 1480 | for line in raw_lines: |
|
| 1481 | if delimiter: |
|
| 1482 | # Inside a raw string, look for the end |
|
| 1483 | end = line.find(delimiter) |
|
| 1484 | if end >= 0: |
|
| 1485 | # Found the end of the string, match leading space for this |
|
| 1486 | # line and resume copying the original lines, and also insert |
|
| 1487 | # a "" on the last line. |
|
| 1488 | leading_space = Match(r'^(\s*)\S', line) |
|
| 1489 | line = leading_space.group(1) + '""' + line[end + len(delimiter):] |
|
| 1490 | delimiter = None |
|
| 1491 | else: |
|
| 1492 | # Haven't found the end yet, append a blank line. |
|
| 1493 | line = '""' |
|
| 1494 | ||
| 1495 | # Look for beginning of a raw string, and replace them with |
|
| 1496 | # empty strings. This is done in a loop to handle multiple raw |
|
| 1497 | # strings on the same line. |
|
| 1498 | while delimiter is None: |
|
| 1499 | # Look for beginning of a raw string. |
|
| 1500 | # See 2.14.15 [lex.string] for syntax. |
|
| 1501 | # |
|
| 1502 | # Once we have matched a raw string, we check the prefix of the |
|
| 1503 | # line to make sure that the line is not part of a single line |
|
| 1504 | # comment. It's done this way because we remove raw strings |
|
| 1505 | # before removing comments as opposed to removing comments |
|
| 1506 | # before removing raw strings. This is because there are some |
|
| 1507 | # cpplint checks that requires the comments to be preserved, but |
|
| 1508 | # we don't want to check comments that are inside raw strings. |
|
| 1509 | matched = Match(r'^(.*?)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line) |
|
| 1510 | if (matched and |
|
| 1511 | not Match(r'^([^\'"]|\'(\\.|[^\'])*\'|"(\\.|[^"])*")*//', |
|
| 1512 | matched.group(1))): |
|
| 1513 | delimiter = ')' + matched.group(2) + '"' |
|
| 1514 | ||
| 1515 | end = matched.group(3).find(delimiter) |
|
| 1516 | if end >= 0: |
|
| 1517 | # Raw string ended on same line |
|
| 1518 | line = (matched.group(1) + '""' + |
|
| 1519 | matched.group(3)[end + len(delimiter):]) |
|
| 1520 | delimiter = None |
|
| 1521 | else: |
|
| 1522 | # Start of a multi-line raw string |
|
| 1523 | line = matched.group(1) + '""' |
|
| 1524 | else: |
|
| 1525 | break |
|
| 1526 | ||
| 1527 | lines_without_raw_strings.append(line) |
|
| 1528 | ||
| 1529 | # TODO(unknown): if delimiter is not None here, we might want to |
|
| 1530 | # emit a warning for unterminated string. |
|
| 1531 | return lines_without_raw_strings |
|
| 1532 | ||
| 1533 | ||
| 1534 | def FindNextMultiLineCommentStart(lines, lineix): |
|