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; } } } } }
static bool FindUsesInGenericConstraints(MetadataReader metadata, GenericParameterHandleCollection collection, FindTypeDecoder decoder) { foreach (var h in collection) { var gp = metadata.GetGenericParameter(h); foreach (var hc in gp.GetConstraints()) { var gc = metadata.GetGenericParameterConstraint(hc); if (decoder.GetTypeFromEntity(metadata, gc.Type)) { return(true); } } } return(false); }