public void HasATypeEqualToThatOfTheTypeBeingConstructed() { var constructedType = new NamedType("class Foo { }".ParseClass()); var constructorType = NamedType.Constructor(constructedType); Type("new Foo()", Foo => constructorType).ShouldEqual(constructedType); }
public void CanCreateFullyTypedInstance() { var @class = @"class Foo { bool Even(int n) { if (n==0) true else Odd(n-1) } bool Odd(int n) { if (n==0) false else Even(n-1) } int Test() { if (Even(4)) 0 else 1 } }".ParseClass(); var constructorReturningFoo = NamedType.Constructor(new NamedType(@class)); @class.Methods.ShouldList( even => { even.Name.Identifier.ShouldEqual("Even"); even.Type.ShouldEqual(Unknown); even.Body.Type.ShouldEqual(Unknown); }, odd => { odd.Name.Identifier.ShouldEqual("Odd"); odd.Type.ShouldEqual(Unknown); odd.Body.Type.ShouldEqual(Unknown); }, test => { test.Name.Identifier.ShouldEqual("Test"); test.Type.ShouldEqual(Unknown); test.Body.Type.ShouldEqual(Unknown); }); @class.Type.ShouldEqual(Unknown); var typeRegistry = new TypeRegistry(); typeRegistry.Add(@class); var typeChecker = new TypeChecker(typeRegistry); var typedClass = typeChecker.TypeCheck(@class, Scope()); typedClass.Methods.ShouldList( even => { even.Name.Identifier.ShouldEqual("Even"); even.Type.ToString().ShouldEqual("System.Func<int, bool>"); even.Body.Type.ShouldEqual(Boolean); }, odd => { odd.Name.Identifier.ShouldEqual("Odd"); odd.Type.ToString().ShouldEqual("System.Func<int, bool>"); odd.Body.Type.ShouldEqual(Boolean); }, test => { test.Name.Identifier.ShouldEqual("Test"); test.Type.ToString().ShouldEqual("System.Func<int>"); test.Body.Type.ShouldEqual(Integer); }); typedClass.Type.ShouldEqual(constructorReturningFoo); }
public void PassesTypeCheckingEvenWhenMethodNamesAreTheSameAsNamesInTheSurroundingScope() { var fooClass = "class Foo { int A() {0} int B() {2} }".ParseClass(); var typeRegistry = new TypeRegistry(); var constructorReturningFoo = NamedType.Constructor(new NamedType(fooClass)); typeRegistry.Add(fooClass); var typeChecker = new TypeChecker(typeRegistry); typeChecker.TypeCheck(fooClass, Scope(B => NamedType.Function(NamedType.Boolean))).Type.ShouldEqual(constructorReturningFoo); typeChecker.HasErrors.ShouldBeFalse(); }
public void HasATypeCorrespondingWithTheDefaultConstructor() { var fooClass = "class Foo { }".ParseClass(); var typeRegistry = new TypeRegistry(); var constructorReturningFoo = NamedType.Constructor(new NamedType(fooClass)); typeRegistry.Add(fooClass); var typeChecker = new TypeChecker(typeRegistry); typeChecker.TypeCheck(fooClass, Scope()).Type.ShouldEqual(constructorReturningFoo); typeChecker.HasErrors.ShouldBeFalse(); }
public void CanCreateFullyTypedInstance() { var constructedType = new NamedType("class Foo { }".ParseClass()); var constructorType = NamedType.Constructor(constructedType); var @new = (New)Parse("new Foo()"); @new.Type.ShouldEqual(Unknown); @new.TypeName.Type.ShouldEqual(Unknown); var typedNew = WithTypes(@new, Foo => constructorType); typedNew.Type.ShouldEqual(constructedType); typedNew.TypeName.Type.ShouldEqual(constructorType); }
private NamedType ConstructorType(Name name) { return(NamedType.Constructor(TypeOf(new TypeName(name.Identifier)))); }
public void TypesAllClassesAndFunctions() { var compilationUnit = Parse( @"class Foo { } class Bar { } bool Even(int n) {if (n==0) true else Odd(n-1)} bool Odd(int n) {if (n==0) false else Even(n-1)} int Main() {if (Even(4)) 0 else 1}"); var fooType = new NamedType(compilationUnit.Classes.Single(c => c.Name.Identifier == "Foo")); var barType = new NamedType(compilationUnit.Classes.Single(c => c.Name.Identifier == "Bar")); var fooConstructorType = NamedType.Constructor(fooType); var barConstructorType = NamedType.Constructor(barType); var typeChecker = new TypeChecker(); var typedCompilationUnit = typeChecker.TypeCheck(compilationUnit); compilationUnit.Classes.ShouldList( foo => foo.Type.ShouldEqual(Unknown), bar => bar.Type.ShouldEqual(Unknown)); compilationUnit.Functions.ShouldList( even => { even.Name.Identifier.ShouldEqual("Even"); even.Type.ShouldEqual(Unknown); even.Body.Type.ShouldEqual(Unknown); }, odd => { odd.Name.Identifier.ShouldEqual("Odd"); odd.Type.ShouldEqual(Unknown); odd.Body.Type.ShouldEqual(Unknown); }, main => { main.Name.Identifier.ShouldEqual("Main"); main.Type.ShouldEqual(Unknown); main.Body.Type.ShouldEqual(Unknown); }); typedCompilationUnit.Classes.ShouldList( foo => foo.Type.ShouldEqual(fooConstructorType), bar => bar.Type.ShouldEqual(barConstructorType)); typedCompilationUnit.Functions.ShouldList( even => { even.Name.Identifier.ShouldEqual("Even"); even.Type.ToString().ShouldEqual("System.Func<int, bool>"); even.Body.Type.ShouldEqual(Boolean); }, odd => { odd.Name.Identifier.ShouldEqual("Odd"); odd.Type.ToString().ShouldEqual("System.Func<int, bool>"); odd.Body.Type.ShouldEqual(Boolean); }, main => { main.Name.Identifier.ShouldEqual("Main"); main.Type.ToString().ShouldEqual("System.Func<int>"); main.Body.Type.ShouldEqual(Integer); }); }