private static bool IncludeMember(ISymbol member, CODEMEMBERTYPE memberType, Compilation compilation) { if (!member.CanBeReferencedByName) { return(false); } switch (memberType) { case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENT_HANDLERS: // NOTE: the Dev10 C# codebase just returned if (member.Kind != SymbolKind.Method) { return(false); } var method = (IMethodSymbol)member; if (!method.ReturnsVoid) { return(false); } if (method.Parameters.Length != 2) { return(false); } if (!method.Parameters[0].Type.Equals(compilation.ObjectType)) { return(false); } if (!method.Parameters[1].Type.InheritsFromOrEquals(compilation.EventArgsType())) { return(false); } return(true); case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS: return(member.Kind == SymbolKind.Event); case CODEMEMBERTYPE.CODEMEMBERTYPE_USER_FUNCTIONS: return(member.Kind == SymbolKind.Method); default: throw new ArgumentException("InvalidValue", nameof(memberType)); } }
/// <summary> /// Get the display names and unique ids of all the members of the given type in <paramref /// name="className"/>. /// </summary> public static IEnumerable <Tuple <string, string> > GetMembers( Document document, string className, CODEMEMBERTYPE codeMemberType, CancellationToken cancellationToken) { var type = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken).GetTypeByMetadataName(className); var compilation = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken); var semanticModel = document.GetSemanticModelAsync(cancellationToken).WaitAndGetResult_Venus(cancellationToken); var allMembers = codeMemberType == CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS ? semanticModel.LookupSymbols(position: type.Locations[0].SourceSpan.Start, container: type, name: null) : type.GetMembers(); var members = allMembers.Where(m => IncludeMember(m, codeMemberType, compilation)); return(members.Select(m => Tuple.Create(m.Name, ConstructMemberId(m)))); }
private static bool IncludeMember(ISymbol member, CODEMEMBERTYPE memberType, Compilation compilation) { if (!member.CanBeReferencedByName) { return false; } switch (memberType) { case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENT_HANDLERS: // NOTE: the Dev10 C# codebase just returned if (member.Kind != SymbolKind.Method) { return false; } var method = (IMethodSymbol)member; if (!method.ReturnsVoid) { return false; } if (method.Parameters.Length != 2) { return false; } if (!method.Parameters[0].Type.Equals(compilation.ObjectType)) { return false; } if (!method.Parameters[1].Type.InheritsFromOrEquals(compilation.EventArgsType())) { return false; } return true; case CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS: return member.Kind == SymbolKind.Event; case CODEMEMBERTYPE.CODEMEMBERTYPE_USER_FUNCTIONS: return member.Kind == SymbolKind.Method; default: throw new ArgumentException("InvalidValue", "memberType"); } }
/// <summary> /// Get the display names and unique ids of all the members of the given type in <paramref /// name="className"/>. /// </summary> public static IEnumerable<Tuple<string, string>> GetMembers( Document document, string className, CODEMEMBERTYPE codeMemberType, CancellationToken cancellationToken) { var type = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken).GetTypeByMetadataName(className); var compilation = document.Project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken); var semanticModel = document.GetSemanticModelAsync(cancellationToken).WaitAndGetResult(cancellationToken); var allMembers = codeMemberType == CODEMEMBERTYPE.CODEMEMBERTYPE_EVENTS ? semanticModel.LookupSymbols(position: type.Locations[0].SourceSpan.Start, container: type, name: null) : type.GetMembers(); var members = allMembers.Where(m => IncludeMember(m, codeMemberType, compilation)); return members.Select(m => Tuple.Create(m.Name, ConstructMemberId(m))); }