Пример #1
0
        public void 方法_T6_泛型参数()
        {
            MethodBuilder builder = CodeSyntax.CreateMethod("Test")
                                    .WithAccess(MemberAccess.Public)
                                    .WithReturnType("T1")
                                    .WithGeneric(builder =>
            {
                builder.WithTransformParam("T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11")
                .WithTransformConstraint(@"
        where T1 : struct
        where T2 : class
        where T3 : notnull
        where T4 : unmanaged
        where T5 : new()
        where T6 : IEnumerable<Dictionary<int, int>>
        where T7 : IEnumerable<int>
        where T8 : T2");
            })
                                    .WithParams("T1 t1, T2 t2, T3 t3")
                                    .WithBlock("return t1;");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal(@"public T1 Test<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(T1 t1, T2 t2, T3 t3)
    where T1 : struct where T2 : class where T3 : notnull where T4 : unmanaged where T5 : new()
    where T6 : IEnumerable<Dictionary<int, int>> where T7 : IEnumerable<int> where T8 : T2
{
    return t1;
}", result);
        }
Пример #2
0
        public void 定义字段_T1_简单型()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int");

            var result = builder.ToFormatCode();
        }
        public void 设置名字()
        {
            const string constCode = @"namespace MySpace
{
}";

            string name    = "MySpace";
            var    builder = CodeSyntax.CreateNamespace(name);

            var code = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(code);
#endif
            Assert.Equal(constCode, code.WithUnixEOL());



            builder = CodeSyntax.CreateNamespace(name);
            code    = builder.ToFormatCode();
#if Log
            _tempOutput.WriteLine(code);
#endif
            Assert.Equal(constCode, code.WithUnixEOL());
        }
Пример #4
0
        public void 添加命名空间()
        {
            const string constCode = @"
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Security.Cryptography;
using System.Threading;

namespace MySpace
{
}";

            var builder = CodeSyntax.CreateNamespace("MySpace");

            builder
            .WithUsing("System")
            .WithUsing(
                "System.Collections.Generic",
                "System.ComponentModel",
                "System.Linq",
                "System.Security.Cryptography",
                "System.Threading");

            var code = builder.ToFullCode();

#if Log
            _tempOutput.WriteLine(code);
#endif
            Assert.Equal(constCode, code);
        }
        /// <summary>
        /// 字符串生成特性
        /// </summary>
        /// <param name="attrCode"></param>
        /// <returns></returns>
        /// <example>
        /// <code>
        /// "[Display(Name = \"a\")]"
        /// </code>
        /// </example>
        public static AttributeListSyntax CreateAttributeList(string attrCode)
        {
            var result = CodeSyntax.CreateAttribute(attrCode);

            return(SyntaxFactory.AttributeList(
                       SyntaxFactory.SingletonSeparatedList <AttributeSyntax>(result.BuildSyntax())));
        }
Пример #6
0
        public void 属性_T2()
        {
            PropertyBuilder builder = CodeSyntax.CreateProperty("i");
            var             field   = builder
                                      .WithAccess(MemberAccess.ProtectedInternal)
                                      .WithKeyword(PropertyKeyword.Static)
                                      .WithType("int")
                                      .WithName("i")
                                      .WithGetSet("get{return tmp+1;}", "set{tmp+=1;}")
                                      .WithInit("int.Parse(\"1\")");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif


            Assert.Equal(@"protected internal static int i
{
    get
    {
        return tmp + 1;
    }

    set
    {
        tmp += 1;
    }
} = int.Parse(""1"");", result.WithUnixEOL());
        }
Пример #7
0
        /// <summary>
        /// 读取if(){}else if(){}else{}语句。
        /// </summary>
        private void ReadIf(CodeReader reader, Syntax syntax)
        {
            var current = new IfSyntax();

            current.Name       = "@if";
            current.Parameters = reader.ReadParameters();
            ParseChildren(reader, current);
            //读取elseif语句
            while (reader.IsNextNonWhiteSpace("elseif", stringComparison: StringComparison.OrdinalIgnoreCase))
            {
                var elseif = new IfSyntax();
                elseif.Name       = "elseif";
                elseif.Parameters = reader.ReadParameters();
                ParseChildren(reader, elseif);
                if (current.ElseIf == null)
                {
                    current.ElseIf = new List <IfSyntax>();
                }
                current.ElseIf.Add(elseif);
            }
            //读取elseif语句
            if (reader.IsNextNonWhiteSpace("else",
                                           stringComparison: StringComparison.OrdinalIgnoreCase))
            {
                var @else = new CodeSyntax();
                @else.Name = "else";
                ParseChildren(reader, @else);
                current.Else = @else;
            }
            syntax.Append(current);
        }
Пример #8
0
        public void 定义字段_T3_表达式初始化值()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int")
                                   .WithInit("int.Parse(\"1\")");

            var result = builder.ToFormatCode();
        }
Пример #9
0
        public void 定义字段_T2_常量初始化值()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int")
                                   .WithInit("0");

            var result = builder.ToFormatCode();
        }
Пример #10
0
        public void 定义字段_T8_特性注解()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithAttributes(new string[] { @"[Display(Name = ""a"")]", @"[Key]" })
                                   .WithAccess(MemberAccess.Public)
                                   .WithType("int");

            var result = builder.ToFormatCode();
        }
Пример #11
0
        public void 定义字段_T6_超长的泛型()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>")
                                   .WithName("i")
                                   .WithInit("new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>()");

            var result = builder.ToFormatCode();
        }
Пример #12
0
        public void 定义字段_T5_修饰符()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithAccess(MemberAccess.ProtectedInternal)
                                   .WithKeyword(FieldKeyword.Static)
                                   .WithType("int");

            var result = builder.ToFormatCode();
        }
Пример #13
0
        public void 定义字段_T4_访问修饰符()
        {
            var field1 = CodeSyntax.CreateField("i")
                         .WithAccess(MemberAccess.Public)
                         .WithType("int")
                         .WithName("i");

            var result = field1.ToFormatCode();
        }
        public string[] Start()
        {
            // 编译选项
            // 编译选项可以不配置
            DomainOptionBuilder option = new DomainOptionBuilder()
                                         .WithPlatform(Platform.AnyCpu)                   // 生成可移植程序集
                                         .WithDebug(false)                                // 使用 Release 编译
                                         .WithKind(OutputKind.DynamicallyLinkedLibrary)   // 生成动态库
                                         .WithLanguageVersion(LanguageVersion.CSharp7_3); // 使用 C# 7.3

            string             dllName = "N" + Guid.NewGuid().ToString() + ".dll";
            CompilationBuilder builder = CodeSyntax.CreateCompilation(dllName)
                                         .WithPath(Directory.GetParent(typeof(Program).Assembly.Location).FullName)
                                         .WithOption(option)       // 可以省略
                                         .WithAutoAssembly()       // 自动添加程序集引用
                                         .WithNamespace(NamespaceBuilder.FromCode(Code));


            try
            {
                if (builder.CreateDomain(out var messages))
                {
                    Messages.Add("编译成功!开始执行程序集进行验证!");
                    var    assembly = Assembly.LoadFile(Directory.GetParent(typeof(Program).Assembly.Location).FullName + "/" + dllName);
                    var    type     = assembly.GetType("MySpace.Test");
                    var    method   = type.GetMethod("MyMethod");
                    object obj      = Activator.CreateInstance(type);
                    string result   = (string)method.Invoke(obj, null);

                    if (result.Equals("测试成功"))
                    {
                        Messages.Add("执行程序集测试成功!");
                    }
                    else
                    {
                        Messages.Add("执行程序集测试失败!");
                    }
                }
                else
                {
                    _ = messages.Execute(item =>
                    {
                        Messages.Add(@$ "ID:{item.Id}
严重程度:{item.Severity}     
位置:{item.Location.SourceSpan.Start}~{item.Location.SourceSpan.End}
消息:{item.Descriptor.Title}   {item}");
                    });
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.ToString()}");
            }
            return(Messages.ToArray());
        }
Пример #15
0
        public void 特性_T1()
        {
            AttributeBuilder builder = CodeSyntax.CreateAttribute("Key");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal("Key", result.WithUnixEOL());
        }
Пример #16
0
        public void 定义属性_T1_简单型()
        {
            PropertyBuilder builder = CodeSyntax.CreateProperty("i")
                                      .WithType("int");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"int i { get; set; }", result.WithUnixEOL());
        }
Пример #17
0
        public void 特性_T2()
        {
            AttributeBuilder builder = CodeSyntax.CreateAttribute("DisplayName")
                                       .WithCtor("666");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal("DisplayName(666)", result.WithUnixEOL());
        }
Пример #18
0
        public void 定义字段_T1_简单型()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal("int i;", result.WithUnixEOL());
        }
Пример #19
0
        public void 特性_T3()
        {
            AttributeBuilder builder = CodeSyntax.CreateAttribute("DisplayName")
                                       .WithProperty(new string[] { "Name = \"a\"" });

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"DisplayName(Name = ""a"")", result.WithUnixEOL());
        }
Пример #20
0
        public void 委托_T2_返回值()
        {
            DelegateBuilder builder = CodeSyntax.CreateDelegate("T2")
                                      .WithAccess(MemberAccess.Public)
                                      .WithReturnType("string");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal("public delegate string T2();", result);
        }
Пример #21
0
        public void 委托_T1_类中()
        {
            DelegateBuilder builder = CodeSyntax.CreateDelegate("T1")
                                      .WithAccess(NamespaceAccess.Public)
                                      .WithReturnType("void");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal("public delegate void T1();", result);
        }
Пример #22
0
        public void 定义字段_T3_表达式初始化值()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int")
                                   .WithInit("int.Parse(\"1\")");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal("int i = int.Parse(\"1\");", result.WithUnixEOL());
        }
Пример #23
0
        public void 定义字段_T2_常量初始化值()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithType("int")
                                   .WithInit("0");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal("int i = 0;", result);
        }
Пример #24
0
        public void 事件_T1()
        {
            EventBuilder builder = CodeSyntax.CreateEvent("t1")
                .WithAccess(MemberAccess.Public)
                .WithType("T")
                .WithInit("AAA");

            var result = builder.ToFormatCode();
#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal("public event T t1 = AAA;", result);
        }
Пример #25
0
        public void 定义属性_T3_表达式初始化值()
        {
            PropertyBuilder builder = CodeSyntax.CreateProperty("i")
                                      .WithType("int")
                                      .WithInit("int.Parse(\"1\")");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"int i { get; set; } = int.Parse(""1"");", result.WithUnixEOL());
        }
Пример #26
0
        public void 定义属性_T4_访问修饰符()
        {
            var field1 = CodeSyntax.CreateProperty("i")
                         .WithAccess(MemberAccess.Public)
                         .WithType("int")
                         .WithName("i");

            var result = field1.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"public int i { get; set; }", result.WithUnixEOL());
        }
Пример #27
0
        public void 定义字段_T4_访问修饰符()
        {
            var field1 = CodeSyntax.CreateField("i")
                         .WithAccess(MemberAccess.Public)
                         .WithType("int")
                         .WithName("i");

            var result = field1.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result);
#endif
            Assert.Equal("public int i;", result);
        }
Пример #28
0
        public void 定义字段_T5_修饰符()
        {
            FieldBuilder builder = CodeSyntax.CreateField("i")
                                   .WithAccess(MemberAccess.ProtectedInternal)
                                   .WithKeyword(FieldKeyword.Static)
                                   .WithType("int");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal("protected internal static int i;", result.WithUnixEOL());
        }
Пример #29
0
        public void 定义属性_T6_超长的泛型()
        {
            PropertyBuilder builder = CodeSyntax.CreateProperty("i")
                                      .WithType("List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>")
                                      .WithName("i")
                                      .WithInit("new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>()");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"List<Dictionary<int, Dictionary<string, List<FieldInfo>>>> i { get; set; } = new List<Dictionary<int, Dictionary<string, List<FieldInfo>>>>();", result.WithUnixEOL());
        }
Пример #30
0
        public void 定义属性_T5_修饰符()
        {
            PropertyBuilder builder = CodeSyntax.CreateProperty("i")
                                      .WithAccess(MemberAccess.ProtectedInternal)
                                      .WithKeyword(PropertyKeyword.Static)
                                      .WithType("int");

            var result = builder.ToFormatCode();

#if Log
            _tempOutput.WriteLine(result.WithUnixEOL());
#endif
            Assert.Equal(@"protected internal static int i { get; set; }", result.WithUnixEOL());
        }