internal void ScanInterpolatedStringLiteralTop(ArrayBuilder <Interpolation> interpolations, ref TokenInfo info, out bool closeQuoteMissing) { if (isVerbatim) { Debug.Assert( (lexer.TextWindow.PeekChar() == '@' && lexer.TextWindow.PeekChar(1) == '$') || (lexer.TextWindow.PeekChar() == '$' && lexer.TextWindow.PeekChar(1) == '@')); // @$ or $@ lexer.TextWindow.AdvanceChar(); lexer.TextWindow.AdvanceChar(); } else { Debug.Assert(lexer.TextWindow.PeekChar() == '$'); lexer.TextWindow.AdvanceChar(); // $ } Debug.Assert(lexer.TextWindow.PeekChar() == '"'); lexer.TextWindow.AdvanceChar(); // " ScanInterpolatedStringLiteralContents(interpolations); if (lexer.TextWindow.PeekChar() != '"') { Debug.Assert(IsAtEnd()); if (error == null) { int position = IsAtEnd(true) ? lexer.TextWindow.Position - 1 : lexer.TextWindow.Position; error = lexer.MakeError(position, 1, isVerbatim ? ErrorCode.ERR_UnterminatedStringLit : ErrorCode.ERR_NewlineInConst); } closeQuoteMissing = true; } else { // found the closing quote lexer.TextWindow.AdvanceChar(); // " closeQuoteMissing = false; } info.Kind = SyntaxKind.InterpolatedStringToken; }
internal void ScanInterpolatedStringLiteralTop(ArrayBuilder <Interpolation>?interpolations, ref TokenInfo info, out bool closeQuoteMissing) { if (_isVerbatim) { Debug.Assert( (_lexer.TextWindow.PeekChar() == '@' && _lexer.TextWindow.PeekChar(1) == '$') || (_lexer.TextWindow.PeekChar() == '$' && _lexer.TextWindow.PeekChar(1) == '@')); // @$ or $@ _lexer.TextWindow.AdvanceChar(); _lexer.TextWindow.AdvanceChar(); } else { Debug.Assert(_lexer.TextWindow.PeekChar() == '$'); _lexer.TextWindow.AdvanceChar(); // $ } Debug.Assert(_lexer.TextWindow.PeekChar() == '"'); _lexer.TextWindow.AdvanceChar(); // " ScanInterpolatedStringLiteralContents(interpolations); if (_lexer.TextWindow.PeekChar() != '"') { Debug.Assert(IsAtEnd()); int position = IsAtEnd(allowNewline: true) ? _lexer.TextWindow.Position - 1 : _lexer.TextWindow.Position; TrySetUnrecoverableError(_lexer.MakeError(position, 1, _isVerbatim ? ErrorCode.ERR_UnterminatedStringLit : ErrorCode.ERR_NewlineInConst)); closeQuoteMissing = true; } else { // found the closing quote _lexer.TextWindow.AdvanceChar(); // " closeQuoteMissing = false; } info.Kind = SyntaxKind.InterpolatedStringToken; }
private void ScanInterpolatedStringLiteralEnd(out Range closeQuoteRange) { // Handles reading the end of the interpolated string literal (after where the content ends) var closeQuotePosition = _lexer.TextWindow.Position; if (_lexer.TextWindow.PeekChar() != '"') { Debug.Assert(IsAtEnd()); int position = IsAtEnd(allowNewline: true) ? _lexer.TextWindow.Position - 1 : _lexer.TextWindow.Position; TrySetUnrecoverableError(_lexer.MakeError(position, 1, _kind is InterpolatedStringKind.Verbatim ? ErrorCode.ERR_UnterminatedStringLit : ErrorCode.ERR_NewlineInConst)); } else { // found the closing quote _lexer.TextWindow.AdvanceChar(); // " } closeQuoteRange = new Range(closeQuotePosition, _lexer.TextWindow.Position); }