File: Symbols\Synthesized\SynthesizedPropertySymbol.cs
Web Access
Project: src\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.
 
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Reflection;
using Microsoft.Cci;
 
namespace Microsoft.CodeAnalysis.CSharp.Symbols;
 
internal sealed class SynthesizedPropertySymbol : PropertySymbol
{
    private readonly string _name;
    private readonly SynthesizedFieldSymbol _backingField;
 
    public SynthesizedPropertySymbol(string name, SynthesizedFieldSymbol backingField)
    {
        _name = name;
        _backingField = backingField;
        GetMethod = new GetAccessorMethodSymbol(this);
    }
 
    public override string Name => _name;
    public override TypeWithAnnotations TypeWithAnnotations => _backingField.TypeWithAnnotations;
    public override RefKind RefKind => RefKind.None;
    public override ImmutableArray<CustomModifier> RefCustomModifiers => [];
    public override MethodSymbol GetMethod { get; }
    public override MethodSymbol? SetMethod => null;
    public override Symbol ContainingSymbol => _backingField.ContainingSymbol;
    public override Accessibility DeclaredAccessibility => Accessibility.Public;
 
    public override ImmutableArray<Location> Locations => [];
    public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences => [];
    public override ImmutableArray<PropertySymbol> ExplicitInterfaceImplementations => [];
    public override ImmutableArray<ParameterSymbol> Parameters => [];
    public override bool IsIndexer => false;
    public override bool IsStatic => false;
    public override bool IsVirtual => false;
    public override bool IsOverride => false;
    public override bool IsAbstract => false;
    public override bool IsSealed => false;
    public override bool IsExtern => false;
    internal override bool IsRequired => false;
    internal override bool HasSpecialName => false;
    internal override CallingConvention CallingConvention => CallingConvention.HasThis;
    internal override bool MustCallMethodsDirectly => false;
    internal override bool HasUnscopedRefAttribute => false;
    internal override CallerUnsafeMode CallerUnsafeMode => CallerUnsafeMode.None;
    internal override ObsoleteAttributeData? ObsoleteAttributeData => null;
    internal override int TryGetOverloadResolutionPriority() => 0;
 
    private sealed partial class GetAccessorMethodSymbol(SynthesizedPropertySymbol property) : SynthesizedMethodSymbol
    {
        private readonly SynthesizedPropertySymbol _property = property;
 
        public override string Name => $"get_{_property.Name}";
        internal override bool HasSpecialName => true;
        public override MethodKind MethodKind => MethodKind.PropertyGet;
        public override Symbol AssociatedSymbol => _property;
        public override Symbol ContainingSymbol => _property.ContainingSymbol;
 
        internal override bool SynthesizesLoweredBoundBody => true;
 
        internal override void GenerateMethodBody(TypeCompilationState compilationState, BindingDiagnosticBag diagnostics)
        {
            SyntheticBoundNodeFactory F = new SyntheticBoundNodeFactory(this, CSharpSyntaxTree.Dummy.GetRoot(), compilationState, diagnostics);
            F.CurrentFunction = this.OriginalDefinition;
 
            try
            {
                // return this._backingField;
                F.CloseMethod(F.Return(F.Field(F.This(), _property._backingField)));
            }
            catch (SyntheticBoundNodeFactory.MissingPredefinedMember ex)
            {
                F.CloseMethod(F.ThrowNull());
                diagnostics.Add(ex.Diagnostic);
            }
        }
 
        public override bool IsStatic => false;
        public override int Arity => 0;
        public override bool IsExtensionMethod => false;
        public override bool HidesBaseMethodsByName => false;
        public override bool IsVararg => false;
        public override bool ReturnsVoid => false;
        public override bool IsAsync => false;
        public override RefKind RefKind => RefKind.None;
        public override ImmutableArray<CustomModifier> RefCustomModifiers => [];
        public override TypeWithAnnotations ReturnTypeWithAnnotations => _property.TypeWithAnnotations;
        public override FlowAnalysisAnnotations ReturnTypeFlowAnalysisAnnotations => FlowAnalysisAnnotations.None;
        public override ImmutableHashSet<string> ReturnNotNullIfParameterNotNull => [];
        public override ImmutableArray<TypeWithAnnotations> TypeArgumentsWithAnnotations => [];
        public override ImmutableArray<TypeParameterSymbol> TypeParameters => [];
        public override ImmutableArray<ParameterSymbol> Parameters => [];
        public override ImmutableArray<MethodSymbol> ExplicitInterfaceImplementations => [];
        public override ImmutableArray<Location> Locations => [];
        public override Accessibility DeclaredAccessibility => _property.DeclaredAccessibility;
        public override bool IsVirtual => false;
        public override bool IsOverride => false;
        public override bool IsAbstract => false;
        public override bool IsSealed => false;
        public override bool IsExtern => false;
        protected override bool HasSetsRequiredMembersImpl => false;
        internal override MethodImplAttributes ImplementationAttributes => default;
        internal override bool HasDeclarativeSecurity => false;
        internal override MarshalPseudoCustomAttributeData? ReturnValueMarshallingInformation => null;
        internal override bool RequiresSecurityObject => false;
        internal override CallingConvention CallingConvention => CallingConvention.HasThis;
        internal override bool GenerateDebugInfo => false;
 
        public override DllImportData? GetDllImportData() => null;
        internal override ImmutableArray<string> GetAppliedConditionalSymbols() => [];
        internal override IEnumerable<SecurityAttribute>? GetSecurityInformation() => null;
        internal override bool IsMetadataNewSlot(bool ignoreInterfaceImplementationChanges = false) => false;
        internal override bool IsMetadataVirtual(IsMetadataVirtualOption option = IsMetadataVirtualOption.None) => false;
    }
}