public static AttachedMemberList Create(INamedTypeSymbol typeSymbol, TypeDataStore store, INamedTypeSymbol attachedMemberAttr) { var comparer = SymbolEqualityComparer.Default; Dictionary <string, AttachedMemberData>?dic = null; foreach (var attr in typeSymbol.GetAttributes()) { if (comparer.Equals(attachedMemberAttr, attr.AttributeClass) == false) { continue; } var args = attr.ConstructorArguments; if (args.Length != 3) { continue; } var memberName = args[0].Value?.ToString(); var code = args[1].Value?.ToString(); var memberTypeName = args[2].Value?.ToString(); var memberType = memberTypeName != null?store.Compilation.GetTypeByMetadataNameOrSpecialType(memberTypeName) : null; if (memberName == null || code == null || memberType == null) { continue; } dic ??= new(); dic[memberName] = new AttachedMemberData(typeSymbol, memberName, code, memberType); } if (dic == null) { return(Empty); } return(new AttachedMemberList(dic, typeSymbol, store)); }
public bool TryGetData(string memberName, [MaybeNullWhen(false)] out AttachedMemberData data) { var dic = _dic; if (dic is null) { data = null; return(false); } return(dic.TryGetValue(memberName, out data)); }