private IEnumerable<ITypeSymbol> InferTypeInYieldStatement(YieldStatementSyntax yieldStatement, SyntaxToken? previousToken = null) { // If we are position based, then we have to be after the return keyword if (previousToken.HasValue && (previousToken.Value != yieldStatement.ReturnOrBreakKeyword || yieldStatement.ReturnOrBreakKeyword.IsKind(SyntaxKind.BreakKeyword))) { return SpecializedCollections.EmptyEnumerable<ITypeSymbol>(); } var memberSymbol = GetDeclaredMemberSymbolFromOriginalSemanticModel(this.semanticModel, yieldStatement.GetAncestorOrThis<MemberDeclarationSyntax>()); var memberType = memberSymbol.TypeSwitch( (IMethodSymbol method) => method.ReturnType, (IPropertySymbol property) => property.Type); if (memberType is INamedTypeSymbol) { if (memberType.OriginalDefinition.SpecialType == SpecialType.System_Collections_Generic_IEnumerable_T || memberType.OriginalDefinition.SpecialType == SpecialType.System_Collections_Generic_IEnumerator_T) { return SpecializedCollections.SingletonEnumerable(((INamedTypeSymbol)memberType).TypeArguments[0]); } } return SpecializedCollections.EmptyEnumerable<ITypeSymbol>(); }