Exemplo n.º 1
0
        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();
            }
        }