Beispiel #1
0
        public void BasicProtection()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class VendingMachine 
                { 
                    public    void coin();
                    protected void choc();
                    protected void toffee();

                    void main() 
                    {
                        for (;;)
                        {
                            coin >> (choc | toffee);
                        }
                    }
                }", out text);

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <ThrowStatementSyntax>()
                          .SelectMany(thrw => thrw
                                      .DescendantNodes()
                                      .OfType <LiteralExpressionSyntax>())
                          .Select(s => s.ToString())
                          .Count(s => new[] { "\"choc\"", "\"toffee\"" }
                                 .Contains(s)) == 2); //must have added checks for choc and toffee
        }
Beispiel #2
0
        private static Compilation createCompilation(string text,
                                                     List <Diagnostic> errors     = null,
                                                     IPersistentStorage storage   = null,
                                                     CompilationAnalysis analysis = null)
        {
            var injector = new CompositeInjector <SyntaxToken, SyntaxNode, SemanticModel>(new[]
            {
                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(compiler => compiler
                                                                              .Environment()
                                                                              .dependency <ExcessOwinMiddleware>("Excess.Server.Middleware")
                                                                              .dependency <IAppBuilder>("Owin")
                                                                              .dependency <IOwinRequest>("Microsoft.Owin")
                                                                              .dependency <__Scope>("Excess.Runtime")),

                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(
                    compiler => ConcurrentExtension.Apply((RoslynCompiler)compiler)),

                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(
                    compiler => ServerExtension.Apply(compiler, new Scope(null))),

                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(
                    compiler => Functions.Apply(compiler))
            });

            if (analysis != null)
            {
                ServerExtension.Compilation(analysis);
            }

            var compilation = new Compilation(storage, analysis: analysis);

            compilation.addDocument("test", text, injector);
            return(compilation);
        }
Beispiel #3
0
        public void ShouldSupport_GenericReturnType()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class SomeClass 
                { 
                    public IEnumerable<int> SomeMethod()
                    {
                        throw new NotImplementedException();
                    }
                }", out text);

            Assert.IsNotNull(tree);

            //must have passed the generic type along
            Assert.IsTrue(tree
                          .GetRoot()
                          .DescendantNodes()
                          .OfType <TypeSyntax>()
                          .Where(type => type.ToString() == "IEnumerable<int>")
                          .Any());
        }
Beispiel #4
0
        public static SyntaxTree Compile(string code, out string output)
        {
            RoslynCompiler compiler = new RoslynCompiler(environment: null);

            ServerExtension.Apply(compiler, compiler.Scope);
            ConcurrentExtension.Apply(compiler);
            return(compiler.ApplySemanticalPass(code, out output));
        }
Beispiel #5
0
        public void BasicAssigment()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class SomeClass 
                { 
                    int E;
                    void main() 
                    {
                        string B;
                        A | (B = C()) & (E = D(10));
                    }

                    public void A();
                    public void F();
                    public void G();
                    
                    private string C()
                    {
                        F & G;

                        return ""SomeValue"";
                    }

                    private int D(int v)
                    {
                        return v + 1;
                    }
                }", out text);

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <ClassDeclarationSyntax>()
                          .Where(@class => @class.Identifier.ToString() == "__expr1")
                          .Single()
                          .Members
                          .OfType <FieldDeclarationSyntax>()
                          .Count(field => new[] { "B", "E" }
                                 .Contains(field
                                           .Declaration
                                           .Variables[0]
                                           .Identifier.ToString())) == 2); //must have added fields to the expression object

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <AssignmentExpressionSyntax>()
                          .Count(assignment => new[] { "B", "E" }
                                 .Contains(assignment
                                           .Left
                                           .ToString())) == 2); //must have added assignments from fields to the expression object
        }
Beispiel #6
0
        public void BasicAwait()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class SomeClass
                { 
                    public void A();
                    public void B();

                    void main() 
                    {
                        await A;
                        int val = await C();
                        val++;
                    }

                    private int C()
                    {
                        await B;
                        return 10;
                    }
                }", out text);

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <InvocationExpressionSyntax>()
                          .Where(invocation => invocation
                                 .Expression
                                 .ToString() == "__listen")
                          .Count(invocation => new[] { "\"A\"", "\"B\"" }
                                 .Contains(invocation
                                           .ArgumentList
                                           .Arguments[0]
                                           .Expression.ToString())) == 2); //must have listened to both signals
        }
Beispiel #7
0
        public void BasicTryCatch()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class SomeClass 
                { 
                    public void A();
                    public void B();

                    void main() 
                    {
                        try
                        {
                            int someValue = 10;
                            int someOtherValue = 11;

                            A | B;

                            someValue++;

                            B >> A;

                            someOtherValue++;
                        }
                        catch
                        {
                        }
                    }
                }", out text);

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <TryStatementSyntax>()
                          .Count() == 2); //must have added a a try statement
        }
Beispiel #8
0
        private static ICompilerInjector <SyntaxToken, SyntaxNode, SemanticModel> MockInjector(Options options)
        {
            return(new CompositeInjector <SyntaxToken, SyntaxNode, SemanticModel>(new[]
            {
                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(compiler => compiler
                                                                              .Environment()
                                                                              .dependency(new[]
                {
                    "System.Threading",
                    "System.Threading.Tasks",
                    "System.Diagnostics",
                })
                                                                              .dependency <ConcurrentObject>(new string[]
                {
                    "Excess.Concurrent.Runtime"
                })),

                new DelegateInjector <SyntaxToken, SyntaxNode, SemanticModel>(compiler =>
                                                                              ConcurrentExtension.Apply((RoslynCompiler)compiler, options))
            }));
        }
Beispiel #9
0
 public Transpiler()
 {
     XSLanguage.Apply(_compiler);
     ConcurrentExtension.Apply(_compiler);
 }
Beispiel #10
0
        public void BasicOperators()
        {
            RoslynCompiler compiler = new RoslynCompiler();

            ConcurrentExtension.Apply(compiler);

            SyntaxTree tree = null;
            string     text = null;

            tree = compiler.ApplySemanticalPass(@"
                concurrent class SomeClass 
                { 
                    void main() 
                    {
                        A | (B & C()) >> D(10);
                    }

                    public void A();
                    public void B();
                    public void F();
                    public void G();
                    
                    private string C()
                    {
                        if (2 > 1)
                            return ""SomeValue"";

                        F & G;

                        if (1 > 2)
                            return ""SomeValue"";
                        return ""SomeOtherValue"";
                    }

                    private int D(int v)
                    {
                        return v + 1;
                    }
                }", out text);

            Assert.IsTrue(tree.GetRoot()
                          .DescendantNodes()
                          .OfType <MethodDeclarationSyntax>()
                          .Count(method =>
                                 new[] {
                "__concurrentmain",
                "__concurrentA",
                "__concurrentB",
                "__concurrentC",
                "__concurrentF",
                "__concurrentG",
            }
                                 .Contains(method
                                           .Identifier
                                           .ToString())) == 6); //must have created concurrent methods

            Assert.IsFalse(tree.GetRoot()
                           .DescendantNodes()
                           .OfType <MethodDeclarationSyntax>()
                           .Any(method => method
                                .Identifier
                                .ToString() == "__concurrentD")); //but not for D
        }