mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Crystal
		
	
	
	
	
	
#!/usr/bin/env bin/crystal --run
 | 
						|
require "../../spec_helper"
 | 
						|
 | 
						|
describe "Type inference: declare var" do
 | 
						|
  it "types declare var" do
 | 
						|
    assert_type("a :: Int32") { int32 }
 | 
						|
  end
 | 
						|
 | 
						|
  it "types declare var and reads it" do
 | 
						|
    assert_type("a :: Int32; a") { int32 }
 | 
						|
  end
 | 
						|
 | 
						|
  it "types declare var and changes its type" do
 | 
						|
    assert_type("a :: Int32; while 1 == 2; a = 'a'; end; a") { union_of(int32, char) }
 | 
						|
  end
 | 
						|
 | 
						|
  it "declares instance var which appears in initialize" do
 | 
						|
    result = assert_type("
 | 
						|
      class Foo
 | 
						|
        @x :: Int32
 | 
						|
      end
 | 
						|
 | 
						|
      Foo.new") { types["Foo"] }
 | 
						|
 | 
						|
    mod = result.program
 | 
						|
 | 
						|
    foo = mod.types["Foo"] as NonGenericClassType
 | 
						|
    foo.instance_vars["@x"].type.should eq(mod.int32)
 | 
						|
  end
 | 
						|
 | 
						|
  it "declares instance var of generic class" do
 | 
						|
    result = assert_type("
 | 
						|
      class Foo(T)
 | 
						|
        @x :: T
 | 
						|
      end
 | 
						|
 | 
						|
      Foo(Int32).new") do
 | 
						|
        foo = types["Foo"] as GenericClassType
 | 
						|
        foo_i32 = foo.instantiate([int32] of Type | ASTNode)
 | 
						|
        foo_i32.lookup_instance_var("@x").type.should eq(int32)
 | 
						|
        foo_i32
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  it "declares instance var of generic class after reopen" do
 | 
						|
    result = assert_type("
 | 
						|
      class Foo(T)
 | 
						|
      end
 | 
						|
 | 
						|
      f = Foo(Int32).new
 | 
						|
 | 
						|
      class Foo(T)
 | 
						|
        @x :: T
 | 
						|
      end
 | 
						|
 | 
						|
      f") do
 | 
						|
        foo = types["Foo"] as GenericClassType
 | 
						|
        foo_i32 = foo.instantiate([int32] of Type | ASTNode)
 | 
						|
        foo_i32.lookup_instance_var("@x").type.should eq(int32)
 | 
						|
        foo_i32
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  it "declares an instance variable in initialize" do
 | 
						|
    assert_type("
 | 
						|
      class Foo
 | 
						|
        def initialize
 | 
						|
          @x :: Int32
 | 
						|
        end
 | 
						|
 | 
						|
        def x
 | 
						|
          @x
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      Foo.new.x
 | 
						|
      ") { int32 }
 | 
						|
  end
 | 
						|
end
 |