コード例 #1
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        private EnumMemberDeclarationSyntax ToEnumMemberSyntax(EnumMember member)
        {
            var syntax = SyntaxFactory.EnumMemberDeclaration(SyntaxFactory.Identifier(member.Name));

            if (member.Value != null)
            {
                syntax = syntax.WithEqualsValue(SyntaxFactory.EqualsValueClause(SyntaxHelpers.GetLiteralSyntax(member.Value)));
            }

            return(syntax);
        }
コード例 #2
0
        public static AttributeSyntax EmitSyntax(AttributeDescription description)
        {
            var syntax = SyntaxFactory.Attribute(SyntaxHelpers.GetTypeFullNameSyntax(description.AttributeType, stripSuffix: "Attribute"));

            if (description.ConstructorArguments.Count > 0 || description.PropertyValues.Count > 0)
            {
                syntax = syntax
                         .WithArgumentList(
                    SyntaxFactory.AttributeArgumentList(
                        SyntaxFactory.SeparatedList <AttributeArgumentSyntax>(
                            description.ConstructorArguments.Select(arg =>
                                                                    SyntaxFactory.AttributeArgument(SyntaxHelpers.GetLiteralSyntax(arg)))
                            .Concat(description.PropertyValues.Select(pv =>
                                                                      SyntaxFactory.AttributeArgument(ExpressionSyntaxEmitter.EmitSyntax(pv.Value))
                                                                      .WithNameEquals(SyntaxFactory.NameEquals(SyntaxFactory.IdentifierName(pv.Name)))
                                                                      ))
                            )
                        )
                    );
            }

            return(syntax);
        }
コード例 #3
0
        //-----------------------------------------------------------------------------------------------------------------------------------------------------

        protected BaseTypeSyntax ToBaseTypeSyntax(TypeMember baseTypeMember)
        {
            return(SyntaxFactory.SimpleBaseType(SyntaxHelpers.GetTypeFullNameSyntax(baseTypeMember)));
        }
コード例 #4
0
        public static ExpressionSyntax EmitSyntax(AbstractExpression expression)
        {
            switch (expression)
            {
            case null:
                throw new ArgumentNullException(nameof(expression));

            case ConstantExpression constant:
                return(SyntaxHelpers.GetLiteralSyntax(constant.Value));

            case LocalVariableExpression local:
                return(SyntaxFactory.IdentifierName(local.Variable.Name));

            case MethodCallExpression call:
                return(EmitMethodCallSyntax(call));

            case NewObjectExpression newObject:
                return(EmitNewObjectSyntax(newObject));

            case ThisExpression @this:
                return(SyntaxFactory.ThisExpression());

            case BaseExpression @base:
                return(SyntaxFactory.BaseExpression());

            case ParameterExpression argument:
                return(SyntaxFactory.IdentifierName(argument.Parameter.Name));

            case AssignmentExpression assignment:
                return(SyntaxFactory.AssignmentExpression(
                           SyntaxKind.SimpleAssignmentExpression,
                           EmitSyntax(assignment.Left.AsExpression()),
                           EmitSyntax(assignment.Right)));

            case MemberExpression member:
                var identifierSyntax = SyntaxFactory.IdentifierName(member.Member?.Name ?? member.MemberName);

                if (member.Target is ThisExpression)
                {
                    return(identifierSyntax);
                }

                return(SyntaxFactory.MemberAccessExpression(
                           SyntaxKind.SimpleMemberAccessExpression,
                           EmitSyntax(member.Target),
                           identifierSyntax));

            case NewArrayExpression newArray:
                return(EmitNewArraySyntax(newArray));

            case IndexerExpression indexer:
                return(SyntaxFactory.ElementAccessExpression(EmitSyntax(indexer.Target)).WithArgumentList(
                           SyntaxFactory.BracketedArgumentList(
                               SyntaxFactory.SeparatedList <ArgumentSyntax>(
                                   indexer.IndexArguments.Select(arg => SyntaxFactory.Argument(EmitSyntax(arg)))))));

            case BinaryExpression binary:
                return(SyntaxFactory.BinaryExpression(GetBinaryOperatorKeyword(binary.Operator), EmitSyntax(binary.Left), EmitSyntax(binary.Right)));

            case UnaryExpression unary:
                return(EmitUnaryExpression(unary));

            case AwaitExpression @await:
                return(SyntaxFactory.AwaitExpression(EmitSyntax(@await.Expression)));

            //TODO: support other types of expressions

            default:
                throw new NotSupportedException($"Syntax emitter is not supported for expression node of type '{expression.GetType().Name}'.");
            }
        }