tealrb 0.1.0

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.
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TEALrb
4
+ module Rewriters
5
+ class Rewriter < Parser::TreeRewriter
6
+ include RuboCop::AST::Traversal
7
+ end
8
+
9
+ class MethodRewriter < Rewriter
10
+ def on_def(node)
11
+ replace node.source_range, node.body.source
12
+ super
13
+ end
14
+
15
+ def on_block(node)
16
+ replace node.source_range, node.body.source
17
+ end
18
+
19
+ def on_send(node)
20
+ remove node.loc.selector if node.loc.selector.source == 'subroutine' || node.loc.selector.source == 'teal'
21
+
22
+ # @teal_methods[:name] = ->(*args) { ... } becomes ->(*args) { ... }
23
+ if ['@teal_methods', '@subroutines'].include? node.children[0]&.source
24
+ replace node.source_range, node.children[3].body.source
25
+ end
26
+
27
+ super
28
+ end
29
+ end
30
+
31
+ class AssignRewriter < Rewriter
32
+ def on_lvasgn(node)
33
+ wrap(node.children[1].source_range, '-> { ', ' }')
34
+ super
35
+ end
36
+
37
+ def on_lvar(node)
38
+ insert_after(node.loc.name, '.call')
39
+ super
40
+ end
41
+
42
+ def on_ivasgn(node)
43
+ wrap(node.children[1].source_range, '-> { ', ' }')
44
+ super
45
+ end
46
+
47
+ def on_ivar(node)
48
+ insert_after(node.loc.name, '.call') unless ['@teal', '@teal_methods', '@subroutines'].include? node.source
49
+ super
50
+ end
51
+ end
52
+
53
+ class ComparisonRewriter < Rewriter
54
+ def on_send(node)
55
+ if TEALrb::Opcodes::BINARY_OPCODE_METHOD_MAPPING.keys.map(&:to_s).include? node.loc.selector.source
56
+ wrap(node.source_range, '(', ')')
57
+ end
58
+ super
59
+ end
60
+ end
61
+
62
+ class OpRewriter < Rewriter
63
+ def initialize
64
+ @skips = 0
65
+ super
66
+ end
67
+
68
+ def on_and(node)
69
+ wrap(node.children[1].source_range, '(', ')')
70
+
71
+ op_loc = node.loc.operator
72
+ op_loc = op_loc.resize(3) if op_loc.resize(3).source == '&& '
73
+
74
+ replace(op_loc, '.boolean_and')
75
+
76
+ super
77
+ end
78
+
79
+ def on_or(node)
80
+ wrap(node.children[1].source_range, '(', ')')
81
+
82
+ op_loc = node.loc.operator
83
+ op_loc = op_loc.resize(3) if op_loc.resize(3).source == '|| '
84
+
85
+ replace(op_loc, '.boolean_or')
86
+ super
87
+ end
88
+
89
+ OPCODE_METHODS = TEALrb::Opcodes.instance_methods.freeze
90
+
91
+ def on_const(node)
92
+ @skips = 1 if %w[Txna Gtxn AppArgs].include? node.loc.name.source
93
+ super
94
+ end
95
+
96
+ def on_ivar(node)
97
+ @skips = 2 if node.source == '@teal_methods'
98
+ end
99
+
100
+ def on_send(node)
101
+ meth_name = node.loc.selector.source.to_sym
102
+
103
+ if OPCODE_METHODS.include? meth_name
104
+ if meth_name[/(byte|int)cblock/]
105
+ @skips = node.children.size - 2
106
+ else
107
+ params = TEALrb::Opcodes.instance_method(meth_name).parameters
108
+ @skips = params.count { |param| param[0] == :req }
109
+ end
110
+ elsif %i[comment placeholder].include? meth_name
111
+ @skips = 1
112
+ end
113
+ super
114
+ end
115
+
116
+ def on_int(node)
117
+ wrap(node.source_range, 'int(', ')') if (@skips -= 1).negative?
118
+ super
119
+ end
120
+
121
+ def on_str(node)
122
+ wrap(node.source_range, 'byte(', ')') if (@skips -= 1).negative?
123
+ super
124
+ end
125
+
126
+ def on_sym(node)
127
+ wrap(node.source_range, 'label(', ')') if node.source_range.source[/^:/] && (@skips -= 1).negative?
128
+ super
129
+ end
130
+ end
131
+
132
+ class IfRewriter < Rewriter
133
+ def on_if(node)
134
+ case node.loc.keyword.source
135
+ when 'if'
136
+ replace(node.loc.keyword, 'IfBlock.new(@teal, ')
137
+ when 'elsif'
138
+ replace(node.loc.keyword, 'end.elsif(')
139
+ end
140
+
141
+ cond_expr = node.children.first.source_range
142
+ replace(cond_expr, "#{cond_expr.source} ) do")
143
+
144
+ replace(node.loc.else, 'end.else do') if node.loc.else && node.loc.else.source == 'else'
145
+ super
146
+ end
147
+ end
148
+ end
149
+ end
data/lib/tealrb.rb ADDED
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'method_source'
4
+ require 'rubocop'
5
+
6
+ require_relative 'tealrb/constants'
7
+ require_relative 'tealrb/abi'
8
+ require_relative 'tealrb/opcodes'
9
+ require_relative 'tealrb/opcode_modules'
10
+ require_relative 'tealrb/rewriters'
11
+ require_relative 'tealrb/if_block'
12
+ require_relative 'tealrb/contract'
13
+ require_relative 'tealrb/cmd_line/teal2tealrb'
14
+
15
+ module TEALrb
16
+ class TEAL < Array
17
+ class << self
18
+ attr_accessor :current
19
+ end
20
+
21
+ @current = {}
22
+
23
+ def set_as_current
24
+ self.class.current[Thread.current] = self
25
+ end
26
+
27
+ def teal
28
+ flatten
29
+ end
30
+
31
+ def boolean_and(_other)
32
+ self << '&&'
33
+ end
34
+
35
+ def boolean_or(_other)
36
+ self << '||'
37
+ end
38
+
39
+ TEALrb::Opcodes::BINARY_OPCODE_METHOD_MAPPING.each do |meth, opcode|
40
+ define_method(meth) do |other|
41
+ ExtendedOpcodes.send(opcode, self, other)
42
+ end
43
+ end
44
+
45
+ TEALrb::Opcodes::UNARY_OPCODE_METHOD_MAPPING.each do |meth, opcode|
46
+ define_method(meth) do
47
+ ExtendedOpcodes.send(opcode, self)
48
+ end
49
+ end
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,152 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tealrb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Joe Polny
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: method_source
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: redcarpet
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: yard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email: joepolny+dev@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - lib/tealrb.rb
118
+ - lib/tealrb/abi.rb
119
+ - lib/tealrb/cmd_line/teal2tealrb.rb
120
+ - lib/tealrb/constants.rb
121
+ - lib/tealrb/contract.rb
122
+ - lib/tealrb/if_block.rb
123
+ - lib/tealrb/opcode_modules.rb
124
+ - lib/tealrb/opcodes.rb
125
+ - lib/tealrb/patches.rb
126
+ - lib/tealrb/rewriters.rb
127
+ homepage: https://github.com/joe-p/tealrb
128
+ licenses:
129
+ - MIT
130
+ metadata:
131
+ source_code_uri: https://github.com/joe-p/tealrb
132
+ rubygems_mfa_required: 'true'
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '2.7'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubygems_version: 3.1.6
149
+ signing_key:
150
+ specification_version: 4
151
+ summary: A DSL for building Algorand applications
152
+ test_files: []