コード例 #1
0
ファイル: SyntaxUtil.cs プロジェクト: Svengali/SharpLibs
    /*
     * public static T Or<T>(this Option<T> thisOption, T or)
     * {
     *      T v;
     *
     *      thisOption.
     *
     *      return v;
     * }
     */


    public static FieldDeclarationSyntax Field(string fieldName, string type, Optional <ExpressionSyntax> assignment, params SyntaxKind[] modifiers)
    {
        //var st = SF.ParseStatement( $"static public readonly {m_class.Identifier} def = new {m_class.Identifier};" );
        //var newClass = SF.ParseExpression( $"new {m_class.Identifier}()" );

        var declarator = SF.VariableDeclarator(fieldName);

        if (assignment.HasValue)
        {
            declarator = declarator.WithInitializer(SF.EqualsValueClause(assignment.Value));
        }


        var decl = SF.VariableDeclaration(SF.IdentifierName(type), SF.SingletonSeparatedList(declarator));

        var field = SF.FieldDeclaration(decl);

        if (modifiers.Length > 0)
        {
            var stl = new SyntaxTokenList(modifiers.Select(mod => SF.Token(mod)));

            field = field.WithModifiers(stl);
        }

        return(field);
    }
コード例 #2
0
        private ClassDeclarationSyntax GetClassForLocatorInInfo(WebLocatorInfo locatorInfo)
        {
            var infoMembers     = new List <MemberDeclarationSyntax>();
            var infoMembersList = new List <(string type, string fName, string value)>
            {
                (nameof(WebLocatorType), nameof(locatorInfo.LocatorType), $"{nameof(WebLocatorType)}.{locatorInfo.LocatorType}"),
                ("string", nameof(locatorInfo.LocatorValue), locatorInfo.LocatorValue),
                ("bool", nameof(locatorInfo.IsRelative), $"{locatorInfo.IsRelative}"),
            };

            foreach (var infoMemberItem in infoMembersList)
            {
                var docComment = GetDocCommentWithText(infoMemberItem.value);

                var fd = SF.FieldDeclaration(
                    SF.VariableDeclaration(SF.ParseTypeName(infoMemberItem.type))
                    .AddVariables(SF.VariableDeclarator(SF.Identifier(infoMemberItem.fName))
                                  )
                    )
                         .AddModifiers(
                    SF.Token(SF.TriviaList(), SyntaxKind.PublicKeyword, SF.TriviaList())
                    .WithLeadingTrivia(SF.Trivia(docComment))
                    );
                infoMembers.Add(fd);
            }

            var infoCD = SF.ClassDeclaration(LocatorClassName)
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                         .AddMembers(infoMembers.ToArray());

            return(infoCD);
        }
 private static FieldDeclarationSyntax CreateFileSystemPropertyDeclaration()
 {
     return(SF.FieldDeclaration(SF.VariableDeclaration(CreateFileSystemType())
                                .WithVariables(SF.SingletonSeparatedList(SF.VariableDeclarator(SF.Identifier("_fileSystem")))))
            .WithModifiers(SF.TokenList(SF.Token(SyntaxKind.PrivateKeyword),
                                        SF.Token(SyntaxKind.ReadOnlyKeyword))));
 }
コード例 #4
0
        private ClassDeclarationSyntax GetClassForConstLocatorInInfo(WebLocatorInfo locatorInfo)
        {
            var infoMembers     = new List <MemberDeclarationSyntax>();
            var infoMembersList = new List <(string type, string fName, ExpressionSyntax expr)>
            {
                (nameof(WebLocatorType), nameof(locatorInfo.LocatorType), GetESForValue(locatorInfo.LocatorType)),
                ("string", nameof(locatorInfo.LocatorValue), GetESForValue(locatorInfo.LocatorValue)),
                ("bool", nameof(locatorInfo.IsRelative), GetESForValue(locatorInfo.IsRelative))
            };

            foreach (var infoMemberItem in infoMembersList)
            {
                var fd = SF.FieldDeclaration(
                    SF.VariableDeclaration(SF.ParseTypeName(infoMemberItem.type))
                    .AddVariables(SF.VariableDeclarator(SF.Identifier(infoMemberItem.fName))
                                  .WithInitializer(SF.EqualsValueClause(infoMemberItem.expr))
                                  )
                    )
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword), SF.Token(SyntaxKind.ConstKeyword));
                infoMembers.Add(fd);
            }



            var infoCD = SF.ClassDeclaration(LocatorStaticClassName)
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword), SF.Token(SyntaxKind.StaticKeyword))
                         .AddMembers(infoMembers.ToArray());

            return(infoCD);
        }
コード例 #5
0
        public ClassDeclarationSyntax GenerateHelper()
        {
            if (!HasImports)
            {
                return(null);
            }

            var xAttributeList = SyntaxFactory.FieldDeclaration(
                SyntaxFactory.List <AttributeListSyntax>(),
                SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.PrivateKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                CommonConversions.CreateVariableDeclarationAndAssignment(
                    "namespaceAttributes", SyntaxFactory.InitializerExpression(
                        CSSyntaxKind.ArrayInitializerExpression,
                        SyntaxFactory.SeparatedList <ExpressionSyntax>(
                            from x in _xNamespaceFields
                            let fieldIdentifierName = SyntaxFactory.IdentifierName(x.Declaration.Variables.Single().Identifier)
                                                      let namespaceNameExpression = SyntaxFactory.MemberAccessExpression(CSSyntaxKind.SimpleMemberAccessExpression, fieldIdentifierName, SyntaxFactory.IdentifierName("NamespaceName"))
                                                                                    let attributeNameExpression = fieldIdentifierName.IsEquivalentTo(DefaultIdentifierName) ? CommonConversions.Literal("xmlns") : BuildXmlnsAttributeName(fieldIdentifierName)
                                                                                                                  let arguments = SyntaxFactory.Argument(attributeNameExpression).Yield().Concat(SyntaxFactory.Argument(namespaceNameExpression))
                                                                                                                                  select SyntaxFactory.ObjectCreationExpression(SyntaxFactory.IdentifierName("XAttribute")).WithArgumentList(SyntaxFactory.ArgumentList(SyntaxFactory.SeparatedList(arguments))))),
                    SyntaxFactory.ArrayType(SyntaxFactory.IdentifierName("XAttribute"), SyntaxFactory.SingletonList(SyntaxFactory.ArrayRankSpecifier(SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(SyntaxFactory.OmittedArraySizeExpression()))))));


            var boilerplate = SyntaxFactory.ParseStatement(@"
                TContainer Apply<TContainer>(TContainer x) where TContainer : XContainer
                {
                    foreach (var d in x.Descendants()) {
                        foreach (var n in namespaceAttributes) {
                            var a = d.Attribute(n.Name);
                            if (a != null && a.Value == n.Value) {
                                a.Remove();
                            }
                        }
                    }
                    x.Add(namespaceAttributes);
                    return x;
                }") as LocalFunctionStatementSyntax;

            var applyMethod = SyntaxFactory.MethodDeclaration(
                SyntaxFactory.List <AttributeListSyntax>(),
                SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.InternalKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                boilerplate.ReturnType,
                null,
                boilerplate.Identifier,
                boilerplate.TypeParameterList,
                boilerplate.ParameterList,
                boilerplate.ConstraintClauses,
                boilerplate.Body,
                boilerplate.ExpressionBody);

            return(SyntaxFactory.ClassDeclaration(
                       SyntaxFactory.List <AttributeListSyntax>(),
                       SyntaxFactory.TokenList(SyntaxFactory.Token(CSSyntaxKind.InternalKeyword), SyntaxFactory.Token(CSSyntaxKind.StaticKeyword)),
                       HelperClassUniqueIdentifierName.Identifier,
                       null, null,
                       SyntaxFactory.List <TypeParameterConstraintClauseSyntax>(),
                       SyntaxFactory.List(_xNamespaceFields.Concat <MemberDeclarationSyntax>(xAttributeList).Concat(applyMethod))
                       ));
        }
コード例 #6
0
 private MemberDeclarationSyntax TypedMockProviderField()
 {
     return(F.FieldDeclaration(F.VariableDeclaration(TypesForSymbols.TypedMockProvider()).WithVariables(
                                   F.SingletonSeparatedList(F.VariableDeclarator(F.Identifier(MockProviderName))
                                                            .WithInitializer(F.EqualsValueClause(F.ObjectCreationExpression(TypesForSymbols.TypedMockProvider())
                                                                                                 .WithArgumentList(F.ArgumentList())))))
                               ).WithModifiers(F.TokenList(F.Token(SyntaxKind.PrivateKeyword), F.Token(SyntaxKind.ReadOnlyKeyword))));
 }
コード例 #7
0
        /// <summary>
        /// Returns syntax for the static fields of the serializer class.
        /// </summary>
        /// <param name="fields">The fields.</param>
        /// <returns>Syntax for the static fields of the serializer class.</returns>
        private static MemberDeclarationSyntax[] GenerateFields(List <FieldInfoMember> fields)
        {
            var result = new List <MemberDeclarationSyntax>();

            // Add each field and initialize it.
            foreach (var field in fields)
            {
                // Declare the getter for this field.
                if (!field.IsGettableProperty)
                {
                    var getterType =
                        typeof(Func <,>).MakeGenericType(field.FieldInfo.DeclaringType, field.FieldInfo.FieldType)
                        .GetTypeSyntax();
                    var fieldGetterVariable = SF.VariableDeclarator(field.GetterFieldName);

                    result.Add(
                        SF.FieldDeclaration(SF.VariableDeclaration(getterType).AddVariables(fieldGetterVariable))
                        .AddModifiers(
                            SF.Token(SyntaxKind.PrivateKeyword),
                            SF.Token(SyntaxKind.ReadOnlyKeyword)));
                }

                if (!field.IsSettableProperty)
                {
                    if (field.FieldInfo.DeclaringType != null && field.FieldInfo.DeclaringType.GetTypeInfo().IsValueType)
                    {
                        var setterType =
                            typeof(ValueTypeSetter <,>).MakeGenericType(
                                field.FieldInfo.DeclaringType,
                                field.FieldInfo.FieldType).GetTypeSyntax();

                        var fieldSetterVariable = SF.VariableDeclarator(field.SetterFieldName);

                        result.Add(
                            SF.FieldDeclaration(SF.VariableDeclaration(setterType).AddVariables(fieldSetterVariable))
                            .AddModifiers(
                                SF.Token(SyntaxKind.PrivateKeyword),
                                SF.Token(SyntaxKind.ReadOnlyKeyword)));
                    }
                    else
                    {
                        var setterType =
                            typeof(Action <,>).MakeGenericType(field.FieldInfo.DeclaringType, field.FieldInfo.FieldType)
                            .GetTypeSyntax();

                        var fieldSetterVariable = SF.VariableDeclarator(field.SetterFieldName);

                        result.Add(
                            SF.FieldDeclaration(SF.VariableDeclaration(setterType).AddVariables(fieldSetterVariable))
                            .AddModifiers(
                                SF.Token(SyntaxKind.PrivateKeyword),
                                SF.Token(SyntaxKind.ReadOnlyKeyword)));
                    }
                }
            }

            return(result.ToArray());
        }
コード例 #8
0
ファイル: Member.cs プロジェクト: Dana-Ferguson/DotDart
        public FieldDeclarationSyntax ToFieldDeclaration()
        {
            if (canonicalName.value != name.name.value)
            {
                Console.WriteLine($"Warning!!! '{canonicalName.value}' != '{name.name.value}';");
            }

            if (annotations.Count != 0)
            {
                Console.WriteLine($"Warning!!! Annotations!;");
            }

            var declaratorSyntax = SF.VariableDeclarator(SF.Identifier(name.name.value));

            if (initializer.TryGetValue(out var initializerExpression))
            {
                declaratorSyntax = declaratorSyntax.WithInitializer(
                    // todo: I think this might not work ... a lot!
                    SF.EqualsValueClause(initializerExpression.ToLiteralExpressionSyntax()));
            }

            var fieldDeclaration = SF.FieldDeclaration(
                SF.VariableDeclaration(type.ToTypeSyntax())
                .WithVariables(SF.SingletonSeparatedList <VariableDeclaratorSyntax>(declaratorSyntax)));

            if (flags.HasFlag(Flag.isConst))
            {
                fieldDeclaration = fieldDeclaration.WithModifiers(SF.TokenList(SF.Token(SyntaxKind.ConstKeyword)));
            }
            if (flags.HasFlag(Flag.isFinal))
            {
                fieldDeclaration = fieldDeclaration.WithModifiers(SF.TokenList(SF.Token(SyntaxKind.ReadOnlyKeyword)));
            }
            if (flags.HasFlag(Flag.isStatic))
            {
                fieldDeclaration = fieldDeclaration.WithModifiers(SF.TokenList(SF.Token(SyntaxKind.StaticKeyword)));
            }

            if (flags.HasFlag(Flag.isCovariant))
            {
                throw new NotImplementedException();
            }
            if (flags.HasFlag(Flag.isGenericCovariantImpl))
            {
                throw new NotImplementedException();
            }
            if (flags.HasFlag(Flag.hasImplicitSetter))
            {
                throw new NotImplementedException();
            }
            if (flags.HasFlag(Flag.hasImplicitGetter))
            {
                throw new NotImplementedException();
            }

            return(fieldDeclaration);
        }
コード例 #9
0
ファイル: CompilerClass.cs プロジェクト: tuyndv/DynamicCSharp
        private SyntaxTree CreateSyntaxTree()
        {
            var compilationUnit = SF
                                  .CompilationUnit()
                                  .AddUsings
                                  (
                SF.UsingDirective
                    (SF.ParseName("System"))
                                  );

            var ns = SF
                     .NamespaceDeclaration(SF.IdentifierName("SynTreeFred"));

            var cls = SF
                      .ClassDeclaration("Henry")
                      .AddModifiers(SF.Token(SyntaxKind.PublicKeyword));

            // How to define base class and interfaces, with/without generics
            //
            //cls = cls.AddBaseListTypes(
            //    SF.SimpleBaseType(SF.ParseTypeName("Object")),
            //    SF.SimpleBaseType(SF.ParseTypeName("IEnumerable<string>")));

            var inti = SF
                       .VariableDeclaration(SF.ParseTypeName("int"))
                       .AddVariables
                       (
                SF.VariableDeclarator
                (
                    SF.Identifier("i"),
                    null,
                    SF.EqualsValueClause
                    (
                        SF.LiteralExpression
                        (
                            SyntaxKind.NumericLiteralExpression,
                            SF.Literal(12)
                        )
                    )
                )
                       );

            var field = SF.FieldDeclaration(inti)
                        .AddModifiers(SF.Token(SyntaxKind.PrivateKeyword));

            var syntax            = SF.ParseStatement("return ++i;");
            var methodDeclaration = SF
                                    .MethodDeclaration(SF.ParseTypeName("int"), "GetNextInt")
                                    .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                                    .WithBody(SF.Block(syntax));

            cls             = cls.AddMembers(field, methodDeclaration);
            ns              = ns.AddMembers(cls);
            compilationUnit = compilationUnit.AddMembers(ns);
            return(compilationUnit.SyntaxTree);
        }
コード例 #10
0
        public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
        {
            FieldDeclarationSyntax aField = SF.FieldDeclaration(
                SF.VariableDeclaration(
                    SF.ParseTypeName(" string "),
                    SF.SeparatedList(new[] { SF.VariableDeclarator(SF.Identifier("bopin=\"Hi bopin\"")) })
                    ))
                                            .AddModifiers(SF.Token(SyntaxKind.StaticKeyword)); //SyntaxKind.PublicKeyword),

            node = node.AddMembers(aField);
            return(base.VisitClassDeclaration(node));
        }
コード例 #11
0
 private static ClassDeclarationSyntax AddStubContainerField(ClassDeclarationSyntax classDclr, string stubName)
 {
     classDclr = classDclr.AddMembers(
         SF.FieldDeclaration(
             SF.VariableDeclaration(SF.ParseTypeName($"StubContainer<{stubName}>"),
                                    SF.SeparatedList(new[]
     {
         SF.VariableDeclarator(SF.Identifier("_stubs"), null,
                               SF.EqualsValueClause(SF.ParseExpression($"new StubContainer<{stubName}>()")))
     })))
         .AddModifiers(SF.Token(SyntaxKind.PrivateKeyword), SF.Token(SyntaxKind.ReadOnlyKeyword)));
     return(classDclr);
 }
コード例 #12
0
        private ClassDeclarationSyntax GetClassForInfo(WebElementInfo info)
        {
            var infoMembers     = new List <MemberDeclarationSyntax>();
            var infoMembersList = new List <(string type, string fName, string value)>
            {
                ("string", nameof(info.ElementType), info.ElementType),
                ("string", nameof(info.Name), info.Name),
                ("string", nameof(info.Description), info.Description),
                ("bool", nameof(info.IsKey), $"{info.IsKey}"),
                ("string", nameof(info.InnerKey), $"{info.InnerKey ?? "null"}"),
                (LocatorClassName, LocatorClassName, "Element Locator values")
            };


            var newLineToken = SF.Token(default(SyntaxTriviaList),
                                        SyntaxKind.XmlTextLiteralNewLineToken,
                                        Environment.NewLine, Environment.NewLine, default(SyntaxTriviaList));

            var docCommentToken = SF.Token(SF.TriviaList(
                                               SF.SyntaxTrivia(SyntaxKind.DocumentationCommentExteriorTrivia, "///")),
                                           SyntaxKind.XmlTextLiteralToken, " ", " ", default(SyntaxTriviaList));

            var endNode = SF.XmlText(
                SF.TokenList(SF.Token(default(SyntaxTriviaList), SyntaxKind.XmlTextLiteralNewLineToken,
                                      Environment.NewLine, Environment.NewLine, default(SyntaxTriviaList))));


            foreach (var infoMemberItem in infoMembersList)
            {
                var docComment = GetDocCommentWithText(infoMemberItem.value);

                var fd = SF.FieldDeclaration(
                    SF.VariableDeclaration(SF.ParseTypeName(infoMemberItem.type))
                    .AddVariables(SF.VariableDeclarator(SF.Identifier(infoMemberItem.fName)))
                    )
                         .AddModifiers(
                    SF.Token(SF.TriviaList(), SyntaxKind.PublicKeyword, SF.TriviaList())
                    .WithLeadingTrivia(SF.Trivia(docComment))
                    );

                infoMembers.Add(fd);
            }

            var infoCD = SF.ClassDeclaration(InfoClassName)
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                         .AddMembers(infoMembers.ToArray());

            return(infoCD);
        }
コード例 #13
0
        public static string GenerateClass()
        {
            var @consoleWriteLine = Syntax.MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                                                  Syntax.IdentifierName("Console"),
                                                                  name: Syntax.IdentifierName("WriteLine"));


            var @arguments = Syntax.ArgumentList(Syntax.SeparatedList(new[] {
                Syntax.Argument(
                    Syntax.LiteralExpression(
                        SyntaxKind.StringLiteralExpression,
                        Syntax.Literal(@"$""{this.Name} -> {this.counter}""", "${this.Name} -> {this.counter}")))
            }));

            var @consoleWriteLineStatement = Syntax.ExpressionStatement(Syntax.InvocationExpression(@consoleWriteLine, @arguments));

            var @voidType   = Syntax.ParseTypeName("void");
            var @stringType = Syntax.ParseTypeName("string");

            var @field    = Syntax.FieldDeclaration(Syntax.VariableDeclaration(Syntax.ParseTypeName("int"), Syntax.SeparatedList(new[] { Syntax.VariableDeclarator(Syntax.Identifier("counter")) }))).AddModifiers(Syntax.Token(SyntaxKind.PrivateKeyword)).WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken));
            var @property = Syntax.PropertyDeclaration(stringType, "Name").AddAccessorListAccessors(Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                                                                                                    .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)
                                                                                                                        )).AddModifiers(Syntax.Token(SyntaxKind.PublicKeyword));

            @property = @property.AddAccessorListAccessors(Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)));

            var @printMethod = Syntax.MethodDeclaration(voidType, "Print").AddModifiers(Syntax.Token(SyntaxKind.PublicKeyword)).WithBody(Syntax.Block(consoleWriteLineStatement));



            List <ParameterSyntax> @parameterList = new List <ParameterSyntax>
            {
                Syntax.Parameter(Syntax.Identifier("x")).WithType(Syntax.ParseTypeName("int"))
            };
            var @methodBody      = Syntax.ParseStatement("counter += x;");
            var @incrementMethod = Syntax.MethodDeclaration(voidType, "Increment").AddModifiers(Syntax.Token(SyntaxKind.PublicKeyword)).WithBody(Syntax.Block(methodBody)).AddParameterListParameters(parameterList.ToArray());


            var @class = Syntax.ClassDeclaration("MyClass").WithMembers(Syntax.List(new MemberDeclarationSyntax[] { @property, @field, @incrementMethod, @printMethod })).AddModifiers(Syntax.Token(SyntaxKind.PublicKeyword)).AddModifiers(Syntax.Token(SyntaxKind.SealedKeyword));

            var adhocWorkSpace = new AdhocWorkspace();

            adhocWorkSpace.Options.WithChangedOption(CSharpFormattingOptions.IndentBraces, true);
            var formattedCode = Formatter.Format(@class, adhocWorkSpace);

            return(formattedCode.ToFullString());
        }
コード例 #14
0
    public static void Generate()
    {
        // Make a namespace
        var nspaceDecl = SF.NamespaceDeclaration(SF.ParseName("ExampleNamespace"));

        // Make a class
        var classDecl = SF.ClassDeclaration("Order");

        // Class inherits base type and implements interface
        classDecl = classDecl.AddBaseListTypes(
            SF.SimpleBaseType(SF.ParseTypeName("BaseEntity<Order>")),
            SF.SimpleBaseType(SF.ParseTypeName("IHaveIdentity"))
            );

        var varDecl = SF.VariableDeclaration(SF.ParseTypeName("bool")).AddVariables(SF.VariableDeclarator("canceled"));

        var fieldDecl = SF.FieldDeclaration(varDecl).AddModifiers(SF.Token(SyntaxKind.PrivateKeyword));

        var propDecl = SF.PropertyDeclaration(SF.ParseTypeName("int"), "Quantity")
                       .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                       .AddAccessorListAccessors(
            SF.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken)),
            SF.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SF.Token(SyntaxKind.SemicolonToken))
            );

        var methodBody = SF.ParseStatement("canceled = true");

        var methodDecl = SF.MethodDeclaration(SF.ParseTypeName("void"), "MarkAsCanceled")
                         .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                         .WithBody(SF.Block(methodBody));

        classDecl = classDecl.AddMembers(
            fieldDecl,
            propDecl,
            methodDecl);

        nspaceDecl = nspaceDecl.AddMembers(classDecl);

        var code = nspaceDecl.NormalizeWhitespace().ToFullString();

        Console.WriteLine(code);
    }
コード例 #15
0
        private static MemberDeclarationSyntax[] GetFieldInfoFields(List <FieldInfoMember> fields)
        {
            var result = new List <MemberDeclarationSyntax>();

            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Expression <Action <Type> > getField = _ => _.GetField(string.Empty, BindingFlags.Default);

            // Expressions for specifying binding flags.
            var flags         = SF.IdentifierName("System").Member("Reflection").Member("BindingFlags");
            var publicFlag    = flags.Member(BindingFlags.Public.ToString());
            var nonPublicFlag = flags.Member(BindingFlags.NonPublic.ToString());
            var instanceFlag  = flags.Member(BindingFlags.Instance.ToString());
            var bindingFlags  =
                SF.ParenthesizedExpression(
                    SF.BinaryExpression(
                        SyntaxKind.BitwiseOrExpression,
                        publicFlag,
                        SF.BinaryExpression(SyntaxKind.BitwiseOrExpression, nonPublicFlag, instanceFlag)));

            // Add each field and initialize it.
            foreach (var field in fields)
            {
                var fieldInfo =
                    getField.Invoke(SF.TypeOfExpression(field.FieldInfo.DeclaringType.GetTypeSyntax()))
                    .AddArgumentListArguments(
                        SF.Argument(field.FieldInfo.Name.GetLiteralExpression()),
                        SF.Argument(bindingFlags));
                var fieldInfoVariable =
                    SF.VariableDeclarator(field.InfoFieldName).WithInitializer(SF.EqualsValueClause(fieldInfo));
                result.Add(
                    SF.FieldDeclaration(
                        SF.VariableDeclaration(typeof(FieldInfo).GetTypeSyntax()).AddVariables(fieldInfoVariable))
                    .AddModifiers(
                        SF.Token(SyntaxKind.PrivateKeyword),
                        SF.Token(SyntaxKind.StaticKeyword),
                        SF.Token(SyntaxKind.ReadOnlyKeyword)));
            }

            return(result.ToArray());
        }
コード例 #16
0
        /// <summary>
        /// Generates a <see cref="GenericMethodInvoker"/> field for the provided generic method.
        /// </summary>
        /// <param name="method">The method.</param>
        /// <returns>The generated field.</returns>
        private static MemberDeclarationSyntax GenerateGenericInvokerField(MethodInfo method)
        {
            var fieldInfoVariable =
                SF.VariableDeclarator(GetGenericMethodInvokerFieldName(method))
                .WithInitializer(
                    SF.EqualsValueClause(
                        SF.ObjectCreationExpression(typeof(GenericMethodInvoker).GetTypeSyntax())
                        .AddArgumentListArguments(
                            SF.Argument(SF.TypeOfExpression(method.DeclaringType.GetTypeSyntax())),
                            SF.Argument(method.Name.GetLiteralExpression()),
                            SF.Argument(
                                SF.LiteralExpression(
                                    SyntaxKind.NumericLiteralExpression,
                                    SF.Literal(method.GetGenericArguments().Length))))));

            return
                (SF.FieldDeclaration(
                     SF.VariableDeclaration(typeof(GenericMethodInvoker).GetTypeSyntax()).AddVariables(fieldInfoVariable))
                 .AddModifiers(
                     SF.Token(SyntaxKind.PrivateKeyword),
                     SF.Token(SyntaxKind.StaticKeyword),
                     SF.Token(SyntaxKind.ReadOnlyKeyword)));
        }
コード例 #17
0
        private SyntaxList <MemberDeclarationSyntax> CreateDefault()
        {
            var list = new SyntaxList <MemberDeclarationSyntax>();

            //var st = SF.ParseStatement( $"static public readonly {m_class.Identifier} def = new {m_class.Identifier};" );
            var newClass = SF.ParseExpression($"new {SU.ClassNameWithGenerics(m_class)}()");

            var declarator = SF.VariableDeclarator("def")
                             .WithInitializer(SF.EqualsValueClause(newClass));

            var decl = SF.VariableDeclaration(SF.IdentifierName(SU.ClassNameWithGenerics(m_class)), SF.SingletonSeparatedList(declarator));

            var keywords = SyntaxTokenList.Create(SF.Token(SyntaxKind.PublicKeyword))
                           .Add(SF.Token(SyntaxKind.StaticKeyword))
                           .Add(SF.Token(SyntaxKind.ReadOnlyKeyword));

            var field = SF.FieldDeclaration(decl)
                        .WithModifiers(keywords);

            list = list.Add(field);

            return(list);
        }
コード例 #18
0
        /// <summary>
        /// Returns syntax for the static fields of the serializer class.
        /// </summary>
        /// <param name="fields">The fields.</param>
        /// <returns>Syntax for the static fields of the serializer class.</returns>
        private static MemberDeclarationSyntax[] GenerateStaticFields(List <FieldInfoMember> fields)
        {
            var result = new List <MemberDeclarationSyntax>();

            // ReSharper disable once ReturnValueOfPureMethodIsNotUsed
            Expression <Action <TypeInfo> > getField           = _ => _.GetField(string.Empty, BindingFlags.Default);
            Expression <Action <Type> >     getTypeInfo        = _ => _.GetTypeInfo();
            Expression <Action>             getGetter          = () => SerializationManager.GetGetter(default(FieldInfo));
            Expression <Action>             getReferenceSetter = () => SerializationManager.GetReferenceSetter(default(FieldInfo));
            Expression <Action>             getValueSetter     = () => SerializationManager.GetValueSetter(default(FieldInfo));

            // Expressions for specifying binding flags.
            var bindingFlags = SyntaxFactoryExtensions.GetBindingFlagsParenthesizedExpressionSyntax(
                SyntaxKind.BitwiseOrExpression,
                BindingFlags.Instance,
                BindingFlags.NonPublic,
                BindingFlags.Public);

            // Add each field and initialize it.
            foreach (var field in fields)
            {
                var fieldInfo =
                    getField.Invoke(getTypeInfo.Invoke(SF.TypeOfExpression(field.FieldInfo.DeclaringType.GetTypeSyntax())))
                    .AddArgumentListArguments(
                        SF.Argument(field.FieldInfo.Name.GetLiteralExpression()),
                        SF.Argument(bindingFlags));
                var fieldInfoVariable =
                    SF.VariableDeclarator(field.InfoFieldName).WithInitializer(SF.EqualsValueClause(fieldInfo));
                var fieldInfoField = SF.IdentifierName(field.InfoFieldName);

                if (!field.IsGettableProperty || !field.IsSettableProperty)
                {
                    result.Add(
                        SF.FieldDeclaration(
                            SF.VariableDeclaration(typeof(FieldInfo).GetTypeSyntax()).AddVariables(fieldInfoVariable))
                        .AddModifiers(
                            SF.Token(SyntaxKind.PrivateKeyword),
                            SF.Token(SyntaxKind.StaticKeyword),
                            SF.Token(SyntaxKind.ReadOnlyKeyword)));
                }

                // Declare the getter for this field.
                if (!field.IsGettableProperty)
                {
                    var getterType =
                        typeof(Func <,>).MakeGenericType(field.FieldInfo.DeclaringType, field.FieldInfo.FieldType)
                        .GetTypeSyntax();
                    var fieldGetterVariable =
                        SF.VariableDeclarator(field.GetterFieldName)
                        .WithInitializer(
                            SF.EqualsValueClause(
                                SF.CastExpression(
                                    getterType,
                                    getGetter.Invoke().AddArgumentListArguments(SF.Argument(fieldInfoField)))));
                    result.Add(
                        SF.FieldDeclaration(SF.VariableDeclaration(getterType).AddVariables(fieldGetterVariable))
                        .AddModifiers(
                            SF.Token(SyntaxKind.PrivateKeyword),
                            SF.Token(SyntaxKind.StaticKeyword),
                            SF.Token(SyntaxKind.ReadOnlyKeyword)));
                }

                if (!field.IsSettableProperty)
                {
                    if (field.FieldInfo.DeclaringType != null && field.FieldInfo.DeclaringType.IsValueType)
                    {
                        var setterType =
                            typeof(SerializationManager.ValueTypeSetter <,>).MakeGenericType(
                                field.FieldInfo.DeclaringType,
                                field.FieldInfo.FieldType).GetTypeSyntax();

                        var fieldSetterVariable =
                            SF.VariableDeclarator(field.SetterFieldName)
                            .WithInitializer(
                                SF.EqualsValueClause(
                                    SF.CastExpression(
                                        setterType,
                                        getValueSetter.Invoke()
                                        .AddArgumentListArguments(SF.Argument(fieldInfoField)))));
                        result.Add(
                            SF.FieldDeclaration(SF.VariableDeclaration(setterType).AddVariables(fieldSetterVariable))
                            .AddModifiers(
                                SF.Token(SyntaxKind.PrivateKeyword),
                                SF.Token(SyntaxKind.StaticKeyword),
                                SF.Token(SyntaxKind.ReadOnlyKeyword)));
                    }
                    else
                    {
                        var setterType =
                            typeof(Action <,>).MakeGenericType(field.FieldInfo.DeclaringType, field.FieldInfo.FieldType)
                            .GetTypeSyntax();

                        var fieldSetterVariable =
                            SF.VariableDeclarator(field.SetterFieldName)
                            .WithInitializer(
                                SF.EqualsValueClause(
                                    SF.CastExpression(
                                        setterType,
                                        getReferenceSetter.Invoke()
                                        .AddArgumentListArguments(SF.Argument(fieldInfoField)))));

                        result.Add(
                            SF.FieldDeclaration(SF.VariableDeclaration(setterType).AddVariables(fieldSetterVariable))
                            .AddModifiers(
                                SF.Token(SyntaxKind.PrivateKeyword),
                                SF.Token(SyntaxKind.StaticKeyword),
                                SF.Token(SyntaxKind.ReadOnlyKeyword)));
                    }
                }
            }

            return(result.ToArray());
        }
コード例 #19
0
ファイル: ControllerBuilder.cs プロジェクト: thewebwolf/MBase
        public static byte[] CreateControllerCode(IService service)
        {
            var @file      = SF.CompilationUnit();
            var @namespace = SF.NamespaceDeclaration(SF.ParseName("MBase.ServiceHost.Controllers")).NormalizeWhitespace();

            @file = @file
                    .AddUsings(SF.UsingDirective(SF.IdentifierName("System")));
            @file = @file
                    .AddUsings(SF.UsingDirective(SF.IdentifierName("Microsoft.AspNetCore.Mvc")));
            @file = @file
                    .AddUsings(SF.UsingDirective(SF.IdentifierName("System.Threading.Tasks")));

            @file = @file.AddUsings(SF.UsingDirective(SF.IdentifierName(service.GetType().Namespace)));
            @file = @file.AddUsings(SF.UsingDirective(SF.IdentifierName(service.GetType().Namespace + ".Models")));

            foreach (var item in service.Commands.Where(m => typeof(ICommand).IsAssignableFrom(m.GetType())))
            {
                @file = @file.AddUsings(SF.UsingDirective(SF.IdentifierName(item.GetType().Namespace)));
            }



            var classDeclaration = SF.ClassDeclaration(service.GetType().Name.ToString() + "Controller")
                                   .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                                   .AddBaseListTypes(SF.SimpleBaseType(SF.ParseTypeName("ControllerBase")))
                                   .WithAttributeLists(
                SF.List(
                    new AttributeListSyntax[] {
                SF.AttributeList(
                    SF.SingletonSeparatedList(
                        SF.Attribute(SF.IdentifierName("Route"))
                        .WithArgumentList(
                            SF.AttributeArgumentList(
                                SF.SingletonSeparatedList(
                                    SF.AttributeArgument(
                                        SF.LiteralExpression(SyntaxKind.StringLiteralExpression, SF.Literal($"api/[controller]")))))))),
                SF.AttributeList(
                    SF.SingletonSeparatedList(
                        SF.Attribute(SF.IdentifierName("ApiController"))))
            }));

            List <MemberDeclarationSyntax> controllerMembers = new List <MemberDeclarationSyntax>();

            controllerMembers.Add(
                SF.FieldDeclaration(
                    SF.VariableDeclaration(
                        SF.ParseTypeName(service.GetType().Name))
                    .AddVariables(SF.VariableDeclarator("_service")))
                .AddModifiers(SF.Token(SyntaxKind.PrivateKeyword)));

            controllerMembers.Add(
                SF.ConstructorDeclaration(service.GetType().Name.ToString() + "Controller")
                .WithParameterList(
                    SF.ParameterList(
                        SF.SingletonSeparatedList(
                            SF.Parameter(
                                SF.Identifier("service"))
                            .WithType(
                                SF.IdentifierName("IService")))

                        ))
                .AddModifiers(SF.Token(SyntaxKind.PublicKeyword))
                .WithBody(SF.Block(SF.ParseStatement($"this._service = ({service.GetType().Name})service;"))));

            foreach (var item in service.Commands.Where(m => typeof(ICommand).IsAssignableFrom(m.GetType())))
            {
                var syntax = @$ "

            var response = await CommandHelper.ExecuteMethod<{item.Name}>(new {item.Name}(),new Request<{item.Name}>(request, new MessageEnvelope()));
コード例 #20
0
        private static string CreateClass_NamedColor(List <ColorEntity> entities, ProgressBar progress)
        {
            // Create a namespace: (namespace UnityEngine.Utils)
            var @namespace = Syntax.NamespaceDeclaration(Syntax.ParseName("UnityEngine.Utils")).NormalizeWhitespace();

            //// Add System using statement: (using System)
            //@namespace = @namespace.AddUsings(Syntax.UsingDirective(Syntax.ParseName("System")));

            //  Create a class: (class Order)
            var classDeclaration = Syntax.ClassDeclaration("NamedColor");

            // Add the public modifier: (public class Order)
            classDeclaration = classDeclaration.AddModifiers(
                Syntax.Token(SyntaxKind.PublicKeyword),
                Syntax.Token(SyntaxKind.PartialKeyword));

            string code;

            using (var child = progress.Spawn(entities.Count, "fields added", childOptions))
            {
                // Create a string variable: (bool canceled;)
                var variableDeclarations = entities.Select((entity, index) =>
                {
                    //double prog = (double)index / entities.Count / STEPS;
                    //progress.Report(PROGRESS_STEP * lastStep + prog);

                    child.Tick();

                    string varName = entity.Name.SanitizeEnum();
                    return(Syntax.VariableDeclaration(Syntax.ParseTypeName("NamedColor"))
                           // .AddVariables(Syntax.VariableDeclarator("canceled"))
                           .WithVariables(Syntax.SingletonSeparatedList(
                                              Syntax.VariableDeclarator(
                                                  Syntax.Identifier(varName))
                                              .WithInitializer(
                                                  Syntax.EqualsValueClause(
                                                      Syntax.ParseExpression($"new NamedColor(ColorNames.{varName}, " +
                                                                             $"{entity.Hex.ToUpperInvariant().Replace("#", "0x")})")
                                                      )))));
                });

                // Create a field declaration: (private bool canceled;)
                var fieldDeclarations = variableDeclarations.Select(variableDeclaration => Syntax.FieldDeclaration(variableDeclaration)
                                                                    .AddModifiers(
                                                                        Syntax.Token(SyntaxKind.PrivateKeyword),
                                                                        Syntax.Token(SyntaxKind.StaticKeyword)));

                // Add the field, the property and method to the class.
                classDeclaration = classDeclaration.AddMembers(fieldDeclarations.ToArray());

                // Add the class to the namespace.
                @namespace = @namespace.AddMembers(classDeclaration);

                // Normalize and get code as string.
                code = @namespace
                       .NormalizeWhitespace()
                       .ToFullString();
            }

            // Output new code to the console.
            return(code);
        }
コード例 #21
0
 private static FieldDeclarationSyntax Field(string name, TypeSyntax type, params SyntaxKind[] modifiers)
 {
     return(S.FieldDeclaration(S.VariableDeclaration(type, S.SeparatedList(new[] { S.VariableDeclarator(name) })))
            .AddModifiers(modifiers.Select(S.Token).ToArray()));
 }