gloss 0.0.3 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +3 -0
- data/.github/workflows/{crystal.yml → crystal_specs.yml} +1 -1
- data/.github/workflows/{ruby.yml → ruby_specs.yml} +2 -2
- data/.gloss.yml +1 -0
- data/.rspec +1 -0
- data/Gemfile.lock +10 -12
- data/README.md +36 -5
- data/Rakefile +1 -1
- data/exe/gloss +13 -2
- data/ext/gloss/Makefile +8 -19
- data/ext/gloss/{src/lib → lib}/cr_ruby.cr +0 -0
- data/ext/gloss/lib/rbs_types.cr +3 -0
- data/ext/gloss/spec/parser_spec.cr +83 -83
- data/ext/gloss/src/cr_ast.cr +96 -77
- data/ext/gloss/src/gloss.cr +2 -2
- data/ext/gloss/src/lexer.cr +59 -1
- data/ext/gloss/src/rb_ast.cr +114 -63
- data/lib/gloss.rb +15 -7
- data/lib/gloss/cli.rb +85 -28
- data/lib/gloss/config.rb +13 -7
- data/lib/gloss/errors.rb +3 -4
- data/lib/gloss/initializer.rb +9 -9
- data/lib/gloss/logger.rb +29 -0
- data/lib/gloss/parser.rb +19 -5
- data/lib/gloss/prog_loader.rb +141 -0
- data/lib/gloss/scope.rb +7 -2
- data/lib/gloss/source.rb +17 -14
- data/lib/gloss/type_checker.rb +86 -33
- data/lib/gloss/utils.rb +44 -0
- data/lib/gloss/version.rb +1 -2
- data/lib/gloss/visitor.rb +667 -0
- data/lib/gloss/watcher.rb +51 -16
- data/lib/gloss/writer.rb +24 -15
- data/sig/core.rbs +2 -0
- data/sig/fast_blank.rbs +4 -0
- data/sig/{gloss.rbs → gls.rbs} +0 -0
- data/sig/listen.rbs +1 -0
- data/sig/optparse.rbs +6 -0
- data/sig/rubygems.rbs +9 -0
- data/sig/yaml.rbs +3 -0
- data/src/exe/gloss +19 -0
- data/src/lib/gloss.gl +26 -0
- data/src/lib/gloss/cli.gl +70 -0
- data/src/lib/gloss/config.gl +9 -3
- data/src/lib/gloss/initializer.gl +4 -6
- data/src/lib/gloss/logger.gl +21 -0
- data/src/lib/gloss/parser.gl +17 -5
- data/src/lib/gloss/prog_loader.gl +133 -0
- data/src/lib/gloss/scope.gl +7 -0
- data/src/lib/gloss/source.gl +32 -0
- data/src/lib/gloss/type_checker.gl +85 -36
- data/src/lib/gloss/utils.gl +38 -0
- data/src/lib/gloss/version.gl +1 -1
- data/src/lib/gloss/visitor.gl +575 -0
- data/src/lib/gloss/watcher.gl +44 -10
- data/src/lib/gloss/writer.gl +16 -14
- metadata +28 -8
- data/lib/gloss/builder.rb +0 -447
data/ext/gloss/src/gloss.cr
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require "
|
1
|
+
require "../lib/cr_ruby"
|
2
|
+
require "../lib/rbs_types"
|
2
3
|
require "./cr_ast"
|
3
4
|
require "./rb_ast"
|
4
5
|
require "./parser"
|
@@ -10,7 +11,6 @@ def parse_string(self : CrRuby::VALUE, str : CrRuby::VALUE)
|
|
10
11
|
output = begin
|
11
12
|
Gloss.parse_string(string)
|
12
13
|
rescue e : Crystal::SyntaxException
|
13
|
-
pp e.backtrace
|
14
14
|
e.to_s
|
15
15
|
end
|
16
16
|
|
data/ext/gloss/src/lexer.cr
CHANGED
@@ -115,7 +115,7 @@ module Crystal
|
|
115
115
|
case next_char
|
116
116
|
when '='
|
117
117
|
next_char :"<<="
|
118
|
-
when '-'
|
118
|
+
when '-', '~'
|
119
119
|
has_single_quote = false
|
120
120
|
found_closing_single_quote = false
|
121
121
|
|
@@ -1182,5 +1182,63 @@ module Crystal
|
|
1182
1182
|
|
1183
1183
|
@token
|
1184
1184
|
end
|
1185
|
+
|
1186
|
+
def check_heredoc_start
|
1187
|
+
return nil unless current_char == '<' && next_char == '<' && {'-', '~'}.includes?(next_char)
|
1188
|
+
|
1189
|
+
has_single_quote = false
|
1190
|
+
found_closing_single_quote = false
|
1191
|
+
|
1192
|
+
char = next_char
|
1193
|
+
start_here = current_pos
|
1194
|
+
|
1195
|
+
if char == '\''
|
1196
|
+
has_single_quote = true
|
1197
|
+
char = next_char
|
1198
|
+
start_here = current_pos
|
1199
|
+
end
|
1200
|
+
|
1201
|
+
return nil unless ident_part?(char)
|
1202
|
+
|
1203
|
+
end_here = 0
|
1204
|
+
|
1205
|
+
while true
|
1206
|
+
char = next_char
|
1207
|
+
case
|
1208
|
+
when char == '\r'
|
1209
|
+
if peek_next_char == '\n'
|
1210
|
+
end_here = current_pos
|
1211
|
+
next_char
|
1212
|
+
break
|
1213
|
+
else
|
1214
|
+
return nil
|
1215
|
+
end
|
1216
|
+
when char == '\n'
|
1217
|
+
end_here = current_pos
|
1218
|
+
break
|
1219
|
+
when ident_part?(char)
|
1220
|
+
# ok
|
1221
|
+
when char == '\0'
|
1222
|
+
return nil
|
1223
|
+
else
|
1224
|
+
if char == '\'' && has_single_quote
|
1225
|
+
found_closing_single_quote = true
|
1226
|
+
end_here = current_pos
|
1227
|
+
next_char
|
1228
|
+
break
|
1229
|
+
elsif has_single_quote
|
1230
|
+
# wait until another quote
|
1231
|
+
else
|
1232
|
+
end_here = current_pos
|
1233
|
+
break
|
1234
|
+
end
|
1235
|
+
end
|
1236
|
+
end
|
1237
|
+
|
1238
|
+
return nil if has_single_quote && !found_closing_single_quote
|
1239
|
+
|
1240
|
+
here = string_range(start_here, end_here)
|
1241
|
+
Token::DelimiterState.new(:heredoc, here, here, allow_escapes: !has_single_quote)
|
1242
|
+
end
|
1185
1243
|
end
|
1186
1244
|
end
|
data/ext/gloss/src/rb_ast.cr
CHANGED
@@ -19,7 +19,7 @@ module Rb
|
|
19
19
|
abstract class NodeWithChildren < Node
|
20
20
|
@info : NamedTuple(type: String, children: Array(Node))
|
21
21
|
|
22
|
-
def initialize(@children : Array(Node))
|
22
|
+
def initialize(@children : Array(Node), location : Crystal::Location?)
|
23
23
|
@info = {
|
24
24
|
type: self.class.name.split("::").last,
|
25
25
|
children: @children,
|
@@ -32,7 +32,7 @@ module Rb
|
|
32
32
|
abstract class NodeWithValue < Node
|
33
33
|
@info : NamedTuple(type: String, value: String)
|
34
34
|
|
35
|
-
def initialize(@value : String)
|
35
|
+
def initialize(@value : String, location : Crystal::Location?)
|
36
36
|
@info = {
|
37
37
|
type: self.class.name.split("::").last,
|
38
38
|
value: @value,
|
@@ -43,13 +43,14 @@ module Rb
|
|
43
43
|
end
|
44
44
|
|
45
45
|
class Block < Node
|
46
|
-
@info : NamedTuple(type: String,
|
46
|
+
@info : NamedTuple(type: String, positional_args: Array(Var), body: Node, rest_p_args: Node?)
|
47
47
|
|
48
|
-
def initialize(args, body)
|
48
|
+
def initialize(args, splat, body, location : Crystal::Location?)
|
49
49
|
@info = {
|
50
50
|
type: self.class.name.split("::").last,
|
51
51
|
body: body,
|
52
|
-
|
52
|
+
positional_args: args,
|
53
|
+
rest_p_args: splat
|
53
54
|
}
|
54
55
|
end
|
55
56
|
|
@@ -62,7 +63,7 @@ module Rb
|
|
62
63
|
class ClassNode < Node
|
63
64
|
@info : NamedTuple(type: String, name: Path, body: Node, superclass: Node?, type_vars: Array(String)?, abstract: Bool)
|
64
65
|
|
65
|
-
def initialize(name : Path, body : Node, superclass : Node?, type_vars : Array(String)?, abstr : Bool)
|
66
|
+
def initialize(name : Path, body : Node, superclass : Node?, type_vars : Array(String)?, abstr : Bool, location : Crystal::Location?)
|
66
67
|
@info = {
|
67
68
|
type: self.class.name.split("::").last,
|
68
69
|
name: name,
|
@@ -80,7 +81,7 @@ module Rb
|
|
80
81
|
class ModuleNode < Node
|
81
82
|
@info : NamedTuple(type: String, name: Path, body: Node, type_vars: Array(String)?)
|
82
83
|
|
83
|
-
def initialize(name : Path, body : Node, type_vars : Array(String)?)
|
84
|
+
def initialize(name : Path, body : Node, type_vars : Array(String)?, location : Crystal::Location?)
|
84
85
|
@info = {
|
85
86
|
type: self.class.name.split("::").last,
|
86
87
|
name: name,
|
@@ -94,18 +95,32 @@ module Rb
|
|
94
95
|
end
|
95
96
|
|
96
97
|
class DefNode < Node
|
97
|
-
@info : NamedTuple(type: String, name: String, body: Node,
|
98
|
-
return_type: Node?, rest_kw_args: Arg?)
|
98
|
+
@info : NamedTuple(type: String, name: String, body: Node, positional_args: Array(Arg), receiver: Node?,
|
99
|
+
return_type: Node?, rest_kw_args: Arg?, rest_p_args: Arg?, block_arg: Node?, yield_arg_count: Int32?)
|
99
100
|
|
100
|
-
def initialize(
|
101
|
+
def initialize(
|
102
|
+
receiver : Node?,
|
103
|
+
name : String,
|
104
|
+
positional_args : Array(Arg),
|
105
|
+
splat,
|
106
|
+
rest_kw_args,
|
107
|
+
body : Node,
|
108
|
+
return_type : Node?,
|
109
|
+
yields : Int32?,
|
110
|
+
block_arg : Node?,
|
111
|
+
location : Crystal::Location?
|
112
|
+
)
|
101
113
|
@info = {
|
102
|
-
type:
|
103
|
-
name:
|
104
|
-
body:
|
105
|
-
|
106
|
-
rest_kw_args:
|
107
|
-
receiver:
|
108
|
-
return_type:
|
114
|
+
type: self.class.name.split("::").last,
|
115
|
+
name: name,
|
116
|
+
body: body,
|
117
|
+
positional_args: positional_args,
|
118
|
+
rest_kw_args: rest_kw_args,
|
119
|
+
receiver: receiver,
|
120
|
+
return_type: return_type,
|
121
|
+
rest_p_args: splat,
|
122
|
+
yield_arg_count: yields,
|
123
|
+
block_arg: block_arg
|
109
124
|
}
|
110
125
|
end
|
111
126
|
|
@@ -116,15 +131,15 @@ module Rb
|
|
116
131
|
@info : NamedTuple(type: String, name: String, external_name: String, value: Node?,
|
117
132
|
restriction: Node?, keyword_arg: Bool)
|
118
133
|
|
119
|
-
def initialize(name : String, external_name : String, restriction : Node?, value :
|
120
|
-
|
134
|
+
def initialize(name : String, external_name : String, restriction : Node?, value : Node?,
|
135
|
+
keyword_arg, location : Crystal::Location?)
|
121
136
|
@info = {
|
122
137
|
type: self.class.name.split("::").last,
|
123
138
|
name: name,
|
124
139
|
restriction: restriction,
|
125
|
-
value:
|
140
|
+
value: value,
|
126
141
|
external_name: external_name,
|
127
|
-
keyword_arg:
|
142
|
+
keyword_arg: keyword_arg,
|
128
143
|
}
|
129
144
|
end
|
130
145
|
|
@@ -134,7 +149,7 @@ module Rb
|
|
134
149
|
class LiteralNode < Node
|
135
150
|
@info : NamedTuple(type: String, value: String | Int32 | Bool | Nil, rb_type: String)
|
136
151
|
|
137
|
-
def initialize(value, rb_type : RbLiteral)
|
152
|
+
def initialize(value, rb_type : RbLiteral, location : Crystal::Location?)
|
138
153
|
val = case rb_type
|
139
154
|
when Rb::AST::RbLiteral::TrueClass
|
140
155
|
true
|
@@ -160,7 +175,7 @@ module Rb
|
|
160
175
|
class ArrayLiteral < Node
|
161
176
|
@info : NamedTuple(type: String, elements: Array(Node), frozen: Bool)
|
162
177
|
|
163
|
-
def initialize(elems, frozen = false)
|
178
|
+
def initialize(elems, location : Crystal::Location?, frozen = false)
|
164
179
|
@info = {
|
165
180
|
type: self.class.name.split("::").last,
|
166
181
|
elements: elems,
|
@@ -174,7 +189,7 @@ module Rb
|
|
174
189
|
class HashLiteral < Node
|
175
190
|
@info : NamedTuple(type: String, elements: Array(Tuple(Node, Node)) | Array(Tuple(String, Node)), frozen: Bool)
|
176
191
|
|
177
|
-
def initialize(elems, frozen = false)
|
192
|
+
def initialize(elems, location : Crystal::Location?, frozen = false)
|
178
193
|
@info = {
|
179
194
|
type: self.class.name.split("::").last,
|
180
195
|
elements: elems,
|
@@ -188,7 +203,7 @@ module Rb
|
|
188
203
|
class RangeLiteral < Node
|
189
204
|
@info : NamedTuple(type: String, from: Node, to: Node, exclusive: Bool)
|
190
205
|
|
191
|
-
def initialize(from, to, exclusive)
|
206
|
+
def initialize(from, to, exclusive, location : Crystal::Location?)
|
192
207
|
@info = {
|
193
208
|
type: self.class.name.split("::").last,
|
194
209
|
from: from,
|
@@ -203,7 +218,7 @@ module Rb
|
|
203
218
|
class RegexLiteral < Node
|
204
219
|
@info : NamedTuple(type: String, value: Node)
|
205
220
|
|
206
|
-
def initialize(value)
|
221
|
+
def initialize(value, location : Crystal::Location?)
|
207
222
|
@info = {
|
208
223
|
type: self.class.name.split("::").last,
|
209
224
|
value: value,
|
@@ -224,7 +239,7 @@ module Rb
|
|
224
239
|
end
|
225
240
|
|
226
241
|
class EmptyNode < Nop
|
227
|
-
def initialize(class_name : String)
|
242
|
+
def initialize(class_name : String, location : Crystal::Location?)
|
228
243
|
STDERR.puts "Encountered a ruby EmptyNode class name: #{class_name}"
|
229
244
|
@info = {
|
230
245
|
type: self.class.name.split("::").last,
|
@@ -235,7 +250,7 @@ module Rb
|
|
235
250
|
class Var < Node
|
236
251
|
@info : NamedTuple(type: String, name: String)
|
237
252
|
|
238
|
-
def initialize(@name : String)
|
253
|
+
def initialize(@name : String, location : Crystal::Location?)
|
239
254
|
@info = {
|
240
255
|
type: self.class.name.split("::").last,
|
241
256
|
name: @name,
|
@@ -254,7 +269,7 @@ module Rb
|
|
254
269
|
abstract class Conditional < Node
|
255
270
|
@info : NamedTuple(type: String, condition: Node, then: Node, else: Node)
|
256
271
|
|
257
|
-
def initialize(@condition : Node, @thn : Node, @els : Node)
|
272
|
+
def initialize(@condition : Node, @thn : Node, @els : Node, location : Crystal::Location?)
|
258
273
|
@info = {
|
259
274
|
type: self.class.name.split("::").last,
|
260
275
|
condition: @condition,
|
@@ -275,7 +290,7 @@ module Rb
|
|
275
290
|
class Case < Node
|
276
291
|
@info : NamedTuple(type: String, condition: Node?, whens: Array(When), else: Node?, exhaustive: Bool)
|
277
292
|
|
278
|
-
def initialize(cond : Node?, whens : Array(When), els : Node?, exhaustive : Bool)
|
293
|
+
def initialize(cond : Node?, whens : Array(When), els : Node?, exhaustive : Bool, location : Crystal::Location?)
|
279
294
|
@info = {
|
280
295
|
type: self.class.name.split("::").last,
|
281
296
|
condition: cond,
|
@@ -291,7 +306,7 @@ module Rb
|
|
291
306
|
class When < Node
|
292
307
|
@info : NamedTuple(type: String, conditions: Array(Node), body: Node, exhaustive: Bool)
|
293
308
|
|
294
|
-
def initialize(conds : Array(Node), body : Node, exhaustive : Bool)
|
309
|
+
def initialize(conds : Array(Node), body : Node, exhaustive : Bool, location : Crystal::Location?)
|
295
310
|
@info = {
|
296
311
|
type: self.class.name.split("::").last,
|
297
312
|
conditions: conds,
|
@@ -306,7 +321,7 @@ module Rb
|
|
306
321
|
class Enum < Node
|
307
322
|
@info : NamedTuple(type: String, name: Crystal::Path, members: Array(Node))
|
308
323
|
|
309
|
-
def initialize(@name : Crystal::Path, @members : Array(Node))
|
324
|
+
def initialize(@name : Crystal::Path, @members : Array(Node), location : Crystal::Location?)
|
310
325
|
@info = {
|
311
326
|
type: self.class.name.split("::").last,
|
312
327
|
name: @name,
|
@@ -318,18 +333,18 @@ module Rb
|
|
318
333
|
end
|
319
334
|
|
320
335
|
class Call < Node
|
321
|
-
@info : NamedTuple(type: String, name: String, args: Array(Node), object: Node?, block:
|
322
|
-
Block?, block_arg: Node?, named_args: Array(Arg)?)
|
336
|
+
@info : NamedTuple(type: String, name: String, args: Array(Node), object: Node?, block: Block?, block_arg: Node?, named_args: Array(Arg)?, has_parentheses: Bool)
|
323
337
|
|
324
|
-
def initialize(object : Node?, name : String, args : Array(Node), named_args, block, block_arg)
|
338
|
+
def initialize(object : Node?, name : String, args : Array(Node), named_args, block, block_arg, has_parentheses, location : Crystal::Location?)
|
325
339
|
@info = {
|
326
|
-
type:
|
327
|
-
name:
|
328
|
-
args:
|
329
|
-
object:
|
330
|
-
block:
|
331
|
-
block_arg:
|
332
|
-
named_args:
|
340
|
+
type: self.class.name.split("::").last,
|
341
|
+
name: name,
|
342
|
+
args: args,
|
343
|
+
object: object,
|
344
|
+
block: block,
|
345
|
+
block_arg: block_arg,
|
346
|
+
named_args: named_args,
|
347
|
+
has_parentheses: has_parentheses || false,
|
333
348
|
}
|
334
349
|
end
|
335
350
|
|
@@ -345,7 +360,7 @@ module Rb
|
|
345
360
|
class StringInterpolation < Node
|
346
361
|
@info : NamedTuple(type: String, contents: Array(Node))
|
347
362
|
|
348
|
-
def initialize(contents)
|
363
|
+
def initialize(contents, location : Crystal::Location?)
|
349
364
|
@info = {
|
350
365
|
type: self.class.name.split("::").last,
|
351
366
|
contents: contents,
|
@@ -358,7 +373,7 @@ module Rb
|
|
358
373
|
class UnaryExpr < Node
|
359
374
|
@info : NamedTuple(type: String, op: String, value: Node, with_parens: Bool)
|
360
375
|
|
361
|
-
def initialize(val, op, parens)
|
376
|
+
def initialize(val, op, parens, location : Crystal::Location?)
|
362
377
|
@info = {
|
363
378
|
type: self.class.name.split("::").last,
|
364
379
|
value: val,
|
@@ -373,7 +388,7 @@ module Rb
|
|
373
388
|
class BinaryOp < Node
|
374
389
|
@info : NamedTuple(type: String, op: String, left: Node, right: Node)
|
375
390
|
|
376
|
-
def initialize(op, left, right)
|
391
|
+
def initialize(op, left, right, location : Crystal::Location?)
|
377
392
|
@info = {
|
378
393
|
type: self.class.name.split("::").last,
|
379
394
|
left: left,
|
@@ -388,7 +403,7 @@ module Rb
|
|
388
403
|
class Assign < Node
|
389
404
|
@info : NamedTuple(type: String, op: String?, target: Node, value: Node)
|
390
405
|
|
391
|
-
def initialize(target, value, op
|
406
|
+
def initialize(target, value, op, location : Crystal::Location?)
|
392
407
|
@info = {
|
393
408
|
type: self.class.name.split("::").last,
|
394
409
|
target: target,
|
@@ -400,10 +415,24 @@ module Rb
|
|
400
415
|
delegate :to_json, to: @info
|
401
416
|
end
|
402
417
|
|
418
|
+
class MultiAssign < Node
|
419
|
+
@info : NamedTuple(type: String, targets: Array(Node), values: Array(Node))
|
420
|
+
|
421
|
+
def initialize(targets, values, location : Crystal::Location?)
|
422
|
+
@info = {
|
423
|
+
type: self.class.name.split("::").last,
|
424
|
+
targets: targets,
|
425
|
+
values: values,
|
426
|
+
}
|
427
|
+
end
|
428
|
+
|
429
|
+
delegate :to_json, to: @info
|
430
|
+
end
|
431
|
+
|
403
432
|
class TypeDeclaration < Node
|
404
433
|
@info : NamedTuple(type: String, var: Node, declared_type: Node, value: Node?, var_type: String)
|
405
434
|
|
406
|
-
def initialize(@var : Node, @declared_type : Node, @value : Node?)
|
435
|
+
def initialize(@var : Node, @declared_type : Node, @value : Node?, location : Crystal::Location?)
|
407
436
|
@info = {
|
408
437
|
type: self.class.name.split("::").last,
|
409
438
|
var: @var,
|
@@ -419,7 +448,7 @@ module Rb
|
|
419
448
|
class MacroFor < Node
|
420
449
|
@info : NamedTuple(type: String, vars: Array(Var), expr: Node, body: Node)
|
421
450
|
|
422
|
-
def initialize(vars, expr, body)
|
451
|
+
def initialize(vars, expr, body, location : Crystal::Location?)
|
423
452
|
@info = {
|
424
453
|
type: self.class.name.split("::").last,
|
425
454
|
vars: vars,
|
@@ -440,7 +469,7 @@ module Rb
|
|
440
469
|
class MacroExpression < Node
|
441
470
|
@info : NamedTuple(type: String, expr: Node, output: Bool)
|
442
471
|
|
443
|
-
def initialize(expr, output)
|
472
|
+
def initialize(expr, output, location : Crystal::Location?)
|
444
473
|
@info = {
|
445
474
|
type: self.class.name.split("::").last,
|
446
475
|
expr: expr,
|
@@ -454,7 +483,7 @@ module Rb
|
|
454
483
|
class ControlExpression < Node
|
455
484
|
@info : NamedTuple(type: String, value: Node?)
|
456
485
|
|
457
|
-
def initialize(value)
|
486
|
+
def initialize(value, location : Crystal::Location?)
|
458
487
|
@info = {
|
459
488
|
type: self.class.name.split("::").last,
|
460
489
|
value: value,
|
@@ -477,7 +506,7 @@ module Rb
|
|
477
506
|
@info : NamedTuple(type: String, body: Node, rescues: Array(Rescue)?, else: Node?,
|
478
507
|
ensure: Node?)
|
479
508
|
|
480
|
-
def initialize(body, rescues, else_node, ensure_node)
|
509
|
+
def initialize(body, rescues, else_node, ensure_node, location : Crystal::Location?)
|
481
510
|
@info = {
|
482
511
|
type: self.class.name.split("::").last,
|
483
512
|
body: body,
|
@@ -493,7 +522,7 @@ module Rb
|
|
493
522
|
class Rescue < Node
|
494
523
|
@info : NamedTuple(type: String, body: Node, types: Array(Node)?, name: String?)
|
495
524
|
|
496
|
-
def initialize(body, types, name)
|
525
|
+
def initialize(body, types, name, location : Crystal::Location?)
|
497
526
|
@info = {
|
498
527
|
type: self.class.name.split("::").last,
|
499
528
|
body: body,
|
@@ -508,10 +537,10 @@ module Rb
|
|
508
537
|
class Union < Node
|
509
538
|
@info : NamedTuple(type: String, types: Array(Node))
|
510
539
|
|
511
|
-
def initialize(types)
|
540
|
+
def initialize(types, location : Crystal::Location?)
|
512
541
|
@info = {
|
513
542
|
type: self.class.name.split("::").last,
|
514
|
-
types: types
|
543
|
+
types: types,
|
515
544
|
}
|
516
545
|
end
|
517
546
|
|
@@ -521,11 +550,11 @@ module Rb
|
|
521
550
|
class Generic < Node
|
522
551
|
@info : NamedTuple(type: String, name: Node, args: Array(Node))
|
523
552
|
|
524
|
-
def initialize(name, args)
|
553
|
+
def initialize(name, args, location : Crystal::Location?)
|
525
554
|
@info = {
|
526
|
-
type:
|
555
|
+
type: self.class.name.split("::").last,
|
527
556
|
name: name,
|
528
|
-
args: args
|
557
|
+
args: args,
|
529
558
|
}
|
530
559
|
end
|
531
560
|
|
@@ -535,10 +564,10 @@ module Rb
|
|
535
564
|
class Proc < Node
|
536
565
|
@info : NamedTuple(type: String, function: DefNode)
|
537
566
|
|
538
|
-
def initialize(function)
|
567
|
+
def initialize(function, location : Crystal::Location?)
|
539
568
|
@info = {
|
540
|
-
type:
|
541
|
-
function: function
|
569
|
+
type: self.class.name.split("::").last,
|
570
|
+
function: function,
|
542
571
|
}
|
543
572
|
end
|
544
573
|
|
@@ -548,10 +577,10 @@ module Rb
|
|
548
577
|
class NodeWithNameNode < Node
|
549
578
|
@info : NamedTuple(type: String, name: Node)
|
550
579
|
|
551
|
-
def initialize(name)
|
580
|
+
def initialize(name, location : Crystal::Location?)
|
552
581
|
@info = {
|
553
|
-
type:
|
554
|
-
name: name
|
582
|
+
type: self.class.name.split("::").last,
|
583
|
+
name: name,
|
555
584
|
}
|
556
585
|
end
|
557
586
|
|
@@ -563,5 +592,27 @@ module Rb
|
|
563
592
|
|
564
593
|
class Include < NodeWithNameNode
|
565
594
|
end
|
595
|
+
|
596
|
+
class VisibilityModifier < Node
|
597
|
+
@info : NamedTuple(type: String, visibility: String, exp: Node)
|
598
|
+
|
599
|
+
def initialize(visibility : Crystal::Visibility, exp : Node, location : Crystal::Location?)
|
600
|
+
vis = case visibility
|
601
|
+
when Crystal::Visibility::Public
|
602
|
+
"public"
|
603
|
+
when Crystal::Visibility::Protected
|
604
|
+
"protected"
|
605
|
+
when Crystal::Visibility::Private
|
606
|
+
"private"
|
607
|
+
end
|
608
|
+
@info = {
|
609
|
+
type: self.class.name.split("::").last,
|
610
|
+
visibility: vis.as(String),
|
611
|
+
exp: exp,
|
612
|
+
}
|
613
|
+
end
|
614
|
+
|
615
|
+
delegate :to_json, to: @info
|
616
|
+
end
|
566
617
|
end
|
567
618
|
end
|