// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNetCore.Razor.Tokenizer.Symbols; namespace Microsoft.AspNetCore.Razor.Parser { public partial class CSharpCodeParser { private void SetUpExpressions() { MapExpressionKeyword(AwaitExpression, CSharpKeyword.Await); } private void AwaitExpression(bool topLevel) { // Ensure that we're on the await statement (only runs in debug) Assert(CSharpKeyword.Await); // Accept the "await" and move on AcceptAndMoveNext(); // Accept 1 or more spaces between the await and the following code. AcceptWhile(IsSpacingToken(includeNewLines: false, includeComments: true)); // Top level basically indicates if we're within an expression or statement. // Ex: topLevel true = @await Foo() | topLevel false = @{ await Foo(); } // Note that in this case @{ @await Foo() } top level is true for await. // Therefore, if we're top level then we want to act like an implicit expression, // otherwise just act as whatever we're contained in. if (topLevel) { // Setup the Span to be an async implicit expression (an implicit expresison that allows spaces). // Spaces are allowed because of "@await Foo()". AsyncImplicitExpression(); } } } }