Пример #1
0
        SyntaxNode CompileCurrentGraphModel()
        {
            var roslynTr = new RoslynTranslator(GraphModel.Stencil);
            var ast      = roslynTr.Translate(GraphModel, CompilationOptions.Profiling);

            return(ast.GetRoot());
        }
        public void Test_Translate_Constructor()
        {
            FunctionModel a = GraphModel.CreateFunction("A", Vector2.zero);

            // Debug.Log(...)
            MethodInfo logMethod = typeof(Debug).GetMethod(nameof(Debug.Log), new[] { typeof(object) });

            Assume.That(logMethod, Is.Not.Null);
            FunctionCallNodeModel log = a.CreateStackedNode <FunctionCallNodeModel>("Log", 0, SpawnFlags.Default, n => n.MethodInfo = logMethod);

            // new Vector4(x, y)
            ConstructorInfo ctor = typeof(Vector4).GetConstructor(new[] { typeof(float), typeof(float) });

            Assume.That(ctor, Is.Not.Null);
            FunctionCallNodeModel newV4 = GraphModel.CreateNode <FunctionCallNodeModel>("New Vector4", Vector2.left * 200, SpawnFlags.Default, n => n.MethodInfo = ctor);

            GraphModel.CreateEdge(log.GetParameterPorts().First(), newV4.OutputPort);

            var b = new RoslynTranslator(Stencil);
            var c = b.Translate(GraphModel, CompilationOptions.Default);

            SyntaxNode      d    = c.GetRoot();
            StatementSyntax stmt = d.DescendantNodes().OfType <MethodDeclarationSyntax>().First(n => n.Identifier.ValueText == "A")
                                   .Body.Statements.First();

            ExpressionSyntax arg = ((InvocationExpressionSyntax)((ExpressionStatementSyntax)stmt).Expression).ArgumentList.Arguments.Single().Expression;

            Assert.That(arg.ToFullString(), Is.EqualTo("new UnityEngine.Vector4(0F, 0F)"));
        }
        public void Test_Translate_SimpleResizableMethod()
        {
            GraphModel.CreateFunction("A", Vector2.zero);
            var b = new RoslynTranslator(Stencil);
            var c = b.Translate(GraphModel, CompilationOptions.Default);
            var d = c.GetRoot();

            Assert.That(d.DescendantNodes().OfType <MethodDeclarationSyntax>().Where(n => n.Identifier.ValueText == "A").ToArray().Length, Is.EqualTo(1));
            Assert.That(d.DescendantNodes().OfType <ParameterSyntax>().ToArray().Length, Is.EqualTo(0));
        }
        public void Test_Translate_UsingAlias()
        {
            var b = new RoslynTranslator(Stencil);

            b.AddUsingAlias("TestAlias", "UnityEditor.VisualScriptingTests.Roslyn.TestAlias");
            var c = b.Translate(GraphModel, CompilationOptions.Default);
            var d = c.GetRoot();

            var ud = d.DescendantNodes().OfType <UsingDirectiveSyntax>().Where(n => n.Alias != null).ToList();

            Assert.That(ud.Count, Is.EqualTo(5));
            Assert.That(ud.Count(u => u.Alias.Name.Identifier.Text == "TestAlias"), Is.EqualTo(1));
        }
        public void Test_Translate_DetectInfiniteLoop()
        {
            var function = GraphModel.CreateFunction("Function", Vector2.zero);
            var stack0   = GraphModel.CreateStack(string.Empty, Vector2.zero);
            var stack1   = GraphModel.CreateStack(string.Empty, Vector2.zero);

            GraphModel.CreateEdge(stack0.InputPorts[0], function.OutputPort);
            GraphModel.CreateEdge(stack0.InputPorts[0], stack1.OutputPorts[0]);
            GraphModel.CreateEdge(stack1.InputPorts[0], stack0.OutputPorts[0]);

            var b = new RoslynTranslator(Stencil);

            Assert.Throws <LoopDetectedException>(() => b.Translate(GraphModel, CompilationOptions.Default));
        }
        public void Test_Translate_UsingDirective()
        {
            var type = typeof(TestObject);
            var a    = GraphModel.CreateFunction("A", Vector2.zero);
            var i    = typeof(TestObject).GetMethod(nameof(TestObject.DoStuff));

            a.CreateStackedNode <FunctionCallNodeModel>("Do", 0, SpawnFlags.Default, n => n.MethodInfo = i);

            var b = new RoslynTranslator(Stencil);
            var c = b.Translate(GraphModel, CompilationOptions.Default);
            var d = c.GetRoot();

            var ud = d.DescendantNodes().OfType <UsingDirectiveSyntax>();

            Assert.That(ud.Count(n => n.Name.ToString() == type.Namespace), Is.EqualTo(1));
        }
        public void Test_Translate_SimpleMethod2Params()
        {
            var a = GraphModel.CreateFunction("A", Vector2.zero);

            a.CreateFunctionVariableDeclaration("l", typeof(int).GenerateTypeHandle(GraphModel.Stencil));
            a.CreateAndRegisterFunctionParameterDeclaration("a", typeof(int).GenerateTypeHandle(GraphModel.Stencil));

            var b = new RoslynTranslator(Stencil);
            var c = b.Translate(GraphModel, CompilationOptions.Default);
            var d = c.GetRoot();


            Assert.That(d.DescendantNodes().OfType <MethodDeclarationSyntax>().Where(n => n.Identifier.ValueText == "A").ToArray().Length, Is.EqualTo(1));
            Assert.That(d.DescendantNodes().OfType <ParameterSyntax>().ToArray().Length, Is.EqualTo(1));
            Assert.That(d.DescendantNodes().OfType <LocalDeclarationStatementSyntax>().ToArray().Length, Is.EqualTo(1));
        }
Пример #8
0
        public void Test_Profile()
        {
            // turn on profiling
            FunctionModel isIntEvenFunction = CreateIsIntEvenFunction();

            // enable profiling for this function
            isIntEvenFunction.EnableProfiling = true;

            // needed to set the owning function of each stack
            new PortInitializationTraversal().VisitGraph(GraphModel);

            // compile graph
            var        roslynTr = new RoslynTranslator(Stencil);
            var        ast      = roslynTr.Translate(GraphModel, CompilationOptions.Profiling);
            SyntaxNode astRoot  = ast.GetRoot();

            // check there's only one IsIntEven method
            IEnumerable <MethodDeclarationSyntax> methods = astRoot.DescendantNodes().OfType <MethodDeclarationSyntax>().ToList();

            Assert.That(methods.Count, Is.EqualTo(1));
            MethodDeclarationSyntax method = methods.First();

            // check there's only a CustomSampler declaration and then a try/finally statement including everything
            BlockSyntax body = method.Body;

            Assert.That(body.Statements.Count, Is.EqualTo(2));
            StatementSyntax statement1 = body.Statements[0];

            Assert.That(statement1, Is.TypeOf(typeof(LocalDeclarationStatementSyntax)));

            StatementSyntax statement2 = body.Statements[1];

            Assert.That(statement2, Is.TypeOf(typeof(TryStatementSyntax)));

            TryStatementSyntax tryStatement = (TryStatementSyntax)statement2;

            // check that there is code inside the try and finally statements
            Assert.That(tryStatement.Block.Statements.Count, Is.GreaterThan(0));
            Assert.That(tryStatement.Finally.Block.Statements.Count, Is.GreaterThan(0));
        }