steep 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/steep/ast/signature/members.rb +24 -0
- data/lib/steep/ast/types/intersection.rb +2 -2
- data/lib/steep/ast/types/union.rb +2 -2
- data/lib/steep/interface/builder.rb +39 -0
- data/lib/steep/parser.y +20 -0
- data/lib/steep/type_construction.rb +38 -28
- data/lib/steep/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5bc8e25ce0d9d4c9946d0100d3a011ca486086997b4ba86644939cfed1a9b08
|
4
|
+
data.tar.gz: 7d4c26a383e9387a9f4c15c09f488eb24dc5d7ede91b9acc8da1d033f32389ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d491cda774d07a99a41be32e9bf7559104d84a68bb36ba590e70d1592a1a4cda40a1bba416c50969279b7e6c1cfd3f4b80274d32e7ef29fa8b71851de4d214f7
|
7
|
+
data.tar.gz: 5140446569e665f76971fbf4dec158a664f8e2e4ae32339480069288c1e3fdbbc50237db5999c3f9d124190859a334696dcb579f09009762c25aa5bdd3361edc
|
data/CHANGELOG.md
ADDED
@@ -65,6 +65,30 @@ module Steep
|
|
65
65
|
@type = type
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
class Attr
|
70
|
+
attr_reader :location
|
71
|
+
attr_reader :kind
|
72
|
+
attr_reader :name
|
73
|
+
attr_reader :ivar
|
74
|
+
attr_reader :type
|
75
|
+
|
76
|
+
def initialize(location:, kind:, name:, ivar:, type:)
|
77
|
+
@location = location
|
78
|
+
@kind = kind
|
79
|
+
@name = name
|
80
|
+
@ivar = ivar
|
81
|
+
@type = type
|
82
|
+
end
|
83
|
+
|
84
|
+
def reader?
|
85
|
+
kind == :reader
|
86
|
+
end
|
87
|
+
|
88
|
+
def accessor?
|
89
|
+
kind == :accessor
|
90
|
+
end
|
91
|
+
end
|
68
92
|
end
|
69
93
|
end
|
70
94
|
end
|
@@ -20,9 +20,9 @@ module Steep
|
|
20
20
|
end.map do |type|
|
21
21
|
case type
|
22
22
|
when AST::Types::Any
|
23
|
-
return AST::Types::Any.new()
|
23
|
+
return AST::Types::Any.new(location: location)
|
24
24
|
when AST::Types::Bot
|
25
|
-
return AST::Types::Bot.new()
|
25
|
+
return AST::Types::Bot.new(location: location)
|
26
26
|
when AST::Types::Top
|
27
27
|
nil
|
28
28
|
else
|
@@ -20,9 +20,9 @@ module Steep
|
|
20
20
|
end.map do |type|
|
21
21
|
case type
|
22
22
|
when AST::Types::Any
|
23
|
-
return AST::Types::Any.new()
|
23
|
+
return AST::Types::Any.new(location: location)
|
24
24
|
when AST::Types::Top
|
25
|
-
return AST::Types::Top.new()
|
25
|
+
return AST::Types::Top.new(location: location)
|
26
26
|
when AST::Types::Bot
|
27
27
|
nil
|
28
28
|
else
|
@@ -358,6 +358,45 @@ module Steep
|
|
358
358
|
when AST::Signature::Members::Ivar
|
359
359
|
merge_ivars(ivar_chains,
|
360
360
|
{ member.name => absolute_type(member.type, current: sig.name) })
|
361
|
+
when AST::Signature::Members::Attr
|
362
|
+
if member.ivar != false
|
363
|
+
ivar_name = member.ivar || "@#{member.name}".to_sym
|
364
|
+
merge_ivars(ivar_chains,
|
365
|
+
{ ivar_name => absolute_type(member.type, current: sig.name) })
|
366
|
+
end
|
367
|
+
|
368
|
+
reader_method = AST::Signature::Members::Method.new(
|
369
|
+
location: member.location,
|
370
|
+
name: member.name,
|
371
|
+
kind: :instance,
|
372
|
+
types: [
|
373
|
+
AST::MethodType.new(location: member.type.location,
|
374
|
+
type_params: nil,
|
375
|
+
params: nil,
|
376
|
+
block: nil,
|
377
|
+
return_type: member.type)
|
378
|
+
],
|
379
|
+
attributes: []
|
380
|
+
)
|
381
|
+
add_method(type_name, reader_method, methods: methods)
|
382
|
+
|
383
|
+
if member.accessor?
|
384
|
+
writer_method = AST::Signature::Members::Method.new(
|
385
|
+
location: member.location,
|
386
|
+
name: "#{member.name}=".to_sym,
|
387
|
+
kind: :instance,
|
388
|
+
types: [
|
389
|
+
AST::MethodType.new(location: member.type.location,
|
390
|
+
type_params: nil,
|
391
|
+
params: AST::MethodType::Params::Required.new(location: member.type.location,
|
392
|
+
type: member.type),
|
393
|
+
block: nil,
|
394
|
+
return_type: member.type)
|
395
|
+
],
|
396
|
+
attributes: []
|
397
|
+
)
|
398
|
+
add_method(type_name, writer_method, methods: methods)
|
399
|
+
end
|
361
400
|
end
|
362
401
|
end
|
363
402
|
|
data/lib/steep/parser.y
CHANGED
@@ -293,6 +293,8 @@ class_member: instance_method_member
|
|
293
293
|
| include_member
|
294
294
|
| extend_member
|
295
295
|
| ivar_member
|
296
|
+
| attr_reader_member
|
297
|
+
| attr_accessor_member
|
296
298
|
|
297
299
|
ivar_member: IVAR_NAME COLON type {
|
298
300
|
loc = val.first.location + val.last.location
|
@@ -353,6 +355,18 @@ extend_member: EXTEND module_name {
|
|
353
355
|
name = val[1].value
|
354
356
|
result = AST::Signature::Members::Extend.new(name: name, location: loc, args: val[3])
|
355
357
|
}
|
358
|
+
attr_reader_member: ATTR_READER method_name attr_ivar_opt COLON type {
|
359
|
+
loc = val.first.location + val.last.location
|
360
|
+
result = AST::Signature::Members::Attr.new(location: loc, name: val[1].value, kind: :reader, ivar: val[2], type: val[4])
|
361
|
+
}
|
362
|
+
attr_accessor_member: ATTR_ACCESSOR method_name attr_ivar_opt COLON type {
|
363
|
+
loc = val.first.location + val.last.location
|
364
|
+
result = AST::Signature::Members::Attr.new(location: loc, name: val[1].value, kind: :accessor, ivar: val[2], type: val[4])
|
365
|
+
}
|
366
|
+
|
367
|
+
attr_ivar_opt: { result = nil }
|
368
|
+
| LPAREN RPAREN { result = false }
|
369
|
+
| LPAREN IVAR_NAME RPAREN { result = val[1].value }
|
356
370
|
|
357
371
|
constructor_method: { result = false }
|
358
372
|
| LPAREN CONSTRUCTOR RPAREN { result = true }
|
@@ -421,6 +435,8 @@ method_name: IDENT
|
|
421
435
|
raise ParseError, "\nunexpected method name > >" unless val[0].location.pred?(val[1].location)
|
422
436
|
result = LocatedValue.new(location: val[0].location + val[1].location, value: :>>)
|
423
437
|
}
|
438
|
+
| ATTR_READER
|
439
|
+
| ATTR_ACCESSOR
|
424
440
|
|
425
441
|
annotation: AT_TYPE VAR subject COLON type {
|
426
442
|
loc = val.first.location + val.last.location
|
@@ -640,6 +656,10 @@ def next_token
|
|
640
656
|
new_token(:SELF, :self)
|
641
657
|
when input.scan(/'\w+/)
|
642
658
|
new_token(:TVAR, input.matched.gsub(/\A'/, '').to_sym)
|
659
|
+
when input.scan(/attr_reader\b/)
|
660
|
+
new_token(:ATTR_READER, :attr_reader)
|
661
|
+
when input.scan(/attr_accessor\b/)
|
662
|
+
new_token(:ATTR_ACCESSOR, :attr_accessor)
|
643
663
|
when input.scan(/instance\b/)
|
644
664
|
new_token(:INSTANCE, :instance)
|
645
665
|
when input.scan(/class\b/)
|
@@ -1984,46 +1984,56 @@ module Steep
|
|
1984
1984
|
|
1985
1985
|
def validate_method_definitions(node, module_name)
|
1986
1986
|
signature = checker.builder.signatures.find_class_or_module(module_name.name)
|
1987
|
+
expected_instance_method_names = Set.new()
|
1988
|
+
expected_module_method_names = Set.new
|
1987
1989
|
|
1988
1990
|
signature.members.each do |member|
|
1989
|
-
|
1991
|
+
case member
|
1992
|
+
when AST::Signature::Members::Method
|
1990
1993
|
if member.instance_method?
|
1991
|
-
|
1992
|
-
when module_context.defined_instance_methods.include?(member.name)
|
1993
|
-
# ok
|
1994
|
-
when annotations.dynamics[member.name]&.instance_method?
|
1995
|
-
# ok
|
1996
|
-
else
|
1997
|
-
typing.add_error Errors::MethodDefinitionMissing.new(node: node,
|
1998
|
-
module_name: module_name.name,
|
1999
|
-
kind: :instance,
|
2000
|
-
missing_method: member.name)
|
2001
|
-
end
|
1994
|
+
expected_instance_method_names << member.name
|
2002
1995
|
end
|
2003
|
-
|
2004
1996
|
if member.module_method?
|
2005
|
-
|
2006
|
-
when module_context.defined_module_methods.include?(member.name)
|
2007
|
-
# ok
|
2008
|
-
when annotations.dynamics[member.name]&.module_method?
|
2009
|
-
# ok
|
2010
|
-
else
|
2011
|
-
typing.add_error Errors::MethodDefinitionMissing.new(node: node,
|
2012
|
-
module_name: module_name.name,
|
2013
|
-
kind: :module,
|
2014
|
-
missing_method: member.name)
|
2015
|
-
end
|
1997
|
+
expected_module_method_names << member.name
|
2016
1998
|
end
|
1999
|
+
when AST::Signature::Members::Attr
|
2000
|
+
expected_instance_method_names << member.name
|
2001
|
+
expected_instance_method_names << "#{member.name}=".to_sym if member.accessor?
|
2017
2002
|
end
|
2018
2003
|
end
|
2019
2004
|
|
2020
|
-
|
2021
|
-
|
2005
|
+
expected_instance_method_names.each do |method_name|
|
2006
|
+
case
|
2007
|
+
when module_context.defined_instance_methods.include?(method_name)
|
2008
|
+
# ok
|
2009
|
+
when annotations.dynamics[method_name]&.instance_method?
|
2010
|
+
# ok
|
2011
|
+
else
|
2012
|
+
typing.add_error Errors::MethodDefinitionMissing.new(node: node,
|
2013
|
+
module_name: module_name.name,
|
2014
|
+
kind: :instance,
|
2015
|
+
missing_method: method_name)
|
2016
|
+
end
|
2017
|
+
end
|
2018
|
+
expected_module_method_names.each do |method_name|
|
2019
|
+
case
|
2020
|
+
when module_context.defined_module_methods.include?(method_name)
|
2021
|
+
# ok
|
2022
|
+
when annotations.dynamics[method_name]&.module_method?
|
2023
|
+
# ok
|
2024
|
+
else
|
2025
|
+
typing.add_error Errors::MethodDefinitionMissing.new(node: node,
|
2026
|
+
module_name: module_name.name,
|
2027
|
+
kind: :module,
|
2028
|
+
missing_method: method_name)
|
2029
|
+
end
|
2030
|
+
end
|
2022
2031
|
|
2032
|
+
annotations.dynamics.each do |method_name, annotation|
|
2023
2033
|
case
|
2024
|
-
when annotation.module_method? &&
|
2034
|
+
when annotation.module_method? && expected_module_method_names.member?(method_name)
|
2025
2035
|
# ok
|
2026
|
-
when annotation.instance_method? &&
|
2036
|
+
when annotation.instance_method? && expected_instance_method_names.member?(method_name)
|
2027
2037
|
# ok
|
2028
2038
|
else
|
2029
2039
|
typing.add_error Errors::UnexpectedDynamicMethod.new(node: node,
|
data/lib/steep/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soutaro Matsumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -132,6 +132,7 @@ extra_rdoc_files: []
|
|
132
132
|
files:
|
133
133
|
- ".gitignore"
|
134
134
|
- ".travis.yml"
|
135
|
+
- CHANGELOG.md
|
135
136
|
- Gemfile
|
136
137
|
- README.md
|
137
138
|
- Rakefile
|
@@ -277,7 +278,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
278
|
version: '0'
|
278
279
|
requirements: []
|
279
280
|
rubyforge_project:
|
280
|
-
rubygems_version: 2.7.
|
281
|
+
rubygems_version: 2.7.3
|
281
282
|
signing_key:
|
282
283
|
specification_version: 4
|
283
284
|
summary: Gradual Typing for Ruby
|