예제 #1
0
        private static IEnumerable<SyntaxMethod> GetSyntaxMethods()
        {
            var methods = (
                from method in typeof(Syntax).GetMethods()
                where
                    !(
                        method.Name.StartsWith("Parse") ||
                        method.Name.StartsWith("Get")
                    ) &&
                    typeof(SyntaxNode).IsAssignableFrom(method.ReturnType)
                select method
            ).ToArray();

            var anonymousMethods = new List<MethodInfo>();

            foreach (var type in _anonymousMethodTypes)
            {
                var maxParameters = methods.Where(p => p.ReturnType == type).Max(p => p.GetParameters().Length);
                anonymousMethods.Add(methods.Single(p => p.ReturnType == type && p.GetParameters().Length == maxParameters));
            }

            foreach (var method in methods)
            {
                var result = new SyntaxMethod(method);

                yield return result;

                if (anonymousMethods.Contains(method))
                {
                    result = new SyntaxMethod(method);

                    result.Parameters.Insert(0, new SyntaxParameter
                    {
                        Name = "modifiers",
                        ParameterType = typeof(SyntaxTokenList),
                        IsOptional = true
                    });

                    yield return result;
                }
            }

            yield return new SyntaxMethod
            {
                Name = "AwaitExpression",
                ReturnType = GetAwaitType(),
                Parameters =
                {
                    new SyntaxParameter
                    {
                        Name = "expression",
                        ParameterType = typeof(ExpressionSyntax),
                        IsOptional = true
                    }
                }
            };
        }
예제 #2
0
        public Factory(SyntaxMethod method)
        {
            Name = method.Name;

            Parameters = new List<FactoryParameter>();

            foreach (var parameter in method.Parameters)
            {
                if (
                    parameter.ParameterType == typeof(SyntaxToken) &&
                    parameter.Name == "identifier")
                {
                    Parameters.Add(new FactoryParameter(
                        parameter.Name,
                        typeof(string),
                        typeof(string).Name,
                        false,
                        false,
                        false
                    ));
                }
                else if (
                    method.ReturnType.Name == "IdentifierNameSyntax" &&
                    parameter.Name == "name"
                )
                {
                    Parameters.Add(new FactoryParameter(
                        "identifier",
                        typeof(string),
                        typeof(string).Name,
                        false,
                        false,
                        false
                    ));
                }
                else if (
                    method.ReturnType.Name == "OperatorDeclarationSyntax" &&
                    parameter.Name == "operatorToken"
                )
                {
                    Parameters.Add(new FactoryParameter(
                        "operator",
                        typeof(SyntaxToken),
                        "Operator",
                        false,
                        false,
                        false
                    ));
                }
                else if (
                    method.ReturnType.Name == "ConversionOperatorDeclarationSyntax" &&
                    parameter.Name == "implicitOrExplicitKeyword"
                )
                {
                    Parameters.Add(new FactoryParameter(
                        "kind",
                        typeof(SyntaxToken),
                        "ImplicitOrExplicit",
                        false,
                        false,
                        false
                    ));
                }
                else if (parameter.ParameterType == typeof(AttributeTargetSpecifierSyntax))
                {
                    Parameters.Add(new FactoryParameter(
                        parameter.Name,
                        typeof(AttributeTargetSpecifierSyntax),
                        "AttributeTarget",
                        false,
                        false,
                        false
                    ));
                }
                else if (!Ignore(parameter))
                {
                    Parameters.Add(new FactoryParameter(parameter));
                }
            }
        }
예제 #3
0
        public Factory(SyntaxMethod method)
        {
            Name = method.Name;

            Parameters = new List <FactoryParameter>();

            foreach (var parameter in method.Parameters)
            {
                if (
                    parameter.ParameterType == typeof(SyntaxToken) &&
                    parameter.Name == "identifier")
                {
                    Parameters.Add(new FactoryParameter(
                                       parameter.Name,
                                       typeof(string),
                                       typeof(string).Name,
                                       false,
                                       false,
                                       false
                                       ));
                }
                else if (
                    method.ReturnType.Name == "IdentifierNameSyntax" &&
                    parameter.Name == "name"
                    )
                {
                    Parameters.Add(new FactoryParameter(
                                       "identifier",
                                       typeof(string),
                                       typeof(string).Name,
                                       false,
                                       false,
                                       false
                                       ));
                }
                else if (
                    method.ReturnType.Name == "OperatorDeclarationSyntax" &&
                    parameter.Name == "operatorToken"
                    )
                {
                    Parameters.Add(new FactoryParameter(
                                       "operator",
                                       typeof(SyntaxToken),
                                       "Operator",
                                       false,
                                       false,
                                       false
                                       ));
                }
                else if (
                    method.ReturnType.Name == "ConversionOperatorDeclarationSyntax" &&
                    parameter.Name == "implicitOrExplicitKeyword"
                    )
                {
                    Parameters.Add(new FactoryParameter(
                                       "kind",
                                       typeof(SyntaxToken),
                                       "ImplicitOrExplicit",
                                       false,
                                       false,
                                       false
                                       ));
                }
                else if (parameter.ParameterType == typeof(AttributeTargetSpecifierSyntax))
                {
                    Parameters.Add(new FactoryParameter(
                                       parameter.Name,
                                       typeof(AttributeTargetSpecifierSyntax),
                                       "AttributeTarget",
                                       false,
                                       false,
                                       false
                                       ));
                }
                else if (!Ignore(parameter))
                {
                    Parameters.Add(new FactoryParameter(parameter));
                }
            }
        }