dtr_to_rust 0.8.1 → 0.12.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/code_generator.rb +90 -0
  3. data/lib/common/type_translator.rb +3 -3
  4. data/lib/contract_handler.rb +98 -0
  5. data/lib/contract_state/handler.rb +35 -0
  6. data/lib/function_handler.rb +47 -0
  7. data/lib/instruction/add.rb +4 -4
  8. data/lib/instruction/and.rb +2 -4
  9. data/lib/instruction/assign.rb +3 -3
  10. data/lib/instruction/binary_instruction.rb +22 -0
  11. data/lib/instruction/break.rb +12 -0
  12. data/lib/instruction/divide.rb +3 -3
  13. data/lib/instruction/end_of_iteration_check.rb +2 -2
  14. data/lib/instruction/evaluate.rb +26 -12
  15. data/lib/instruction/exit_with_message.rb +4 -3
  16. data/lib/instruction/field.rb +2 -2
  17. data/lib/instruction/handler.rb +18 -13
  18. data/lib/instruction/increment.rb +3 -2
  19. data/lib/instruction/instantiate_object.rb +31 -17
  20. data/lib/instruction/jump.rb +24 -5
  21. data/lib/instruction/multiply.rb +3 -3
  22. data/lib/instruction/or.rb +2 -4
  23. data/lib/instruction/print.rb +9 -8
  24. data/lib/instruction/return.rb +2 -2
  25. data/lib/instruction/subtract.rb +3 -4
  26. data/lib/instruction/{goto.rb → try_assign.rb} +3 -3
  27. data/lib/instruction_handler.rb +7 -11
  28. data/lib/lcpbt_forrest.rb +83 -0
  29. data/lib/left_child_preferential_binary_tree.rb +66 -0
  30. data/lib/non_translatables/handler.rb +23 -0
  31. data/lib/silviculturist.rb +149 -0
  32. data/lib/soroban_rust_backend.rb +51 -0
  33. data/lib/user_defined_types_handler.rb +87 -0
  34. metadata +19 -17
  35. data/lib/aggregator/scope_block_aggregator.rb +0 -72
  36. data/lib/common/input_interpreter.rb +0 -74
  37. data/lib/common/reference_appender.rb +0 -59
  38. data/lib/dtr_to_rust.rb +0 -54
  39. data/lib/generator.rb +0 -196
  40. data/lib/instruction/label.rb +0 -12
  41. data/lib/optimization/binary_x_to_self_assignment_reduction.rb +0 -93
  42. data/lib/optimization/chained_invocation_assignment_reduction.rb +0 -123
  43. data/lib/optimization/field_to_assignment_conversion.rb +0 -37
  44. data/lib/user_defined_types/handler.rb +0 -89
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SorobanRustBackend
4
+ class UserDefinedTypesHandler
5
+ def initialize(user_defined_type)
6
+ @user_defined_type = user_defined_type
7
+ end
8
+
9
+ def self.generate(user_defined_type)
10
+ new(user_defined_type).generate
11
+ end
12
+
13
+ def generate
14
+ if struct?
15
+ generate_struct
16
+ elsif enum?
17
+ generate_enum
18
+ end
19
+ end
20
+
21
+ def generate_struct
22
+ "#{derives}pub struct #{@user_defined_type.name.gsub('_STRUCT', '')} {\n#{generate_struct_attributes}\n}\n\n"
23
+ end
24
+
25
+ def generate_struct_attributes
26
+ @user_defined_type.attributes.map do |x|
27
+ " pub #{x[:name]}: #{Common::TypeTranslator.translate_type(x[:type])},"
28
+ end.join("\n")
29
+ end
30
+
31
+ def generate_enum
32
+ "#{derives}pub enum #{@user_defined_type.name.gsub('_ENUM', '')} {\n#{generate_enum_attributes}\n}\n\n"
33
+ end
34
+
35
+ def generate_enum_attributes
36
+ @user_defined_type.attributes.map do |x|
37
+ if x[:value]
38
+ " #{x[:name]} = #{x[:value]},"
39
+ elsif x[:type]&.start_with?('(') && x[:type]&.end_with?(')')
40
+ inner_types = x[:type].gsub('(', '').gsub(')', '').split(',').map do |x|
41
+ Common::TypeTranslator.translate_type(x)
42
+ end
43
+ if inner_types.empty? || x[:type] == '()'
44
+ " #{x[:name]}: (),"
45
+ else
46
+ " #{x[:name]}: (#{inner_types.join(', ')}),"
47
+ end
48
+ elsif x[:type]&.match(/\d+/)
49
+ " #{x[:name]} = #{x[:type]},"
50
+ elsif x[:type] && x[:type] != '()'
51
+ " #{x[:name]}: (#{Common::TypeTranslator.translate_type(x[:type])}),"
52
+ else
53
+ " #{x[:name]}: (),"
54
+ end
55
+ end.join("\n")
56
+ end
57
+
58
+ def derives
59
+ base = if error? && enum?
60
+ "#[contracterror]\n#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\n"
61
+ else
62
+ "#[contracttype]\n#[derive(Clone, Debug, Eq, PartialEq)]\n"
63
+ end
64
+
65
+ base += "#[repr(u32)]\n" if numbered_enum?
66
+
67
+ base
68
+ end
69
+
70
+ # TODO: fix this terrible hack
71
+ def error?
72
+ @user_defined_type.name.start_with? 'Error'
73
+ end
74
+
75
+ def struct?
76
+ @user_defined_type.name.end_with? '_STRUCT'
77
+ end
78
+
79
+ def enum?
80
+ @user_defined_type.name.end_with? '_ENUM'
81
+ end
82
+
83
+ def numbered_enum?
84
+ enum? && @user_defined_type.attributes.all? { |x| x[:value] }
85
+ end
86
+ end
87
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtr_to_rust
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Durst
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-24 00:00:00.000000000 Z
11
+ date: 2024-07-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Rust to DTR translator (Digicus Textual Representation).
14
14
  email:
@@ -17,42 +17,44 @@ executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - lib/aggregator/scope_block_aggregator.rb
21
- - lib/common/input_interpreter.rb
22
- - lib/common/reference_appender.rb
20
+ - lib/code_generator.rb
23
21
  - lib/common/type_translator.rb
24
- - lib/dtr_to_rust.rb
25
- - lib/generator.rb
22
+ - lib/contract_handler.rb
23
+ - lib/contract_state/handler.rb
24
+ - lib/function_handler.rb
26
25
  - lib/instruction/add.rb
27
26
  - lib/instruction/and.rb
28
27
  - lib/instruction/assign.rb
28
+ - lib/instruction/binary_instruction.rb
29
+ - lib/instruction/break.rb
29
30
  - lib/instruction/divide.rb
30
31
  - lib/instruction/end_of_iteration_check.rb
31
32
  - lib/instruction/evaluate.rb
32
33
  - lib/instruction/exit_with_message.rb
33
34
  - lib/instruction/field.rb
34
- - lib/instruction/goto.rb
35
35
  - lib/instruction/handler.rb
36
36
  - lib/instruction/increment.rb
37
37
  - lib/instruction/instantiate_object.rb
38
38
  - lib/instruction/jump.rb
39
- - lib/instruction/label.rb
40
39
  - lib/instruction/multiply.rb
41
40
  - lib/instruction/or.rb
42
41
  - lib/instruction/print.rb
43
42
  - lib/instruction/return.rb
44
43
  - lib/instruction/subtract.rb
44
+ - lib/instruction/try_assign.rb
45
45
  - lib/instruction_handler.rb
46
- - lib/optimization/binary_x_to_self_assignment_reduction.rb
47
- - lib/optimization/chained_invocation_assignment_reduction.rb
48
- - lib/optimization/field_to_assignment_conversion.rb
49
- - lib/user_defined_types/handler.rb
46
+ - lib/lcpbt_forrest.rb
47
+ - lib/left_child_preferential_binary_tree.rb
48
+ - lib/non_translatables/handler.rb
49
+ - lib/silviculturist.rb
50
+ - lib/soroban_rust_backend.rb
51
+ - lib/user_defined_types_handler.rb
50
52
  homepage: https://spaced-out-thoughts-dev-foundation.github.io/digicus/
51
53
  licenses:
52
54
  - MIT
53
55
  metadata:
54
56
  rubygems_mfa_required: 'true'
55
- post_install_message:
57
+ post_install_message:
56
58
  rdoc_options: []
57
59
  require_paths:
58
60
  - lib
@@ -67,8 +69,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
69
  - !ruby/object:Gem::Version
68
70
  version: '0'
69
71
  requirements: []
70
- rubygems_version: 3.5.13
71
- signing_key:
72
+ rubygems_version: 3.4.10
73
+ signing_key:
72
74
  specification_version: 4
73
75
  summary: Rust to DTR translator (Digicus Textual Representation).
74
76
  test_files: []
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DTRToRust
4
- module Aggregator
5
- # Aggregates instructions into scope blocks
6
- class ScopeBlockAggregator
7
- def initialize(instructions)
8
- @instructions = instructions
9
- end
10
-
11
- def self.aggregate(instructions)
12
- new(instructions).aggregate
13
- end
14
-
15
- def aggregate
16
- sequential_scope_blocks = sequentially_group_by_scope(@instructions)
17
-
18
- decorate_scope_blocks(sequential_scope_blocks)
19
- end
20
-
21
- private
22
-
23
- def sequentially_group_by_scope(_instructions)
24
- return [] if @instructions.empty?
25
-
26
- scope_blocks = []
27
- current_scope = nil
28
- current_scope_block = []
29
-
30
- @instructions.each do |instruction|
31
- if current_scope == instruction.scope
32
- current_scope_block << instruction
33
- else
34
- scope_blocks << current_scope_block unless current_scope_block.empty?
35
- current_scope_block = [instruction]
36
- current_scope = instruction.scope
37
- end
38
- end
39
-
40
- scope_blocks << current_scope_block unless current_scope_block.empty?
41
-
42
- scope_blocks
43
- end
44
-
45
- def decorate_scope_blocks(scope_blocks)
46
- current_scope = nil
47
- current_scope_decorated_value = nil
48
- scope_memoize = {}
49
-
50
- scope_blocks.map do |scope_block|
51
- if current_scope.nil?
52
- current_scope = scope_block.first.scope
53
- current_scope_decorated_value = 0
54
- scope_memoize[current_scope] = current_scope_decorated_value
55
- elsif scope_memoize[scope_block.first.scope]
56
- current_scope = scope_block.first.scope
57
- current_scope_decorated_value = scope_memoize[current_scope]
58
- elsif current_scope < scope_block.first.scope
59
- current_scope = scope_block.first.scope
60
- current_scope_decorated_value += 1
61
- scope_memoize[current_scope] = current_scope_decorated_value
62
- else
63
- current_scope = scope_block.first.scope
64
- current_scope_decorated_value -= 1
65
- scope_memoize[current_scope] = current_scope_decorated_value
66
- end
67
- { block: scope_block, scope: current_scope, decorated_value: current_scope_decorated_value }
68
- end
69
- end
70
- end
71
- end
72
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DTRToRust
4
- module Common
5
- # This class is responsible for interpreting the input string.
6
- class InputInterpreter
7
- def initialize(input)
8
- @input = input
9
- end
10
-
11
- def self.interpret(input)
12
- new(input).interpret
13
- end
14
-
15
- def interpret
16
- if number?(@input)
17
- number_return(@input)
18
- elsif string?(@input)
19
- string_return(@input)
20
- elsif boolean?(@input)
21
- boolean_return(@input)
22
- else
23
- variable_return(@input)
24
- end
25
- end
26
-
27
- private
28
-
29
- ## Variable ##
30
- def variable?(input)
31
- !string?(input) && !number?(input)
32
- end
33
-
34
- def variable_return(_input)
35
- { value: @input, type: 'variable', needs_reference: !@input.start_with?('&') }
36
- end
37
-
38
- ## String ##
39
- def string?(input)
40
- input.is_a?(String) && (input.match?(/".*"/) || input.match?(/'.*'/))
41
- end
42
-
43
- def string_return(_input)
44
- { value: @input, type: 'string', needs_reference: false }
45
- end
46
-
47
- ## Number ##
48
- def number?(input)
49
- input.is_a?(Numeric) || input&.match?(/^\s*\d+\.?\d*\s*$/)
50
- end
51
-
52
- def number_return(_input)
53
- { value: contains_decimal?(@input.to_s) ? @input.to_f : @input.to_i, type: 'number', needs_reference: false }
54
- end
55
-
56
- def contains_decimal?(str)
57
- # Define a regular expression pattern for a decimal number
58
- decimal_pattern = /\d+\.\d+/
59
-
60
- # Check if the string matches the pattern
61
- !!(str =~ decimal_pattern)
62
- end
63
-
64
- ## Boolean ##
65
- def boolean?(input)
66
- input.is_a?(TrueClass) || input.is_a?(FalseClass) || input&.match?(/true|false/)
67
- end
68
-
69
- def boolean_return(_input)
70
- { value: @input, type: 'boolean', needs_reference: false }
71
- end
72
- end
73
- end
74
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DTRToRust
4
- module Common
5
- # This module appends references to variables.
6
- module ReferenceAppender
7
- def self.call(input, ref_nums: false)
8
- # Hack to get tests to pass
9
- return '&signature_payload.into()' if input == 'signature_payload.into()'
10
-
11
- decorated_input = Common::InputInterpreter.interpret(input)
12
-
13
- # HACK: is likely chain of method calls
14
- # ex: env.storage().instance().get(COUNTER).unwrap_or(0);
15
- # --> env.storage().instance().get(&COUNTER).unwrap_or(0);
16
- if decorated_input[:type] != 'number' &&
17
- decorated_input[:value].include?('.') &&
18
- decorated_input[:value].include?('(') && decorated_input[:value].include?(')')
19
- more_complex_ref_appender(input, decorated_input)
20
- elsif decorated_input[:needs_reference]
21
- "&#{decorated_input[:value]}"
22
- elsif decorated_input[:type] == 'number'
23
- ref_nums ? "&#{decorated_input[:value]}" : decorated_input[:value]
24
- else
25
- decorated_input[:value]
26
- end
27
- end
28
-
29
- def self.more_complex_ref_appender(_input, decorated_input)
30
- decorated_input[:value].split('.').map do |x|
31
- x = x.strip
32
- if call_with_input?(x)
33
- matches = x.scan(/\((.*?)\)/)
34
- things = matches
35
- .flatten
36
- .filter(&method(:not_empty_string?))
37
- .map(&method(:wild_stuff))
38
- .join(', ')
39
- "#{x.split('(')[0]}(#{things})"
40
- else
41
- x
42
- end
43
- end.join('.')
44
- end
45
-
46
- def self.not_empty_string?(input)
47
- input != ''
48
- end
49
-
50
- def self.wild_stuff(input)
51
- input.split(',').map { |x| ReferenceAppender.call(x.strip) }.join(', ')
52
- end
53
-
54
- def self.call_with_input?(input)
55
- input.include?('(') && input.end_with?(')') && !input.end_with?('()')
56
- end
57
- end
58
- end
59
- end
data/lib/dtr_to_rust.rb DELETED
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This is the main module for the DTR to Rust gem.
4
- module DTRToRust
5
- autoload :Generator, 'generator'
6
- autoload :InstructionHandler, 'instruction_handler'
7
-
8
- # This module contains all the classes that handle the different types of instructions.
9
- module Instruction
10
- autoload :Evaluate, 'instruction/evaluate'
11
- autoload :Field, 'instruction/field'
12
- autoload :Handler, 'instruction/handler'
13
- autoload :Print, 'instruction/print'
14
- autoload :Return, 'instruction/return'
15
- autoload :InstantiateObject, 'instruction/instantiate_object'
16
- autoload :Add, 'instruction/add'
17
- autoload :Subtract, 'instruction/subtract'
18
- autoload :Multiply, 'instruction/multiply'
19
- autoload :Divide, 'instruction/divide'
20
- autoload :Assign, 'instruction/assign'
21
- autoload :Jump, 'instruction/jump'
22
- autoload :Goto, 'instruction/goto'
23
- autoload :ExitWithMessage, 'instruction/exit_with_message'
24
- autoload :And, 'instruction/and'
25
- autoload :Or, 'instruction/or'
26
- autoload :Label, 'instruction/label'
27
- autoload :EndOfIterationCheck, 'instruction/end_of_iteration_check'
28
- autoload :Increment, 'instruction/increment'
29
- end
30
-
31
- # This module contains all the classes that handle common logic.
32
- module Common
33
- autoload :InputInterpreter, 'common/input_interpreter'
34
- autoload :ReferenceAppender, 'common/reference_appender'
35
- autoload :TypeTranslator, 'common/type_translator'
36
- end
37
-
38
- # This module contains all the classes that handle optimization.
39
- module Optimization
40
- autoload :ChainedInvocationAssignmentReduction, 'optimization/chained_invocation_assignment_reduction'
41
- autoload :FieldToAssignmentConversion, 'optimization/field_to_assignment_conversion'
42
- autoload :BinaryXToSelfAssignmentReduction, 'optimization/binary_x_to_self_assignment_reduction'
43
- end
44
-
45
- # This module contains all the classes that handle user defined types.
46
- module UserDefinedTypes
47
- autoload :Handler, 'user_defined_types/handler'
48
- end
49
-
50
- # This module contains all the classes that handle the aggregation of instructions.
51
- module Aggregator
52
- autoload :ScopeBlockAggregator, 'aggregator/scope_block_aggregator'
53
- end
54
- end
data/lib/generator.rb DELETED
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dtr_core'
4
-
5
- module DTRToRust
6
- # Generates Rust code from a DTR contract
7
- class Generator
8
- def initialize(content)
9
- @dtr_contract = ::DTRCore::Contract.from_dtr_raw(content)
10
- end
11
-
12
- def generate
13
- @content = ''
14
-
15
- generate_user_defined_types
16
- generate_state
17
- generate_contract_name
18
- generate_interface
19
- generate_helpers
20
-
21
- generate_contract_header
22
-
23
- @content
24
- end
25
-
26
- def self.generate_from_file(file_path)
27
- new(File.read(file_path)).generate
28
- end
29
-
30
- def self.generate_from_string(dtr_string)
31
- new(dtr_string).generate
32
- end
33
-
34
- private
35
-
36
- attr_reader :dtr_contract
37
-
38
- def generate_contract_header
39
- imports_super_set = %w[
40
- Address
41
- BytesN
42
- contract
43
- contractimpl
44
- contracttype
45
- contracterror
46
- symbol_short
47
- vec
48
- Env
49
- Symbol
50
- Vec
51
- log
52
- token
53
- ]
54
-
55
- used_imports = []
56
-
57
- @content.split.each do |word|
58
- imports_super_set.each do |import|
59
- used_imports << import if word.include?(import)
60
- end
61
- end
62
-
63
- used_imports.uniq!
64
-
65
- # TODO: unsure how to check this one
66
- used_imports << 'auth::Context'
67
- used_imports << 'IntoVal'
68
-
69
- # TODO: don't hardcode imports
70
- @content = "#![no_std]\nuse soroban_sdk::{#{used_imports.join(', ')}};\n\n" + @content
71
- end
72
-
73
- def generate_contract_name
74
- @content += "#[contract]\npub struct #{dtr_contract.name};\n\n"
75
- end
76
-
77
- def generate_state
78
- return if dtr_contract.state.nil?
79
-
80
- dtr_contract.state.each do |state_value|
81
- if state_value.type == 'String'
82
- @content += "const #{state_value.name}: Symbol = symbol_short!(#{state_value.initial_value});\n"
83
- else
84
- @content += "const #{state_value.name}: #{Common::TypeTranslator.translate_type(state_value.type)} = #{state_value.initial_value};\n"
85
- end
86
- end
87
-
88
- @content += "\n"
89
- end
90
-
91
- def generate_interface
92
- @content += "#[contractimpl]\nimpl #{dtr_contract.name} {#{generate_functions_each(dtr_contract.interface,
93
- false)}}\n"
94
- end
95
-
96
- def generate_helpers
97
- @content += "#{generate_functions_each(dtr_contract.helpers, true)}\n"
98
- end
99
-
100
- def generate_functions_each(functions, is_helper)
101
- function_names = functions&.map(&:name)
102
-
103
- functions&.map do |function|
104
- optimized_instructions = optimize_instructions(function.instructions)
105
-
106
- instruction_blocks = Aggregator::ScopeBlockAggregator.aggregate(optimized_instructions)
107
-
108
- return_string = "\n#{is_helper ? '' : ' '}pub fn #{function.name}(#{generate_function_args(function)}) "
109
- return_string += generate_function_output(function)
110
- return_string += " {\n"
111
- if function.output
112
- return_string += " let Thing_to_return: #{Common::TypeTranslator.translate_type(function.output)};\n"
113
- end
114
- return_string += "#{generate_instructions_for_blocks(instruction_blocks, function_names,
115
- is_helper)}"
116
-
117
- if @last_scope.positive?
118
- while @last_scope.positive?
119
- return_string += "\n" + form_rust_string('}', @last_scope,
120
- is_helper)
121
- @last_scope -= 1
122
- end
123
- end
124
- return_string += "\n#{is_helper ? '' : ' '}}\n"
125
-
126
- return_string
127
- end&.join("\n")
128
- end
129
-
130
- def optimize_instructions(instructions)
131
- stage1_optimized = Optimization::FieldToAssignmentConversion.apply(instructions)
132
- stage2_optimized = Optimization::BinaryXToSelfAssignmentReduction.apply(stage1_optimized)
133
- Optimization::ChainedInvocationAssignmentReduction.apply(stage2_optimized)
134
- end
135
-
136
- def generate_function_output(function)
137
- return '' if function.output.nil?
138
-
139
- "-> #{Common::TypeTranslator.translate_type(function.output)}"
140
- end
141
-
142
- def generate_function_args(function)
143
- all_inputs = [] + function.inputs
144
-
145
- all_inputs.map { |x| "#{x[:name]}: #{Common::TypeTranslator.translate_type(x[:type_name])}" }.join(', ')
146
- end
147
-
148
- def generate_instructions_for_blocks(instruction_blocks, function_names, is_helper)
149
- instruction_blocks.map do |block|
150
- spacing_scope = block[:decorated_value]
151
- content = ''
152
- if @last_scope && @last_scope > spacing_scope
153
- while @last_scope > spacing_scope
154
- content += form_rust_string("}\n", @last_scope, is_helper)
155
- @last_scope -= 1
156
- end
157
- end
158
- @last_scope = spacing_scope
159
- content += generate_instructions_each(block[:block], spacing_scope, function_names, is_helper)
160
-
161
- content
162
- end.join("\n")
163
- end
164
-
165
- def generate_instructions_each(instructions, spacing_scope, function_names, is_helper)
166
- instructions.map do |instruction|
167
- content = ''
168
- content += generate_instruction(instruction, spacing_scope, function_names, is_helper)
169
-
170
- content
171
- end.join("\n")
172
- end
173
-
174
- def form_rust_string(instruction_string, scope, is_helper)
175
- "#{spacing(scope, is_helper)}#{instruction_string}"
176
- end
177
-
178
- def spacing(scope, is_helper)
179
- ' ' * (is_helper ? 0 : scope + 1)
180
- end
181
-
182
- def generate_instruction(instruction, spacing_scope, function_names, is_helper)
183
- handler = InstructionHandler.new(instruction, spacing_scope, function_names,
184
- dtr_contract.user_defined_types || [], is_helper)
185
- handler.generate_rust
186
- end
187
-
188
- def generate_user_defined_types
189
- return if dtr_contract.user_defined_types.nil?
190
-
191
- dtr_contract.user_defined_types.each do |udt|
192
- @content += DTRToRust::UserDefinedTypes::Handler.generate(udt)
193
- end
194
- end
195
- end
196
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module DTRToRust
4
- module Instruction
5
- # This class handles the label instruction.
6
- class Label < Handler
7
- def handle
8
- form_rust_string("label: #{@instruction.inputs[0]}")
9
- end
10
- end
11
- end
12
- end