gloss 0.0.2 → 0.1.0
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} +1 -1
- data/.gloss.yml +1 -0
- data/.rspec +1 -0
- data/Gemfile.lock +25 -27
- data/README.md +36 -5
- data/exe/gloss +13 -2
- 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 -50
- data/ext/gloss/src/cr_ast.cr +146 -72
- data/ext/gloss/src/gloss.cr +2 -2
- data/ext/gloss/src/lexer.cr +59 -1
- data/ext/gloss/src/parser.cr +4 -4
- data/ext/gloss/src/rb_ast.cr +152 -57
- data/lib/gloss.rb +15 -7
- data/lib/gloss/cli.rb +85 -27
- data/lib/gloss/config.rb +18 -10
- data/lib/gloss/errors.rb +13 -7
- data/lib/gloss/initializer.rb +11 -6
- data/lib/gloss/logger.rb +29 -0
- data/lib/gloss/parser.rb +22 -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 +105 -66
- data/lib/gloss/utils.rb +44 -0
- data/lib/gloss/version.rb +6 -1
- data/lib/gloss/visitor.rb +667 -0
- data/lib/gloss/watcher.rb +63 -19
- data/lib/gloss/writer.rb +35 -18
- data/sig/core.rbs +2 -0
- data/sig/fast_blank.rbs +4 -0
- data/sig/gls.rbs +3 -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 +21 -0
- data/src/lib/gloss/errors.gl +11 -0
- data/src/lib/gloss/initializer.gl +20 -0
- data/src/lib/gloss/logger.gl +21 -0
- data/src/lib/gloss/parser.gl +31 -0
- 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 +119 -0
- data/src/lib/gloss/utils.gl +38 -0
- data/src/lib/gloss/version.gl +3 -0
- data/src/lib/gloss/visitor.gl +575 -0
- data/src/lib/gloss/watcher.gl +66 -0
- data/src/lib/gloss/writer.gl +35 -0
- metadata +35 -8
- data/lib/gloss/builder.rb +0 -393
- data/src/lib/hrb/initializer.gl +0 -22
- data/src/lib/hrb/watcher.gl +0 -32
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/parser.cr
CHANGED
@@ -17,10 +17,10 @@ module Gloss
|
|
17
17
|
line = @line_number
|
18
18
|
column = @token.column_number
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
Crystal::ArrayLiteral.new([] of Crystal::ASTNode)
|
20
|
+
next_token_skip_space
|
21
|
+
next_token_skip_space_or_newline
|
22
|
+
of = nil
|
23
|
+
Crystal::ArrayLiteral.new([] of Crystal::ASTNode).at_end(of)
|
24
24
|
end
|
25
25
|
|
26
26
|
def new_hash_literal(entries, line, column, end_location, allow_of = true)
|
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?)
|
99
|
-
|
100
|
-
def initialize(
|
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?)
|
100
|
+
|
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
|
|
@@ -113,18 +128,18 @@ module Rb
|
|
113
128
|
end
|
114
129
|
|
115
130
|
class Arg < Node
|
116
|
-
@info : NamedTuple(type: String, name: String, external_name: String,
|
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?,
|
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
|
-
|
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,
|
@@ -200,7 +215,17 @@ module Rb
|
|
200
215
|
delegate :to_json, to: @info
|
201
216
|
end
|
202
217
|
|
203
|
-
class RegexLiteral <
|
218
|
+
class RegexLiteral < Node
|
219
|
+
@info : NamedTuple(type: String, value: Node)
|
220
|
+
|
221
|
+
def initialize(value, location : Crystal::Location?)
|
222
|
+
@info = {
|
223
|
+
type: self.class.name.split("::").last,
|
224
|
+
value: value,
|
225
|
+
}
|
226
|
+
end
|
227
|
+
|
228
|
+
delegate :to_json, to: @info
|
204
229
|
end
|
205
230
|
|
206
231
|
class Nop < Node
|
@@ -214,7 +239,7 @@ module Rb
|
|
214
239
|
end
|
215
240
|
|
216
241
|
class EmptyNode < Nop
|
217
|
-
def initialize(class_name : String)
|
242
|
+
def initialize(class_name : String, location : Crystal::Location?)
|
218
243
|
STDERR.puts "Encountered a ruby EmptyNode class name: #{class_name}"
|
219
244
|
@info = {
|
220
245
|
type: self.class.name.split("::").last,
|
@@ -225,7 +250,7 @@ module Rb
|
|
225
250
|
class Var < Node
|
226
251
|
@info : NamedTuple(type: String, name: String)
|
227
252
|
|
228
|
-
def initialize(@name : String)
|
253
|
+
def initialize(@name : String, location : Crystal::Location?)
|
229
254
|
@info = {
|
230
255
|
type: self.class.name.split("::").last,
|
231
256
|
name: @name,
|
@@ -244,7 +269,7 @@ module Rb
|
|
244
269
|
abstract class Conditional < Node
|
245
270
|
@info : NamedTuple(type: String, condition: Node, then: Node, else: Node)
|
246
271
|
|
247
|
-
def initialize(@condition : Node, @thn : Node, @els : Node)
|
272
|
+
def initialize(@condition : Node, @thn : Node, @els : Node, location : Crystal::Location?)
|
248
273
|
@info = {
|
249
274
|
type: self.class.name.split("::").last,
|
250
275
|
condition: @condition,
|
@@ -265,7 +290,7 @@ module Rb
|
|
265
290
|
class Case < Node
|
266
291
|
@info : NamedTuple(type: String, condition: Node?, whens: Array(When), else: Node?, exhaustive: Bool)
|
267
292
|
|
268
|
-
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?)
|
269
294
|
@info = {
|
270
295
|
type: self.class.name.split("::").last,
|
271
296
|
condition: cond,
|
@@ -281,7 +306,7 @@ module Rb
|
|
281
306
|
class When < Node
|
282
307
|
@info : NamedTuple(type: String, conditions: Array(Node), body: Node, exhaustive: Bool)
|
283
308
|
|
284
|
-
def initialize(conds : Array(Node), body : Node, exhaustive : Bool)
|
309
|
+
def initialize(conds : Array(Node), body : Node, exhaustive : Bool, location : Crystal::Location?)
|
285
310
|
@info = {
|
286
311
|
type: self.class.name.split("::").last,
|
287
312
|
conditions: conds,
|
@@ -296,7 +321,7 @@ module Rb
|
|
296
321
|
class Enum < Node
|
297
322
|
@info : NamedTuple(type: String, name: Crystal::Path, members: Array(Node))
|
298
323
|
|
299
|
-
def initialize(@name : Crystal::Path, @members : Array(Node))
|
324
|
+
def initialize(@name : Crystal::Path, @members : Array(Node), location : Crystal::Location?)
|
300
325
|
@info = {
|
301
326
|
type: self.class.name.split("::").last,
|
302
327
|
name: @name,
|
@@ -308,16 +333,18 @@ module Rb
|
|
308
333
|
end
|
309
334
|
|
310
335
|
class Call < Node
|
311
|
-
@info : NamedTuple(type: String, name: String, args: Array(Node), object: Node?, block: Block?, block_arg: Node
|
336
|
+
@info : NamedTuple(type: String, name: String, args: Array(Node), object: Node?, block: Block?, block_arg: Node?, named_args: Array(Arg)?, has_parentheses: Bool)
|
312
337
|
|
313
|
-
def initialize(object : Node?, name : String, args : Array(Node), block, block_arg)
|
338
|
+
def initialize(object : Node?, name : String, args : Array(Node), named_args, block, block_arg, has_parentheses, location : Crystal::Location?)
|
314
339
|
@info = {
|
315
|
-
type:
|
316
|
-
name:
|
317
|
-
args:
|
318
|
-
object:
|
319
|
-
block:
|
320
|
-
block_arg:
|
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,
|
321
348
|
}
|
322
349
|
end
|
323
350
|
|
@@ -333,7 +360,7 @@ module Rb
|
|
333
360
|
class StringInterpolation < Node
|
334
361
|
@info : NamedTuple(type: String, contents: Array(Node))
|
335
362
|
|
336
|
-
def initialize(contents)
|
363
|
+
def initialize(contents, location : Crystal::Location?)
|
337
364
|
@info = {
|
338
365
|
type: self.class.name.split("::").last,
|
339
366
|
contents: contents,
|
@@ -346,7 +373,7 @@ module Rb
|
|
346
373
|
class UnaryExpr < Node
|
347
374
|
@info : NamedTuple(type: String, op: String, value: Node, with_parens: Bool)
|
348
375
|
|
349
|
-
def initialize(val, op, parens)
|
376
|
+
def initialize(val, op, parens, location : Crystal::Location?)
|
350
377
|
@info = {
|
351
378
|
type: self.class.name.split("::").last,
|
352
379
|
value: val,
|
@@ -361,7 +388,7 @@ module Rb
|
|
361
388
|
class BinaryOp < Node
|
362
389
|
@info : NamedTuple(type: String, op: String, left: Node, right: Node)
|
363
390
|
|
364
|
-
def initialize(op, left, right)
|
391
|
+
def initialize(op, left, right, location : Crystal::Location?)
|
365
392
|
@info = {
|
366
393
|
type: self.class.name.split("::").last,
|
367
394
|
left: left,
|
@@ -376,7 +403,7 @@ module Rb
|
|
376
403
|
class Assign < Node
|
377
404
|
@info : NamedTuple(type: String, op: String?, target: Node, value: Node)
|
378
405
|
|
379
|
-
def initialize(target, value, op
|
406
|
+
def initialize(target, value, op, location : Crystal::Location?)
|
380
407
|
@info = {
|
381
408
|
type: self.class.name.split("::").last,
|
382
409
|
target: target,
|
@@ -388,10 +415,24 @@ module Rb
|
|
388
415
|
delegate :to_json, to: @info
|
389
416
|
end
|
390
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
|
+
|
391
432
|
class TypeDeclaration < Node
|
392
433
|
@info : NamedTuple(type: String, var: Node, declared_type: Node, value: Node?, var_type: String)
|
393
434
|
|
394
|
-
def initialize(@var : Node, @declared_type : Node, @value : Node?)
|
435
|
+
def initialize(@var : Node, @declared_type : Node, @value : Node?, location : Crystal::Location?)
|
395
436
|
@info = {
|
396
437
|
type: self.class.name.split("::").last,
|
397
438
|
var: @var,
|
@@ -407,7 +448,7 @@ module Rb
|
|
407
448
|
class MacroFor < Node
|
408
449
|
@info : NamedTuple(type: String, vars: Array(Var), expr: Node, body: Node)
|
409
450
|
|
410
|
-
def initialize(vars, expr, body)
|
451
|
+
def initialize(vars, expr, body, location : Crystal::Location?)
|
411
452
|
@info = {
|
412
453
|
type: self.class.name.split("::").last,
|
413
454
|
vars: vars,
|
@@ -428,7 +469,7 @@ module Rb
|
|
428
469
|
class MacroExpression < Node
|
429
470
|
@info : NamedTuple(type: String, expr: Node, output: Bool)
|
430
471
|
|
431
|
-
def initialize(expr, output)
|
472
|
+
def initialize(expr, output, location : Crystal::Location?)
|
432
473
|
@info = {
|
433
474
|
type: self.class.name.split("::").last,
|
434
475
|
expr: expr,
|
@@ -442,7 +483,7 @@ module Rb
|
|
442
483
|
class ControlExpression < Node
|
443
484
|
@info : NamedTuple(type: String, value: Node?)
|
444
485
|
|
445
|
-
def initialize(value)
|
486
|
+
def initialize(value, location : Crystal::Location?)
|
446
487
|
@info = {
|
447
488
|
type: self.class.name.split("::").last,
|
448
489
|
value: value,
|
@@ -465,7 +506,7 @@ module Rb
|
|
465
506
|
@info : NamedTuple(type: String, body: Node, rescues: Array(Rescue)?, else: Node?,
|
466
507
|
ensure: Node?)
|
467
508
|
|
468
|
-
def initialize(body, rescues, else_node, ensure_node)
|
509
|
+
def initialize(body, rescues, else_node, ensure_node, location : Crystal::Location?)
|
469
510
|
@info = {
|
470
511
|
type: self.class.name.split("::").last,
|
471
512
|
body: body,
|
@@ -481,7 +522,7 @@ module Rb
|
|
481
522
|
class Rescue < Node
|
482
523
|
@info : NamedTuple(type: String, body: Node, types: Array(Node)?, name: String?)
|
483
524
|
|
484
|
-
def initialize(body, types, name)
|
525
|
+
def initialize(body, types, name, location : Crystal::Location?)
|
485
526
|
@info = {
|
486
527
|
type: self.class.name.split("::").last,
|
487
528
|
body: body,
|
@@ -496,10 +537,10 @@ module Rb
|
|
496
537
|
class Union < Node
|
497
538
|
@info : NamedTuple(type: String, types: Array(Node))
|
498
539
|
|
499
|
-
def initialize(types)
|
540
|
+
def initialize(types, location : Crystal::Location?)
|
500
541
|
@info = {
|
501
542
|
type: self.class.name.split("::").last,
|
502
|
-
types: types
|
543
|
+
types: types,
|
503
544
|
}
|
504
545
|
end
|
505
546
|
|
@@ -509,11 +550,65 @@ module Rb
|
|
509
550
|
class Generic < Node
|
510
551
|
@info : NamedTuple(type: String, name: Node, args: Array(Node))
|
511
552
|
|
512
|
-
def initialize(name, args)
|
553
|
+
def initialize(name, args, location : Crystal::Location?)
|
513
554
|
@info = {
|
514
|
-
type:
|
555
|
+
type: self.class.name.split("::").last,
|
556
|
+
name: name,
|
557
|
+
args: args,
|
558
|
+
}
|
559
|
+
end
|
560
|
+
|
561
|
+
delegate :to_json, to: @info
|
562
|
+
end
|
563
|
+
|
564
|
+
class Proc < Node
|
565
|
+
@info : NamedTuple(type: String, function: DefNode)
|
566
|
+
|
567
|
+
def initialize(function, location : Crystal::Location?)
|
568
|
+
@info = {
|
569
|
+
type: self.class.name.split("::").last,
|
570
|
+
function: function,
|
571
|
+
}
|
572
|
+
end
|
573
|
+
|
574
|
+
delegate :to_json, to: @info
|
575
|
+
end
|
576
|
+
|
577
|
+
class NodeWithNameNode < Node
|
578
|
+
@info : NamedTuple(type: String, name: Node)
|
579
|
+
|
580
|
+
def initialize(name, location : Crystal::Location?)
|
581
|
+
@info = {
|
582
|
+
type: self.class.name.split("::").last,
|
515
583
|
name: name,
|
516
|
-
|
584
|
+
}
|
585
|
+
end
|
586
|
+
|
587
|
+
delegate :to_json, to: @info
|
588
|
+
end
|
589
|
+
|
590
|
+
class Extend < NodeWithNameNode
|
591
|
+
end
|
592
|
+
|
593
|
+
class Include < NodeWithNameNode
|
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,
|
517
612
|
}
|
518
613
|
end
|
519
614
|
|