private scanEscapeSequence()

in tsdoc/src/beta/DeclarationReference.ts [984:1055]


  private scanEscapeSequence(): void {
    if (this.eof) {
      this._stringIsUnterminated = true;
      return;
    }

    const ch: string = this._text.charAt(this._pos);

    // EscapeSequence:: CharacterEscapeSequence
    if (isCharacterEscapeSequence(ch)) {
      this._pos++;
      return;
    }

    // EscapeSequence:: `0` [lookahead != DecimalDigit]
    if (
      ch === '0' &&
      (this._pos + 1 === this._text.length || !isDecimalDigit(this._text.charAt(this._pos + 1)))
    ) {
      this._pos++;
      return;
    }

    // EscapeSequence:: HexEscapeSequence
    if (
      ch === 'x' &&
      this._pos + 3 <= this._text.length &&
      isHexDigit(this._text.charAt(this._pos + 1)) &&
      isHexDigit(this._text.charAt(this._pos + 2))
    ) {
      this._pos += 3;
      return;
    }

    // EscapeSequence:: UnicodeEscapeSequence
    // UnicodeEscapeSequence:: `u` Hex4Digits
    if (
      ch === 'u' &&
      this._pos + 5 <= this._text.length &&
      isHexDigit(this._text.charAt(this._pos + 1)) &&
      isHexDigit(this._text.charAt(this._pos + 2)) &&
      isHexDigit(this._text.charAt(this._pos + 3)) &&
      isHexDigit(this._text.charAt(this._pos + 4))
    ) {
      this._pos += 5;
      return;
    }

    // EscapeSequence:: UnicodeEscapeSequence
    // UnicodeEscapeSequence:: `u` `{` CodePoint `}`
    if (ch === 'u' && this._pos + 4 <= this._text.length && this._text.charAt(this._pos + 1) === '{') {
      let hexDigits: string = this._text.charAt(this._pos + 2);
      if (isHexDigit(hexDigits)) {
        for (let i: number = this._pos + 3; i < this._text.length; i++) {
          const ch2: string = this._text.charAt(i);
          if (ch2 === '}') {
            const mv: number = parseInt(hexDigits, 16);
            if (mv <= 0x10ffff) {
              this._pos = i + 1;
              return;
            }
            break;
          }
          if (!isHexDigit(ch2)) {
            hexDigits += ch2;
            break;
          }
        }
      }
    }
    this._stringIsUnterminated = true;
  }