Ejemplo n.º 1
0
        public void HasATypeEqualToThatOfTheTypeBeingConstructed()
        {
            var constructedType = new NamedType("class Foo { }".ParseClass());
            var constructorType = NamedType.Constructor(constructedType);

            Type("new Foo()", Foo => constructorType).ShouldEqual(constructedType);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 private NamedType ConstructorType(Name name)
 {
     return(NamedType.Constructor(TypeOf(new TypeName(name.Identifier))));
 }
Ejemplo n.º 7
0
        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);
            });
        }