tealrb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []