gloss 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +5 -0
- data/.gloss.yml +3 -0
- data/.rubocop.yml +147 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +112 -0
- data/README.md +205 -0
- data/Rakefile +20 -0
- data/bin/console +14 -0
- data/exe/gloss +6 -0
- data/ext/gloss/Makefile +15 -0
- data/ext/gloss/extconf.rb +32 -0
- data/ext/gloss/shard.yml +18 -0
- data/ext/gloss/src/cr_ast.cr +382 -0
- data/ext/gloss/src/gloss.cr +31 -0
- data/ext/gloss/src/lexer.cr +1186 -0
- data/ext/gloss/src/lib/cr_ruby.cr +35 -0
- data/ext/gloss/src/parser.cr +340 -0
- data/ext/gloss/src/rb_ast.cr +491 -0
- data/gloss.gemspec +26 -0
- data/lib/gloss.bundle.dwarf +0 -0
- data/lib/gloss.rb +22 -0
- data/lib/gloss/builder.rb +442 -0
- data/lib/gloss/cli.rb +35 -0
- data/lib/gloss/config.rb +15 -0
- data/lib/gloss/errors.rb +11 -0
- data/lib/gloss/initializer.rb +20 -0
- data/lib/gloss/scope.rb +9 -0
- data/lib/gloss/source.rb +32 -0
- data/lib/gloss/version.rb +3 -0
- data/lib/gloss/watcher.rb +32 -0
- data/lib/gloss/writer.rb +26 -0
- data/sig/listen.rbs +48 -0
- data/src/lib/hrb/initializer.gl +22 -0
- data/src/lib/hrb/watcher.gl +32 -0
- metadata +177 -0
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'rake/extensiontask'
|
5
|
+
require 'rubygems/package_task'
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
require "bundler/gem_tasks"
|
8
|
+
|
9
|
+
gem = Gem::Specification.load(File.dirname(__FILE__) + '/gloss.gemspec' )
|
10
|
+
Rake::ExtensionTask.new('gloss', gem )
|
11
|
+
|
12
|
+
Gem::PackageTask.new gem do |pkg|
|
13
|
+
pkg.need_zip = pkg.need_tar = false
|
14
|
+
end
|
15
|
+
|
16
|
+
RSpec::Core::RakeTask.new :spec do |spec|
|
17
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
18
|
+
end
|
19
|
+
|
20
|
+
task :default => [:spec]
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "gloss"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/exe/gloss
ADDED
data/ext/gloss/Makefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
CRYSTAL = crystal
|
2
|
+
TARGET = ../../lib/gloss.bundle
|
3
|
+
|
4
|
+
install: all
|
5
|
+
|
6
|
+
all: clean shards $(TARGET)
|
7
|
+
|
8
|
+
shards:
|
9
|
+
shards
|
10
|
+
|
11
|
+
$(TARGET): ./src/gloss.cr
|
12
|
+
$(CRYSTAL) build --link-flags "-dynamic -bundle -Wl,-undefined,dynamic_lookup" $< -o $(TARGET)
|
13
|
+
|
14
|
+
clean:
|
15
|
+
rm -f ../../**/*.bundle*
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "mkmf"
|
2
|
+
# $makefile_created = true
|
3
|
+
find_executable("crystal") or abort <<~ERR
|
4
|
+
You need crystal installed to use this gem.
|
5
|
+
Please check out https://crystal-lang.org/ for information on how to install it.
|
6
|
+
ERR
|
7
|
+
# $LDFLAGS = "-rdynamic -L/usr/local/Cellar/crystal/0.35.1_1/embedded/lib -L/usr/local/lib -lpcre -lgc -lpthread /usr/local/Cellar/crystal/0.35.1_1/src/ext/libcrystal.a -L/usr/local/Cellar/libevent/2.1.12/lib -levent -liconv -ldl -Llib -lgloss"
|
8
|
+
# $LDFLAGS << " -Wl,-undefined,dynamic_lookup -Llib -lgloss "
|
9
|
+
|
10
|
+
create_makefile "gloss"
|
11
|
+
# $(CRYSTAL) $< --link-flags "-dynamic -bundle -Wl,-undefined,dynamic_lookup" -o $(TARGET)
|
12
|
+
|
13
|
+
# I feel like a bad person
|
14
|
+
# File.open(File.join(__dir__, "Makefile"), "w") do |f|
|
15
|
+
# f.write <<~MAKEFILE
|
16
|
+
# CRYSTAL = crystal
|
17
|
+
# TARGET = ../../lib/gloss.bundle
|
18
|
+
|
19
|
+
# install: all
|
20
|
+
|
21
|
+
# all: clean shards $(TARGET)
|
22
|
+
|
23
|
+
# shards:
|
24
|
+
# shards
|
25
|
+
|
26
|
+
# $(TARGET): ./src/gloss.cr
|
27
|
+
# $(CRYSTAL) build --link-flags "-dynamic -bundle -Wl,-undefined,dynamic_lookup" $< -o $(TARGET)
|
28
|
+
|
29
|
+
# clean:
|
30
|
+
# rm -f ../../**/*.bundle*
|
31
|
+
# MAKEFILE
|
32
|
+
# end
|
data/ext/gloss/shard.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
name: gloss
|
2
|
+
version: 0.1.0
|
3
|
+
|
4
|
+
authors:
|
5
|
+
- johansenja
|
6
|
+
|
7
|
+
targets:
|
8
|
+
gloss:
|
9
|
+
main: ./gloss.cr
|
10
|
+
#
|
11
|
+
# add dependencies and development_dependencies:
|
12
|
+
# dependencies:
|
13
|
+
# pg:
|
14
|
+
# github: will/crystal-pg
|
15
|
+
# version: "~> 0.5"
|
16
|
+
#
|
17
|
+
# development_dependencies:
|
18
|
+
# ...
|
@@ -0,0 +1,382 @@
|
|
1
|
+
require "compiler/crystal/syntax/*"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Crystal
|
5
|
+
abstract class ASTNode
|
6
|
+
def to_rb
|
7
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Nop < ASTNode
|
12
|
+
def to_rb
|
13
|
+
Rb::AST::Nop.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Expressions < ASTNode
|
18
|
+
def to_rb
|
19
|
+
Rb::AST::CollectionNode.new(@expressions.map(&.to_rb))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class NilLiteral < ASTNode
|
24
|
+
def to_rb
|
25
|
+
Rb::AST::LiteralNode.new("nil", Rb::AST::RbLiteral::NilClass)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class BoolLiteral < ASTNode
|
30
|
+
def to_rb
|
31
|
+
Rb::AST::LiteralNode.new(
|
32
|
+
@value.inspect,
|
33
|
+
@value ? Rb::AST::RbLiteral::TrueClass : Rb::AST::RbLiteral::FalseClass
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class NumberLiteral < ASTNode
|
39
|
+
def to_rb
|
40
|
+
Rb::AST::LiteralNode.new(@value, Rb::AST::RbLiteral::Integer)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class CharLiteral < ASTNode
|
45
|
+
def to_rb
|
46
|
+
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class StringLiteral < ASTNode
|
51
|
+
def to_rb
|
52
|
+
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class StringInterpolation < ASTNode
|
57
|
+
def to_rb
|
58
|
+
Rb::AST::StringInterpolation.new(@expressions.map &.to_rb)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class SymbolLiteral < ASTNode
|
63
|
+
def to_rb
|
64
|
+
Rb::AST::LiteralNode.new(":#{@value.to_s}", Rb::AST::RbLiteral::Symbol)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class ArrayLiteral < ASTNode
|
69
|
+
def to_rb
|
70
|
+
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb))
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class HashLiteral < ASTNode
|
75
|
+
def to_rb
|
76
|
+
Rb::AST::HashLiteral.new(@entries.map { |e| { e.key.to_rb, e.value.to_rb }})
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class NamedTupleLiteral < ASTNode
|
81
|
+
def to_rb
|
82
|
+
Rb::AST::HashLiteral.new(@entries.map { |e| { e.key, e.value.to_rb }}, frozen: true)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class RangeLiteral < ASTNode
|
87
|
+
def to_rb
|
88
|
+
Rb::AST::RangeLiteral.new(@from.to_rb, @to.to_rb, @exclusive)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class RegexLiteral < ASTNode
|
93
|
+
def to_rb
|
94
|
+
Rb::AST::RegexLiteral.new("//")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class TupleLiteral < ASTNode
|
99
|
+
def to_rb
|
100
|
+
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb), frozen: true)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class Def < ASTNode
|
105
|
+
def to_rb
|
106
|
+
Rb::AST::DefNode.new(@name, @args.map(&.to_rb), @body.to_rb, receiver.try(&.to_rb),
|
107
|
+
return_type.try(&.to_rb), @double_splat.try(&.to_rb))
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class ClassDef < ASTNode
|
112
|
+
def to_rb
|
113
|
+
Rb::AST::ClassNode.new(@name.to_rb, @body.to_rb, @superclass.try(&.to_rb), @type_vars, @abstract)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class ModuleDef < ASTNode
|
118
|
+
def to_rb
|
119
|
+
Rb::AST::ModuleNode.new(@name.to_rb, @body.to_rb, @type_vars)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
class Var < ASTNode
|
124
|
+
def to_rb
|
125
|
+
Rb::AST::Var.new(@name)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class Block < ASTNode
|
130
|
+
def to_rb
|
131
|
+
Rb::AST::Block.new(@args.map(&.to_rb), @body.to_rb)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
class Call < ASTNode
|
136
|
+
def to_rb
|
137
|
+
Rb::AST::Call.new(@obj.try(&.to_rb), @name, @args.map(&.to_rb), @block.try(&.to_rb),
|
138
|
+
@block_arg.try(&.to_rb))
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class NamedArgument < ASTNode
|
143
|
+
def to_rb
|
144
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
class Arg < ASTNode
|
149
|
+
property keyword_arg : Bool = false
|
150
|
+
|
151
|
+
def to_rb
|
152
|
+
Rb::AST::Arg.new(@name, @external_name, @restriction.try(&.to_rb), @default_value.try(&.to_rb))
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class If < ASTNode
|
157
|
+
def to_rb
|
158
|
+
Rb::AST::If.new(@cond.to_rb, @then.to_rb, @else.to_rb)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
class Assign < ASTNode
|
163
|
+
def to_rb
|
164
|
+
Rb::AST::Assign.new(@target.to_rb, @value.to_rb)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class OpAssign < ASTNode
|
169
|
+
def to_rb
|
170
|
+
Rb::AST::Assign.new(@target.to_rb, @value.to_rb, @op)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
class MultiAssign < ASTNode
|
175
|
+
def to_rb
|
176
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class InstanceVar < ASTNode
|
181
|
+
def to_rb
|
182
|
+
Rb::AST::InstanceVar.new(@name)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
class ReadInstanceVar < ASTNode
|
187
|
+
def to_rb
|
188
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
class ClassVar < ASTNode
|
193
|
+
def to_rb
|
194
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class Global < ASTNode
|
199
|
+
def to_rb
|
200
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class Annotation < ASTNode
|
205
|
+
def to_rb
|
206
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class MacroExpression < ASTNode
|
211
|
+
def to_rb
|
212
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
class MacroIf < ASTNode
|
217
|
+
def to_rb
|
218
|
+
Rb::AST::MacroIf.new(@cond.to_rb, @then.to_rb, @else.to_rb)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
class MacroFor < ASTNode
|
223
|
+
def to_rb
|
224
|
+
Rb::AST::MacroFor.new(@vars.map(&.to_rb), @exp.to_rb, @body.to_rb)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
class MacroVar < ASTNode
|
229
|
+
def to_rb
|
230
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
class MacroExpression < ASTNode
|
235
|
+
def to_rb
|
236
|
+
Rb::AST::MacroExpression.new(@exp.to_rb, @output)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
class MacroLiteral < ASTNode
|
241
|
+
def to_rb
|
242
|
+
Rb::AST::MacroLiteral.new(@value)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
class Annotation < ASTNode
|
247
|
+
def to_rb
|
248
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
class EnumDef < ASTNode
|
253
|
+
def to_rb
|
254
|
+
Rb::AST::Enum.new(@name, @members.map(&.to_rb))
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
class Path < ASTNode
|
259
|
+
def to_rb
|
260
|
+
Rb::AST::Path.new(full_name)
|
261
|
+
end
|
262
|
+
|
263
|
+
def full_name
|
264
|
+
@names.join("::")
|
265
|
+
end
|
266
|
+
|
267
|
+
delegate :to_json, to: :full_name
|
268
|
+
end
|
269
|
+
|
270
|
+
class Require < ASTNode
|
271
|
+
def to_rb
|
272
|
+
Rb::AST::Require.new(@string)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
class TypeDeclaration < ASTNode
|
277
|
+
def to_rb
|
278
|
+
Rb::AST::TypeDeclaration.new(@var.to_rb, @declared_type.to_rb, @value.try(&.to_rb))
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
class Case < ASTNode
|
283
|
+
def to_rb
|
284
|
+
Rb::AST::Case.new(
|
285
|
+
@cond.try(&.to_rb),
|
286
|
+
@whens.map(&.to_rb),
|
287
|
+
@else.try(&.to_rb),
|
288
|
+
@exhaustive
|
289
|
+
)
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
class When < ASTNode
|
294
|
+
def to_rb
|
295
|
+
Rb::AST::When.new(
|
296
|
+
@conds.map(&.to_rb),
|
297
|
+
@body.to_rb,
|
298
|
+
@exhaustive
|
299
|
+
)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
{% for class_name in %w[Splat DoubleSplat Not] %}
|
304
|
+
class {{class_name.id}} < UnaryExpression
|
305
|
+
def to_rb
|
306
|
+
{% if class_name == "Splat" %}
|
307
|
+
op = "*"
|
308
|
+
{% elsif class_name == "DoubleSplat" %}
|
309
|
+
op = "**"
|
310
|
+
{% else %}
|
311
|
+
op = "!"
|
312
|
+
{% end %}
|
313
|
+
# for some of the other unary expressions, parentheses are normally used by convention eg.
|
314
|
+
# pointerof - but they are definitely lower priority
|
315
|
+
requires_parentheses = true
|
316
|
+
Rb::AST::UnaryExpr.new(
|
317
|
+
@exp.to_rb,
|
318
|
+
op,
|
319
|
+
requires_parentheses
|
320
|
+
)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
{% end %}
|
324
|
+
|
325
|
+
{% for class_name in %w[And Or] %}
|
326
|
+
class {{class_name.id}} < BinaryOp
|
327
|
+
def to_rb
|
328
|
+
Rb::AST::BinaryOp.new(
|
329
|
+
{% if class_name == "And" %}
|
330
|
+
"&&",
|
331
|
+
{% else %}
|
332
|
+
"||",
|
333
|
+
{% end %}
|
334
|
+
@left.to_rb,
|
335
|
+
@right.to_rb
|
336
|
+
)
|
337
|
+
end
|
338
|
+
end
|
339
|
+
{% end %}
|
340
|
+
|
341
|
+
{% for class_name in %w[Return Break Next] %}
|
342
|
+
class {{class_name.id}} < ControlExpression
|
343
|
+
def to_rb
|
344
|
+
Rb::AST::{{class_name.id}}.new(@exp.try(&.to_rb))
|
345
|
+
end
|
346
|
+
end
|
347
|
+
{% end %}
|
348
|
+
|
349
|
+
class ExceptionHandler < ASTNode
|
350
|
+
def to_rb
|
351
|
+
Rb::AST::ExceptionHandler.new(@body.to_rb, @rescues.try(&.map(&.to_rb)), @else.try(&.to_rb),
|
352
|
+
@ensure.try(&.to_rb))
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
class Rescue < ASTNode
|
357
|
+
def to_rb
|
358
|
+
Rb::AST::Rescue.new(@body.to_rb, @types.try(&.map(&.to_rb)), @name)
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
{% for class_name in %w[ProcNotation Macro OffsetOf VisibilityModifier IsA RespondsTo
|
363
|
+
Select ImplicitObj AnnotationDef While Until Generic UninitializedVar
|
364
|
+
ProcLiteral ProcPointer Union Self Yield Include
|
365
|
+
Extend LibDef FunDef TypeDef CStructOrUnionDef ExternalVar Alias
|
366
|
+
Metaclass Cast NilableCast TypeOf Annotation
|
367
|
+
Underscore MagicConstant Asm AsmOperand] %}
|
368
|
+
class {{class_name.id}} < ASTNode
|
369
|
+
def to_rb
|
370
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
{% end %}
|
374
|
+
|
375
|
+
{% for class_name in %w[PointerOf SizeOf InstanceSizeOf Out MacroVerbatim DoubleSplat] %}
|
376
|
+
class {{class_name.id}} < UnaryExpression
|
377
|
+
def to_rb
|
378
|
+
Rb::AST::EmptyNode.new(self.class.name)
|
379
|
+
end
|
380
|
+
end
|
381
|
+
{% end %}
|
382
|
+
end
|