IEnumerable <ISymbol> HandleCustomAttribute(ITypeDefinition attributeType, AnalyzerScope scope, CancellationToken ct) { var genericContext = new Decompiler.TypeSystem.GenericContext(); // type arguments do not matter for this analyzer. foreach (var module in scope.GetModulesInScope(ct)) { var ts = scope.ConstructTypeSystem(module); ct.ThrowIfCancellationRequested(); var decoder = new FindTypeDecoder(ts.MainModule, attributeType); var referencedParameters = new HashSet <ParameterHandle>(); foreach (var h in module.Metadata.CustomAttributes) { var customAttribute = module.Metadata.GetCustomAttribute(h); if (IsCustomAttributeOfType(customAttribute.Constructor, module.Metadata, decoder)) { if (customAttribute.Parent.Kind == HandleKind.Parameter) { referencedParameters.Add((ParameterHandle)customAttribute.Parent); } else { var parent = AnalyzerHelpers.GetParentEntity(ts, customAttribute); if (parent != null) { yield return(parent); } } } } if (referencedParameters.Count > 0) { foreach (var h in module.Metadata.MethodDefinitions) { var md = module.Metadata.GetMethodDefinition(h); foreach (var p in md.GetParameters()) { if (referencedParameters.Contains(p)) { var method = ts.MainModule.ResolveMethod(h, genericContext); if (method != null) { if (method.IsAccessor) { yield return(method.AccessorOwner); } else { yield return(method); } } break; } } } } } }
static IEnumerable <ISymbol> FindUsesInAttributes(DecompilerTypeSystem typeSystem, MetadataReader metadata, FindTypeDecoder decoder, ITypeDefinition analyzedType) { var attrDecoder = new FindTypeInAttributeDecoder(typeSystem.MainModule, analyzedType); var referencedParameters = new HashSet <ParameterHandle>(); foreach (var h in metadata.CustomAttributes) { var customAttribute = metadata.GetCustomAttribute(h); CustomAttributeValue <TokenSearchResult> value; try { value = customAttribute.DecodeValue(attrDecoder); } catch (EnumUnderlyingTypeResolveException) { continue; } if (AttributeAppliedToAnalyzer.IsCustomAttributeOfType(customAttribute.Constructor, metadata, decoder) || AnalyzeCustomAttributeValue(value)) { if (customAttribute.Parent.Kind == HandleKind.Parameter) { referencedParameters.Add((ParameterHandle)customAttribute.Parent); } else { var parent = AnalyzerHelpers.GetParentEntity(typeSystem, customAttribute); if (parent != null) { yield return(parent); } } } } if (referencedParameters.Count > 0) { foreach (var h in metadata.MethodDefinitions) { var md = metadata.GetMethodDefinition(h); foreach (var p in md.GetParameters()) { if (referencedParameters.Contains(p)) { var method = typeSystem.MainModule.ResolveMethod(h, default); if (method != null) { if (method.IsAccessor) { yield return(method.AccessorOwner); } else { yield return(method); } } break; } } } } }