本文整理汇总了C#中DecodeWellKnownAttributeArguments类的典型用法代码示例。如果您正苦于以下问题:C# DecodeWellKnownAttributeArguments类的具体用法?C# DecodeWellKnownAttributeArguments怎么用?C# DecodeWellKnownAttributeArguments使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
DecodeWellKnownAttributeArguments类属于命名空间,在下文中一共展示了DecodeWellKnownAttributeArguments类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DecodeCoClassAttribute
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;
}
}
}
示例2: DecodeWellKnownAttribute
/// <summary>
/// This method is called by the binder when it is finished binding a set of attributes on the symbol so that
/// the symbol can extract data from the attribute arguments and potentially perform validation specific to
/// some well known attributes.
/// <para>
/// NOTE: If we are decoding a well-known attribute that could be queried by the binder, consider decoding it during early decoding pass.
/// </para>
/// </summary>
/// <remarks>
/// <para>
/// Symbol types should override this if they want to handle a specific well-known attribute.
/// If the attribute is of a type that the symbol does not wish to handle, it should delegate back to
/// this (base) method.
/// </para>
/// </remarks>
internal virtual void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments)
{
}
示例3: DecodeWellKnownAttribute
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;
}
}
示例4: DecodeWellKnownAttribute
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);
}
}
}
示例5: VerifyConstantValueMatches
/// <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;
}
}
}
}
示例6: DecodeWellKnownAttribute
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);
}
}
示例7: DecodeDllImportAttribute
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(
//.........这里部分代码省略.........
示例8: DecodeWellKnownAttribute
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);
}
}
示例9: VerifyObsoleteAttributeAppliedToMethod
private bool VerifyObsoleteAttributeAppliedToMethod(
ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments,
AttributeDescription description)
{
if (arguments.Attribute.IsTargetAttribute(this, description))
{
if (this.IsAccessor())
{
// CS1667: Attribute '{0}' is not valid on property or event accessors. It is only valid on '{1}' declarations.
AttributeUsageInfo attributeUsage = arguments.Attribute.AttributeClass.GetAttributeUsageInfo();
arguments.Diagnostics.Add(ErrorCode.ERR_AttributeNotOnAccessor, arguments.AttributeSyntaxOpt.Name.Location, description.FullName, attributeUsage.GetValidTargetsString());
}
return true;
}
return false;
}
示例10: DecodeWellKnownAttributeAppliedToReturnValue
private void DecodeWellKnownAttributeAppliedToReturnValue(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.MarshalAsAttribute))
{
// MarshalAs applied to the return value:
MarshalAsAttributeDecoder<CommonReturnTypeWellKnownAttributeData, AttributeSyntax, CSharpAttributeData, AttributeLocation>.Decode(ref arguments, AttributeTargets.ReturnValue, MessageProvider.Instance);
}
else if (attribute.IsTargetAttribute(this, AttributeDescription.DynamicAttribute))
{
// DynamicAttribute should not be set explicitly.
arguments.Diagnostics.Add(ErrorCode.ERR_ExplicitDynamicAttr, arguments.AttributeSyntaxOpt.Location);
}
}
示例11: DecodeWellKnownAttributeAppliedToMethod
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);
}
}
}
示例12: DecodeWellKnownAttribute
internal override void DecodeWellKnownAttribute(ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments)
{
Debug.Assert(!arguments.Attribute.HasErrors);
Debug.Assert(arguments.SymbolPart == AttributeLocation.None || arguments.SymbolPart == AttributeLocation.Return);
if (arguments.SymbolPart == AttributeLocation.None)
{
DecodeWellKnownAttributeAppliedToMethod(ref arguments);
}
else
{
DecodeWellKnownAttributeAppliedToReturnValue(ref arguments);
}
}
示例13: DecodeDefaultParameterValueAttribute
private void DecodeDefaultParameterValueAttribute(AttributeDescription description, ref DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation> arguments)
{
var attribute = arguments.Attribute;
var syntax = arguments.AttributeSyntaxOpt;
var diagnostics = arguments.Diagnostics;
Debug.Assert(syntax != null);
Debug.Assert(diagnostics != null);
var value = DecodeDefaultParameterValueAttribute(description, attribute, syntax, diagnose: true, diagnosticsOpt: diagnostics);
if (!value.IsBad)
{
VerifyParamDefaultValueMatchesAttributeIfAny(value, syntax, diagnostics);
}
}
示例14: ValidateAttributeUsageAndDecodeWellKnownAttributes
/// <summary>
/// This method validates attribute usage for each bound attribute and calls <see cref="DecodeWellKnownAttribute"/>
/// on attributes with valid attribute usage.
/// This method is called by the binder when it is finished binding a set of attributes on the symbol so that
/// the symbol can extract data from the attribute arguments and potentially perform validation specific to
/// some well known attributes.
/// </summary>
private WellKnownAttributeData ValidateAttributeUsageAndDecodeWellKnownAttributes(
ImmutableArray<Binder> binders,
ImmutableArray<AttributeSyntax> attributeSyntaxList,
ImmutableArray<CSharpAttributeData> boundAttributes,
DiagnosticBag diagnostics,
AttributeLocation symbolPart)
{
Debug.Assert(binders.Any());
Debug.Assert(attributeSyntaxList.Any());
Debug.Assert(boundAttributes.Any());
Debug.Assert(binders.Length == boundAttributes.Length);
Debug.Assert(attributeSyntaxList.Length == boundAttributes.Length);
int totalAttributesCount = boundAttributes.Length;
HashSet<NamedTypeSymbol> uniqueAttributeTypes = new HashSet<NamedTypeSymbol>();
var arguments = new DecodeWellKnownAttributeArguments<AttributeSyntax, CSharpAttributeData, AttributeLocation>();
arguments.Diagnostics = diagnostics;
arguments.AttributesCount = totalAttributesCount;
arguments.SymbolPart = symbolPart;
for (int i = 0; i < totalAttributesCount; i++)
{
CSharpAttributeData boundAttribute = boundAttributes[i];
AttributeSyntax attributeSyntax = attributeSyntaxList[i];
Binder binder = binders[i];
// Decode attribute as a possible well-known attribute only if it has no binding errors and has valid AttributeUsage.
if (!boundAttribute.HasErrors && ValidateAttributeUsage(boundAttribute, attributeSyntax, binder.Compilation, symbolPart, diagnostics, uniqueAttributeTypes))
{
arguments.Attribute = boundAttribute;
arguments.AttributeSyntaxOpt = attributeSyntax;
arguments.Index = i;
this.DecodeWellKnownAttribute(ref arguments);
}
}
return arguments.HasDecodedData ? arguments.DecodedData : null;
}
示例15: DecodeWellKnownAttribute
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);
}
}