typeprof 0.21.11 → 0.30.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -31
  3. data/bin/typeprof +5 -0
  4. data/doc/doc.ja.md +134 -0
  5. data/doc/doc.md +136 -0
  6. data/lib/typeprof/cli/cli.rb +178 -0
  7. data/lib/typeprof/cli.rb +3 -133
  8. data/lib/typeprof/code_range.rb +112 -0
  9. data/lib/typeprof/core/ast/base.rb +263 -0
  10. data/lib/typeprof/core/ast/call.rb +259 -0
  11. data/lib/typeprof/core/ast/const.rb +126 -0
  12. data/lib/typeprof/core/ast/control.rb +433 -0
  13. data/lib/typeprof/core/ast/meta.rb +150 -0
  14. data/lib/typeprof/core/ast/method.rb +339 -0
  15. data/lib/typeprof/core/ast/misc.rb +263 -0
  16. data/lib/typeprof/core/ast/module.rb +123 -0
  17. data/lib/typeprof/core/ast/pattern.rb +140 -0
  18. data/lib/typeprof/core/ast/sig_decl.rb +471 -0
  19. data/lib/typeprof/core/ast/sig_type.rb +663 -0
  20. data/lib/typeprof/core/ast/value.rb +319 -0
  21. data/lib/typeprof/core/ast/variable.rb +315 -0
  22. data/lib/typeprof/core/ast.rb +472 -0
  23. data/lib/typeprof/core/builtin.rb +146 -0
  24. data/lib/typeprof/core/env/method.rb +137 -0
  25. data/lib/typeprof/core/env/method_entity.rb +55 -0
  26. data/lib/typeprof/core/env/module_entity.rb +408 -0
  27. data/lib/typeprof/core/env/static_read.rb +155 -0
  28. data/lib/typeprof/core/env/type_alias_entity.rb +27 -0
  29. data/lib/typeprof/core/env/value_entity.rb +32 -0
  30. data/lib/typeprof/core/env.rb +366 -0
  31. data/lib/typeprof/core/graph/box.rb +998 -0
  32. data/lib/typeprof/core/graph/change_set.rb +224 -0
  33. data/lib/typeprof/core/graph/filter.rb +155 -0
  34. data/lib/typeprof/core/graph/vertex.rb +225 -0
  35. data/lib/typeprof/core/service.rb +514 -0
  36. data/lib/typeprof/core/type.rb +352 -0
  37. data/lib/typeprof/core/util.rb +81 -0
  38. data/lib/typeprof/core.rb +31 -0
  39. data/lib/typeprof/diagnostic.rb +35 -0
  40. data/lib/typeprof/lsp/messages.rb +415 -0
  41. data/lib/typeprof/lsp/server.rb +203 -0
  42. data/lib/typeprof/lsp/text.rb +69 -0
  43. data/lib/typeprof/lsp/util.rb +51 -0
  44. data/lib/typeprof/lsp.rb +4 -907
  45. data/lib/typeprof/version.rb +1 -1
  46. data/lib/typeprof.rb +4 -18
  47. data/typeprof.gemspec +5 -7
  48. metadata +47 -33
  49. data/.github/dependabot.yml +0 -6
  50. data/.github/workflows/main.yml +0 -39
  51. data/.gitignore +0 -9
  52. data/Gemfile +0 -17
  53. data/Gemfile.lock +0 -41
  54. data/Rakefile +0 -10
  55. data/exe/typeprof +0 -10
  56. data/lib/typeprof/analyzer.rb +0 -2598
  57. data/lib/typeprof/arguments.rb +0 -414
  58. data/lib/typeprof/block.rb +0 -176
  59. data/lib/typeprof/builtin.rb +0 -893
  60. data/lib/typeprof/code-range.rb +0 -177
  61. data/lib/typeprof/config.rb +0 -158
  62. data/lib/typeprof/container-type.rb +0 -912
  63. data/lib/typeprof/export.rb +0 -589
  64. data/lib/typeprof/import.rb +0 -852
  65. data/lib/typeprof/insns-def.rb +0 -65
  66. data/lib/typeprof/iseq.rb +0 -864
  67. data/lib/typeprof/method.rb +0 -355
  68. data/lib/typeprof/type.rb +0 -1140
  69. data/lib/typeprof/utils.rb +0 -212
  70. data/tools/coverage.rb +0 -14
  71. data/tools/setup-insns-def.rb +0 -30
  72. data/typeprof-lsp +0 -3
@@ -0,0 +1,123 @@
1
+ module TypeProf::Core
2
+ class AST
3
+ class ModuleBaseNode < Node
4
+ def initialize(raw_node, lenv, raw_cpath, meta, raw_scope, use_result)
5
+ super(raw_node, lenv)
6
+
7
+ @cpath = AST.create_node(raw_cpath, lenv)
8
+ @static_cpath = AST.parse_cpath(raw_cpath, lenv.cref)
9
+ @tbl = raw_node.locals
10
+
11
+ # TODO: class Foo < Struct.new(:foo, :bar)
12
+
13
+ if @static_cpath
14
+ ncref = CRef.new(@static_cpath, meta ? :metaclass : :class, nil, lenv.cref)
15
+ nlenv = LocalEnv.new(@lenv.path, ncref, {}, [])
16
+ @body = raw_scope ? AST.create_node(raw_scope, nlenv, use_result) : DummyNilNode.new(code_range, lenv)
17
+ else
18
+ @body = nil
19
+ end
20
+
21
+ @cname_code_range = meta ? nil : TypeProf::CodeRange.from_node(raw_node.constant_path)
22
+ end
23
+
24
+ attr_reader :tbl, :cpath, :static_cpath, :cname_code_range, :body
25
+
26
+ def subnodes = { cpath:, body: }
27
+ def attrs = { static_cpath:, tbl: }
28
+
29
+ def define0(genv)
30
+ @cpath.define(genv)
31
+ if @static_cpath
32
+ @body.define(genv)
33
+ @mod = genv.resolve_cpath(@static_cpath)
34
+ @mod_cdef = @mod.add_module_def(genv, self)
35
+ else
36
+ kind = self.is_a?(ModuleNode) ? "module" : "class"
37
+ @changes.add_diagnostic(:code_range, "TypeProf cannot analyze a non-static #{ kind }") # warning
38
+ nil
39
+ end
40
+ end
41
+
42
+ def define_copy(genv)
43
+ if @static_cpath
44
+ @mod_cdef.add_def(self)
45
+ @mod_cdef.remove_def(@prev_node)
46
+ end
47
+ super(genv)
48
+ end
49
+
50
+ def undefine0(genv)
51
+ if @static_cpath
52
+ @mod.remove_module_def(genv, self)
53
+ @body.undefine(genv)
54
+ end
55
+ @cpath.undefine(genv)
56
+ end
57
+
58
+ def install0(genv)
59
+ @cpath.install(genv)
60
+ if @static_cpath
61
+ @tbl.each {|var| @body.lenv.locals[var] = Source.new(genv.nil_type) }
62
+ @body.lenv.locals[:"*self"] = @body.lenv.cref.get_self(genv)
63
+
64
+ @mod_val = Source.new(Type::Singleton.new(genv, genv.resolve_cpath(@static_cpath)))
65
+ @changes.add_edge(genv, @mod_val, @mod_cdef.vtx)
66
+ ret = Vertex.new(self)
67
+ @changes.add_edge(genv, @body.install(genv), ret)
68
+ ret
69
+ else
70
+ Source.new
71
+ end
72
+ end
73
+
74
+ def modified_vars(tbl, vars)
75
+ # skip
76
+ end
77
+ end
78
+
79
+ class ModuleNode < ModuleBaseNode
80
+ def initialize(raw_node, lenv, use_result)
81
+ super(raw_node, lenv, raw_node.constant_path, false, raw_node.body, use_result)
82
+ end
83
+ end
84
+
85
+ class ClassNode < ModuleBaseNode
86
+ def initialize(raw_node, lenv, use_result)
87
+ super(raw_node, lenv, raw_node.constant_path, false, raw_node.body, use_result)
88
+ raw_superclass = raw_node.superclass
89
+ @superclass_cpath = raw_superclass ? AST.create_node(raw_superclass, lenv) : nil
90
+ end
91
+
92
+ attr_reader :superclass_cpath
93
+
94
+ def subnodes
95
+ super.merge!({ superclass_cpath: })
96
+ end
97
+
98
+ def define0(genv)
99
+ if @static_cpath && @superclass_cpath
100
+ const = @superclass_cpath.define(genv)
101
+ const.followers << genv.resolve_cpath(@static_cpath) if const
102
+ end
103
+ super(genv)
104
+ end
105
+
106
+ def undefine0(genv)
107
+ super(genv)
108
+ @superclass_cpath.undefine(genv) if @superclass_cpath
109
+ end
110
+
111
+ def install0(genv)
112
+ @superclass_cpath.install(genv) if @superclass_cpath
113
+ super(genv)
114
+ end
115
+ end
116
+
117
+ class SingletonClassNode < ModuleBaseNode
118
+ def initialize(raw_node, lenv, use_result)
119
+ super(raw_node, lenv, raw_node.expression, true, raw_node.body, use_result)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,140 @@
1
+ module TypeProf::Core
2
+ class AST
3
+ class ArrayPatternNode < Node
4
+ def initialize(raw_node, lenv)
5
+ super(raw_node, lenv)
6
+ @requireds = raw_node.requireds.map {|raw_pat| AST.create_pattern_node(raw_pat, lenv) }
7
+ @rest = !!raw_node.rest
8
+ @rest_pattern = raw_node.rest && raw_node.rest.expression ? AST.create_pattern_node(raw_node.rest.expression, lenv) : nil
9
+ @posts = raw_node.posts.map {|raw_pat| AST.create_pattern_node(raw_pat, lenv) }
10
+ end
11
+
12
+ attr_reader :requireds, :rest, :rest_pattern, :posts
13
+
14
+ def attrs = { rest: }
15
+ def subnodes = { requireds:, rest_pattern:, posts: }
16
+
17
+ def install0(genv)
18
+ @requireds.each do |pat|
19
+ pat.install(genv)
20
+ end
21
+ @rest_pattern.install(genv) if @rest_pattern
22
+ @posts.each do |pat|
23
+ pat.install(genv)
24
+ end
25
+ end
26
+ end
27
+
28
+ class HashPatternNode < Node
29
+ def initialize(raw_node, lenv)
30
+ super(raw_node, lenv)
31
+ @keys = raw_node.elements.map {|raw_assoc| raw_assoc.key.value.to_sym }
32
+ @values = raw_node.elements.map {|raw_assoc| AST.create_pattern_node(raw_assoc.value, lenv) }
33
+ @rest = !!raw_node.rest
34
+ @rest_pattern = raw_node.rest && raw_node.rest.value ? AST.create_pattern_node(raw_node.rest.value, lenv) : nil
35
+ end
36
+
37
+ attr_reader :keys, :values, :rest, :rest_pattern
38
+
39
+ def attrs = { keys:, rest: }
40
+ def subnodes = { values:, rest_pattern: }
41
+
42
+ def install0(genv)
43
+ @values.each do |pat|
44
+ pat.install(genv)
45
+ end
46
+ @rest_pattern.install(genv) if @rest_pattern
47
+ end
48
+ end
49
+
50
+ class FindPatternNode < Node
51
+ def initialize(raw_node, lenv)
52
+ super(raw_node, lenv)
53
+ @left = raw_node.left ? AST.create_pattern_node(raw_node.left.expression, lenv) : nil
54
+ @requireds = raw_node.requireds.map {|raw_elem| AST.create_pattern_node(raw_elem, lenv) }
55
+ @right = raw_node.right ? AST.create_pattern_node(raw_node.right.expression, lenv) : nil
56
+ end
57
+
58
+ attr_reader :left, :requireds, :right
59
+
60
+ def subnodes = { left:, requireds:, right: }
61
+
62
+ def install0(genv)
63
+ @left.install(genv) if @left
64
+ @requireds.each do |pat|
65
+ pat.install(genv)
66
+ end
67
+ @right.install(genv) if @right
68
+ end
69
+ end
70
+
71
+ class AltPatternNode < Node
72
+ def initialize(raw_node, lenv)
73
+ super(raw_node, lenv)
74
+ @left = AST.create_pattern_node(raw_node.left, lenv)
75
+ @right = AST.create_pattern_node(raw_node.right, lenv)
76
+ end
77
+
78
+ attr_reader :left, :right
79
+
80
+ def subnodes = { left:, right: }
81
+
82
+ def install0(genv)
83
+ @left.install(genv)
84
+ @right.install(genv)
85
+ end
86
+ end
87
+
88
+ class CapturePatternNode < Node
89
+ def initialize(raw_node, lenv)
90
+ super(raw_node, lenv)
91
+ @value = AST.create_pattern_node(raw_node.value, lenv)
92
+ @target = AST.create_pattern_node(raw_node.target, lenv)
93
+ end
94
+
95
+ attr_reader :value, :target
96
+
97
+ def subnodes = { value:, target: }
98
+
99
+ def install0(genv)
100
+ @value.install(genv)
101
+ @target.install(genv)
102
+ end
103
+ end
104
+
105
+ class IfPatternNode < Node
106
+ def initialize(raw_node, lenv)
107
+ super(raw_node, lenv)
108
+ @cond = AST.create_node(raw_node.predicate, lenv)
109
+ raise if raw_node.statements.type != :statements_node
110
+ raise if raw_node.statements.body.size != 1
111
+ @body = AST.create_pattern_node(raw_node.statements.body[0], lenv)
112
+ raise if raw_node.subsequent
113
+ end
114
+
115
+ attr_reader :cond, :body
116
+
117
+ def subnodes = { cond:, body: }
118
+
119
+ def install0(genv)
120
+ @cond.install(genv)
121
+ @body.install(genv)
122
+ end
123
+ end
124
+
125
+ class PinnedPatternNode < Node
126
+ def initialize(raw_node, lenv)
127
+ super(raw_node, lenv)
128
+ @expr = AST.create_node(raw_node.type == :pinned_variable_node ? raw_node.variable : raw_node.expression, lenv)
129
+ end
130
+
131
+ attr_reader :expr
132
+
133
+ def subnodes = { expr: }
134
+
135
+ def install0(genv)
136
+ @expr.install(genv)
137
+ end
138
+ end
139
+ end
140
+ end