MCPcopy Create free account
hub / github.com/microsoft/typescript-go / scanEscapeSequence

Method scanEscapeSequence

internal/scanner/scanner.go:1690–1852  ·  view source on GitHub ↗
(flags EscapeSequenceScanningFlags)

Source from the content-addressed store, hash-verified

1688}
1689
1690func (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"

Callers 3

scanStringMethod · 0.95
scanCharacterEscapeMethod · 0.80

Calls 15

charMethod · 0.95
errorMethod · 0.95
errorAtMethod · 0.95
scanUnicodeEscapeMethod · 0.95
charAtMethod · 0.95
IsDigitFunction · 0.92
IsOctalDigitFunction · 0.92
IsHighSurrogateFunction · 0.92
EncodeJSStringRuneFunction · 0.92
IsLowSurrogateFunction · 0.92
SurrogatePairToCodePointFunction · 0.92

Tested by

no test coverage detected