Example #1
0
        public void ClassTest()
        {
            Expression expression       = parseExpression(@"class Test {
                jelly -> int;
                public belly -> Banana<int,int>;
                p -> String = ""haha"";
                
                foopy(a -> int, b -> Banana) -> String {
                    a = 5;
                }
            }");
            ClassDefinitionExpression a = assertTypeAndCast <ClassDefinitionExpression>(expression);

            Assert.AreEqual("Test", a.name);
            Assert.AreEqual(4, a.members.Count);
            Assert.AreEqual(Visibility.None, a.visibility);

            VariableDeclarationExpression           b = assertTypeAndCast <VariableDeclarationExpression>(a.members[0]);
            VariableDeclarationExpression           c = assertTypeAndCast <VariableDeclarationExpression>(a.members[1]);
            VariableDeclarationAssignmentExpression d = assertTypeAndCast <VariableDeclarationAssignmentExpression>(a.members[2]);
            FunctionExpression e = assertTypeAndCast <FunctionExpression>(a.members[3]);

            Assert.AreEqual("jelly", b.name);
            Assert.AreEqual("int", b.typeName.name);
            Assert.IsNotInstanceOfType(b.typeName, typeof(GenericTypeName));
            Assert.AreEqual(Visibility.None, b.visibility);

            Assert.AreEqual("belly", c.name);
            Assert.AreEqual("Banana", c.typeName.name);
            Assert.AreEqual(Visibility.Public, c.visibility);
            GenericTypeName f = assertTypeAndCast <GenericTypeName>(c.typeName);

            Assert.AreEqual(2, f.genericTypes.Count);
            Assert.AreEqual("int", f.genericTypes[0].name);
            Assert.IsNotInstanceOfType(f.genericTypes[0], typeof(GenericTypeName));
            Assert.AreEqual("int", f.genericTypes[1].name);
            Assert.IsNotInstanceOfType(f.genericTypes[1], typeof(GenericTypeName));

            Assert.AreEqual("p", d.declaration.name);
            Assert.AreEqual("String", d.declaration.typeName.name);
            Assert.IsNotInstanceOfType(d.declaration.typeName, typeof(GenericTypeName));

            StringLiteralExpression g = assertTypeAndCast <StringLiteralExpression>(d.value);

            Assert.AreEqual("haha", g.value);

            Assert.AreEqual("foopy", e.name);
            Assert.AreEqual(Visibility.None, e.visibility);
            Assert.AreEqual("String", e.returnType.name);
            Assert.IsNotInstanceOfType(e.returnType, typeof(GenericTypeName));
            Assert.AreEqual(2, e.arguments.members.Count);
            Assert.AreEqual(1, e.body.innerExpressions.Count);

            Assert.AreEqual("a", e.arguments.members[0].name);
            Assert.AreEqual("int", e.arguments.members[0].typeName.name);
            Assert.IsNotInstanceOfType(e.arguments.members[0].typeName, typeof(GenericTypeName));

            Assert.AreEqual("b", e.arguments.members[1].name);
            Assert.AreEqual("Banana", e.arguments.members[1].typeName.name);
            Assert.IsNotInstanceOfType(e.arguments.members[1].typeName, typeof(GenericTypeName));

            VariableAssignmentExpression h = assertTypeAndCast <VariableAssignmentExpression>(e.body.innerExpressions[0]);

            Assert.AreEqual("a", h.name);
            IntegralLiteralExpression i = assertTypeAndCast <IntegralLiteralExpression>(h.value);

            Assert.AreEqual(5, i.value);
        }
 protected virtual Expression VisitClassDefinition(ClassDefinitionExpression node)
 {
     node.Contents.ForEach(content => Visit(content));
     return(node);
 }