sbuilder-ethereum 0.0.6
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/VERSION +1 -0
- data/lib/mixer/decl_ref.rb +19 -0
- data/lib/mixer/domain_ref.rb +18 -0
- data/lib/mixer/scope.rb +92 -0
- data/lib/mixer/scoped.rb +17 -0
- data/lib/mixer/symbol_ref.rb +16 -0
- data/lib/mixer/type_symbol.rb +75 -0
- data/lib/plugin/plugin.rb +332 -0
- data/lib/resources/correctness/accouns_type.tla +1 -0
- data/lib/resources/correctness/accounts_unique.tla +2 -0
- data/lib/resources/correctness/accounts_valid.tla +2 -0
- data/lib/resources/correctness/storage_root_unique.tla +2 -0
- data/lib/resources/correctness/total_value.tla +1 -0
- data/lib/resources/eth/accounts_state.tla +2 -0
- data/lib/resources/eth/accounts_temp.tla +2 -0
- data/lib/resources/eth/address_free.tla +2 -0
- data/lib/resources/eth/mined_state.tla +1 -0
- data/lib/resources/eth/storageRoot.tla +1 -0
- data/lib/resources/eth/storageRoot_temp.tla +1 -0
- data/lib/resources/mine/mine_entry.tla +4 -0
- data/lib/resources/mine/mine_service.tla +22 -0
- data/lib/resources/operators/elementExists.tla +4 -0
- data/lib/resources/operators/gasPrice.tla +2 -0
- data/lib/resources/operators/gasValue.tla +2 -0
- data/lib/resources/operators/getElement.tla +5 -0
- data/lib/resources/operators/intrinsicGas.tla +4 -0
- data/lib/resources/operators/transactionGas.tla +4 -0
- data/lib/resources/operators/upFrontCost.tla +6 -0
- data/lib/resources/personal_newAccount/personal_newAccount_done.tla +14 -0
- data/lib/resources/personal_newAccount/personal_newAccount_entry.tla +10 -0
- data/lib/resources/personal_newAccount/personal_newAccount_service.tla +29 -0
- data/lib/resources/removed/sendTransaction_entry.tla +5 -0
- data/lib/resources/removed/sendTransaction_service.tla +36 -0
- data/lib/resources/removed/tst.tla +1 -0
- data/lib/resources/transaction/ethereum_service_done.tla +24 -0
- data/lib/resources/transaction/ethereum_service_pop.tla +24 -0
- data/lib/resources/transaction/ethereum_service_push.tla +14 -0
- data/lib/resources/transaction/ethereum_service_start.tla +13 -0
- data/lib/resources/transaction/status_fail.tla +1 -0
- data/lib/resources/transaction/status_ok.tla +1 -0
- data/lib/sbuilder-ethereum.rb +52 -0
- data/lib/sbuilder/compile.rb +163 -0
- data/lib/sbuilder/constants.rb +93 -0
- data/lib/sbuilder/exception.rb +22 -0
- data/lib/sbuilder/generate/sexp_processor_tla.rb +2674 -0
- data/lib/sbuilder/generate/tla_element_generator.rb +1206 -0
- data/lib/sbuilder/generate/tla_element_text.rb +703 -0
- data/lib/sbuilder/load.rb +119 -0
- data/lib/sbuilder/mustache/renderer.rb +152 -0
- data/lib/sbuilder/render.rb +141 -0
- data/lib/sbuilder/s.rb +21 -0
- data/lib/sbuilder/sexp_ast.rb +1378 -0
- data/lib/sbuilder/sexp_processor_api.rb +184 -0
- data/lib/sbuilder/sexp_processor_canonize.rb +326 -0
- data/lib/sbuilder/sexp_processor_dataflow.rb +461 -0
- data/lib/sbuilder/sexp_processor_ethereum.rb +127 -0
- data/lib/sbuilder/sexp_processor_need_to_canonize.rb +572 -0
- data/lib/sbuilder/sexp_processor_snippet.rb +154 -0
- data/lib/sbuilder/sexp_processor_symboltable1.rb +296 -0
- data/lib/sbuilder/sexp_processor_symboltable2.rb +175 -0
- data/lib/sbuilder/sexp_utils.rb +417 -0
- data/lib/utils/logger.rb +82 -0
- data/lib/utils/string_inject.rb +11 -0
- data/sbuilder-ethereum.gemspec +39 -0
- metadata +190 -0
| @@ -0,0 +1,184 @@ | |
| 1 | 
            +
            module Sbuilder;
         | 
| 2 | 
            +
              module Ethereum
         | 
| 3 | 
            +
                ##
         | 
| 4 | 
            +
                # Load Api information to sbuilder using facade
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                class SexpProcessorApi < SexpProcessorEthereum
         | 
| 7 | 
            +
                  
         | 
| 8 | 
            +
                  # ------------------------------------------------------------------
         | 
| 9 | 
            +
                  # Attributes
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  # @attr [ApiLoaderFacade] apiFacade
         | 
| 12 | 
            +
                  attr_accessor :apiFacade
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  # ------------------------------------------------------------------
         | 
| 15 | 
            +
                  # Maintain state in tree tarversal
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # @attr [ParamSet_If] currentInterface
         | 
| 19 | 
            +
                  attr_accessor :currentInterface
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  # @attr [ParamSetDef_If] currentDefinition 
         | 
| 22 | 
            +
                  attr_accessor :currentDefinition
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  # @attr [ParamSetRoot:Stack] paramSetStack
         | 
| 25 | 
            +
                  attr_reader :paramSetStack
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  # ------------------------------------------------------------------
         | 
| 28 | 
            +
                  # @!group Construct & configure
         | 
| 29 | 
            +
                  
         | 
| 30 | 
            +
                  def initialize( options={} )
         | 
| 31 | 
            +
                    super( options )
         | 
| 32 | 
            +
                    @paramSetStack = []
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                  
         | 
| 35 | 
            +
                  # @!endgroup
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  # ------------------------------------------------------------------
         | 
| 38 | 
            +
                  # @!group wrap interfaces
         | 
| 39 | 
            +
                  
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  # @param [Interface] expInterface
         | 
| 42 | 
            +
                  def encloseInterface( expInterface )
         | 
| 43 | 
            +
                    logger.info "#{__method__}: #{expInterface}"
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    raise "Invalid call sequence, should have callde #apiFacade= before #process" unless apiFacade
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    # create new interface
         | 
| 48 | 
            +
                    self.currentInterface = apiFacade.newInterface( expInterface.path, expInterface.op )
         | 
| 49 | 
            +
                    
         | 
| 50 | 
            +
                    begin
         | 
| 51 | 
            +
                      # build new interface
         | 
| 52 | 
            +
                      yield
         | 
| 53 | 
            +
                    ensure
         | 
| 54 | 
            +
                      # pass interface object built to sbuilder
         | 
| 55 | 
            +
                      apiFacade.modelInterface( currentInterface )
         | 
| 56 | 
            +
                      self.currentInterface = nil
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def encloseDefinition( expDefinition )
         | 
| 61 | 
            +
                    logger.info "#{__method__}: #{expDefinition}"
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    raise "Invalid call sequence, should have callde #apiFacade= before #process" unless apiFacade
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    # create new definition based on 'expDefinition.definitionType'
         | 
| 66 | 
            +
                    case expDefinition.definitionType
         | 
| 67 | 
            +
                    when :normal
         | 
| 68 | 
            +
                      self.currentDefinition = apiFacade.newDefinition( expDefinition.name )
         | 
| 69 | 
            +
                    when :function
         | 
| 70 | 
            +
                      self.currentDefinition = apiFacade.newFunctionDefinition( expDefinition.name )          
         | 
| 71 | 
            +
                    else
         | 
| 72 | 
            +
                      raise "Unknown definitionType #{expDefinition.definitionType}"
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                    
         | 
| 75 | 
            +
                    begin
         | 
| 76 | 
            +
                      # build new interface
         | 
| 77 | 
            +
                      yield currentDefinition
         | 
| 78 | 
            +
                    ensure
         | 
| 79 | 
            +
                      # pass definition object built to sbuilder
         | 
| 80 | 
            +
                      apiFacade.modelDefinition( currentDefinition )
         | 
| 81 | 
            +
                      self.currentDefinition = nil
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
                  end
         | 
| 84 | 
            +
                  
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  def encloseParameterList( expParameterList )
         | 
| 87 | 
            +
                    logger.info "#{__method__}: currentInterface=#{currentInterface}"
         | 
| 88 | 
            +
                    paramSetStack.push( currentInterface  )
         | 
| 89 | 
            +
                    begin
         | 
| 90 | 
            +
                      # traverse the tree under the newly created scope
         | 
| 91 | 
            +
                      yield
         | 
| 92 | 
            +
                    ensure
         | 
| 93 | 
            +
                      paramSetStack.pop
         | 
| 94 | 
            +
                    end
         | 
| 95 | 
            +
                  end
         | 
| 96 | 
            +
                  
         | 
| 97 | 
            +
                  # ------------------------------------------------------------------
         | 
| 98 | 
            +
                  # @!group Sexp node actions
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                  def process_Definition( exp )
         | 
| 101 | 
            +
                    logger.info "#{__method__}: #{exp}"
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    encloseDefinition( exp ) do |paramSet| 
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                      exp.properties.each do |prop|
         | 
| 106 | 
            +
                        if prop[:type] == :parameter
         | 
| 107 | 
            +
                          sbuilderParameter = apiFacade.newParameter( prop[:name] )
         | 
| 108 | 
            +
                          domainName = prop[:domain_name]
         | 
| 109 | 
            +
                          logger.debug "#{__method__}: add definition parameter=#{sbuilderParameter} with domain '#{domainName}' for prop=#{prop}" if logger.debug?               
         | 
| 110 | 
            +
                          apiFacade.addParameter( paramSet, sbuilderParameter, domainName )
         | 
| 111 | 
            +
                        elsif prop[:type] == :reference
         | 
| 112 | 
            +
                          isArray = false
         | 
| 113 | 
            +
                          sbuilderParameter = apiFacade.newParameterReference( prop[:name], prop[:reference], isArray )
         | 
| 114 | 
            +
                          logger.debug "#{__method__}: add definition parameter=#{sbuilderParameter} for prop=#{prop}" if logger.debug? 
         | 
| 115 | 
            +
                          apiFacade.addParameter( paramSet, sbuilderParameter )              
         | 
| 116 | 
            +
                        else
         | 
| 117 | 
            +
                          raise "Unknown :type #{prop[:type]} in #{prop}, knwon types ':parameter', ':reference'" 
         | 
| 118 | 
            +
                        end
         | 
| 119 | 
            +
                        # add it to the parameter list on top of the stack
         | 
| 120 | 
            +
                      end
         | 
| 121 | 
            +
                      
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    s()
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  def process_Interface( exp )
         | 
| 128 | 
            +
                    logger.info "#{__method__}: #{exp}"
         | 
| 129 | 
            +
                    
         | 
| 130 | 
            +
                    encloseInterface( exp ) do
         | 
| 131 | 
            +
                      
         | 
| 132 | 
            +
                      encloseParameterList( exp ) do
         | 
| 133 | 
            +
                        
         | 
| 134 | 
            +
                        # processing arameter set on top of the stack
         | 
| 135 | 
            +
                        paramSet = paramSetStack.last
         | 
| 136 | 
            +
                        
         | 
| 137 | 
            +
                        exp.interfaceDefinition[:input].each do |param|
         | 
| 138 | 
            +
                          sbuilderParameter = apiFacade.newParameter( param[:name] )
         | 
| 139 | 
            +
                          logger.info "#{__method__}: add input parameter=#{sbuilderParameter}"
         | 
| 140 | 
            +
                          # add it to the parameter list on top of the stack
         | 
| 141 | 
            +
                          apiFacade.addParameter( paramSet, sbuilderParameter, param[:domain_name] )
         | 
| 142 | 
            +
                        end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                        exp.interfaceDefinition[:output].each do |param|
         | 
| 145 | 
            +
                          sbuilderParameter = apiFacade.newParameter( param[:name] )
         | 
| 146 | 
            +
                          logger.info "#{__method__}: add outpu parameter=#{sbuilderParameter}"
         | 
| 147 | 
            +
                          apiFacade.addResponseParameter( paramSet, sbuilderParameter, param[:domain_name] )
         | 
| 148 | 
            +
                        end
         | 
| 149 | 
            +
                        
         | 
| 150 | 
            +
                        # process_rest( exp.inputParameters )
         | 
| 151 | 
            +
                      end
         | 
| 152 | 
            +
                    end
         | 
| 153 | 
            +
                    s()
         | 
| 154 | 
            +
                  end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  # def process_ParameterList( exp )
         | 
| 157 | 
            +
                  #   raise "no support for recursive  ParameterList"
         | 
| 158 | 
            +
                  #   # logger.info "#{__method__}"
         | 
| 159 | 
            +
                  #   # encloseParameterList( exp ) do
         | 
| 160 | 
            +
                  #   #   process_rest( exp )          
         | 
| 161 | 
            +
                  #   # end
         | 
| 162 | 
            +
                  # end
         | 
| 163 | 
            +
                  
         | 
| 164 | 
            +
                  # def process_VariableDeclaration( exp )
         | 
| 165 | 
            +
                  #   logger.info "#{__method__}: #{exp}}"
         | 
| 166 | 
            +
                  #   raise "Support only elementary types" unless exp.isElementary
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  #   # create elementary parameter
         | 
| 169 | 
            +
                  #   sbuilderParameter = apiFacade.newParameter( exp.name )
         | 
| 170 | 
            +
                    
         | 
| 171 | 
            +
                  #   # add it to the parameter list on top of the stack
         | 
| 172 | 
            +
                  #   paramSetStack.last.addParameter( sbuilderParameter )
         | 
| 173 | 
            +
                  #   s()
         | 
| 174 | 
            +
                  # end
         | 
| 175 | 
            +
             | 
| 176 | 
            +
             | 
| 177 | 
            +
                  # @!endgroup
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                  
         | 
| 180 | 
            +
                end # class
         | 
| 181 | 
            +
                
         | 
| 182 | 
            +
                               
         | 
| 183 | 
            +
              end
         | 
| 184 | 
            +
            end
         | 
| @@ -0,0 +1,326 @@ | |
| 1 | 
            +
            module Sbuilder
         | 
| 2 | 
            +
              module Ethereum
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                require 'yaml'
         | 
| 5 | 
            +
                require 'json'
         | 
| 6 | 
            +
                
         | 
| 7 | 
            +
                ##
         | 
| 8 | 
            +
                # SexpProcessorCanonize know how to canonize SexpAst. It expect
         | 
| 9 | 
            +
                # +SexpProcessorNeedToCanonize+ object in +needs+ attribute to
         | 
| 10 | 
            +
                # know, what needs to be canonized. After canonization, this
         | 
| 11 | 
            +
                # method returns +somethingCanonized+
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                # - constructor - if missing
         | 
| 14 | 
            +
                # - balance - if missing
         | 
| 15 | 
            +
                # - getter methods - if missing
         | 
| 16 | 
            +
                #
         | 
| 17 | 
            +
                # Generates unique identifiers using static variable +idGenerator+
         | 
| 18 | 
            +
                #
         | 
| 19 | 
            +
                # 
         | 
| 20 | 
            +
                #
         | 
| 21 | 
            +
                
         | 
| 22 | 
            +
                class SexpProcessorCanonize < SexpProcessorEthereum
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| 26 | 
            +
                  # @attr [SexpProcessorNeedToCanonize] needs SexpProcessor, which
         | 
| 27 | 
            +
                  # knows what needs to be added to SexpAst -tree.
         | 
| 28 | 
            +
                  attr_reader :needs
         | 
| 29 | 
            +
             | 
| 30 | 
            +
             | 
| 31 | 
            +
                  # @attr [Hash] optionss
         | 
| 32 | 
            +
                  attr_reader :options
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  # @attr [Boolean] somethingCanonized true if any chg in SexpTree
         | 
| 35 | 
            +
                  attr_reader :somethingCanonized
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  # @attr [String] compileUnit for better log message
         | 
| 38 | 
            +
                  attr_reader :compileUnit
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  # ------------------------------------------------------------------
         | 
| 41 | 
            +
                  # @!group Scoped
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # @attr [Contract] currentContract which currently processing
         | 
| 44 | 
            +
                  attr_accessor :currentContract
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  # @attr [FunctionDefinition] currentFunction
         | 
| 47 | 
            +
                  attr_accessor :currentFunction
         | 
| 48 | 
            +
                  
         | 
| 49 | 
            +
                  
         | 
| 50 | 
            +
                  def contracted( expContract )
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    self.currentContract = expContract
         | 
| 53 | 
            +
                    begin
         | 
| 54 | 
            +
                      yield
         | 
| 55 | 
            +
                    ensure
         | 
| 56 | 
            +
                      self.currentContract = nil
         | 
| 57 | 
            +
                    end
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def functed( expFunctionDef )
         | 
| 61 | 
            +
                    self.currentFunction = expFunctionDef
         | 
| 62 | 
            +
                    
         | 
| 63 | 
            +
                    begin
         | 
| 64 | 
            +
                      yield
         | 
| 65 | 
            +
                    ensure
         | 
| 66 | 
            +
                      self.currentFunction = nil
         | 
| 67 | 
            +
                    end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  # @!endgroup
         | 
| 72 | 
            +
                  
         | 
| 73 | 
            +
                  
         | 
| 74 | 
            +
                  # ------------------------------------------------------------------
         | 
| 75 | 
            +
                  # @!group Construct & init & configure
         | 
| 76 | 
            +
                  
         | 
| 77 | 
            +
                  def initialize( options={} )
         | 
| 78 | 
            +
                    super( options )
         | 
| 79 | 
            +
                    logger.debug "#{__method__}: created"  if logger.debug?      
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                    @options = options
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    initIt
         | 
| 84 | 
            +
                  end
         | 
| 85 | 
            +
                  
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  ## 
         | 
| 88 | 
            +
                  # Init +needs+ which knows what to canonize
         | 
| 89 | 
            +
                  # MUST BE CALLED FOR EACH FIX POINT ITERATION
         | 
| 90 | 
            +
                  def setNeeds( sexpProcessorNeedToCanonize )
         | 
| 91 | 
            +
                    @needs  = sexpProcessorNeedToCanonize
         | 
| 92 | 
            +
                    initIt
         | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                  ##
         | 
| 96 | 
            +
                  # better log messages
         | 
| 97 | 
            +
                  def setCompileUnit( compileUnit )
         | 
| 98 | 
            +
                    @compileUnit = compileUnit
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  def initIt
         | 
| 102 | 
            +
                    # default no changes - toggle if changed
         | 
| 103 | 
            +
                    @somethingCanonized = false
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                  # @!endgroup
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  # ------------------------------------------------------------------
         | 
| 109 | 
            +
                  # @!group scope support
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                  # @attr [Contract] currentContract which currently processing
         | 
| 112 | 
            +
                  attr_accessor :currentContract
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  def contracted( expContract )
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    @currentContract = expContract
         | 
| 117 | 
            +
                    begin
         | 
| 118 | 
            +
                      yield
         | 
| 119 | 
            +
                    ensure
         | 
| 120 | 
            +
                      @currentContract = nil
         | 
| 121 | 
            +
                    end
         | 
| 122 | 
            +
                  end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                  ##
         | 
| 125 | 
            +
                  # Set flag +somethingCanonized+ to indicate that SexpAst has been modified
         | 
| 126 | 
            +
                  def addNewNode( exp, chldExp )
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                    logger.debug "#{__method__}: add #{chldExp}, to #{exp}" if logger.debug?
         | 
| 129 | 
            +
                    
         | 
| 130 | 
            +
                    # # Added as child --> add pointer to parent
         | 
| 131 | 
            +
                    # chldExp.setParent(  exp )
         | 
| 132 | 
            +
                    # exp << chldExp
         | 
| 133 | 
            +
                    SexpUtils.addNewChild( exp, chldExp )
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    # Iterate as long as something has changed
         | 
| 136 | 
            +
                    @somethingCanonized = true
         | 
| 137 | 
            +
                  end
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                  
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                  # @!endgroup
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  ##
         | 
| 144 | 
            +
                  # @return [s(s(name,functionAst))] array of name/function Ast pair, which
         | 
| 145 | 
            +
                  # any address implements. 
         | 
| 146 | 
            +
                  def getAddressFunctions
         | 
| 147 | 
            +
                    return @addressFunctions if  @addressFunctions
         | 
| 148 | 
            +
                    @addressFunctions
         | 
| 149 | 
            +
                  end
         | 
| 150 | 
            +
                  
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                  # ------------------------------------------------------------------
         | 
| 153 | 
            +
                  # @!group Tree traversal
         | 
| 154 | 
            +
                  def process_GlobalScope( exp )
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                    mapLiterals
         | 
| 157 | 
            +
                    process_rest( exp  )
         | 
| 158 | 
            +
                    
         | 
| 159 | 
            +
                  end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                  def process_ContractDefinition( exp )
         | 
| 162 | 
            +
                    logger.debug "#{__method__}: exp=#{exp}" if logger.debug?
         | 
| 163 | 
            +
             | 
| 164 | 
            +
             | 
| 165 | 
            +
                    # Add constructor?
         | 
| 166 | 
            +
                    logger.debug "#{__method__}: #{compileUnit} needs.needConstructor=#{needs.needConstructor}" if logger.debug?
         | 
| 167 | 
            +
                    if needs.needConstructor
         | 
| 168 | 
            +
                      constructor = SexpUtils.createConstructorNode( exp.name )
         | 
| 169 | 
            +
                      logger.info "#{__method__}: add constructor=#{constructor} to exp=#{exp}"          
         | 
| 170 | 
            +
                      # exp << constructor
         | 
| 171 | 
            +
                      addNewNode( exp, constructor )
         | 
| 172 | 
            +
                    end
         | 
| 173 | 
            +
             | 
| 174 | 
            +
             | 
| 175 | 
            +
                    # Add variableDeclation?
         | 
| 176 | 
            +
                    logger.debug "#{__method__}: #{compileUnit} needs.needVariableDeclarations=#{needs.needVariableDeclarations}" if logger.debug?
         | 
| 177 | 
            +
                    needs.needVariableDeclarations.each do |variableName|
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                      newVariableDeclaration = SexpUtils.createVariableDeclaration( variableName )
         | 
| 180 | 
            +
                      logger.info "#{__method__}: add newVariableDeclaration=#{newVariableDeclaration} to #{exp.name}"                    
         | 
| 181 | 
            +
                      
         | 
| 182 | 
            +
                      addNewNode( exp, newVariableDeclaration )
         | 
| 183 | 
            +
                    end
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                    # Add getters?
         | 
| 186 | 
            +
                    logger.debug "#{__method__}: needs.neededGetters=#{needs.neededGetters}" if logger.debug?
         | 
| 187 | 
            +
                    needs.neededGetters.each do |variableName|
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                      newGetter = SexpUtils.createGetter( variableName )
         | 
| 190 | 
            +
                      logger.info "#{__method__}: add newGetter=#{newGetter} to exp=#{exp}"                    
         | 
| 191 | 
            +
                      addNewNode( exp, newGetter )
         | 
| 192 | 
            +
                    end
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                    logger.debug "#{__method__}: needs.assignmentOperatorSplits=#{needs.assignmentOperatorSplits}" if logger.debug?
         | 
| 195 | 
            +
                    needs.assignmentOperatorSplits.each do |assignmentOperatorSplit|
         | 
| 196 | 
            +
                      logger.info "#{__method__}: split assignment assignmentOperatorSplit=#{assignmentOperatorSplit}"
         | 
| 197 | 
            +
                      binOp = SexpUtils.createBinaryOperator( SexpUtils.mapAssignmentOperator(assignmentOperatorSplit.operator) )
         | 
| 198 | 
            +
                      binOp << assignmentOperatorSplit.lval
         | 
| 199 | 
            +
                      binOp << assignmentOperatorSplit.rval
         | 
| 200 | 
            +
                      # canonize
         | 
| 201 | 
            +
                      assignmentOperatorSplit.setOperator
         | 
| 202 | 
            +
                      assignmentOperatorSplit.setRval( binOp )          
         | 
| 203 | 
            +
                      logger.info "#{__method__}: canonizned assignment=#{assignmentOperatorSplit}"
         | 
| 204 | 
            +
                    end
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                    # # TODO remove
         | 
| 207 | 
            +
                    # # Change assignment rval from :FunctionCall to :FunctionCallReadReturn
         | 
| 208 | 
            +
                    # logger.debug "#{__method__}: needs.assignmentsToSplit=#{needs.assignmentsToSplit}" if logger.debug?
         | 
| 209 | 
            +
                    # needs.assignmentsToSplit.each do |assignmentToSplit|
         | 
| 210 | 
            +
                    #   readReturn = FunctionCallReadReturn.define( assignmentToSplit.rval )
         | 
| 211 | 
            +
                    #   assignmentToSplit.changeRval( readReturn )
         | 
| 212 | 
            +
                    #   logger.info "#{__method__}: split assignmentToSplit=#{assignmentToSplit}"
         | 
| 213 | 
            +
                    # end
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                    mapLiterals
         | 
| 216 | 
            +
                    
         | 
| 217 | 
            +
                    contracted( exp ) do 
         | 
| 218 | 
            +
                      process_rest(exp)
         | 
| 219 | 
            +
                    end
         | 
| 220 | 
            +
                    logger.info "#{__method__}: #{compileUnit} needs. somethingCanonized=#{somethingCanonized}"
         | 
| 221 | 
            +
                    
         | 
| 222 | 
            +
                    exp
         | 
| 223 | 
            +
                  end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                  
         | 
| 226 | 
            +
                  def process_FunctionDefinition( exp )
         | 
| 227 | 
            +
                    logger.debug "#{__method__}: exp=#{exp}" if logger.debug?
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                    # [ s( FUnctionDef, [name, ...] )] 
         | 
| 230 | 
            +
                    parametersToAdd = needs.missing_request_parameters.
         | 
| 231 | 
            +
                                 select { |sexp| sexp[0] == exp }.
         | 
| 232 | 
            +
                                 map { |sexp| sexp[1] }.first
         | 
| 233 | 
            +
             | 
| 234 | 
            +
                    # something to add
         | 
| 235 | 
            +
                    if  parametersToAdd && parametersToAdd.any? then
         | 
| 236 | 
            +
                      logger.info "#{__method__}: #{exp.name} should add parametersToAdd=#{parametersToAdd} to with #{exp.parameterList.length} "
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                      # parameter = s(:parameter, name, domainName )
         | 
| 239 | 
            +
                      parametersToAdd.each do |parameter|
         | 
| 240 | 
            +
                        # exp.parameterList << s(:VariableDeclaration, name, s(:Domain, domainName ))
         | 
| 241 | 
            +
                        newParameter = SexpUtils.createVariableDeclarationWithDomain( parameter[1], parameter[2] )
         | 
| 242 | 
            +
                        addNewNode( exp.parameterList, newParameter )
         | 
| 243 | 
            +
                      end
         | 
| 244 | 
            +
                      logger.info "#{__method__}: after add #{exp}"
         | 
| 245 | 
            +
                      
         | 
| 246 | 
            +
                    end
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                    functed( exp ) do 
         | 
| 249 | 
            +
                      process_rest(exp)
         | 
| 250 | 
            +
                    end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                    s()
         | 
| 253 | 
            +
                  end
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                  def process_Block( exp )
         | 
| 256 | 
            +
                    logger.debug "#{__method__}: exp=#{exp}" if logger.debug?
         | 
| 257 | 
            +
                    
         | 
| 258 | 
            +
                    # functionCallsToSplit: s( s(:Block), s(:Statement), s(:FunctionCall) )
         | 
| 259 | 
            +
                    bodySplitters = needs.functionCallsToSplit.select{ |functionCallToSplit| functionCallToSplit[0].equal?(exp) }
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                    # something to expand in this body before recursion
         | 
| 262 | 
            +
                    if bodySplitters.any? then
         | 
| 263 | 
            +
                      
         | 
| 264 | 
            +
                      logger.debug "#{__method__}: should split #{bodySplitters.length} stmts with #{bodySplitters} in block #{exp} " if logger.debug?
         | 
| 265 | 
            +
                      
         | 
| 266 | 
            +
                      bodySplitters.each do |bodySplitter|
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                        bodyStatement = bodySplitter[1] 
         | 
| 269 | 
            +
                        functionCall = bodySplitter[2]
         | 
| 270 | 
            +
             | 
| 271 | 
            +
                        logger.info "#{__method__} split stmt #{functionCall} for function call #{functionCall}"
         | 
| 272 | 
            +
                        # add s(:FunctionCall) to s(:Body) just before s(:Statement)
         | 
| 273 | 
            +
                        raise "Could not find #{bodyStatement} in #{exp}" if exp.find_index( bodyStatement ).nil?
         | 
| 274 | 
            +
                        exp.insert( exp.find_index( bodyStatement ), functionCall )
         | 
| 275 | 
            +
             | 
| 276 | 
            +
                        # wrap s(:FunctionCall ) in parent  with s(:FunctionCallReadReturn)
         | 
| 277 | 
            +
                        wrappedFunctionCall = FunctionCallReadReturn.define( functionCall  )
         | 
| 278 | 
            +
                        functionCall.parent[functionCall.parent.find_index( functionCall)] = wrappedFunctionCall
         | 
| 279 | 
            +
                      end
         | 
| 280 | 
            +
                      logger.info "#{__method__}: after split #{exp}"          
         | 
| 281 | 
            +
                    end
         | 
| 282 | 
            +
                    
         | 
| 283 | 
            +
                    process_rest( exp )
         | 
| 284 | 
            +
                  end
         | 
| 285 | 
            +
                    
         | 
| 286 | 
            +
                  
         | 
| 287 | 
            +
             | 
| 288 | 
            +
                  def process_VariableDeclaration( exp )
         | 
| 289 | 
            +
                    logger.debug "#{__method__}: exp=#{exp}" if logger.debug?
         | 
| 290 | 
            +
             | 
| 291 | 
            +
                    ##
         | 
| 292 | 
            +
                    # If there is variable declatrion without name for 'exp'
         | 
| 293 | 
            +
                    if needs.variable_declarations_without_name.include?( exp )
         | 
| 294 | 
            +
                      logger.info "#{__method__}: update name '#{currentFunction.name}' for #{exp}"
         | 
| 295 | 
            +
                      exp.setName( currentFunction.name )
         | 
| 296 | 
            +
                    end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                    s()        
         | 
| 299 | 
            +
                  end
         | 
| 300 | 
            +
                  
         | 
| 301 | 
            +
                  # @!endgroup
         | 
| 302 | 
            +
             | 
| 303 | 
            +
                  # ------------------------------------------------------------------
         | 
| 304 | 
            +
                  # @!group Utilities
         | 
| 305 | 
            +
             | 
| 306 | 
            +
                  ##
         | 
| 307 | 
            +
                  # Change value in literal
         | 
| 308 | 
            +
                  #
         | 
| 309 | 
            +
                  # @param [s(literalSexp,value):Array] map_literalValue
         | 
| 310 | 
            +
                  private def mapLiterals()
         | 
| 311 | 
            +
                    logger.debug "#{__method__}: needs.map_literalValue=#{needs.map_literalValue}" if logger.debug?
         | 
| 312 | 
            +
                    if needs.map_literalValue &&  needs.map_literalValue.any?
         | 
| 313 | 
            +
                      needs.map_literalValue.each do |literalSexpToValue|
         | 
| 314 | 
            +
                        literalSexp = literalSexpToValue[0]
         | 
| 315 | 
            +
                        newValue =  literalSexpToValue[1]
         | 
| 316 | 
            +
                        logger.info "#{__method__}: set newValue=#{newValue} in literalSexp #{literalSexp}"
         | 
| 317 | 
            +
                        literalSexp.setValue( newValue )
         | 
| 318 | 
            +
                      end
         | 
| 319 | 
            +
                    end
         | 
| 320 | 
            +
                  end
         | 
| 321 | 
            +
             | 
| 322 | 
            +
                  # @!endgroup      
         | 
| 323 | 
            +
                  
         | 
| 324 | 
            +
                end
         | 
| 325 | 
            +
              end
         | 
| 326 | 
            +
            end
         |