public override VisualBasicSyntaxNode VisitAttributeTargetSpecifier(CSS.AttributeTargetSpecifierSyntax node) { SyntaxToken id; switch (node.Identifier.CSKind()) { case CS.SyntaxKind.AssemblyKeyword: id = SyntaxFactory.Token(SyntaxKind.AssemblyKeyword); break; case CS.SyntaxKind.ReturnKeyword: // not necessary, return attributes are moved by ConvertAndSplitAttributes. return(null); default: throw new NotSupportedException(); } return(SyntaxFactory.AttributeTarget(id)); }
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; } }
private IEnumerable<ITypeSymbol> InferTypeInAttributeTargetSpecifier( AttributeTargetSpecifierSyntax attributeTargetSpecifier, SyntaxToken? previousToken) { // If we have a position, then it has to be after the colon. if (previousToken.HasValue && previousToken.Value != attributeTargetSpecifier.ColonToken) { return SpecializedCollections.EmptyEnumerable<ITypeSymbol>(); } return SpecializedCollections.SingletonEnumerable(this.Compilation.AttributeType()); }
/// <summary> /// /// </summary> /// <param name="node"></param> public override sealed void VisitAttributeTargetSpecifier(AttributeTargetSpecifierSyntax node) { this.OnNodeVisited(node, this.type.IsInstanceOfType(node)); base.VisitAttributeTargetSpecifier(node); }
/// <summary> /// /// </summary> /// <param name="node"></param> public override sealed void VisitAttributeTargetSpecifier(AttributeTargetSpecifierSyntax node) { this.OnNodeVisited(node); if (!this.traverseRootOnly) base.VisitAttributeTargetSpecifier(node); }