public override ImmutableArray <CSharpAttributeData> GetAttributes() { if (_lazyCustomAttributes.IsDefault) { Debug.Assert(!_handle.IsNil); var containingPEModuleSymbol = (PEModuleSymbol)this.ContainingModule; // Filter out ParamArrayAttributes if necessary and cache // the attribute handle for GetCustomAttributesToEmit bool filterOutParamArrayAttribute = (!_lazyIsParams.HasValue() || _lazyIsParams.Value()); ConstantValue defaultValue = this.ExplicitDefaultConstantValue; AttributeDescription filterOutConstantAttributeDescription = default(AttributeDescription); bool filterIsReadOnlyAttribute = this.RefKind == RefKind.In; if (filterOutParamArrayAttribute || filterOutConstantAttributeDescription.Signatures != null || filterIsReadOnlyAttribute) { CustomAttributeHandle paramArrayAttribute; CustomAttributeHandle constantAttribute; CustomAttributeHandle isReadOnlyAttribute; ImmutableArray <CSharpAttributeData> attributes = containingPEModuleSymbol.GetCustomAttributesForToken( _handle, out paramArrayAttribute, filterOutParamArrayAttribute ? AttributeDescription.ParamArrayAttribute : default,
internal bool ShouldEmit(ImmutableArray <BoundInitializer> boundInitializersOpt = default) { if (_lazyShouldEmit.HasValue()) { return(_lazyShouldEmit.Value()); } var shouldEmit = CalculateShouldEmit(boundInitializersOpt); _lazyShouldEmit = shouldEmit.ToThreeState(); return(shouldEmit); }
public override ImmutableArray <CSharpAttributeData> GetAttributes() { if (_lazyCustomAttributes.IsDefault) { Debug.Assert(!_handle.IsNil); var containingPEModuleSymbol = (PEModuleSymbol)this.ContainingModule; // Filter out ParamArrayAttributes if necessary and cache // the attribute handle for GetCustomAttributesToEmit bool filterOutParamArrayAttribute = (!_lazyIsParams.HasValue() || _lazyIsParams.Value()); ConstantValue defaultValue = this.ExplicitDefaultConstantValue; AttributeDescription filterOutConstantAttributeDescription = default(AttributeDescription); if ((object)defaultValue != null) { if (defaultValue.Discriminator == ConstantValueTypeDiscriminator.DateTime) { filterOutConstantAttributeDescription = AttributeDescription.DateTimeConstantAttribute; } else if (defaultValue.Discriminator == ConstantValueTypeDiscriminator.Decimal) { filterOutConstantAttributeDescription = AttributeDescription.DecimalConstantAttribute; } } if (filterOutParamArrayAttribute || filterOutConstantAttributeDescription.Signatures != null) { CustomAttributeHandle paramArrayAttribute; CustomAttributeHandle constantAttribute; ImmutableArray <CSharpAttributeData> attributes = containingPEModuleSymbol.GetCustomAttributesForToken( _handle, out paramArrayAttribute, filterOutParamArrayAttribute ? AttributeDescription.ParamArrayAttribute : default(AttributeDescription), out constantAttribute, filterOutConstantAttributeDescription); if (!paramArrayAttribute.IsNil || !constantAttribute.IsNil) { var builder = ArrayBuilder <CSharpAttributeData> .GetInstance(); if (!paramArrayAttribute.IsNil) { builder.Add(new PEAttributeData(containingPEModuleSymbol, paramArrayAttribute)); } if (!constantAttribute.IsNil) { builder.Add(new PEAttributeData(containingPEModuleSymbol, constantAttribute)); } ImmutableInterlocked.InterlockedInitialize(ref _lazyHiddenAttributes, builder.ToImmutableAndFree()); } else { ImmutableInterlocked.InterlockedInitialize(ref _lazyHiddenAttributes, ImmutableArray <CSharpAttributeData> .Empty); } if (!_lazyIsParams.HasValue()) { Debug.Assert(filterOutParamArrayAttribute); _lazyIsParams = (!paramArrayAttribute.IsNil).ToThreeState(); } ImmutableInterlocked.InterlockedInitialize( ref _lazyCustomAttributes, attributes); } else { ImmutableInterlocked.InterlockedInitialize(ref _lazyHiddenAttributes, ImmutableArray <CSharpAttributeData> .Empty); containingPEModuleSymbol.LoadCustomAttributes(_handle, ref _lazyCustomAttributes); } } Debug.Assert(!_lazyHiddenAttributes.IsDefault); return(_lazyCustomAttributes); }