gloss 0.0.5 → 0.1.3
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 +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/.github/workflows/self_build.yml +45 -0
- data/.gloss.yml +1 -0
- data/Gemfile.lock +3 -3
- data/README.md +35 -5
- data/Rakefile +1 -1
- data/exe/gloss +13 -2
- data/ext/gloss/Makefile +8 -19
- data/ext/gloss/lib/cr_ruby.cr +5 -4
- data/ext/gloss/src/cr_ast.cr +61 -77
- data/ext/gloss/src/gloss.cr +7 -3
- data/ext/gloss/src/rb_ast.cr +37 -36
- data/lib/gloss.rb +11 -7
- data/lib/gloss/cli.rb +61 -23
- data/lib/gloss/config.rb +3 -1
- data/lib/gloss/errors.rb +1 -1
- data/lib/gloss/initializer.rb +2 -1
- data/lib/gloss/logger.rb +29 -0
- data/lib/gloss/parser.rb +17 -2
- data/lib/gloss/prog_loader.rb +141 -0
- data/lib/gloss/scope.rb +1 -1
- data/lib/gloss/source.rb +1 -1
- data/lib/gloss/type_checker.rb +80 -32
- data/lib/gloss/utils.rb +44 -0
- data/lib/gloss/version.rb +4 -4
- data/lib/gloss/{builder.rb → visitor.rb} +93 -54
- data/lib/gloss/watcher.rb +41 -19
- data/lib/gloss/writer.rb +21 -10
- data/sig/core.rbs +2 -0
- data/sig/fast_blank.rbs +4 -0
- data/sig/{gloss.rbs → gls.rbs} +0 -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 +25 -0
- data/src/lib/gloss/cli.gl +40 -14
- data/src/lib/gloss/config.gl +2 -2
- data/src/lib/gloss/initializer.gl +1 -1
- 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 +0 -2
- data/src/lib/gloss/type_checker.gl +85 -39
- data/src/lib/gloss/utils.gl +38 -0
- data/src/lib/gloss/version.gl +1 -1
- data/src/lib/gloss/{builder.gl → visitor.gl} +80 -49
- data/src/lib/gloss/watcher.gl +42 -24
- data/src/lib/gloss/writer.gl +15 -13
- metadata +22 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed8cc1e615a2df1545467719ac63f8e2667a6e80c0e8fb3e05bf2e11d657779c
|
4
|
+
data.tar.gz: 59ecbb8e9f8327d8ffc86ffcb7254526b8dc2874d9c72b9fcd5f316f8c02334d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91a18fc32f3a8dd27e14e9206c623fa3c608b0c6215ed8f239ae4f23a5ffa1f529b6b0cf4ddb6beeeb103b0d522c3a7bfdf5dc1d4462df0ba8a9da6598cb7c79
|
7
|
+
data.tar.gz: 8c42f4e1c6b92b5823835684d932ce686c6c517558d8e0061dc5633d7aa8eb11f8c652bf6aadca0bd5748731fdc51ae09543354de505da57640c89f5b457f5b4
|
data/.gitattributes
ADDED
@@ -5,7 +5,7 @@
|
|
5
5
|
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
6
|
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
7
|
|
8
|
-
name: Ruby
|
8
|
+
name: Ruby Specs
|
9
9
|
|
10
10
|
on:
|
11
11
|
push:
|
@@ -16,7 +16,7 @@ on:
|
|
16
16
|
jobs:
|
17
17
|
test:
|
18
18
|
|
19
|
-
runs-on: ubuntu-
|
19
|
+
runs-on: ubuntu-20.04
|
20
20
|
|
21
21
|
steps:
|
22
22
|
- uses: actions/checkout@v2
|
@@ -0,0 +1,45 @@
|
|
1
|
+
name: Self Build
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
env:
|
9
|
+
ImageOS: ubuntu18
|
10
|
+
jobs:
|
11
|
+
build:
|
12
|
+
|
13
|
+
runs-on: ubuntu-latest
|
14
|
+
|
15
|
+
container:
|
16
|
+
image: crystallang/crystal
|
17
|
+
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v2
|
20
|
+
- name: Set up Ruby
|
21
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
22
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
23
|
+
# uses: ruby/setup-ruby@v1
|
24
|
+
uses: ruby/setup-ruby@21351ecc0a7c196081abca5dc55b08f085efe09a
|
25
|
+
with:
|
26
|
+
ruby-version: 2.7
|
27
|
+
- name: Install ruby-dev
|
28
|
+
run: apt-get update -y && apt-get install -y ruby-dev
|
29
|
+
- uses: actions/cache@v2
|
30
|
+
id: gems-cache
|
31
|
+
with:
|
32
|
+
path: vendor/bundle
|
33
|
+
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
|
34
|
+
restore-keys: |
|
35
|
+
${{ runner.os }}-gems-
|
36
|
+
- name: install Bundler
|
37
|
+
run: gem install bundler:2.2.3
|
38
|
+
- name: install gems
|
39
|
+
run: bundle install --jobs 4 --retry 3
|
40
|
+
- name: build native extensions
|
41
|
+
run: cd ext/gloss && make && cd -
|
42
|
+
- name: Build self with current state
|
43
|
+
run: ls lib/ && exe/gloss build
|
44
|
+
- name: check installation from rubygems
|
45
|
+
run: gem install gloss
|
data/.gloss.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gloss (0.
|
4
|
+
gloss (0.1.3)
|
5
5
|
fast_blank
|
6
6
|
listen
|
7
7
|
rbs
|
@@ -25,7 +25,7 @@ GEM
|
|
25
25
|
diff-lcs (1.4.4)
|
26
26
|
fast_blank (1.0.0)
|
27
27
|
ffi (1.14.2)
|
28
|
-
i18n (1.8.
|
28
|
+
i18n (1.8.8)
|
29
29
|
concurrent-ruby (~> 1.0)
|
30
30
|
language_server-protocol (3.15.0.1)
|
31
31
|
listen (3.4.1)
|
@@ -77,7 +77,7 @@ GEM
|
|
77
77
|
rubocop-ast (1.4.0)
|
78
78
|
parser (>= 2.7.1.5)
|
79
79
|
ruby-progressbar (1.11.0)
|
80
|
-
steep (0.
|
80
|
+
steep (0.41.0)
|
81
81
|
activesupport (>= 5.1)
|
82
82
|
ast_utils (>= 0.4.0)
|
83
83
|
language_server-protocol (~> 3.15.0.1)
|
data/README.md
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
# Gloss
|
2
|
+
[](https://rubygems.org/gems/gloss)
|
3
|
+
[](https://github.com/johansenja/gloss/actions?query=workflow%3A%22Ruby+Specs%22)
|
4
|
+
[](https://github.com/johansenja/gloss/actions?query=workflow%3A%22Crystal+Specs%22)
|
5
|
+
[&total_label=)](https://rubygems.org/gems/gloss)
|
6
|
+
[&metric=true)](https://rubygems.org/gems/gloss)
|
2
7
|
|
3
8
|
[Gloss](https://en.wikipedia.org/wiki/Gloss_(annotation)) is a high-level programming language based on [Ruby](https://github.com/ruby/ruby) and [Crystal](https://github.com/crystal-lang/crystal), which compiles to ruby; its aims are on transparency,
|
4
|
-
efficiency, and to enhance ruby's goal of developer happiness and productivity.
|
9
|
+
efficiency, and to enhance ruby's goal of developer happiness and productivity.
|
10
|
+
|
11
|
+
### Current features
|
5
12
|
|
6
13
|
- Type checking, via optional type annotations
|
7
14
|
- Compile-time macros
|
@@ -10,11 +17,26 @@ efficiency, and to enhance ruby's goal of developer happiness and productivity.
|
|
10
17
|
- All ruby files are valid gloss files (a small exceptions for now; workarounds are mostly available)
|
11
18
|
- Other syntactic sugar
|
12
19
|
|
13
|
-
|
14
|
-
|
20
|
+
### Current Status
|
21
|
+
|
22
|
+
This project is at a stage where the core non-crystal parts are written in Gloss and compile to ruby (essentially self-hosting), albeit with the type checking being fairly loose. However the project is still in the very early stages; with (as of yet) no Linux support nor error handling (see roadmap below). Use at your own discretion!
|
23
|
+
|
24
|
+
### Approx. roadmap:
|
25
|
+
|
26
|
+
- Improve error handling and logging (currently almost non-existant)
|
27
|
+
- Address Linux compatibility (currently more or less non-existant)
|
28
|
+
- Implement different strictnesses of type checking
|
29
|
+
- Metaprogramming helpers/safety:*
|
30
|
+
- Abstract classes and methods
|
31
|
+
- Method lookup/existence checking at compile time
|
32
|
+
- Method overloading
|
33
|
+
|
34
|
+
#### Related items:
|
35
|
+
|
36
|
+
- Rails helpers; probably some time away*
|
37
|
+
- Editor plugins/syntax highlighting/langserver; probably some time away*
|
15
38
|
|
16
|
-
|
17
|
-
- Method overloading
|
39
|
+
*__Dependent on popularity__
|
18
40
|
|
19
41
|
## Examples:
|
20
42
|
|
@@ -223,4 +245,12 @@ then
|
|
223
245
|
|
224
246
|
then
|
225
247
|
|
248
|
+
`mkdir src && echo "puts 'hello world'" > src/hello_world.gl`
|
249
|
+
|
250
|
+
then
|
251
|
+
|
226
252
|
`gloss build`
|
253
|
+
|
254
|
+
then
|
255
|
+
|
256
|
+
`ruby ./hello_world.rb`
|
data/Rakefile
CHANGED
data/exe/gloss
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
##### This file was generated by Gloss; any changes made here will be overwritten.
|
5
|
+
##### See src/ to make changes
|
2
6
|
|
3
7
|
require "bundler/setup"
|
4
8
|
require "gloss"
|
5
|
-
|
6
|
-
Gloss::CLI.new(ARGV)
|
9
|
+
begin
|
10
|
+
Gloss::CLI.new(ARGV)
|
11
|
+
.run
|
12
|
+
rescue SystemExit
|
13
|
+
rescue => e
|
14
|
+
abort(" Unexpected error: #{e.class
|
15
|
+
.name}\n Message: #{e.message}\n Trace:\n #{e.backtrace
|
16
|
+
.join("\n")}\n\n This is probably a bug and may warrant a bug report at https://github.com/johansenja/gloss/issues")
|
17
|
+
end
|
data/ext/gloss/Makefile
CHANGED
@@ -1,26 +1,20 @@
|
|
1
1
|
CRYSTAL = crystal
|
2
|
-
TARGET = ../../lib/gls
|
3
|
-
|
4
2
|
PLATFORM = $(shell uname -s)
|
5
3
|
|
6
4
|
ifeq "$(PLATFORM)" "Darwin"
|
7
|
-
|
8
|
-
|
9
|
-
all: clean shards build
|
5
|
+
TARGET = ../../lib/gls.bundle
|
10
6
|
|
11
|
-
|
12
|
-
|
7
|
+
clean:
|
8
|
+
rm -f $(TARGET) $(TARGET).dwarf
|
9
|
+
endif
|
13
10
|
|
14
|
-
|
15
|
-
|
11
|
+
ifeq "$(PLATFORM)" "Linux"
|
12
|
+
TARGET = ../../lib/gls.so
|
16
13
|
|
17
14
|
clean:
|
18
|
-
rm -f $(TARGET)
|
19
|
-
rm -f $(TARGET).bundle.dwarf
|
15
|
+
rm -f $(TARGET)
|
20
16
|
endif
|
21
17
|
|
22
|
-
ifeq "$(PLATFORM)" "Linux"
|
23
|
-
LLVM_TARGET = "$(shell uname -m)-unknown-linux-gnu"
|
24
18
|
install: all
|
25
19
|
|
26
20
|
all: clean shards build
|
@@ -29,9 +23,4 @@ shards:
|
|
29
23
|
shards
|
30
24
|
|
31
25
|
build: ./src/gloss.cr
|
32
|
-
$(CRYSTAL) build
|
33
|
-
|
34
|
-
clean:
|
35
|
-
rm -f $(TARGET).o
|
36
|
-
rm -f $(TARGET).so
|
37
|
-
endif
|
26
|
+
$(CRYSTAL) build --link-flags "-shared -dynamic -Wl,-undefined,dynamic_lookup" $< -o $(TARGET) --release
|
data/ext/gloss/lib/cr_ruby.cr
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
lib CrRuby
|
2
2
|
# every ruby Object is a VALUE
|
3
3
|
type VALUE = Void*
|
4
|
-
# ruby method typing
|
5
|
-
type METHOD_FUNC = VALUE, VALUE -> VALUE
|
6
4
|
|
7
5
|
# a ruby Class is a VALUE
|
8
6
|
$rb_cObject : VALUE
|
@@ -28,8 +26,11 @@ lib CrRuby
|
|
28
26
|
fun rb_define_module(name: UInt8*) : VALUE
|
29
27
|
|
30
28
|
# define ruby method in C
|
31
|
-
fun rb_define_method(klass: VALUE, name: UInt8*, func:
|
29
|
+
fun rb_define_method(klass: VALUE, name: UInt8*, func: Proc(CrRuby::VALUE, CrRuby::VALUE,
|
30
|
+
CrRuby::VALUE), argc: Int32)
|
32
31
|
|
33
32
|
# define singleton ruby method in C
|
34
|
-
fun rb_define_singleton_method(klass: VALUE, name: UInt8*, func:
|
33
|
+
fun rb_define_singleton_method(klass: VALUE, name: UInt8*, func: Proc(CrRuby::VALUE,
|
34
|
+
CrRuby::VALUE,
|
35
|
+
CrRuby::VALUE), argc: Int32)
|
35
36
|
end
|
data/ext/gloss/src/cr_ast.cr
CHANGED
@@ -5,7 +5,7 @@ require "./rb_ast"
|
|
5
5
|
module Crystal
|
6
6
|
abstract class ASTNode
|
7
7
|
def to_rb
|
8
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
8
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -17,13 +17,13 @@ module Crystal
|
|
17
17
|
|
18
18
|
class Expressions < ASTNode
|
19
19
|
def to_rb
|
20
|
-
Rb::AST::CollectionNode.new(@expressions.map(&.to_rb))
|
20
|
+
Rb::AST::CollectionNode.new(@expressions.map(&.to_rb), @location)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
class NilLiteral < ASTNode
|
25
25
|
def to_rb
|
26
|
-
Rb::AST::LiteralNode.new("nil", Rb::AST::RbLiteral::NilClass)
|
26
|
+
Rb::AST::LiteralNode.new("nil", Rb::AST::RbLiteral::NilClass, @location)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -31,74 +31,73 @@ module Crystal
|
|
31
31
|
def to_rb
|
32
32
|
Rb::AST::LiteralNode.new(
|
33
33
|
@value.inspect,
|
34
|
-
@value ? Rb::AST::RbLiteral::TrueClass : Rb::AST::RbLiteral::FalseClass
|
35
|
-
)
|
34
|
+
@value ? Rb::AST::RbLiteral::TrueClass : Rb::AST::RbLiteral::FalseClass, @location)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
class NumberLiteral < ASTNode
|
40
39
|
def to_rb
|
41
|
-
Rb::AST::LiteralNode.new(@value, Rb::AST::RbLiteral::Integer)
|
40
|
+
Rb::AST::LiteralNode.new(@value, Rb::AST::RbLiteral::Integer, @location)
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
44
|
class CharLiteral < ASTNode
|
46
45
|
def to_rb
|
47
|
-
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String)
|
46
|
+
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String, @location)
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
50
|
class StringLiteral < ASTNode
|
52
51
|
def to_rb
|
53
|
-
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String)
|
52
|
+
Rb::AST::LiteralNode.new(@value.inspect, Rb::AST::RbLiteral::String, @location)
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
56
|
class StringInterpolation < ASTNode
|
58
57
|
def to_rb
|
59
|
-
Rb::AST::StringInterpolation.new(@expressions.map &.to_rb)
|
58
|
+
Rb::AST::StringInterpolation.new(@expressions.map &.to_rb, @location)
|
60
59
|
end
|
61
60
|
end
|
62
61
|
|
63
62
|
class SymbolLiteral < ASTNode
|
64
63
|
def to_rb
|
65
|
-
Rb::AST::LiteralNode.new(%{:"#{@value.to_s}"}, Rb::AST::RbLiteral::Symbol)
|
64
|
+
Rb::AST::LiteralNode.new(%{:"#{@value.to_s}"}, Rb::AST::RbLiteral::Symbol, @location)
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
68
|
class ArrayLiteral < ASTNode
|
70
69
|
def to_rb
|
71
|
-
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb))
|
70
|
+
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb), @location)
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
75
74
|
class HashLiteral < ASTNode
|
76
75
|
def to_rb
|
77
|
-
Rb::AST::HashLiteral.new(@entries.map { |e| {e.key.to_rb, e.value.to_rb} })
|
76
|
+
Rb::AST::HashLiteral.new(@entries.map { |e| {e.key.to_rb, e.value.to_rb} }, @location)
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
80
|
class NamedTupleLiteral < ASTNode
|
82
81
|
def to_rb
|
83
|
-
Rb::AST::HashLiteral.new(@entries.map { |e| {e.key, e.value.to_rb} }, frozen: true)
|
82
|
+
Rb::AST::HashLiteral.new(@entries.map { |e| {e.key, e.value.to_rb} }, @location, frozen: true)
|
84
83
|
end
|
85
84
|
end
|
86
85
|
|
87
86
|
class RangeLiteral < ASTNode
|
88
87
|
def to_rb
|
89
|
-
Rb::AST::RangeLiteral.new(@from.to_rb, @to.to_rb, @exclusive)
|
88
|
+
Rb::AST::RangeLiteral.new(@from.to_rb, @to.to_rb, @exclusive, @location)
|
90
89
|
end
|
91
90
|
end
|
92
91
|
|
93
92
|
class RegexLiteral < ASTNode
|
94
93
|
def to_rb
|
95
|
-
Rb::AST::RegexLiteral.new(@value.to_rb)
|
94
|
+
Rb::AST::RegexLiteral.new(@value.to_rb, @location)
|
96
95
|
end
|
97
96
|
end
|
98
97
|
|
99
98
|
class TupleLiteral < ASTNode
|
100
99
|
def to_rb
|
101
|
-
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb), frozen: true)
|
100
|
+
Rb::AST::ArrayLiteral.new(@elements.map(&.to_rb), @location, frozen: true)
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
@@ -115,26 +114,25 @@ module Crystal
|
|
115
114
|
@body.to_rb,
|
116
115
|
return_type.try(&.to_rb),
|
117
116
|
@yields,
|
118
|
-
@block_arg.try &.to_rb
|
119
|
-
)
|
117
|
+
@block_arg.try &.to_rb, @location)
|
120
118
|
end
|
121
119
|
end
|
122
120
|
|
123
121
|
class ClassDef < ASTNode
|
124
122
|
def to_rb
|
125
|
-
Rb::AST::ClassNode.new(@name.to_rb, @body.to_rb, @superclass.try(&.to_rb), @type_vars, @abstract)
|
123
|
+
Rb::AST::ClassNode.new(@name.to_rb, @body.to_rb, @superclass.try(&.to_rb), @type_vars, @abstract, @location)
|
126
124
|
end
|
127
125
|
end
|
128
126
|
|
129
127
|
class ModuleDef < ASTNode
|
130
128
|
def to_rb
|
131
|
-
Rb::AST::ModuleNode.new(@name.to_rb, @body.to_rb, @type_vars)
|
129
|
+
Rb::AST::ModuleNode.new(@name.to_rb, @body.to_rb, @type_vars, @location)
|
132
130
|
end
|
133
131
|
end
|
134
132
|
|
135
133
|
class Var < ASTNode
|
136
134
|
def to_rb
|
137
|
-
Rb::AST::Var.new(@name)
|
135
|
+
Rb::AST::Var.new(@name, @location)
|
138
136
|
end
|
139
137
|
end
|
140
138
|
|
@@ -142,7 +140,7 @@ module Crystal
|
|
142
140
|
def to_rb
|
143
141
|
positional_args = args.dup
|
144
142
|
splat = @splat_index ? positional_args.delete_at(@splat_index.as(Int32)) : nil
|
145
|
-
Rb::AST::Block.new(positional_args.map(&.to_rb), splat.try &.to_rb, @body.to_rb)
|
143
|
+
Rb::AST::Block.new(positional_args.map(&.to_rb), splat.try &.to_rb, @body.to_rb, @location)
|
146
144
|
end
|
147
145
|
end
|
148
146
|
|
@@ -155,8 +153,7 @@ module Crystal
|
|
155
153
|
@named_args.try(&.map(&.to_rb.as(Rb::AST::Arg))),
|
156
154
|
@block.try(&.to_rb),
|
157
155
|
@block_arg.try(&.to_rb),
|
158
|
-
@has_parentheses
|
159
|
-
)
|
156
|
+
@has_parentheses, @location)
|
160
157
|
end
|
161
158
|
end
|
162
159
|
|
@@ -165,127 +162,121 @@ module Crystal
|
|
165
162
|
|
166
163
|
def to_rb
|
167
164
|
Rb::AST::Arg.new(@name, @external_name, @restriction.try(&.to_rb),
|
168
|
-
@default_value.try(&.to_rb), @keyword_arg)
|
165
|
+
@default_value.try(&.to_rb), @keyword_arg, @location)
|
169
166
|
end
|
170
167
|
end
|
171
168
|
|
172
169
|
class NamedArgument < ASTNode
|
173
170
|
def to_rb
|
174
|
-
Rb::AST::Arg.new(@name, @name, nil, @value.to_rb, true)
|
171
|
+
Rb::AST::Arg.new(@name, @name, nil, @value.to_rb, true, @location)
|
175
172
|
end
|
176
173
|
end
|
177
174
|
|
178
175
|
class If < ASTNode
|
179
176
|
def to_rb
|
180
|
-
Rb::AST::If.new(@cond.to_rb, @then.to_rb, @else.to_rb)
|
177
|
+
Rb::AST::If.new(@cond.to_rb, @then.to_rb, @else.to_rb, @location)
|
181
178
|
end
|
182
179
|
end
|
183
180
|
|
184
181
|
class Unless < ASTNode
|
185
182
|
def to_rb
|
186
|
-
Rb::AST::Unless.new(@cond.to_rb, @then.to_rb, @else.to_rb)
|
183
|
+
Rb::AST::Unless.new(@cond.to_rb, @then.to_rb, @else.to_rb, @location)
|
187
184
|
end
|
188
185
|
end
|
189
186
|
|
190
187
|
class Assign < ASTNode
|
191
188
|
def to_rb
|
192
|
-
Rb::AST::Assign.new(@target.to_rb, @value.to_rb)
|
189
|
+
Rb::AST::Assign.new(@target.to_rb, @value.to_rb, nil, @location)
|
193
190
|
end
|
194
191
|
end
|
195
192
|
|
196
193
|
class OpAssign < ASTNode
|
197
194
|
def to_rb
|
198
|
-
Rb::AST::Assign.new(@target.to_rb, @value.to_rb, @op)
|
195
|
+
Rb::AST::Assign.new(@target.to_rb, @value.to_rb, @op, @location)
|
199
196
|
end
|
200
197
|
end
|
201
198
|
|
202
199
|
class MultiAssign < ASTNode
|
203
200
|
def to_rb
|
204
|
-
Rb::AST::MultiAssign.new(@targets.map(&.to_rb), @values.map(&.to_rb))
|
201
|
+
Rb::AST::MultiAssign.new(@targets.map(&.to_rb), @values.map(&.to_rb), @location)
|
205
202
|
end
|
206
203
|
end
|
207
204
|
|
208
205
|
class InstanceVar < ASTNode
|
209
206
|
def to_rb
|
210
|
-
Rb::AST::InstanceVar.new(@name)
|
207
|
+
Rb::AST::InstanceVar.new(@name, @location)
|
211
208
|
end
|
212
209
|
end
|
213
210
|
|
214
211
|
class ReadInstanceVar < ASTNode
|
215
212
|
def to_rb
|
216
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
213
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
217
214
|
end
|
218
215
|
end
|
219
216
|
|
220
217
|
class ClassVar < ASTNode
|
221
218
|
def to_rb
|
222
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
219
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
223
220
|
end
|
224
221
|
end
|
225
222
|
|
226
223
|
class Global < ASTNode
|
227
224
|
def to_rb
|
228
|
-
Rb::AST::GlobalVar.new(@name)
|
225
|
+
Rb::AST::GlobalVar.new(@name, @location)
|
229
226
|
end
|
230
227
|
end
|
231
228
|
|
232
229
|
class Annotation < ASTNode
|
233
230
|
def to_rb
|
234
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
class MacroExpression < ASTNode
|
239
|
-
def to_rb
|
240
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
231
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
241
232
|
end
|
242
233
|
end
|
243
234
|
|
244
235
|
class MacroIf < ASTNode
|
245
236
|
def to_rb
|
246
|
-
Rb::AST::MacroIf.new(@cond.to_rb, @then.to_rb, @else.to_rb)
|
237
|
+
Rb::AST::MacroIf.new(@cond.to_rb, @then.to_rb, @else.to_rb, @location)
|
247
238
|
end
|
248
239
|
end
|
249
240
|
|
250
241
|
class MacroFor < ASTNode
|
251
242
|
def to_rb
|
252
|
-
Rb::AST::MacroFor.new(@vars.map(&.to_rb), @exp.to_rb, @body.to_rb)
|
243
|
+
Rb::AST::MacroFor.new(@vars.map(&.to_rb), @exp.to_rb, @body.to_rb, @location)
|
253
244
|
end
|
254
245
|
end
|
255
246
|
|
256
247
|
class MacroVar < ASTNode
|
257
248
|
def to_rb
|
258
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
249
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
259
250
|
end
|
260
251
|
end
|
261
252
|
|
262
253
|
class MacroExpression < ASTNode
|
263
254
|
def to_rb
|
264
|
-
Rb::AST::MacroExpression.new(@exp.to_rb, @output)
|
255
|
+
Rb::AST::MacroExpression.new(@exp.to_rb, @output, @location)
|
265
256
|
end
|
266
257
|
end
|
267
258
|
|
268
259
|
class MacroLiteral < ASTNode
|
269
260
|
def to_rb
|
270
|
-
Rb::AST::MacroLiteral.new(@value)
|
261
|
+
Rb::AST::MacroLiteral.new(@value, @location)
|
271
262
|
end
|
272
263
|
end
|
273
264
|
|
274
265
|
class Annotation < ASTNode
|
275
266
|
def to_rb
|
276
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
267
|
+
Rb::AST::EmptyNode.new(self.class.name, @location)
|
277
268
|
end
|
278
269
|
end
|
279
270
|
|
280
271
|
class EnumDef < ASTNode
|
281
272
|
def to_rb
|
282
|
-
Rb::AST::Enum.new(@name, @members.map(&.to_rb))
|
273
|
+
Rb::AST::Enum.new(@name, @members.map(&.to_rb), @location)
|
283
274
|
end
|
284
275
|
end
|
285
276
|
|
286
277
|
class Path < ASTNode
|
287
278
|
def to_rb
|
288
|
-
Rb::AST::Path.new(full_name)
|
279
|
+
Rb::AST::Path.new(full_name, @location)
|
289
280
|
end
|
290
281
|
|
291
282
|
def full_name
|
@@ -297,13 +288,13 @@ module Crystal
|
|
297
288
|
|
298
289
|
class Require < ASTNode
|
299
290
|
def to_rb
|
300
|
-
Rb::AST::Require.new(@string)
|
291
|
+
Rb::AST::Require.new(@string, @location)
|
301
292
|
end
|
302
293
|
end
|
303
294
|
|
304
295
|
class TypeDeclaration < ASTNode
|
305
296
|
def to_rb
|
306
|
-
Rb::AST::TypeDeclaration.new(@var.to_rb, @declared_type.to_rb, @value.try(&.to_rb))
|
297
|
+
Rb::AST::TypeDeclaration.new(@var.to_rb, @declared_type.to_rb, @value.try(&.to_rb), @location)
|
307
298
|
end
|
308
299
|
end
|
309
300
|
|
@@ -313,8 +304,7 @@ module Crystal
|
|
313
304
|
@cond.try(&.to_rb),
|
314
305
|
@whens.map(&.to_rb),
|
315
306
|
@else.try(&.to_rb),
|
316
|
-
@exhaustive
|
317
|
-
)
|
307
|
+
@exhaustive, @location)
|
318
308
|
end
|
319
309
|
end
|
320
310
|
|
@@ -328,16 +318,14 @@ module Crystal
|
|
328
318
|
Def.new(
|
329
319
|
"->",
|
330
320
|
[Arg.new(arg_name)],
|
331
|
-
c.tap { |call| call.obj = Var.new(arg_name) }
|
332
|
-
)
|
321
|
+
c.tap { |call| call.obj = Var.new(arg_name) })
|
333
322
|
).to_rb
|
334
323
|
else
|
335
324
|
c.to_rb
|
336
325
|
end
|
337
326
|
end,
|
338
327
|
@body.to_rb,
|
339
|
-
@exhaustive
|
340
|
-
)
|
328
|
+
@exhaustive, @location)
|
341
329
|
end
|
342
330
|
end
|
343
331
|
|
@@ -357,8 +345,7 @@ module Crystal
|
|
357
345
|
Rb::AST::UnaryExpr.new(
|
358
346
|
@exp.to_rb,
|
359
347
|
op,
|
360
|
-
requires_parentheses
|
361
|
-
)
|
348
|
+
requires_parentheses ,@location)
|
362
349
|
end
|
363
350
|
end
|
364
351
|
{% end %}
|
@@ -373,8 +360,7 @@ module Crystal
|
|
373
360
|
"||",
|
374
361
|
{% end %}
|
375
362
|
@left.to_rb,
|
376
|
-
@right.to_rb
|
377
|
-
)
|
363
|
+
@right.to_rb ,@location)
|
378
364
|
end
|
379
365
|
end
|
380
366
|
{% end %}
|
@@ -382,7 +368,7 @@ module Crystal
|
|
382
368
|
{% for class_name in %w[Return Break Next] %}
|
383
369
|
class {{class_name.id}} < ControlExpression
|
384
370
|
def to_rb
|
385
|
-
Rb::AST::{{class_name.id}}.new(@exp.try(&.to_rb))
|
371
|
+
Rb::AST::{{class_name.id}}.new(@exp.try(&.to_rb),@location)
|
386
372
|
end
|
387
373
|
end
|
388
374
|
{% end %}
|
@@ -390,43 +376,43 @@ module Crystal
|
|
390
376
|
class ExceptionHandler < ASTNode
|
391
377
|
def to_rb
|
392
378
|
Rb::AST::ExceptionHandler.new(@body.to_rb, @rescues.try(&.map(&.to_rb)), @else.try(&.to_rb),
|
393
|
-
@ensure.try(&.to_rb))
|
379
|
+
@ensure.try(&.to_rb), @location)
|
394
380
|
end
|
395
381
|
end
|
396
382
|
|
397
383
|
class Rescue < ASTNode
|
398
384
|
def to_rb
|
399
|
-
Rb::AST::Rescue.new(@body.to_rb, @types.try(&.map(&.to_rb)), @name)
|
385
|
+
Rb::AST::Rescue.new(@body.to_rb, @types.try(&.map(&.to_rb)), @name, @location)
|
400
386
|
end
|
401
387
|
end
|
402
388
|
|
403
389
|
class Union < ASTNode
|
404
390
|
def to_rb
|
405
|
-
Rb::AST::Union.new(@types.map(&.to_rb))
|
391
|
+
Rb::AST::Union.new(@types.map(&.to_rb), @location)
|
406
392
|
end
|
407
393
|
end
|
408
394
|
|
409
395
|
class Generic < ASTNode
|
410
396
|
def to_rb
|
411
|
-
Rb::AST::Generic.new(@name.to_rb, @type_vars.map(&.to_rb))
|
397
|
+
Rb::AST::Generic.new(@name.to_rb, @type_vars.map(&.to_rb), @location)
|
412
398
|
end
|
413
399
|
end
|
414
400
|
|
415
401
|
class ProcLiteral < ASTNode
|
416
402
|
def to_rb
|
417
|
-
Rb::AST::Proc.new(@def.to_rb)
|
403
|
+
Rb::AST::Proc.new(@def.to_rb, @location)
|
418
404
|
end
|
419
405
|
end
|
420
406
|
|
421
407
|
class Include < ASTNode
|
422
408
|
def to_rb
|
423
|
-
Rb::AST::Include.new(@name.to_rb)
|
409
|
+
Rb::AST::Include.new(@name.to_rb, @location)
|
424
410
|
end
|
425
411
|
end
|
426
412
|
|
427
413
|
class Extend < ASTNode
|
428
414
|
def to_rb
|
429
|
-
Rb::AST::Extend.new(@name.to_rb)
|
415
|
+
Rb::AST::Extend.new(@name.to_rb, @location)
|
430
416
|
end
|
431
417
|
end
|
432
418
|
|
@@ -439,14 +425,13 @@ module Crystal
|
|
439
425
|
nil,
|
440
426
|
nil,
|
441
427
|
nil,
|
442
|
-
false
|
443
|
-
)
|
428
|
+
false, @location)
|
444
429
|
end
|
445
430
|
end
|
446
431
|
|
447
432
|
class VisibilityModifier < ASTNode
|
448
433
|
def to_rb
|
449
|
-
Rb::AST::VisibilityModifier.new(@modifier, @exp.to_rb)
|
434
|
+
Rb::AST::VisibilityModifier.new(@modifier, @exp.to_rb, @location)
|
450
435
|
end
|
451
436
|
end
|
452
437
|
|
@@ -459,8 +444,7 @@ module Crystal
|
|
459
444
|
nil,
|
460
445
|
nil,
|
461
446
|
nil,
|
462
|
-
!@exps.empty
|
463
|
-
)
|
447
|
+
!@exps.empty?, @location)
|
464
448
|
end
|
465
449
|
end
|
466
450
|
|
@@ -471,7 +455,7 @@ module Crystal
|
|
471
455
|
Underscore MagicConstant Asm AsmOperand] %}
|
472
456
|
class {{class_name.id}} < ASTNode
|
473
457
|
def to_rb
|
474
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
458
|
+
Rb::AST::EmptyNode.new(self.class.name,@location)
|
475
459
|
end
|
476
460
|
end
|
477
461
|
{% end %}
|
@@ -479,7 +463,7 @@ module Crystal
|
|
479
463
|
{% for class_name in %w[PointerOf SizeOf InstanceSizeOf Out MacroVerbatim] %}
|
480
464
|
class {{class_name.id}} < UnaryExpression
|
481
465
|
def to_rb
|
482
|
-
Rb::AST::EmptyNode.new(self.class.name)
|
466
|
+
Rb::AST::EmptyNode.new(self.class.name,@location)
|
483
467
|
end
|
484
468
|
end
|
485
469
|
{% end %}
|