protected override void MakeMembers(ArrayBuilder <Symbol> mb, Binder binder, DiagnosticBag diagnostics) { // TODO(@MattWindsor91): handle duplicate methods foreach (var concept in ((SourceNamedTypeSymbol)ContainingSymbol).GetConceptsForInlineInstances(null)) { foreach (var member in concept.GetMembersUnordered()) { // TODO(@MattWindsor91): properties if (member.Kind != SymbolKind.Method) { // TODO(@MattWindsor91): better error? diagnostics.Add(ErrorCode.ERR_InlineInstanceNonMethodMember, ContainingSymbol.GetNonNullSyntaxNode().Location, member); continue; } var shim = TrySynthesizeInstanceShim(concept, (MethodSymbol)member, diagnostics); if (shim != null) { mb.Add(shim); } } } }
internal void CheckConceptImplementations(DiagnosticBag diagnostics, CancellationToken cancellationToken) { // TODO(@MattWindsor91): Most of this is copied from // SourceMemberContainerSymbol.ComputeInterfaceImplementations, // and may not be relevant or optimal. ImmutableHashSet <NamedTypeSymbol> interfacesAndTheirBases = InterfacesAndTheirBaseInterfacesNoUseSiteDiagnostics; foreach (var concept in AllInterfacesNoUseSiteDiagnostics) { cancellationToken.ThrowIfCancellationRequested(); if (!interfacesAndTheirBases.Contains(concept)) { continue; } foreach (var conceptMember in concept.GetMembersUnordered()) { cancellationToken.ThrowIfCancellationRequested(); // Only require implementations for members that can be implemented in C#. SymbolKind conceptMemberKind = conceptMember.Kind; switch (conceptMemberKind) { case SymbolKind.Method: case SymbolKind.Property: case SymbolKind.Event: if (conceptMember.IsStatic) { continue; } break; default: continue; } var implementingMemberAndDiagnostics = FindImplementationForInterfaceMemberWithDiagnostics(conceptMember); // TODO(@MattWindsor91): Probably incorrect if (implementingMemberAndDiagnostics.Diagnostics.Any()) { diagnostics.AddRange(implementingMemberAndDiagnostics.Diagnostics); } else if (implementingMemberAndDiagnostics.Symbol == null) { // Suppress for bogus properties and events and for indexed properties. if (!conceptMember.MustCallMethodsDirectly() && !conceptMember.IsIndexedProperty()) { DiagnosticInfo useSiteDiagnostic = conceptMember.GetUseSiteDiagnostic(); if (useSiteDiagnostic != null && useSiteDiagnostic.DefaultSeverity == DiagnosticSeverity.Error) { // TODO(@MattWindsor91): location is wrong. diagnostics.Add(useSiteDiagnostic, ContainingSymbol.GetNonNullSyntaxNode().Location); } else { diagnostics.Add(ErrorCode.ERR_InlineInstanceMissingMember, ContainingSymbol.GetNonNullSyntaxNode().Location, ContainingSymbol, concept, conceptMember); } } } } } }