private static ITypeSymbol GetSymbolForParentUsingTheLambda(LambdaExpressionSyntax syntax, IContext context) { var argListSyntax = syntax.Ancestors().OfType <ArgumentListSyntax>().FirstOrDefault(); if (argListSyntax != null) { var argument = syntax.Ancestors().OfType <ArgumentSyntax>().First(); var argNum = argListSyntax.ChildNodes().ToList().IndexOf(argument); if (argListSyntax.Parent is InvocationExpressionSyntax) { var symbol = (IMethodSymbol) ModelExtensions.GetSymbolInfo( context.SemanticModel, (InvocationExpressionSyntax)argListSyntax.Parent).Symbol; return(symbol.Parameters[argNum].Type); } else if (argListSyntax.Parent is ObjectCreationExpressionSyntax) { var symbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(argListSyntax.Parent).Symbol; if (symbol != null) { return(symbol.Parameters[argNum].Type); } var namedTypeSymbol = (INamedTypeSymbol) ModelExtensions.GetSymbolInfo( context.SemanticModel, ((ObjectCreationExpressionSyntax)argListSyntax.Parent).Type).Symbol; if (namedTypeSymbol.TypeKind == TypeKind.Delegate) { return(namedTypeSymbol); } throw new Exception($"Could not guess constructor for {namedTypeSymbol}."); } else { throw new NotImplementedException(); } } else { var assignment = syntax.Parent as AssignmentExpressionSyntax; if (assignment != null) { var s = context.SemanticModel.GetSymbolInfo(assignment.Left).Symbol; var propertySymbol = s as IPropertySymbol; if (propertySymbol != null) { return(propertySymbol.Type); } var fieldSymbol = s as IFieldSymbol; if (fieldSymbol != null) { return(fieldSymbol.Type); } throw new NotImplementedException(); } throw new NotImplementedException(); } }