private string GetPrefix(MemberReference memberReference) { switch (memberReference.GetKind()) { case MemberReferenceKind.Field: return "F"; case MemberReferenceKind.Method: return "M"; default: return memberReference.GetKind().ToString(); } }
private MemberDependency GetMemberReferenceMemberDependency(MemberReference memberReference) { var provider = new MemberMetadataInfoTypeProvider(_reader); var memberRefInfo = provider.GetMemberRefInfo(memberReference); // Add the parent type to the types list (only needed when we want to report memberrefs defined in the current assembly) if (memberRefInfo.ParentType.IsTypeDef || (memberRefInfo.ParentType.IsPrimitiveType && _currentAssemblyName.Equals("mscorlib", StringComparison.OrdinalIgnoreCase))) { MemberDependency.Add(CreateMemberDependency(memberRefInfo.ParentType)); } var dep = new MemberDependency { CallingAssembly = CallingAssembly, MemberDocId = $"{GetPrefix(memberReference)}:{memberRefInfo}", TypeDocId = $"T:{memberRefInfo.ParentType}", IsPrimitive = memberRefInfo.ParentType.IsPrimitiveType }; if (memberRefInfo.ParentType.IsAssemblySet) { dep.DefinedInAssemblyIdentity = _reader.FormatAssemblyInfo(memberRefInfo.ParentType.DefinedInAssembly); } // If no assembly is set, then the type is either a primitive type or it's in the current assembly. // Mscorlib is special-cased for testing purposes. else if (!memberRefInfo.ParentType.IsPrimitiveType || string.Equals(_currentAssemblyName, "mscorlib", StringComparison.OrdinalIgnoreCase)) { dep.DefinedInAssemblyIdentity = _currentAssemblyInfo; } return dep; }
public ParseTarget CreateParseTarget(MemberReference memberRef) { if (memberRef.GetKind() != MemberReferenceKind.Method) throw new ArgumentException("Metadata Token does not refer to a method"); var methodName = Reader.GetString(memberRef.Name); if (memberRef.Parent.Kind != HandleKind.TypeReference) throw new ArgumentException("Owner of member is not a reference to a type"); var sig = ILReader.ParseMethodSignature(this, Reader.GetBlobBytes(memberRef.Signature)); #if DEBUG_SIG Console.WriteLine("=== Real Sig ==="); foreach (var b in sig) Console.Write("{0:X2} ", b); Console.WriteLine(); #endif var parent = Reader.GetTypeReference((TypeReferenceHandle)memberRef.Parent); if (parent.ResolutionScope.Kind != HandleKind.AssemblyReference) throw new ArgumentException("Owner of members resolution scope is not an assembly"); var parentFqName = GetFullyQualifiedName(parent); var parentScope = Reader.GetAssemblyReference((AssemblyReferenceHandle)parent.ResolutionScope); var assemblyName = Reader.GetString(parentScope.Name); return new ParseTarget(Context, assemblyName, parentScope.Version, parentFqName) { MethodName = methodName, MethodSignature = sig }; }
public Class ForceResolveType(MemberReference memberRef) { var target = CreateParseTarget(memberRef); return ForceResolveTypeCore(target); }
private MemberDependency GetMemberReferenceMemberDependency(MemberReference memberReference) { var provider = new MemberMetadataInfoTypeProvider(_reader); var memberRefInfo = provider.GetMemberRefInfo(memberReference); AssemblyReferenceInformation definedInAssemblyIdentity = null; if (memberRefInfo.ParentType.DefinedInAssembly.HasValue) { definedInAssemblyIdentity = _reader.FormatAssemblyInfo(memberRefInfo.ParentType.DefinedInAssembly.Value); } // If no assembly is set, then the type is either a primitive type or it's in the current assembly. // Mscorlib is special-cased for testing purposes. else if (!memberRefInfo.ParentType.IsPrimitiveType || string.Equals(_currentAssemblyName, "mscorlib", StringComparison.OrdinalIgnoreCase)) { definedInAssemblyIdentity = _currentAssemblyInfo; } // Apply heuristic to determine if API is most likely defined in a framework assembly if (!_assemblyFilter.IsFrameworkAssembly(definedInAssemblyIdentity)) { return null; } // Add the parent type to the types list (only needed when we want to report memberrefs defined in the current assembly) if (memberRefInfo.ParentType.IsTypeDef || (memberRefInfo.ParentType.IsPrimitiveType && _currentAssemblyName.Equals("mscorlib", StringComparison.OrdinalIgnoreCase))) { var memberDependency = CreateMemberDependency(memberRefInfo.ParentType); if (memberDependency != null) { MemberDependency.Add(memberDependency); } } return new MemberDependency { CallingAssembly = CallingAssembly, MemberDocId = $"{GetPrefix(memberReference)}:{memberRefInfo}", TypeDocId = $"T:{memberRefInfo.ParentType}", IsPrimitive = memberRefInfo.ParentType.IsPrimitiveType, DefinedInAssemblyIdentity = definedInAssemblyIdentity }; }