/**
 * Main module for constant-propogation.
 */
module php/strategy/const-prop/common/main
imports
   php/strategy/const-prop/analysis/common/literals
   php/strategy/const-prop/analysis/common/variables
   php/strategy/const-prop/analysis/common/operators
   php/strategy/const-prop/analysis/common/expressions
   php/strategy/const-prop/analysis/common/statements
   php/strategy/const-prop/analysis/common/main
   
   php/strategy/const-prop/analysis/wrappers
   php/strategy/const-prop/analysis/special
   php/strategy/const-prop/analysis/utilities
   php/strategy/const-prop/analysis/ruleset

strategies
  /**
   * Main analysis for the constant propogation. This strategy calls the 
   * more generic functionality without a second analysis.
   */ 
  main-analyse-const-prop = 
   try( 
      plug-main-analyse-const-prop(main-analyse-const-prop  // main
                                  ,fail                     // getter
                                  ,fail                     // setter
                                  ,fail                     // value-id getter
                                  ,fail                     // value-id setter
                                  ,fail                     // value-id remover
                                  ,!""                      // value-id name-maker
                                  ,id                       // literals strategy
                                  ,id                       // operators strategy
                                  ,php-union-const-prop     // rules union
                                  ,php-intersect-const-prop // rules intersect
                                  )
      )
  
  /**
   * Pluggable analysis for contant propgation.
   * This strategy receives some strategies which are used to
   * perform an analysis which is interleaved with the constant-propogation.
   */
  plug-main-analyse-const-prop(main,get,set
                              ,valid-get,valid-put,valid-remove,valid-name
                              ,literal
                              ,operators
                              ,rule-union
                              ,rule-intersect) = 
   try(  special-const-prop(main|)
      <+ wrapper-const-prop(main,get,set)
      <+ variable-const-prop(main,set,get,valid-get)
      <+ expression-const-prop(main,get,set,valid-get,valid-put,valid-remove|)
      <+ assign-operator-const-prop(main,get,set,valid-get,valid-put,valid-remove|) 
      <+ statement-const-prop(main,rule-union,rule-intersect|)
      <+ document-const-prop(main|)
      <+ (  inclusion-const-prop(main,get,set,rule-union|) 
         <+ no-inclusion-const-prop(main|<valid-name>)
         )
     // is does not matter that this always succeeds
     // but keeps the term created by literal or operators! 
      <+ (try( literal-const-prop(main|) <+ operator-const-prop(main|))
         ;try( literal <+ operators )  
         )
      )