steep 0.1.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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