/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Test/Utilities/CSharp/RequiredMemberAttributesVisitor.cs
80 строк
3 KB
Fred Silberberg
Filter out `RequiredMemberAttribute` from metadata symbols (#63497)
26 авг 2022, 01:21
Не верифицирован
26 авг 2022, 01:21
5b4dc71
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.Collections.Immutable; using System.Reflection.Metadata; using System.Text; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Symbols.Metadata.PE; namespace Microsoft.CodeAnalysis.CSharp.Test.Utilities; internal class RequiredMemberAttributesVisitor : TestAttributesVisitor { internal static string GetString(PEModuleSymbol module) { var builder = new StringBuilder(); var visitor = new RequiredMemberAttributesVisitor(builder); visitor.Visit(module); return builder.ToString(); } private RequiredMemberAttributesVisitor(StringBuilder builder) : base(builder) { } protected override SymbolDisplayFormat DisplayFormat => SymbolDisplayFormat.TestFormat; protected override void ReportSymbol(Symbol symbol) { EntityHandle handle; PEModule module; switch (symbol) { case PENamedTypeSymbol namedType: handle = namedType.Handle; module = ((PEModuleSymbol)namedType.ContainingModule).Module; break; case PEFieldSymbol field: handle = field.Handle; module = ((PEModuleSymbol)field.ContainingModule).Module; break; case PEPropertySymbol property: handle = property.Handle; module = ((PEModuleSymbol)property.ContainingModule).Module; break; default: base.ReportSymbol(symbol); return; } var attribute = module.GetAttributeHandle(handle, AttributeDescription.RequiredMemberAttribute); if (attribute.IsNil) { return; } ReportContainingSymbols(symbol); _builder.Append(GetIndentString(symbol)); _builder.Append("[RequiredMember] "); _builder.AppendLine(symbol.ToDisplayString(DisplayFormat)); _reported.Add(symbol); // If attributes aren't filtered out, this will print extra data and cause an error in test assertion. base.ReportSymbol(symbol); } protected override CSharpAttributeData? GetTargetAttribute(ImmutableArray<CSharpAttributeData> attributes) => GetAttribute(attributes, "System.Runtime.CompilerServices", "RequiredMemberAttribute"); protected override bool TypeRequiresAttribute(TypeSymbol? type) { return false; } }