File: src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationMethodSymbol.cs
Web Access
Project: src\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces)
// 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;
using System.Collections.Immutable;
using System.Diagnostics;
 
#if CODE_STYLE
using Microsoft.CodeAnalysis.Internal.Editing;
#else
using Microsoft.CodeAnalysis.Editing;
#endif
 
namespace Microsoft.CodeAnalysis.CodeGeneration;
 
internal partial class CodeGenerationMethodSymbol : CodeGenerationAbstractMethodSymbol
{
    public override ITypeSymbol ReturnType { get; }
    public override ImmutableArray<ITypeParameterSymbol> TypeParameters { get; }
    public override ImmutableArray<IParameterSymbol> Parameters { get; }
    public override ImmutableArray<IMethodSymbol> ExplicitInterfaceImplementations { get; }
    public override MethodKind MethodKind { get; }
 
    public CodeGenerationMethodSymbol(
        INamedTypeSymbol containingType,
        ImmutableArray<AttributeData> attributes,
        Accessibility declaredAccessibility,
        DeclarationModifiers modifiers,
        ITypeSymbol returnType,
        RefKind refKind,
        ImmutableArray<IMethodSymbol> explicitInterfaceImplementations,
        string name,
        ImmutableArray<ITypeParameterSymbol> typeParameters,
        ImmutableArray<IParameterSymbol> parameters,
        ImmutableArray<AttributeData> returnTypeAttributes,
        string documentationCommentXml = null,
        MethodKind methodKind = MethodKind.Ordinary,
        bool isInitOnly = false)
        : base(containingType, attributes, declaredAccessibility, modifiers, name, returnTypeAttributes, documentationCommentXml)
    {
        this.ReturnType = returnType;
        this.RefKind = refKind;
 
        Debug.Assert(!isInitOnly || methodKind == MethodKind.PropertySet);
        this.IsInitOnly = methodKind == MethodKind.PropertySet && isInitOnly;
 
        this.TypeParameters = typeParameters.NullToEmpty();
        this.Parameters = parameters.NullToEmpty();
        this.MethodKind = methodKind;
 
        this.ExplicitInterfaceImplementations = explicitInterfaceImplementations.NullToEmpty();
        this.OriginalDefinition = this;
    }
 
    protected override CodeGenerationSymbol Clone()
    {
        var result = new CodeGenerationMethodSymbol(this.ContainingType,
            this.GetAttributes(), this.DeclaredAccessibility, this.Modifiers,
            this.ReturnType, this.RefKind, this.ExplicitInterfaceImplementations,
            this.Name, this.TypeParameters, this.Parameters, this.GetReturnTypeAttributes(),
            _documentationCommentXml, this.MethodKind, this.IsInitOnly);
 
        CodeGenerationMethodInfo.Attach(result,
            CodeGenerationMethodInfo.GetIsNew(this),
            CodeGenerationMethodInfo.GetIsUnsafe(this),
            CodeGenerationMethodInfo.GetIsPartial(this),
            CodeGenerationMethodInfo.GetIsAsyncMethod(this),
            CodeGenerationMethodInfo.GetStatements(this),
            CodeGenerationMethodInfo.GetHandlesExpressions(this));
 
        return result;
    }
 
    public override int Arity => this.TypeParameters.Length;
 
    public override bool ReturnsVoid
        => this.ReturnType == null || this.ReturnType.SpecialType == SpecialType.System_Void;
 
    public override bool ReturnsByRef
    {
        get
        {
            return RefKind == RefKind.Ref;
        }
    }
 
    public override bool ReturnsByRefReadonly
    {
        get
        {
            return RefKind == RefKind.RefReadOnly;
        }
    }
 
    public override RefKind RefKind { get; }
 
    public override ImmutableArray<ITypeSymbol> TypeArguments
        => this.TypeParameters.As<ITypeSymbol>();
 
    public override IMethodSymbol ConstructedFrom => this;
 
    public override bool IsReadOnly => Modifiers.IsReadOnly;
    public override bool IsInitOnly { get; }
 
    public override System.Reflection.MethodImplAttributes MethodImplementationFlags => default;
 
    public override IMethodSymbol OverriddenMethod => null;
 
    public override IMethodSymbol ReducedFrom => null;
 
    public override ITypeSymbol GetTypeInferredDuringReduction(ITypeParameterSymbol reducedFromTypeParameter)
        => throw new InvalidOperationException();
 
    public override IMethodSymbol ReduceExtensionMethod(ITypeSymbol receiverType)
        => null;
 
    public override IMethodSymbol PartialImplementationPart => null;
 
    public override IMethodSymbol PartialDefinitionPart => null;
 
    public override bool IsPartialDefinition => false;
}