typeprof 0.21.11 → 0.30.1

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 (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