示例#1
0
        public void 设置名字()
        {
            const string constCode = @"
namespace MySpace
{
}";

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

            builder.WithName(name);

            var code = builder.ToFullCode();

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



            builder = new NamespaceBuilder(name);
            code    = builder.ToFormatCode();
#if Log
            _tempOutput.WriteLine(code);
#endif
            Assert.Equal(constCode, code);
        }
示例#2
0
        internal NamespaceBuilder GetNamespace(string uri)
        {
            NamespaceBuilder result = null;

            this.namespaces.TryGetValue(uri, out result);
            return(result);
        }
示例#3
0
        internal NamespaceBuilder CreateNamespace(Importer.XmlReader reader, string uri, string prefix, string qualifiedName)
        {
            if (qualifiedName == null)
            {
                qualifiedName = "Ns" + (++this.namespaceCounter);
            }
            NamespaceBuilder result = this.GetNamespace(uri);

            if (result != null)
            {
                if (result.Uri != uri)
                {
                    this.AddWarning("Namespace '" + result.FullName + "' has conflicting URIs: '" + result.FullName + "' and '" + uri + "'", reader.Uri, LinePositionSpan.Zero);
                }
                return(result);
            }
            string[]         names     = qualifiedName.Split('.');
            int              i         = 0;
            NamespaceBuilder currentNs = null;

            while (i < names.Length)
            {
                if (i == 0)
                {
                    NamespaceBuilder rootNs = this.Model.Symbols.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[0] && ns.Namespace == null);
                    currentNs = rootNs;
                }
                else
                {
                    currentNs = currentNs.Declarations.OfType <NamespaceBuilder>().FirstOrDefault(ns => ns.Name == names[i]);
                }
                if (currentNs != null)
                {
                    ++i;
                }
                else
                {
                    NamespaceBuilder parentNs = currentNs;
                    while (i < names.Length)
                    {
                        NamespaceBuilder ns = this.Factory.Namespace();
                        ns.Name      = names[i];
                        ns.Namespace = parentNs;
                        ++i;
                        if (i == names.Length)
                        {
                            ns.Prefix = prefix;
                            ns.Uri    = uri;
                            result    = ns;
                            this.namespaces.Add(uri, ns);
                        }
                        parentNs = ns;
                    }
                }
            }
            return(result);
        }
        public void ItBuildsWithAClass()
        {
            var builder = new NamespaceBuilder();

            builder.WithClass();

            var result = builder.Build();

            Assert.AreEqual(1, result.Types.Length);
        }
        public void ItBuildsWithCorrectName()
        {
            var builder = new NamespaceBuilder();

            builder.WithName("FooBar");

            var result = builder.Build();

            Assert.AreEqual("FooBar", result.Name);
        }
        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());
        }
示例#7
0
        /// <inheritdoc />
        protected override Namespace Bind(NamespaceStatementContext node, IDocument parent)
        {
            var builder = new NamespaceBuilder()
                          .SetNode(node)
                          .SetParent(parent)
                          .SetBinderProvider(this.binderProvider)
                          .SetScope(node.namespaceScope?.Text)
                          .SetNamespaceName(node.ns?.Text);

            return(builder.Build());
        }
        public void Build_WhenBuildingNamespace_CodeShouldContainMembers()
        {
            var @namespace = new NamespaceBuilder("MyNamespace")
                             .WithUsings("System")
                             .With(new EnumBuildMember("MyEnum", new List <EnumMember> {
                new EnumMember("SomeEnum", 2)
            }))
                             .With(new ClassBuildMember(new ClassBuilder("MyClass", null).BuildWithoutNamespace()))
                             .Build();

            Assert.AreEqual("usingSystem;namespaceMyNamespace{enumMyEnum{SomeEnum=2}publicclassMyClass{}}", @namespace.ToString());
        }
示例#9
0
        protected Namespace SetupNamespace(NamespaceStatementContext namespaceNode, string scope, string name, Document document)
        {
            var @namespace = new NamespaceBuilder()
                             .SetNode(namespaceNode)
                             .SetScope(scope)
                             .SetNamespaceName(name)
                             .Build();

            this.BinderProvider.GetBinder(namespaceNode).Returns(this.namespaceBinder);
            this.NamespaceBinder.Bind <Namespace>(namespaceNode, document).Returns(@namespace);

            return(@namespace);
        }
示例#10
0
        public HashSet <DocumentViewModel> BuildExport()
        {
            var attachedMembers = new AttachedMemberCache(_utilities.FindAllTypes());
            var commentParser   = new CommentParser();
            var builder         = new NamespaceBuilder(new EntityNaming(),
                                                       new SyntaxGenerator(new ExportableCheck(commentParser), new EntityNaming()),
                                                       new ExportableCheck(commentParser),
                                                       attachedMembers,
                                                       commentParser);
            var result = new HashSet <DocumentViewModel>(new DocumentViewModelEqualityComparer());

            _rootNamespace.Namespaces.ForEach(ns => builder.Build(ns, result));
            return(result);
        }
示例#11
0
        public void Given_Namespace_Generate_CSharp(
            string testName,
            List <string> @namespace,
            string expectedCode)
        {
            Debug.Write(testName);
            var codeFormatter = new CodeFormatterWorkerspace(@"../../../CSharpTools.CodeGenerator.Tests.csproj");

            var sut = new NamespaceBuilder();

            var res = codeFormatter.Format(sut.Build(@namespace));

            Assert.Equal(expectedCode, res.ToFullString());
        }
示例#12
0
        public void HasKnownScope_ScopesProvided_ReturnsCorrectValue(
            string scope, bool expected)
        {
            // Arrange
            var ns = new NamespaceBuilder()
                     .SetScope(scope)
                     .Build();

            // Act
            var canGenerate = ns.HasKnownScope;

            // Assert
            Assert.Equal(expected, canGenerate);
        }
示例#13
0
        public void AppliesToAllTargets_ScopesProvided_ReturnsCorrectValue(
            string scope, bool expected)
        {
            // Arrange
            var ns = new NamespaceBuilder()
                     .SetScope(scope)
                     .Build();

            // Act
            var canGenerate = ns.AppliesToAllTargets;

            // Assert
            Assert.Equal(expected, canGenerate);
        }
示例#14
0
        internal SoalTypeBuilder ResolveXsdType(XName name)
        {
            SoalTypeBuilder result = null;

            if (name.NamespaceName == XsdReader.XsdNamespace)
            {
                result = this.ResolveXsdPrimitiveType(name);
                if (result != null)
                {
                    return(result);
                }
            }
            NamespaceBuilder ns = this.GetNamespace(name.NamespaceName);

            if (ns != null)
            {
                SoalTypeBuilder type = ns.Declarations.FirstOrDefault(d => d.Name == name.LocalName) as SoalTypeBuilder;
                return(this.ResolveXsdReplacementType(type));
            }
            return(null);
        }
示例#15
0
 public static NamespaceBuilder Add(string name) => NamespaceBuilder.AddNamespace(name);
示例#16
0
 public override IReadOnlyList <NamedElementBuilder> Namespace_ComputeProperty_Member(NamespaceBuilder _this)
 {
     return(new List <NamedElementBuilder>());
 }
 /// <summary>
 /// <b>自动</b>添加 using 命名空间
 /// </summary>
 /// <param name="builder"></param>
 /// <returns></returns>
 public static NamespaceBuilder WithAutoUsing(this NamespaceBuilder builder)
 {
     builder.WithUsing(DependencyContext.Default.CompileLibraries.Select(x => x.Name).ToArray());
     return(builder);
 }
        public void 编译程序集()
        {
            // 编译选项
            DomainOptionBuilder option = new DomainOptionBuilder()
                                         .WithPlatform(Platform.AnyCpu)                   // 生成可移植程序集
                                         .WithDebug(false)                                // 使用 Release 编译
                                         .WithKind(OutputKind.DynamicallyLinkedLibrary)   // 生成动态库
                                         .WithLanguageVersion(LanguageVersion.CSharp7_3); // 使用 C# 7.3


            CompilationBuilder builder = CodeSyntax.CreateCompilation("Test.dll")
                                         .WithPath(Directory.GetParent(typeof(CompilationTests).Assembly.Location).FullName)
                                         .WithOption(option)
                                         .WithAutoAssembly()       // 自动添加程序集引用
                                         .WithNamespace(NamespaceBuilder.FromCode(@"using System;
    namespace MySpace
    {      
        public class Test
        {
            public string MyMethod()
            {
                Console.WriteLine(""程序集运行成功"");
                return ""测试成功"";
        }
    }
}
"));

            try
            {
                if (builder.CreateDomain(out var messages))
                {
                    Console.WriteLine("编译成功!开始执行程序集进行验证!");
                    var    assembly = Assembly.LoadFile(Directory.GetParent(typeof(CompilationTests).Assembly.Location).FullName + "/Test.dll");
                    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("测试成功"))
                    {
                        Console.WriteLine("执行程序集测试成功!");
                    }
                    else
                    {
                        Console.WriteLine("执行程序集测试失败!");
                    }
                }
                else
                {
                    _ = messages.Execute(item =>
                    {
                        Console.WriteLine(@$ "ID:{item.Id}
严重程度:{item.Severity}     
位置:{item.Location.SourceSpan.Start}~{item.Location.SourceSpan.End}
消息:{item.Descriptor.Title}   {item}");
                    });
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.ToString()}");
            }
        }
示例#19
0
        static void Main(string[] args)
        {
            PropertyInfo info = typeof(Program).GetProperty("a");

            Console.WriteLine(info.Attributes.ToString());

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


            CompilationBuilder builder = CodeSyntax.CreateCompilation("Test.dll")
                                         .WithPath(Directory.GetParent(typeof(Program).Assembly.Location).FullName)
                                         .WithOption(option)       // 可以省略
                                         .WithAutoAssembly()       // 自动添加程序集引用
                                         .WithNamespace(NamespaceBuilder.FromCode(@"using System;
    namespace MySpace
    {      
        public class Test
        {
            public string MyMethod()
            {
                Console.WriteLine(""程序集运行成功"");
                return ""测试成功"";
        }
    }
}
"));

            try
            {
                if (builder.CreateDomain(out var messages))
                {
                    Console.WriteLine("编译成功!开始执行程序集进行验证!");
                    var    assembly = Assembly.LoadFile(Directory.GetParent(typeof(Program).Assembly.Location).FullName + "/Test.dll");
                    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("测试成功"))
                    {
                        Console.WriteLine("执行程序集测试成功!");
                    }
                    else
                    {
                        Console.WriteLine("执行程序集测试失败!");
                    }
                }
                else
                {
                    _ = messages.Execute(item =>
                    {
                        Console.WriteLine(@$ "ID:{item.Id}
严重程度:{item.Severity}     
位置:{item.Location.SourceSpan.Start}~{item.Location.SourceSpan.End}
消息:{item.Descriptor.Title}   {item}");
                    });
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex.ToString()}");
            }



            //List<PortableExecutableReference> references = assemblies.Select(c => MetadataReference.CreateFromStream(c)).ToList();



            //var tmp = DependencyContext.Default.RuntimeLibraries
            //    .Execute(item =>
            //    {
            //        item.Dependencies.Execute(itemNode =>
            //        {
            //            var t = $"{itemNode.Name}.dll";
            //            Console.WriteLine(item.Path + "|" + item.HashPath + "|" + item.Path);
            //            var c = MetadataReference.CreateFromFile(t);
            //            references.Add(c);
            //        });

            //    }).ToArray();


            //PortableExecutableReference[] mscorlibs = references.ToArray();

            //PortableExecutableReference mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
            //CSharpCompilation compilation = CSharpCompilation.Create("MyCompilation",
            //    syntaxTrees: new[] { tree }, references: mscorlibs);

            ////Emitting to file is available through an extension method in the Microsoft.CodeAnalysis namespace
            //EmitResult emitResult = compilation.Emit("output.dll", "output.pdb");

            ////If our compilation failed, we can discover exactly why.
            //if (!emitResult.Success)
            //{
            //    foreach (var diagnostic in emitResult.Diagnostics)
            //    {
            //        Console.WriteLine(diagnostic.ToString());
            //    }
            //}



            //var a = DependencyContext.Default.CompileLibraries;
            //var b = a.Count;

            //foreach (var item in DependencyContext.Default.CompileLibraries.SelectMany(cl=>cl.ResolveReferencePaths()))
            //{
            //    Console.WriteLine(item);
            //}

            //GenericBuilder generic = new GenericBuilder();
            //generic.AddConstarint(new GenericScheme("T1", GenericConstraintsType.Struct));
            //generic.AddConstarint(new GenericScheme("T2", GenericConstraintsType.Class));
            //generic.AddConstarint(new GenericScheme("T3", GenericConstraintsType.Notnull));
            //generic.AddConstarint(new GenericScheme("T4", GenericConstraintsType.Unmanaged));
            //generic.AddConstarint(new GenericScheme("T5", GenericConstraintsType.New));
            //// 如果能够反射拿到 Type
            //generic.AddConstarint(new GenericScheme("T6", GenericConstraintsType.BaseClass, typeof(int)));
            //// 如果要以字符串定义基类类型,请使用 此API
            //generic.AddBaseClassConstarint("T7", " IEnumerable<int>");
            //generic.AddTUConstarint("T8", "T2");
            //generic.AddConstarint(new GenericScheme("T9", GenericConstraintsType.Class, GenericConstraintsType.New));
            //var syntax = generic.Build();
            //var result = syntax.ToFullString();
            //Console.WriteLine(result);

            //ClassBuilder buidler = new ClassBuilder();
            //var build = buidler.SetVisibility(ClassVisibilityType.Public)
            //    .SetName("Test")
            //    .AddMethodMember(b =>
            //    {
            //        b.SetVisibility(MemberVisibilityType.Public)
            //        .SetRondomName()
            //        .SetBlock("System.Console.WriteLine(\"111\");");
            //    })
            //    .Build();

            // CompilationBuilder compilation = new CompilationBuilder();
            //compilation.Test(build);
            Console.ReadKey();
        }
示例#20
0
        public void OnWizardCreate()
        {
            //save settting

            if (!string.IsNullOrEmpty(folder) && !string.IsNullOrEmpty(namespaceName))
            {
                List <string> filesPaths = new List <string>();
                filesPaths.AddRange(
                    Directory.GetFiles(Path.GetFullPath(".") + Path.DirectorySeparatorChar + folder, "*.cs", SearchOption.AllDirectories)
                    );
                Dictionary <string, bool> scripts = new Dictionary <string, bool>();

                int counter = -1;
                foreach (string filePath in filesPaths)
                {
                    scripts[filePath] = true;

                    EditorUtility.DisplayProgressBar("Add Namespace", filePath, counter / (float)filesPaths.Count);
                    counter++;

                    string contents = File.ReadAllText(filePath);
                    string res      = NamespaceBuilder.AddNameSpace(contents, namespaceName);
                    File.WriteAllText(filePath, res);
                }


                //处理加了命名空间后出现方法miss
                filesPaths.AddRange(
                    Directory.GetFiles(Path.GetFullPath(".") + Path.DirectorySeparatorChar + folder, "*.unity", SearchOption.AllDirectories)
                    );
                filesPaths.AddRange(
                    Directory.GetFiles(Path.GetFullPath(".") + Path.DirectorySeparatorChar + folder, "*.prefab", SearchOption.AllDirectories)
                    );


                counter = -1;
                foreach (string filePath in filesPaths)
                {
                    EditorUtility.DisplayProgressBar("Modify Script Ref", filePath, counter / (float)filesPaths.Count);
                    counter++;

                    string contents = File.ReadAllText(filePath);

                    string result = "";
                    using (TextReader reader = new StringReader(contents))
                    {
                        int index = 0;
                        while (reader.Peek() != -1)
                        {
                            string line = reader.ReadLine();

                            if (line.IndexOf("m_ObjectArgumentAssemblyTypeName:") > -1 && !line.Contains(namespaceName))
                            {
                                string scriptName = line.Split(':')[1].Split(',')[0].Trim();
                                if (scripts.ContainsKey(scriptName))
                                {
                                    line = line.Replace(scriptName, "namespaceName." + scriptName);
                                }

                                result += line + "\n";
                            }
                            else
                            {
                                result += line + "\n";
                            }
                            ++index;
                        }
                        reader.Close();
                    }

                    File.WriteAllText(filePath, result);
                }


                EditorUtility.ClearProgressBar();
                AssetDatabase.Refresh();
            }
        }