internal bool IsSecurityAttribute(CSharpCompilation compilation) { if (_lazyIsSecurityAttribute == ThreeState.Unknown) { Debug.Assert(!this.HasErrors); // CLI spec (Partition II Metadata), section 21.11 "DeclSecurity : 0x0E" states: // SPEC: If the attribute's type is derived (directly or indirectly) from System.Security.Permissions.SecurityAttribute then // SPEC: it is a security custom attribute and requires special treatment. // NOTE: The native C# compiler violates the above and considers only those attributes whose type derives from // NOTE: System.Security.Permissions.CodeAccessSecurityAttribute as security custom attributes. // NOTE: We will follow the specification. // NOTE: See Devdiv Bug #13762 "Custom security attributes deriving from SecurityAttribute are not treated as security attributes" for details. // Well-known type SecurityAttribute is optional. // Native compiler doesn't generate a use-site error if it is not found, we do the same. var wellKnownType = compilation.GetWellKnownType(WellKnownType.System_Security_Permissions_SecurityAttribute); Debug.Assert(AttributeClass is object); HashSet <DiagnosticInfo>?useSiteDiagnostics = null; _lazyIsSecurityAttribute = AttributeClass.IsDerivedFrom(wellKnownType, TypeCompareKind.ConsiderEverything, useSiteDiagnostics: ref useSiteDiagnostics).ToThreeState(); } return(_lazyIsSecurityAttribute.Value()); }
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); }
private static bool IsViableSourceMethod(MethodSymbol candidateMethod, string desiredMethodName, ImmutableArray<TypeParameterSymbol> desiredTypeParameters, ThreeState isDesiredMethodStatic) { return !candidateMethod.IsAbstract && (isDesiredMethodStatic == ThreeState.Unknown || isDesiredMethodStatic.Value() == candidateMethod.IsStatic) && candidateMethod.Name == desiredMethodName && HaveSameConstraints(candidateMethod.TypeParameters, desiredTypeParameters); }