(flags EscapeSequenceScanningFlags)
| 1688 | } |
| 1689 | |
| 1690 | func (s *Scanner) scanEscapeSequence(flags EscapeSequenceScanningFlags) string { |
| 1691 | start := s.pos |
| 1692 | s.pos++ |
| 1693 | ch := s.char() |
| 1694 | if ch < 0 { |
| 1695 | s.error(diagnostics.Unexpected_end_of_text) |
| 1696 | return "" |
| 1697 | } |
| 1698 | s.pos++ |
| 1699 | switch ch { |
| 1700 | case '0': |
| 1701 | // Although '0' preceding any digit is treated as LegacyOctalEscapeSequence, |
| 1702 | // '\08' should separately be interpreted as '\0' + '8'. |
| 1703 | if !stringutil.IsDigit(s.char()) { |
| 1704 | return "\x00" |
| 1705 | } |
| 1706 | // '\01', '\011' |
| 1707 | fallthrough |
| 1708 | case '1', '2', '3': |
| 1709 | // '\1', '\17', '\177' |
| 1710 | if stringutil.IsOctalDigit(s.char()) { |
| 1711 | s.pos++ |
| 1712 | } |
| 1713 | // '\17', '\177' |
| 1714 | fallthrough |
| 1715 | case '4', '5', '6', '7': |
| 1716 | // '\4', '\47' but not '\477' |
| 1717 | if stringutil.IsOctalDigit(s.char()) { |
| 1718 | s.pos++ |
| 1719 | } |
| 1720 | // '\47' |
| 1721 | s.tokenFlags |= ast.TokenFlagsContainsInvalidEscape |
| 1722 | if flags&EscapeSequenceScanningFlagsReportInvalidEscapeErrors != 0 { |
| 1723 | code, _ := strconv.ParseInt(s.text[start+1:s.pos], 8, 32) |
| 1724 | if flags&EscapeSequenceScanningFlagsRegularExpression != 0 && flags&EscapeSequenceScanningFlagsAtomEscape == 0 && ch != '0' { |
| 1725 | s.errorAt(diagnostics.Octal_escape_sequences_and_backreferences_are_not_allowed_in_a_character_class_If_this_was_intended_as_an_escape_sequence_use_the_syntax_0_instead, start, s.pos-start, fmt.Sprintf("\\x%02x", code)) |
| 1726 | } else { |
| 1727 | s.errorAt(diagnostics.Octal_escape_sequences_are_not_allowed_Use_the_syntax_0, start, s.pos-start, fmt.Sprintf("\\x%02x", code)) |
| 1728 | } |
| 1729 | return string(rune(code)) |
| 1730 | } |
| 1731 | return s.text[start:s.pos] |
| 1732 | case '8', '9': |
| 1733 | // the invalid '\8' and '\9' |
| 1734 | s.tokenFlags |= ast.TokenFlagsContainsInvalidEscape |
| 1735 | if flags&EscapeSequenceScanningFlagsReportInvalidEscapeErrors != 0 { |
| 1736 | if flags&EscapeSequenceScanningFlagsRegularExpression != 0 && flags&EscapeSequenceScanningFlagsAtomEscape == 0 { |
| 1737 | s.errorAt(diagnostics.Decimal_escape_sequences_and_backreferences_are_not_allowed_in_a_character_class, start, s.pos-start) |
| 1738 | } else { |
| 1739 | s.errorAt(diagnostics.Escape_sequence_0_is_not_allowed, start, s.pos-start, s.text[start:s.pos]) |
| 1740 | } |
| 1741 | return string(ch) |
| 1742 | } |
| 1743 | return s.text[start:s.pos] |
| 1744 | case 'b': |
| 1745 | return "\b" |
| 1746 | case 't': |
| 1747 | return "\t" |
no test coverage detected