steep 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|