internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <CommonEventWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.NullableAttribute)) { // NullableAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitNullableAttribute, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.ExcludeFromCodeCoverageAttribute)) { arguments.GetOrCreateData <CommonEventWellKnownAttributeData>().HasExcludeFromCodeCoverageAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.TupleElementNamesAttribute)) { arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitTupleElementNamesAttribute, arguments.AttributeSyntaxOpt.Location); } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.NonSerializedAttribute)) { arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().HasNonSerializedAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.FieldOffsetAttribute)) { if (this.IsStatic || this.IsConst) { // CS0637: The FieldOffset attribute is not allowed on static or const fields arguments.Diagnostics.Add(ErrorCode.ERR_StructOffsetOnBadField, arguments.AttributeSyntaxOpt.Name.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { int offset = attribute.CommonConstructorArguments[0].DecodeValue <int>(SpecialType.System_Int32); if (offset < 0) { // Dev10 reports CS0647: "Error emitting attribute ..." CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); offset = 0; } // Set field offset even if the attribute specifies an invalid value, so that // post-validation knows that the attribute is applied and reports better errors. arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().SetFieldOffset(offset); } } else if (attribute.IsTargetAttribute(this, AttributeDescription.IsReadOnlyAttribute)) { // IsReadOnlyAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitReservedAttr, arguments.AttributeSyntaxOpt.Location, AttributeDescription.IsReadOnlyAttribute.FullName); } else if (attribute.IsTargetAttribute(this, AttributeDescription.IsUnmanagedAttribute)) { // IsUnmanagedAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitReservedAttr, arguments.AttributeSyntaxOpt.Location, AttributeDescription.IsUnmanagedAttribute.FullName); } else if (attribute.IsTargetAttribute(this, AttributeDescription.IsByRefLikeAttribute)) { // IsByRefLikeAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitReservedAttr, arguments.AttributeSyntaxOpt.Location, AttributeDescription.IsByRefLikeAttribute.FullName); } else if (attribute.IsTargetAttribute(this, AttributeDescription.TupleElementNamesAttribute)) { arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitTupleElementNamesAttribute, arguments.AttributeSyntaxOpt.Location); } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultCharSetAttribute)) { CharSet charSet = attribute.GetConstructorArgument <CharSet>(0, SpecialType.System_Enum); if (!ModuleWellKnownAttributeData.IsValidCharSet(charSet)) { CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { arguments.GetOrCreateData <ModuleWellKnownAttributeData>().DefaultCharacterSet = charSet; } } else if (attribute.IsTargetAttribute(this, AttributeDescription.NonNullTypesAttribute)) { bool value = attribute.GetConstructorArgument <bool>(0, SpecialType.System_Boolean); arguments.GetOrCreateData <ModuleWellKnownAttributeData>().NonNullTypes = value; } }
/// <summary> /// Verify the constant value matches the default value from any earlier attribute /// (DateTimeConstantAttribute or DecimalConstantAttribute). /// If not, report ERR_FieldHasMultipleDistinctConstantValues. /// </summary> private void VerifyConstantValueMatches(ConstantValue attrValue, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { if (!attrValue.IsBad) { var data = arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>(); ConstantValue constValue; if (this.IsConst) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); if (data.ConstValue == Compiler.ConstantValue.Unset) { data.ConstValue = attrValue; } } else { constValue = data.ConstValue; if (constValue != Compiler.ConstantValue.Unset) { if (constValue != attrValue) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } } else { data.ConstValue = attrValue; } } } }
static internal void DecodeMemberNotNullWhenAttribute <T>(TypeSymbol type, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) where T : WellKnownAttributeData, IMemberNotNullAttributeTarget, new() { var membersArray = arguments.Attribute.CommonConstructorArguments[1]; if (membersArray.IsNull) { return; } var builder = ArrayBuilder <string> .GetInstance(); foreach (var member in membersArray.Values) { var memberName = member.DecodeValue <string>(SpecialType.System_String); if (memberName is object) { builder.Add(memberName); ReportBadNotNullMemberIfNeeded(type, arguments, memberName); } } var sense = arguments.Attribute.CommonConstructorArguments[0].DecodeValue <bool>(SpecialType.System_Boolean); arguments.GetOrCreateData <T>().AddNotNullWhenMember(sense, builder); builder.Free(); }
internal void DecodeSecurityAttribute <T>(Symbol targetSymbol, CSharpCompilation compilation, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) where T : WellKnownAttributeData, ISecurityAttributeTarget, new() { Debug.Assert(!this.HasErrors); bool hasErrors; Cci.SecurityAction action = DecodeSecurityAttributeAction(targetSymbol, compilation, arguments.AttributeSyntaxOpt, out hasErrors, arguments.Diagnostics); if (!hasErrors) { T data = arguments.GetOrCreateData <T>(); SecurityWellKnownAttributeData securityData = data.GetOrCreateData(); securityData.SetSecurityAttribute(arguments.Index, action, arguments.AttributesCount); if (this.IsTargetAttribute(targetSymbol, AttributeDescription.PermissionSetAttribute)) { string resolvedPathForFixup = DecodePermissionSetAttribute(compilation, arguments.AttributeSyntaxOpt, arguments.Diagnostics); if (resolvedPathForFixup != null) { securityData.SetPathForPermissionSetAttributeFixup(arguments.Index, resolvedPathForFixup, arguments.AttributesCount); } } } }
protected override void DecodeWellKnownAttributeImpl(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultCharSetAttribute)) { CharSet charSet = attribute.GetConstructorArgument <CharSet>(0, SpecialType.System_Enum); if (!ModuleWellKnownAttributeData.IsValidCharSet(charSet)) { CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); ((BindingDiagnosticBag)arguments.Diagnostics).Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { arguments.GetOrCreateData <ModuleWellKnownAttributeData>().DefaultCharacterSet = charSet; } } else if (ReportExplicitUseOfReservedAttributes(in arguments, ReservedAttributes.NullableContextAttribute | ReservedAttributes.NullablePublicOnlyAttribute)) { }
internal void DecodeSkipLocalsInitAttribute <T>(CSharpCompilation compilation, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) where T : WellKnownAttributeData, ISkipLocalsInitAttributeTarget, new() { arguments.GetOrCreateData <T>().HasSkipLocalsInitAttribute = true; if (!compilation.Options.AllowUnsafe) { arguments.Diagnostics.Add(ErrorCode.ERR_IllegalUnsafe, arguments.AttributeSyntaxOpt.Location); } }
internal static void DecodeMemberNotNullAttribute <T>( TypeSymbol type, ref DecodeWellKnownAttributeArguments < AttributeSyntax, CSharpAttributeData, AttributeLocation > arguments ) where T : WellKnownAttributeData, IMemberNotNullAttributeTarget, new() { var value = arguments.Attribute.CommonConstructorArguments[0]; if (value.IsNull) { return; } if (value.Kind != TypedConstantKind.Array) { string?memberName = value.DecodeValue <string>(SpecialType.System_String); if (memberName is object) { arguments.GetOrCreateData <T>().AddNotNullMember(memberName); ReportBadNotNullMemberIfNeeded(type, arguments, memberName); } } else { var builder = ArrayBuilder <string> .GetInstance(); foreach (var member in value.Values) { var memberName = member.DecodeValue <string>(SpecialType.System_String); if (memberName is object) { builder.Add(memberName); ReportBadNotNullMemberIfNeeded(type, arguments, memberName); } } arguments.GetOrCreateData <T>().AddNotNullMember(builder); builder.Free(); } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <CommonEventWellKnownAttributeData>().HasSpecialNameAttribute = true; } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <CommonEventWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (ReportExplicitUseOfReservedAttributes(in arguments, ReservedAttributes.NullableAttribute | ReservedAttributes.NativeIntegerAttribute | ReservedAttributes.TupleElementNamesAttribute)) { }
/// <summary> /// Verify the constant value matches the default value from any earlier attribute /// (DateTimeConstantAttribute or DecimalConstantAttribute). /// If not, report ERR_FieldHasMultipleDistinctConstantValues. /// </summary> private void VerifyConstantValueMatches(ConstantValue attrValue, ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { if (!attrValue.IsBad) { var data = arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>(); ConstantValue constValue; if (this.IsConst) { if (this.Type.SpecialType == SpecialType.System_Decimal) { constValue = this.GetConstantValue(ConstantFieldsInProgress.Empty, earlyDecodingWellKnownAttributes: false); if ((object)constValue != null && !constValue.IsBad && constValue != attrValue) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } } else { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } if (data.ConstValue == CodeAnalysis.ConstantValue.Unset) { data.ConstValue = attrValue; } } else { constValue = data.ConstValue; if (constValue != CodeAnalysis.ConstantValue.Unset) { if (constValue != attrValue) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } } else { data.ConstValue = attrValue; } } } }
private void DecodeCoClassAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); if (this.IsInterfaceType() && (!arguments.HasDecodedData || (object)((TypeWellKnownAttributeData)arguments.DecodedData).ComImportCoClass == null)) { TypedConstant argument = attribute.CommonConstructorArguments[0]; Debug.Assert(argument.Kind == TypedConstantKind.Type); var coClassType = argument.Value as NamedTypeSymbol; if ((object)coClassType != null && coClassType.TypeKind == TypeKind.Class) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().ComImportCoClass = coClassType; } } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert(arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.IndexerNameAttribute)) { //NOTE: decoding was done by EarlyDecodeWellKnownAttribute. ValidateIndexerNameAttribute(attribute, arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<CommonPropertyWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.NonSerializedAttribute)) { arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().HasNonSerializedAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.FieldOffsetAttribute)) { if (this.IsStatic || this.IsConst) { // CS0637: The FieldOffset attribute is not allowed on static or const fields arguments.Diagnostics.Add(ErrorCode.ERR_StructOffsetOnBadField, arguments.AttributeSyntaxOpt.Name.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { int offset = attribute.CommonConstructorArguments[0].DecodeValue <int>(SpecialType.System_Int32); if (offset < 0) { // Dev10 reports CS0647: "Error emitting attribute ..." CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); offset = 0; } // Set field offset even if the attribute specifies an invalid value, so that // post-validation knows that the attribute is applied and reports better errors. arguments.GetOrCreateData <CommonFieldWellKnownAttributeData>().SetFieldOffset(offset); } } else if (attribute.IsTargetAttribute(this, AttributeDescription.MarshalAsAttribute)) { MarshalAsAttributeDecoder <CommonFieldWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation> .Decode(ref arguments, AttributeTargets.Field, MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.FixedBufferAttribute)) { // error CS1716: Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute. Use the 'fixed' field modifier instead. arguments.Diagnostics.Add(ErrorCode.ERR_DoNotUseFixedBufferAttr, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DateTimeConstantAttribute)) { VerifyConstantValueMatches(attribute.DecodeDateTimeConstantValue(), ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DecimalConstantAttribute)) { VerifyConstantValueMatches(attribute.DecodeDecimalConstantValue(), ref arguments); } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultParameterValueAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DefaultParameterValueAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DecimalConstantAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DecimalConstantAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DateTimeConstantAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DateTimeConstantAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.OptionalAttribute)) { Debug.Assert(this.lazyHasOptionalAttribute == ThreeState.True); if (HasDefaultArgumentSyntax) { // error CS1745: Cannot specify default parameter value in conjunction with DefaultParameterAttribute or OptionalAttribute arguments.Diagnostics.Add(ErrorCode.ERR_DefaultValueUsedWithAttributes, arguments.AttributeSyntaxOpt.Name.Location); } } else if (attribute.IsTargetAttribute(this, AttributeDescription.ParamArrayAttribute)) { // error CS0674: Do not use 'System.ParamArrayAttribute'. Use the 'params' keyword instead. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitParamArray, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.InAttribute)) { if (this.RefKind == RefKind.Out) { // error CS0036: An out parameter cannot have the In attribute arguments.Diagnostics.Add(ErrorCode.ERR_InAttrOnOutParam, arguments.AttributeSyntaxOpt.Name.Location); } else { arguments.GetOrCreateData <CommonParameterWellKnownAttributeData>().HasInAttribute = true; } } else if (attribute.IsTargetAttribute(this, AttributeDescription.OutAttribute)) { arguments.GetOrCreateData <CommonParameterWellKnownAttributeData>().HasOutAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.MarshalAsAttribute)) { MarshalAsAttributeDecoder <CommonParameterWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation> .Decode(ref arguments, AttributeTargets.Parameter, MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.IDispatchConstantAttribute)) { arguments.GetOrCreateData <CommonParameterWellKnownAttributeData>().HasIDispatchConstantAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.IUnknownConstantAttribute)) { arguments.GetOrCreateData <CommonParameterWellKnownAttributeData>().HasIUnknownConstantAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerLineNumberAttribute)) { ValidateCallerLineNumberAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerFilePathAttribute)) { ValidateCallerFilePathAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerMemberNameAttribute)) { ValidateCallerMemberNameAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } }
private void DecodeDllImportAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); bool hasErrors = false; if (!this.IsExtern || !this.IsStatic) { arguments.Diagnostics.Add(ErrorCode.ERR_DllImportOnInvalidMethod, arguments.AttributeSyntaxOpt.Name.Location); hasErrors = true; } if (this.IsGenericMethod || (object)containingType != null && containingType.IsGenericType) { arguments.Diagnostics.Add(ErrorCode.ERR_DllImportOnGenericMethod, arguments.AttributeSyntaxOpt.Name.Location); hasErrors = true; } string moduleName = attribute.GetConstructorArgument<string>(0, SpecialType.System_String); if (!MetadataHelpers.IsValidMetadataIdentifier(moduleName)) { // Dev10 reports CS0647: "Error emitting attribute ..." CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); hasErrors = true; moduleName = null; } // Default value of charset is inherited from the module (only if specified). // This might be different from ContainingType.DefaultMarshallingCharSet. If the charset is not specified on module // ContainingType.DefaultMarshallingCharSet would be Ansi (the class is emitted with "Ansi" charset metadata flag) // while the charset in P/Invoke metadata should be "None". CharSet charSet = this.GetEffectiveDefaultMarshallingCharSet() ?? Cci.Constants.CharSet_None; string importName = null; bool preserveSig = true; CallingConvention callingConvention = System.Runtime.InteropServices.CallingConvention.Winapi; bool setLastError = false; bool exactSpelling = false; // C#: ExactSpelling=false for any charset bool? bestFitMapping = null; bool? throwOnUnmappable = null; int position = 1; foreach (var namedArg in attribute.CommonNamedArguments) { switch (namedArg.Key) { case "EntryPoint": importName = namedArg.Value.Value as string; if (!MetadataHelpers.IsValidMetadataIdentifier(importName)) { // Dev10 reports CS0647: "Error emitting attribute ..." arguments.Diagnostics.Add(ErrorCode.ERR_InvalidNamedArgument, arguments.AttributeSyntaxOpt.ArgumentList.Arguments[position].Location, namedArg.Key); hasErrors = true; importName = null; } break; case "CharSet": // invalid values will be ignored charSet = namedArg.Value.DecodeValue<CharSet>(SpecialType.System_Enum); break; case "SetLastError": // invalid values will be ignored setLastError = namedArg.Value.DecodeValue<bool>(SpecialType.System_Boolean); break; case "ExactSpelling": // invalid values will be ignored exactSpelling = namedArg.Value.DecodeValue<bool>(SpecialType.System_Boolean); break; case "PreserveSig": preserveSig = namedArg.Value.DecodeValue<bool>(SpecialType.System_Boolean); break; case "CallingConvention": // invalid values will be ignored callingConvention = namedArg.Value.DecodeValue<CallingConvention>(SpecialType.System_Enum); break; case "BestFitMapping": bestFitMapping = namedArg.Value.DecodeValue<bool>(SpecialType.System_Boolean); break; case "ThrowOnUnmappableChar": throwOnUnmappable = namedArg.Value.DecodeValue<bool>(SpecialType.System_Boolean); break; } position++; } if (!hasErrors) { arguments.GetOrCreateData<CommonMethodWellKnownAttributeData>().SetDllImport( arguments.Index, moduleName, importName, DllImportData.MakeFlags( exactSpelling, charSet, setLastError, callingConvention, bestFitMapping, throwOnUnmappable), preserveSig); } }
private void DecodeCoClassAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); if (this.IsInterfaceType() && (!arguments.HasDecodedData || (object)((TypeWellKnownAttributeData)arguments.DecodedData).ComImportCoClass == null)) { TypedConstant argument = attribute.CommonConstructorArguments[0]; Debug.Assert(argument.Kind == TypedConstantKind.Type); var coClassType = argument.Value as NamedTypeSymbol; if ((object)coClassType != null && coClassType.TypeKind == TypeKind.Class) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().ComImportCoClass = coClassType; } } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.AttributeUsageAttribute)) { DecodeAttributeUsageAttribute(attribute, arguments.AttributeSyntaxOpt, diagnose: true, diagnosticsOpt: arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultMemberAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasDefaultMemberAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.CoClassAttribute)) { DecodeCoClassAttribute(ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.ConditionalAttribute)) { ValidateConditionalAttribute(attribute, arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.GuidAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().GuidString = attribute.DecodeGuidAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.SerializableAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasSerializableAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.StructLayoutAttribute)) { AttributeData.DecodeStructLayoutAttribute<TypeWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>( ref arguments, this.DefaultMarshallingCharSet, defaultAutoLayoutSize: 0, messageProvider: MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SuppressUnmanagedCodeSecurityAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasSuppressUnmanagedCodeSecurityAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.ClassInterfaceAttribute)) { attribute.DecodeClassInterfaceAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.InterfaceTypeAttribute)) { attribute.DecodeInterfaceTypeAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.WindowsRuntimeImportAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasWindowsRuntimeImportAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.RequiredAttributeAttribute)) { // CS1608: The Required attribute is not permitted on C# types arguments.Diagnostics.Add(ErrorCode.ERR_CantUseRequiredAttribute, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CaseSensitiveExtensionAttribute)) { // ExtensionAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitExtension, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SecurityCriticalAttribute) || attribute.IsTargetAttribute(this, AttributeDescription.SecuritySafeCriticalAttribute)) { arguments.GetOrCreateData<TypeWellKnownAttributeData>().HasSecurityCriticalAttributes = true; } else if (_lazyIsExplicitDefinitionOfNoPiaLocalType == ThreeState.Unknown && attribute.IsTargetAttribute(this, AttributeDescription.TypeIdentifierAttribute)) { _lazyIsExplicitDefinitionOfNoPiaLocalType = ThreeState.True; } else { var compilation = this.DeclaringCompilation; if (attribute.IsSecurityAttribute(compilation)) { attribute.DecodeSecurityAttribute<TypeWellKnownAttributeData>(this, compilation, ref arguments); } } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<CommonEventWellKnownAttributeData>().HasSpecialNameAttribute = true; } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<CommonEventWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.ExcludeFromCodeCoverageAttribute)) { arguments.GetOrCreateData<CommonEventWellKnownAttributeData>().HasExcludeFromCodeCoverageAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.TupleElementNamesAttribute)) { arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitTupleElementNamesAttribute, arguments.AttributeSyntaxOpt.Location); } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<CommonFieldWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.NonSerializedAttribute)) { arguments.GetOrCreateData<CommonFieldWellKnownAttributeData>().HasNonSerializedAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.FieldOffsetAttribute)) { if (this.IsStatic || this.IsConst) { // CS0637: The FieldOffset attribute is not allowed on static or const fields arguments.Diagnostics.Add(ErrorCode.ERR_StructOffsetOnBadField, arguments.AttributeSyntaxOpt.Name.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { int offset = attribute.CommonConstructorArguments[0].DecodeValue<int>(SpecialType.System_Int32); if (offset < 0) { // Dev10 reports CS0647: "Error emitting attribute ..." CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); offset = 0; } // Set field offset even if the attribute specifies an invalid value, so that // post-validation knows that the attribute is applied and reports better errors. arguments.GetOrCreateData<CommonFieldWellKnownAttributeData>().SetFieldOffset(offset); } } else if (attribute.IsTargetAttribute(this, AttributeDescription.MarshalAsAttribute)) { MarshalAsAttributeDecoder<CommonFieldWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>.Decode(ref arguments, AttributeTargets.Field, MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.FixedBufferAttribute)) { // error CS1716: Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute. Use the 'fixed' field modifier instead. arguments.Diagnostics.Add(ErrorCode.ERR_DoNotUseFixedBufferAttr, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DateTimeConstantAttribute)) { VerifyConstantValueMatches(attribute.DecodeDateTimeConstantValue(), ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DecimalConstantAttribute)) { VerifyConstantValueMatches(attribute.DecodeDecimalConstantValue(), ref arguments); } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultParameterValueAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DefaultParameterValueAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DecimalConstantAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DecimalConstantAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DateTimeConstantAttribute)) { // Attribute decoded and constant value stored during EarlyDecodeWellKnownAttribute. DecodeDefaultParameterValueAttribute(AttributeDescription.DateTimeConstantAttribute, ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.OptionalAttribute)) { Debug.Assert(_lazyHasOptionalAttribute == ThreeState.True); if (HasDefaultArgumentSyntax) { // error CS1745: Cannot specify default parameter value in conjunction with DefaultParameterAttribute or OptionalAttribute arguments.Diagnostics.Add(ErrorCode.ERR_DefaultValueUsedWithAttributes, arguments.AttributeSyntaxOpt.Name.Location); } } else if (attribute.IsTargetAttribute(this, AttributeDescription.ParamArrayAttribute)) { // error CS0674: Do not use 'System.ParamArrayAttribute'. Use the 'params' keyword instead. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitParamArray, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.InAttribute)) { if (this.RefKind == RefKind.Out) { // error CS0036: An out parameter cannot have the In attribute arguments.Diagnostics.Add(ErrorCode.ERR_InAttrOnOutParam, arguments.AttributeSyntaxOpt.Name.Location); } else { arguments.GetOrCreateData<CommonParameterWellKnownAttributeData>().HasInAttribute = true; } } else if (attribute.IsTargetAttribute(this, AttributeDescription.OutAttribute)) { arguments.GetOrCreateData<CommonParameterWellKnownAttributeData>().HasOutAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.MarshalAsAttribute)) { MarshalAsAttributeDecoder<CommonParameterWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>.Decode(ref arguments, AttributeTargets.Parameter, MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.IDispatchConstantAttribute)) { arguments.GetOrCreateData<CommonParameterWellKnownAttributeData>().HasIDispatchConstantAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.IUnknownConstantAttribute)) { arguments.GetOrCreateData<CommonParameterWellKnownAttributeData>().HasIUnknownConstantAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerLineNumberAttribute)) { ValidateCallerLineNumberAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerFilePathAttribute)) { ValidateCallerFilePathAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CallerMemberNameAttribute)) { ValidateCallerMemberNameAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } }
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultCharSetAttribute)) { CharSet charSet = attribute.GetConstructorArgument<CharSet>(0, SpecialType.System_Enum); if (!CommonModuleWellKnownAttributeData.IsValidCharSet(charSet)) { CSharpSyntaxNode attributeArgumentSyntax = attribute.GetAttributeArgumentSyntax(0, arguments.AttributeSyntaxOpt); arguments.Diagnostics.Add(ErrorCode.ERR_InvalidAttributeArgument, attributeArgumentSyntax.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } else { arguments.GetOrCreateData<CommonModuleWellKnownAttributeData>().DefaultCharacterSet = charSet; } } }
internal sealed override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments <AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); Debug.Assert(arguments.SymbolPart == AttributeLocation.None); if (attribute.IsTargetAttribute(this, AttributeDescription.AttributeUsageAttribute)) { DecodeAttributeUsageAttribute(attribute, arguments.AttributeSyntaxOpt, diagnose: true, diagnosticsOpt: arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DefaultMemberAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasDefaultMemberAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.CoClassAttribute)) { DecodeCoClassAttribute(ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.ConditionalAttribute)) { ValidateConditionalAttribute(attribute, arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.GuidAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().GuidString = attribute.DecodeGuidAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.SerializableAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasSerializableAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.StructLayoutAttribute)) { AttributeData.DecodeStructLayoutAttribute <TypeWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>( ref arguments, this.DefaultMarshallingCharSet, defaultAutoLayoutSize: 0, messageProvider: MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SuppressUnmanagedCodeSecurityAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasSuppressUnmanagedCodeSecurityAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.ClassInterfaceAttribute)) { attribute.DecodeClassInterfaceAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.InterfaceTypeAttribute)) { attribute.DecodeInterfaceTypeAttribute(arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.WindowsRuntimeImportAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasWindowsRuntimeImportAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.RequiredAttributeAttribute)) { // CS1608: The Required attribute is not permitted on C# types arguments.Diagnostics.Add(ErrorCode.ERR_CantUseRequiredAttribute, arguments.AttributeSyntaxOpt.Name.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.CaseSensitiveExtensionAttribute)) { // ExtensionAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitExtension, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute)) { // DynamicAttribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SecurityCriticalAttribute) || attribute.IsTargetAttribute(this, AttributeDescription.SecuritySafeCriticalAttribute)) { arguments.GetOrCreateData <TypeWellKnownAttributeData>().HasSecurityCriticalAttributes = true; } else if (lazyIsExplicitDefinitionOfNoPiaLocalType == ThreeState.Unknown && attribute.IsTargetAttribute(this, AttributeDescription.TypeIdentifierAttribute)) { lazyIsExplicitDefinitionOfNoPiaLocalType = ThreeState.True; } else { var compilation = this.DeclaringCompilation; if (attribute.IsSecurityAttribute(compilation)) { attribute.DecodeSecurityAttribute <TypeWellKnownAttributeData>(this, compilation, ref arguments); } } }
/// <summary> /// Verify the constant value matches the default value from any earlier attribute /// (DateTimeConstantAttribute or DecimalConstantAttribute). /// If not, report ERR_FieldHasMultipleDistinctConstantValues. /// </summary> private void VerifyConstantValueMatches(ConstantValue attrValue, ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { if (!attrValue.IsBad) { var data = arguments.GetOrCreateData<CommonFieldWellKnownAttributeData>(); ConstantValue constValue; if (this.IsConst) { if (this.Type.SpecialType == SpecialType.System_Decimal) { constValue = this.GetConstantValue(ConstantFieldsInProgress.Empty, earlyDecodingWellKnownAttributes: false); if ((object)constValue != null && !constValue.IsBad && constValue != attrValue) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } } else { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } if (data.ConstValue == CodeAnalysis.ConstantValue.Unset) { data.ConstValue = attrValue; } } else { constValue = data.ConstValue; if (constValue != CodeAnalysis.ConstantValue.Unset) { if (constValue != attrValue) { arguments.Diagnostics.Add(ErrorCode.ERR_FieldHasMultipleDistinctConstantValues, arguments.AttributeSyntaxOpt.Location); } } else { data.ConstValue = attrValue; } } } }
private void DecodeWellKnownAttributeAppliedToMethod(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); var attribute = arguments.Attribute; Debug.Assert(!attribute.HasErrors); if (attribute.IsTargetAttribute(this, AttributeDescription.PreserveSigAttribute)) { arguments.GetOrCreateData<CommonMethodWellKnownAttributeData>().SetPreserveSignature(arguments.Index); } else if (attribute.IsTargetAttribute(this, AttributeDescription.MethodImplAttribute)) { AttributeData.DecodeMethodImplAttribute<CommonMethodWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>(ref arguments, MessageProvider.Instance); } else if (attribute.IsTargetAttribute(this, AttributeDescription.DllImportAttribute)) { DecodeDllImportAttribute(ref arguments); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SpecialNameAttribute)) { arguments.GetOrCreateData<CommonMethodWellKnownAttributeData>().HasSpecialNameAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.ConditionalAttribute)) { ValidateConditionalAttribute(attribute, arguments.AttributeSyntaxOpt, arguments.Diagnostics); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SuppressUnmanagedCodeSecurityAttribute)) { arguments.GetOrCreateData<CommonMethodWellKnownAttributeData>().HasSuppressUnmanagedCodeSecurityAttribute = true; } else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicSecurityMethodAttribute)) { arguments.GetOrCreateData<CommonMethodWellKnownAttributeData>().HasDynamicSecurityMethodAttribute = true; } else if (VerifyObsoleteAttributeAppliedToMethod(ref arguments, AttributeDescription.ObsoleteAttribute)) { } else if (VerifyObsoleteAttributeAppliedToMethod(ref arguments, AttributeDescription.DeprecatedAttribute)) { } else if (attribute.IsTargetAttribute(this, AttributeDescription.CaseSensitiveExtensionAttribute)) { // [Extension] attribute should not be set explicitly. arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitExtension, arguments.AttributeSyntaxOpt.Location); } else if (attribute.IsTargetAttribute(this, AttributeDescription.SecurityCriticalAttribute) || attribute.IsTargetAttribute(this, AttributeDescription.SecuritySafeCriticalAttribute)) { if (IsAsync) { arguments.Diagnostics.Add(ErrorCode.ERR_SecurityCriticalOrSecuritySafeCriticalOnAsync, arguments.AttributeSyntaxOpt.Location, arguments.AttributeSyntaxOpt.GetErrorDisplayName()); } } else { var compilation = this.DeclaringCompilation; if (attribute.IsSecurityAttribute(compilation)) { attribute.DecodeSecurityAttribute<CommonMethodWellKnownAttributeData>(this, compilation, ref arguments); } } }