steep 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +6 -0
  4. data/Gemfile +4 -0
  5. data/README.md +95 -0
  6. data/Rakefile +23 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/bin/smoke_runner.rb +106 -0
  10. data/exe/steep +18 -0
  11. data/lib/steep.rb +33 -0
  12. data/lib/steep/annotation.rb +223 -0
  13. data/lib/steep/cli.rb +79 -0
  14. data/lib/steep/drivers/check.rb +141 -0
  15. data/lib/steep/errors.rb +207 -0
  16. data/lib/steep/interface.rb +280 -0
  17. data/lib/steep/parser.y +311 -0
  18. data/lib/steep/signature/class.rb +358 -0
  19. data/lib/steep/signature/errors.rb +78 -0
  20. data/lib/steep/signature/extension.rb +51 -0
  21. data/lib/steep/signature/interface.rb +48 -0
  22. data/lib/steep/source.rb +98 -0
  23. data/lib/steep/type_assignability.rb +362 -0
  24. data/lib/steep/type_construction.rb +993 -0
  25. data/lib/steep/type_name.rb +37 -0
  26. data/lib/steep/types.rb +4 -0
  27. data/lib/steep/types/any.rb +31 -0
  28. data/lib/steep/types/class.rb +27 -0
  29. data/lib/steep/types/instance.rb +27 -0
  30. data/lib/steep/types/merge.rb +32 -0
  31. data/lib/steep/types/name.rb +57 -0
  32. data/lib/steep/types/union.rb +42 -0
  33. data/lib/steep/types/var.rb +38 -0
  34. data/lib/steep/typing.rb +70 -0
  35. data/lib/steep/version.rb +3 -0
  36. data/manual/annotations.md +144 -0
  37. data/sig/signature.rbi +54 -0
  38. data/sig/types.rbi +43 -0
  39. data/smoke/and/a.rb +9 -0
  40. data/smoke/array/a.rb +22 -0
  41. data/smoke/block/a.rb +12 -0
  42. data/smoke/block/a.rbi +4 -0
  43. data/smoke/case/a.rb +20 -0
  44. data/smoke/class/a.rb +31 -0
  45. data/smoke/class/a.rbi +9 -0
  46. data/smoke/class/b.rb +7 -0
  47. data/smoke/class/c.rb +10 -0
  48. data/smoke/const/a.rb +30 -0
  49. data/smoke/dstr/a.rb +6 -0
  50. data/smoke/extension/a.rb +11 -0
  51. data/smoke/extension/a.rbi +8 -0
  52. data/smoke/extension/b.rb +12 -0
  53. data/smoke/extension/c.rb +9 -0
  54. data/smoke/hello/hello.rb +13 -0
  55. data/smoke/hello/hello.rbi +7 -0
  56. data/smoke/if/a.rb +20 -0
  57. data/smoke/implements/a.rb +14 -0
  58. data/smoke/implements/a.rbi +6 -0
  59. data/smoke/literal/a.rb +16 -0
  60. data/smoke/map/a.rb +5 -0
  61. data/smoke/method/a.rb +26 -0
  62. data/smoke/method/a.rbi +0 -0
  63. data/smoke/module/a.rb +21 -0
  64. data/smoke/module/a.rbi +7 -0
  65. data/smoke/module/b.rb +8 -0
  66. data/smoke/self/a.rb +23 -0
  67. data/smoke/self/a.rbi +4 -0
  68. data/smoke/super/a.rb +34 -0
  69. data/smoke/super/a.rbi +10 -0
  70. data/smoke/yield/a.rb +18 -0
  71. data/stdlib/builtin.rbi +89 -0
  72. data/steep.gemspec +32 -0
  73. metadata +214 -0
data/sig/signature.rbi ADDED
@@ -0,0 +1,54 @@
1
+ class Steep__Signature__Error
2
+ def initialize: (signature: Steep__Signature) -> any
3
+ def signature: -> Steep__Signature
4
+ end
5
+
6
+ class Steep__Signature__Errors__UnknownTypeName <: Steep__Signature__Error
7
+ def initialize: (signature: Steep__Signature, type: Steep__Type) -> any
8
+ def type: -> Steep__Type
9
+ end
10
+
11
+ class Steep__MethodType
12
+ def substitute: (klass: Steep__Type, instance: Steep__Type, params: Hash<Symbol, Steep__Type>) -> Steep__MethodType
13
+ end
14
+
15
+ class Steep__Interface
16
+ def initialize: (name: Symbol, methods: Hash<Symbol, Steep__Method>) -> any
17
+ end
18
+
19
+ class Steep__Method
20
+ def initialize: (types: Array<Steep__MethodType>, super_method: Steep__Method) -> any
21
+ def substitute: (klass: Steep__Type, instance: Steep__Type, params: Hash<Symbol, Steep__Type>) -> Steep__Method
22
+ end
23
+
24
+ class Steep__Signature
25
+ end
26
+
27
+ class Steep__Signature__Member
28
+ end
29
+
30
+ class Steep__Signature__Errors__IncompatibleOverride <: Steep__Signature__Error
31
+ def initialize: (signature: Steep__Signature, method_name: Symbol, this_method: Steep__Method, super_method: Steep__Method) -> any
32
+ def method_name: -> Symbol
33
+ def this_method: -> Steep__Method
34
+ def super_method: -> Steep__Method
35
+ end
36
+
37
+ class Steep__Signature__Extension
38
+ def initialize: (module_name: Symbol, extension_name: Symbol, members: Array<Steep__Signature__Member>) -> any
39
+ def module_name: -> Symbol
40
+ def extension_name: -> Symbol
41
+ def members: -> Array<Steep__Signature__Member>
42
+ def name: -> Symbol
43
+ end
44
+
45
+ class Steep__Signature__Interface
46
+ def initialize: (name: Symbol, params: Array<Symbol>, methods: Hash<Symbol, Array<Steep__MethodType>>) -> any
47
+
48
+ def name: -> Symbol
49
+ def params: -> Array<Symbol>
50
+ def methods: -> Hash<Symbol, Array<Steep__MethodType>>
51
+
52
+ def to_interface: (klass: Steep__Type, instance: Steep__Type, params: Array<Steep__Type>) -> any
53
+ def validate: (any) -> any
54
+ end
data/sig/types.rbi ADDED
@@ -0,0 +1,43 @@
1
+ class Steep__TypeName
2
+ def initialize: (name: Symbol) -> any
3
+ end
4
+
5
+ class Steep__Type
6
+ def closed?: -> _Boolean
7
+ def substitute: (klass: Steep__Type, instance: Steep__Type, params: Hash<Symbol, Steep__Type>) -> instance
8
+ end
9
+
10
+ class Steep__Types__Name <: Steep__Type
11
+ def initialize: (name: Steep__TypeName, params: Array<Steep__Type>) -> any
12
+
13
+ def name: -> Steep__TypeName
14
+ def params: -> Array<Steep__Type>
15
+
16
+ def self.interface: (name: Symbol, ?params: Array<Steep__Type>) -> Steep__Types__Name
17
+ def self.module: (name: Symbol, ?params: Array<Steep__Type>) -> Steep__Types__Name
18
+ def self.instance: (name: Symbol, ?params: Array<Steep__Type>) -> Steep__Types__Name
19
+ end
20
+
21
+ class Steep__Types__Union <: Steep__Type
22
+ def initialize: (types: Array<Steep__Type>) -> any
23
+ def types: -> Array<Steep__Type>
24
+ end
25
+
26
+ class Steep__Types__Merge <: Steep__Type
27
+ def initialize: (types: Array<Steep__Type>) -> any
28
+ def types: -> Array<Steep__Type>
29
+ end
30
+
31
+ class Steep__Types__Var <: Steep__Type
32
+ def initialize: (name: Symbol) -> any
33
+ def name: -> Symbol
34
+ end
35
+
36
+ class Steep__Types__Instance <: Steep__Type
37
+ end
38
+
39
+ class Steep__Types__Class <: Steep__Type
40
+ end
41
+
42
+ class Steep__Types__Any <: Steep__Type
43
+ end
data/smoke/and/a.rb ADDED
@@ -0,0 +1,9 @@
1
+ # @type var b: String
2
+ # @type var c: Integer
3
+
4
+ a = "foo"
5
+
6
+ b = a && a.to_str
7
+
8
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
9
+ c = a && a.to_str
data/smoke/array/a.rb ADDED
@@ -0,0 +1,22 @@
1
+ # @type var a: Array<Integer>
2
+
3
+ a = []
4
+ a[1] = 3
5
+
6
+ # !expects ArgumentTypeMismatch: type=Array<Integer>, method=[]=
7
+ a[2] = "foo"
8
+
9
+ # @type var i: Integer
10
+ # @type var s: String
11
+
12
+ i = a[0]
13
+
14
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
15
+ s = a[1]
16
+
17
+
18
+ b = ["a", "b", "c"]
19
+
20
+ s = b[0]
21
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
22
+ i = b[1]
data/smoke/block/a.rb ADDED
@@ -0,0 +1,12 @@
1
+ # @type var a: A
2
+
3
+ a = A.new
4
+
5
+ # @type var i: Integer
6
+ # @type var s: String
7
+
8
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
9
+ s = a.foo
10
+
11
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
12
+ i = a.foo { nil }
data/smoke/block/a.rbi ADDED
@@ -0,0 +1,4 @@
1
+ class A
2
+ def foo: { (String) -> any } -> String
3
+ | -> Integer
4
+ end
data/smoke/case/a.rb ADDED
@@ -0,0 +1,20 @@
1
+ # @type var a: Integer
2
+
3
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=Integer | Array<String> | String
4
+ a = case 1
5
+ when 2
6
+ 1
7
+ when 0, 100
8
+ ["String"]
9
+ when 3
10
+ nil
11
+ when 4
12
+ else
13
+ "string"
14
+ end
15
+
16
+ a = case
17
+ # !expects ArgumentTypeMismatch: type=Integer, method=+
18
+ when 1+"a"
19
+ nil
20
+ end
data/smoke/class/a.rb ADDED
@@ -0,0 +1,31 @@
1
+ class A
2
+ # @type instance: A
3
+ # @type module: A.class
4
+
5
+ # A#foo is defined and the implementation is compatible.
6
+ def foo(x)
7
+ x
8
+ end
9
+
10
+ # A#bar is defined but the implementation is incompatible.
11
+ # !expects MethodParameterTypeMismatch: method=bar
12
+ def bar(y)
13
+ y
14
+ end
15
+
16
+ # Object#to_s is defined but the implementation is incompatible.
17
+ # !expects MethodBodyTypeMismatch: method=to_s, expected=String, actual=Integer
18
+ def to_s
19
+ 3
20
+ end
21
+
22
+ # No method definition given via signature, there is no type error.
23
+ def to_str
24
+ 5
25
+ end
26
+
27
+ # !expects MethodBodyTypeMismatch: method=self.baz, expected=Integer, actual=String
28
+ def self.baz
29
+ "baz"
30
+ end
31
+ end
data/smoke/class/a.rbi ADDED
@@ -0,0 +1,9 @@
1
+ class A
2
+ def foo: (String) -> any
3
+ def bar: () -> String
4
+ def self.baz: -> Integer
5
+ end
6
+
7
+ class B
8
+ def name: -> String
9
+ end
data/smoke/class/b.rb ADDED
@@ -0,0 +1,7 @@
1
+ # @var type s: String
2
+ # @var type a: Integer
3
+
4
+ s = "".class.allocate
5
+
6
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
7
+ s = 3.class.allocate
data/smoke/class/c.rb ADDED
@@ -0,0 +1,10 @@
1
+ # !expects UnexpectedDynamicMethod: module=B, method=type
2
+ class B
3
+ # @implements B
4
+
5
+ # @dynamic name
6
+ attr_reader :name
7
+
8
+ # @dynamic type
9
+ attr_reader :type
10
+ end
data/smoke/const/a.rb ADDED
@@ -0,0 +1,30 @@
1
+ # @type const A: Integer
2
+ # @type var x: String
3
+
4
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
5
+ x = A
6
+
7
+ x = B
8
+
9
+ module X
10
+ # @type const A: Integer
11
+
12
+ def foo
13
+ # @type var x: String
14
+
15
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
16
+ x = A
17
+
18
+ x = B
19
+ end
20
+ end
21
+
22
+
23
+ # @type const Foo::Bar::Baz: Integer
24
+
25
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
26
+ x = Foo::Bar::Baz
27
+
28
+ z = Foo
29
+ x = z::Bar::Baz
30
+ x = ::Foo::Bar::Baz
data/smoke/dstr/a.rb ADDED
@@ -0,0 +1,6 @@
1
+ # @type var b: String
2
+
3
+ a = 0
4
+
5
+ # !expects NoMethodError: type=Integer, method=foo
6
+ b = "Hello #{a.foo} world!"
@@ -0,0 +1,11 @@
1
+ # @type var foo: Foo
2
+
3
+ foo = nil
4
+
5
+ foo.try do |x|
6
+ # @type var string: String
7
+
8
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Foo
9
+ string = x
10
+ end
11
+
@@ -0,0 +1,8 @@
1
+ extension Object (X)
2
+ def try: <'a> { (instance) -> 'a } -> 'a
3
+ def f: -> Object
4
+ end
5
+
6
+ class Foo
7
+ def f: -> String
8
+ end
@@ -0,0 +1,12 @@
1
+ # @type var foo: Foo
2
+ foo = nil
3
+
4
+ # @type var integer: Integer
5
+
6
+ # Foo#f returns String because overridden
7
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
8
+ integer = foo.f()
9
+
10
+ # String#f returns Object because Object(X)#f is used
11
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=Object
12
+ integer = "".f()
@@ -0,0 +1,9 @@
1
+ class Foo
2
+ # @implements Foo
3
+
4
+ def f()
5
+ # @type var string: String
6
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Object
7
+ string = super()
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # @type var x: _Foo
2
+ # @type var y: _Bar
3
+
4
+ x = nil
5
+ y = nil
6
+
7
+ a = x.foo
8
+
9
+ # !expects NoMethodError: type=_Bar, method=foo
10
+ b = y.foo
11
+
12
+ # !expects IncompatibleAssignment: lhs_type=_Foo, rhs_type=_Bar
13
+ x = y
@@ -0,0 +1,7 @@
1
+ interface _Foo
2
+ def foo: -> any
3
+ end
4
+
5
+ interface _Bar
6
+ def bar: -> any
7
+ end
data/smoke/if/a.rb ADDED
@@ -0,0 +1,20 @@
1
+ # @type var a: String
2
+
3
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Symbol
4
+ a = if x
5
+ :foo
6
+ end
7
+
8
+ if y
9
+ :foo
10
+ else
11
+ "baz"
12
+ end
13
+
14
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=String | Integer
15
+ a = if z
16
+ "foofoo"
17
+ else
18
+ 3
19
+ end
20
+
@@ -0,0 +1,14 @@
1
+ # !expects@+2 MethodDefinitionMissing: module=A, method=baz
2
+ # !expects MethodDefinitionMissing: module=A, method=self.bar
3
+ class A
4
+ # @implements A
5
+
6
+ def foo()
7
+ end
8
+
9
+ def bar()
10
+ end
11
+
12
+ def self.baz
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class A
2
+ def foo: -> any
3
+ def baz: -> any
4
+ def self.bar: -> any
5
+ def self.baz: -> any
6
+ end
@@ -0,0 +1,16 @@
1
+ # @type var x: String
2
+ # @type var y: Integer
3
+
4
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
5
+ x = 1
6
+
7
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Symbol
8
+ x = :foo
9
+
10
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=String
11
+ y = "foo"
12
+
13
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=_Boolean
14
+ x = true
15
+ # !expects IncompatibleAssignment: lhs_type=Integer, rhs_type=_Boolean
16
+ y = false
data/smoke/map/a.rb ADDED
@@ -0,0 +1,5 @@
1
+ a = [1,2,3]
2
+
3
+ # @type var b: Array<Integer>
4
+
5
+ b = a.map {|x| x.to_i }
data/smoke/method/a.rb ADDED
@@ -0,0 +1,26 @@
1
+ # @type method foo: (Integer, y: Integer) -> String
2
+
3
+ # !expects MethodBodyTypeMismatch: method=foo, expected=String, actual=Integer
4
+ def foo(x, y:)
5
+ # @type var z: String
6
+
7
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
8
+ z = x
9
+
10
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
11
+ z = y
12
+
13
+ 3
14
+ end
15
+
16
+ # @type method bar: (Integer) -> String
17
+
18
+ # !expects MethodParameterTypeMismatch: method=bar
19
+ def bar(x, y)
20
+ # @type var z: String
21
+
22
+ # !expects IncompatibleAssignment: lhs_type=String, rhs_type=Integer
23
+ z = x
24
+
25
+ z = y
26
+ end