| File: Symbols\Source\SourceOrdinaryMethodSymbolBase.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Immutable; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Threading; using Microsoft.CodeAnalysis.Collections; using Microsoft.CodeAnalysis.CSharp.Emit; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.PooledObjects; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols { /// <summary> /// Unlike <see cref="SourceOrdinaryMethodSymbol"/>, this type doesn't depend /// on any specific kind of syntax node associated with it. Any syntax node is good enough /// for it. /// </summary> internal abstract class SourceOrdinaryMethodSymbolBase : SourceOrdinaryMethodOrUserDefinedOperatorSymbol { private readonly string _name; protected SourceOrdinaryMethodSymbolBase( NamedTypeSymbol containingType, string name, Location location, CSharpSyntaxNode syntax, bool isIterator, (DeclarationModifiers declarationModifiers, Flags flags) modifiersAndFlags) : base(containingType, syntax.GetReference(), location, isIterator: isIterator, modifiersAndFlags) { _name = name; } protected sealed override void LazyAsyncMethodChecks(CancellationToken cancellationToken) { if (!this.IsAsync || this.IsPartialDefinition()) { CompleteAsyncMethodChecks(diagnosticsOpt: null, cancellationToken: cancellationToken); return; } var diagnostics = BindingDiagnosticBag.GetInstance(); AsyncMethodChecks(diagnostics); CompleteAsyncMethodChecks(diagnostics, cancellationToken); diagnostics.Free(); } private void CompleteAsyncMethodChecks(BindingDiagnosticBag diagnosticsOpt, CancellationToken cancellationToken) { if (state.NotePartComplete(CompletionPart.StartAsyncMethodChecks)) { if (diagnosticsOpt != null) { AddDeclarationDiagnostics(diagnosticsOpt); } CompleteAsyncMethodChecksBetweenStartAndFinish(); state.NotePartComplete(CompletionPart.FinishAsyncMethodChecks); } else { state.SpinWaitComplete(CompletionPart.FinishAsyncMethodChecks, cancellationToken); } } protected abstract void CompleteAsyncMethodChecksBetweenStartAndFinish(); public abstract override ImmutableArray<TypeParameterSymbol> TypeParameters { get; } public abstract override string GetDocumentationCommentXml(CultureInfo preferredCulture = null, bool expandIncludes = false, CancellationToken cancellationToken = default(CancellationToken)); public sealed override string Name { get { return _name; } } protected abstract override SourceMemberMethodSymbol BoundAttributesSource { get; } internal abstract override OneOrMany<SyntaxList<AttributeListSyntax>> GetAttributeDeclarations(); } }