Ejemplo n.º 1
0
        public void Compile_SimpleTestScript_AddMethodReturnsCorrectValue()
        {
            var compiler = new RoslynCompiler();

            var outputStream = new MemoryStream();

            var compilationPackage = new CompilationPackage();

            compilationPackage.AddReferenceAssembly(typeof(ISimpleScript).Assembly);
            compilationPackage.SourceCodes.Add(new SourceCodeUnit(TestScripts.SimpleScript, "Test.cs"));

            var compilationOutput = new CompilationOutput(CompilationOutputKind.DynamicallyLinkedLibrary,
                                                          new StreamCompilationOutputData(outputStream));

            var compilerResult = compiler.Compile(compilationPackage, compilationOutput);

            Assert.Empty(compilerResult.Messages.Where(x => x.MessageType == CompilationMessageType.Error));

            var assembly = Assembly.Load(outputStream.ToArray());

            var simpleScript = assembly.CreateInstance(
                "CreativeCoders.CodeCompilation.UnitTests.TestData.SimpleScript") as ISimpleScript;

            var value = simpleScript?.AddIntegers(12, 34);

            Assert.Equal(46, value);
        }
        private static CompilationPackage BuildCompilationPackage(ScriptClassSourceCode classSourceCode)
        {
            var package = new CompilationPackage();

            package.SourceCodes.Add(new SourceCodeUnit(classSourceCode.SourceCode, classSourceCode.ClassName + ".cs"));
            return(package);
        }
Ejemplo n.º 3
0
        public ICompilationResult Compile(CompilationPackage compilationPackage, CompilationOutput compilationOutput)
        {
            Ensure.IsNotNull(compilationOutput, nameof(compilationOutput));

            var syntaxTrees = CreateSyntaxTrees(compilationPackage.SourceCodes).ToArray();

            var assemblyFiles =
                GetAssembliesFromUsings(
                    syntaxTrees.SelectMany(syntaxTree =>
                                           syntaxTree.GetCompilationUnitRoot().Usings.Select(usingDirective => usingDirective)),
                    compilationPackage);

            var compilation = CreateCompilation(syntaxTrees, assemblyFiles, compilationPackage, compilationOutput);

            return(new RoslynCompilationResult(compilation, compilationOutput.OutputData));
        }
Ejemplo n.º 4
0
        private static CSharpCompilation CreateCompilation(IEnumerable <SyntaxTree> syntaxTrees,
                                                           IEnumerable <string> assemblyFiles,
                                                           CompilationPackage compilationPackage, CompilationOutput compilationOutput)
        {
            var assemblyName = compilationPackage.AssemblyName;

            if (string.IsNullOrWhiteSpace(assemblyName))
            {
                assemblyName = FileSys.Path.ChangeExtension(FileSys.Path.GetRandomFileName(), ".dll");
            }

            var references = GetReferences(assemblyFiles);

            var compilation = CSharpCompilation.Create(assemblyName, syntaxTrees, references,
                                                       new CSharpCompilationOptions(RoslynConvert.ConvertOutputKind(compilationOutput.OutputKind)));

            return(compilation);
        }
Ejemplo n.º 5
0
        private static IEnumerable <string> GetAssembliesFromUsings(IEnumerable <UsingDirectiveSyntax> usings,
                                                                    CompilationPackage compilationPackage)
        {
            var assemblies = new List <string> {
                typeof(object).Assembly.Location
            };

            assemblies.AddRange(compilationPackage.ReferencedAssemblyFiles);

            if (compilationPackage.AddAllLoadedAssemblyReferences)
            {
                var loadedAssemblies = ReflectionUtils.GetAllAssemblies();
                usings.ForEach(usingDirective => GetAssemblyForUsing(usingDirective, loadedAssemblies, assemblies));
            }

            if (compilationPackage.AddNetStandardReferences)
            {
                assemblies.AddRange(GetNetStandardAssemblies());
            }

            return(assemblies.Distinct());
        }