| File: Symbols\Synthesized\SynthesizedFieldSymbolBase.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 Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.CSharp.Emit; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols { /// <summary> /// Represents a compiler generated field or captured variable. /// </summary> internal abstract class SynthesizedFieldSymbolBase : FieldSymbol { private readonly NamedTypeSymbol _containingType; private readonly string _name; private readonly DeclarationModifiers _modifiers; public SynthesizedFieldSymbolBase( NamedTypeSymbol containingType, string name, DeclarationModifiers accessibility, bool isReadOnly, bool isStatic) { Debug.Assert((object)containingType != null); Debug.Assert(!string.IsNullOrEmpty(name)); Debug.Assert((accessibility & DeclarationModifiers.AccessibilityMask) != 0); Debug.Assert((accessibility & ~DeclarationModifiers.AccessibilityMask) == 0); _containingType = containingType; _name = name; _modifiers = (accessibility & DeclarationModifiers.AccessibilityMask) | (isReadOnly ? DeclarationModifiers.ReadOnly : DeclarationModifiers.None) | (isStatic ? DeclarationModifiers.Static : DeclarationModifiers.None); } internal abstract bool SuppressDynamicAttribute { get; } internal override void AddSynthesizedAttributes(PEModuleBuilder moduleBuilder, ref ArrayBuilder<CSharpAttributeData> attributes) { base.AddSynthesizedAttributes(moduleBuilder, ref attributes); CSharpCompilation compilation = this.DeclaringCompilation; var typeWithAnnotations = this.TypeWithAnnotations; var type = typeWithAnnotations.Type; // do not emit CompilerGenerated attributes for fields inside compiler generated types: if (!_containingType.IsImplicitlyDeclared) { AddSynthesizedAttribute(ref attributes, compilation.TrySynthesizeAttribute(WellKnownMember.System_Runtime_CompilerServices_CompilerGeneratedAttribute__ctor)); } if (!this.SuppressDynamicAttribute && type.ContainsDynamic() && compilation.HasDynamicEmitAttributes(BindingDiagnosticBag.Discarded, Location.None) && compilation.CanEmitBoolean()) { AddSynthesizedAttribute(ref attributes, compilation.SynthesizeDynamicAttribute(type, typeWithAnnotations.CustomModifiers.Length)); } if (compilation.ShouldEmitNativeIntegerAttributes(type)) { AddSynthesizedAttribute(ref attributes, moduleBuilder.SynthesizeNativeIntegerAttribute(this, type)); } if (type.ContainsTupleNames() && compilation.HasTupleNamesAttributes(BindingDiagnosticBag.Discarded, Location.None) && compilation.CanEmitSpecialType(SpecialType.System_String)) { AddSynthesizedAttribute(ref attributes, compilation.SynthesizeTupleNamesAttribute(Type)); } if (compilation.ShouldEmitNullableAttributes(this)) { AddSynthesizedAttribute(ref attributes, moduleBuilder.SynthesizeNullableAttributeIfNecessary(this, ContainingType.GetNullableContextValue(), typeWithAnnotations)); } } internal abstract override TypeWithAnnotations GetFieldType(ConsList<FieldSymbol> fieldsBeingBound); public override FlowAnalysisAnnotations FlowAnalysisAnnotations => FlowAnalysisAnnotations.None; public override string Name { get { return _name; } } public override Symbol AssociatedSymbol { get { return null; } } public override bool IsReadOnly { get { return (_modifiers & DeclarationModifiers.ReadOnly) != 0; } } public override bool IsVolatile { get { return false; } } public override bool IsConst { get { return false; } } internal override bool IsNotSerialized { get { return false; } } internal override MarshalPseudoCustomAttributeData MarshallingInformation { get { return null; } } internal override int? TypeLayoutOffset { get { return null; } } internal override ConstantValue GetConstantValue(ConstantFieldsInProgress inProgress, bool earlyDecodingWellKnownAttributes) { return null; } internal sealed override ObsoleteAttributeData ObsoleteAttributeData { get { return null; } } public override Symbol ContainingSymbol { get { return _containingType; } } public override NamedTypeSymbol ContainingType { get { return _containingType; } } public override ImmutableArray<Location> Locations { get { return ImmutableArray<Location>.Empty; } } public override ImmutableArray<SyntaxReference> DeclaringSyntaxReferences { get { return ImmutableArray<SyntaxReference>.Empty; } } public override Accessibility DeclaredAccessibility { get { return ModifierUtils.EffectiveAccessibility(_modifiers); } } public override bool IsStatic { get { return (_modifiers & DeclarationModifiers.Static) != 0; } } internal override bool HasSpecialName { get { return this.HasRuntimeSpecialName; } } internal override bool HasRuntimeSpecialName { get { return this.Name == WellKnownMemberNames.EnumBackingFieldName; } } public override bool IsImplicitlyDeclared { get { return true; } } internal override bool IsRequired => false; } }