private static bool MatchAttributeTarget(IAttributeTargetSymbol attributeTarget, AttributeLocation symbolPart, AttributeTargetSpecifierSyntax targetOpt, DiagnosticBag diagnostics) { IAttributeTargetSymbol attributesOwner = attributeTarget.AttributesOwner; // Determine if the target symbol owns the attribute declaration. // We need to report diagnostics only once, so do it when visiting attributes for the owner. bool isOwner = symbolPart == AttributeLocation.None && ReferenceEquals(attributesOwner, attributeTarget); if (targetOpt == null) { // only attributes with an explicit target match if the symbol doesn't own the attributes: return(isOwner); } AttributeLocation allowedTargets = attributesOwner.AllowedAttributeLocations; AttributeLocation explicitTarget = targetOpt.GetAttributeLocation(); if (explicitTarget == AttributeLocation.None) { // error: unknown attribute location if (isOwner) { //NOTE: ValueText so that we accept targets like "@return", to match dev10 (DevDiv #2591). diagnostics.Add(ErrorCode.WRN_InvalidAttributeLocation, targetOpt.Identifier.GetLocation(), targetOpt.Identifier.ValueText, allowedTargets.ToDisplayString()); } return(false); } if ((explicitTarget & allowedTargets) == 0) { // error: invalid target for symbol if (isOwner) { if (allowedTargets == AttributeLocation.None) { switch (attributeTarget.DefaultAttributeLocation) { case AttributeLocation.Assembly: case AttributeLocation.Module: // global attributes are disallowed in interactive code: diagnostics.Add(ErrorCode.ERR_GlobalAttributesNotAllowed, targetOpt.Identifier.GetLocation()); break; default: // currently this can't happen throw ExceptionUtilities.UnexpectedValue(attributeTarget.DefaultAttributeLocation); } } else { diagnostics.Add(ErrorCode.WRN_AttributeLocationOnBadDeclaration, targetOpt.Identifier.GetLocation(), targetOpt.Identifier.ToString(), allowedTargets.ToDisplayString()); } } return(false); } if (symbolPart == AttributeLocation.None) { return(explicitTarget == attributeTarget.DefaultAttributeLocation); } else { return(explicitTarget == symbolPart); } }
private static bool MatchAttributeTarget(IAttributeTargetSymbol attributeTarget, AttributeLocation symbolPart, AttributeTargetSpecifierSyntax targetOpt, DiagnosticBag diagnostics) { IAttributeTargetSymbol attributesOwner = attributeTarget.AttributesOwner; // Determine if the target symbol owns the attribute declaration. // We need to report diagnostics only once, so do it when visiting attributes for the owner. bool isOwner = symbolPart == AttributeLocation.None && ReferenceEquals(attributesOwner, attributeTarget); if (targetOpt == null) { // only attributes with an explicit target match if the symbol doesn't own the attributes: return isOwner; } AttributeLocation explicitTarget = targetOpt.GetAttributeLocation(); if (explicitTarget == AttributeLocation.None) { // error: unknown attribute location if (isOwner) { //NOTE: ValueText so that we accept targets like "@return", to match dev10 (DevDiv #2591). diagnostics.Add(ErrorCode.WRN_InvalidAttributeLocation, targetOpt.Identifier.GetLocation(), targetOpt.Identifier.ValueText); } return false; } AttributeLocation allowedTargets = attributesOwner.AllowedAttributeLocations; if ((explicitTarget & allowedTargets) == 0) { // error: invalid target for symbol if (isOwner) { if (allowedTargets == AttributeLocation.None) { switch (attributeTarget.DefaultAttributeLocation) { case AttributeLocation.Assembly: case AttributeLocation.Module: // global attributes are disallowed in interactive code: diagnostics.Add(ErrorCode.ERR_GlobalAttributesNotAllowed, targetOpt.Identifier.GetLocation()); break; default: // currently this can't happen throw ExceptionUtilities.UnexpectedValue(attributeTarget.DefaultAttributeLocation); } } else { diagnostics.Add(ErrorCode.WRN_AttributeLocationOnBadDeclaration, targetOpt.Identifier.GetLocation(), targetOpt.Identifier.ToString(), allowedTargets.ToDisplayString()); } } return false; } if (symbolPart == AttributeLocation.None) { return explicitTarget == attributeTarget.DefaultAttributeLocation; } else { return explicitTarget == symbolPart; } }