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); }