private StateResult QuotedLiteral(char quote, Func <char, bool> isEndQuotedLiteral, SyntaxKind literalType) { TakeUntil(isEndQuotedLiteral); if (CurrentCharacter == '\\') { TakeCurrent(); // Take the '\' // If the next char is the same quote that started this if (CurrentCharacter == quote || CurrentCharacter == '\\') { TakeCurrent(); // Take it so that we don't prematurely end the literal. } return(Stay()); } else if (EndOfFile || ParserHelpers.IsNewLine(CurrentCharacter)) { CurrentErrors.Add( RazorDiagnosticFactory.CreateParsing_UnterminatedStringLiteral( new SourceSpan(CurrentStart, contentLength: 1 /* " */))); } else { TakeCurrent(); // No-op if at EOF } return(Transition(CSharpTokenizerState.Data, EndToken(literalType))); }
public void ParseBlockTerminatesNormalStringAtEndOfFile() { SingleSpanBlockTest("if(foo) { var foo = \"blah blah blah blah blah", BlockKindInternal.Statement, SpanKindInternal.Code, RazorDiagnosticFactory.CreateParsing_UnterminatedStringLiteral( new SourceSpan(new SourceLocation(20, 0, 20), contentLength: 1)), RazorDiagnosticFactory.CreateParsing_ExpectedEndOfBlockBeforeEOF( new SourceSpan(SourceLocation.Zero, contentLength: 1), "if", "}", "{")); }
public void ParseBlockTerminatesNormalCSharpStringsAtEOLIfEndQuoteMissing() { SingleSpanBlockTest("if(foo) {" + Environment.NewLine + " var p = \"foo bar baz" + Environment.NewLine + ";" + Environment.NewLine + "}", BlockKindInternal.Statement, SpanKindInternal.Code, RazorDiagnosticFactory.CreateParsing_UnterminatedStringLiteral( new SourceSpan(new SourceLocation(21 + Environment.NewLine.Length, 1, 12), contentLength: 1))); }
private StateResult VerbatimStringLiteral() { TakeUntil(c => c == '"'); if (CurrentCharacter == '"') { TakeCurrent(); if (CurrentCharacter == '"') { TakeCurrent(); // Stay in the literal, this is an escaped " return(Stay()); } } else if (EndOfFile) { CurrentErrors.Add( RazorDiagnosticFactory.CreateParsing_UnterminatedStringLiteral( new SourceSpan(CurrentStart, contentLength: 1 /* end of file */))); } return(Transition(CSharpTokenizerState.Data, EndToken(SyntaxKind.StringLiteral))); }
public void ParseBlockCorrectlyParsesMarkupIncorrectyAssumedToBeWithinAStatement() { ParseBlockTest("if(foo) {" + Environment.NewLine + " var foo = \"foo bar baz" + Environment.NewLine + " <p>Foo is @foo</p>" + Environment.NewLine + "}", new StatementBlock( Factory.Code($"if(foo) {{{Environment.NewLine} var foo = \"foo bar baz{Environment.NewLine} ").AsStatement(), new MarkupBlock( BlockFactory.MarkupTagBlock("<p>", AcceptedCharactersInternal.None), Factory.Markup("Foo is "), new ExpressionBlock( Factory.CodeTransition(), Factory.Code("foo") .AsImplicitExpression(CSharpCodeParser.DefaultKeywords) .Accepts(AcceptedCharactersInternal.NonWhiteSpace)), BlockFactory.MarkupTagBlock("</p>", AcceptedCharactersInternal.None), Factory.Markup(Environment.NewLine).Accepts(AcceptedCharactersInternal.None)), Factory.Code("}").AsStatement() ), RazorDiagnosticFactory.CreateParsing_UnterminatedStringLiteral( new SourceSpan(new SourceLocation(23 + Environment.NewLine.Length, 1, 14), contentLength: 1))); }