home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / cstarget.tcl < prev    next >
Text File  |  1997-09-05  |  5KB  |  198 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. # Copyright (c) 1997 by Cayenne Software, Inc.
  4. #
  5. # This software is furnished under a license and may be used only in
  6. # accordance with the terms of such license and with the inclusion of
  7. # the above copyright notice. This software or any other copies thereof
  8. # may not be provided or otherwise made available to any other person.
  9. # No title to and ownership of the software is hereby transferred.
  10. #
  11. # The information in this software is subject to change without notice
  12. # and should not be construed as a commitment by Cayenne Software, Inc.
  13. #
  14. #---------------------------------------------------------------------------
  15. #
  16. #       File            : @(#)cstarget.tcl    /main/titanic/6 5 Sep 1997
  17. #       Original date   : Fri Sep  5 12:02:36 MET DST 1997
  18. #       Description     : Constraint satisfaction module
  19. #              Target language model derived custmizations
  20. #
  21. #---------------------------------------------------------------------------
  22.  
  23. require "cgcustom.tcl"
  24. require "csconst.tcl"
  25.  
  26. Class CSRegen : [customizeTargetModel CppRegen CSRegen] {
  27.     attribute userCodeOk
  28.     method promoter
  29.     method append
  30. }
  31.  
  32. method CSRegen::promoter {this} {
  33.     $this userCodeOk 1
  34. }
  35.  
  36. method CSRegen::append {this text} {
  37.     global Constraint::beginEnsure
  38.     global Constraint::endEnsure
  39.     global Constraint::beginRequire
  40.     global Constraint::endRequire
  41.     global CSRegen::super
  42.  
  43.     if {[string first ${Constraint::beginEnsure} $text] != -1} {
  44.         $this userCodeOk 0
  45.     }
  46.     if {[string first ${Constraint::beginRequire} $text] != -1} {
  47.         $this userCodeOk 0
  48.     }
  49.     if {[$this userCodeOk]==1} {
  50.         $this ${CSRegen::super}::append $text
  51.     }
  52.     if {[string first ${Constraint::endEnsure} $text] != -1} {
  53.         $this userCodeOk 1
  54.     }
  55.     if {[string first ${Constraint::endRequire} $text] != -1} {
  56.         $this userCodeOk 1
  57.     }
  58. }
  59.  
  60. selfPromoter CppRegen {this} {
  61.     CSRegen promote $this
  62. }
  63.  
  64. Class CSUserMethod : [customizeTargetModel CppUserMethod CSUserMethod] {
  65.     attribute ensure
  66.     attribute require
  67.     method formatComment
  68.     method formatHdrComment
  69.     method subGenerate
  70. }
  71.  
  72. method CSUserMethod::formatComment {this section {prefix "// "}} {
  73. }
  74.  
  75. method CSUserMethod::formatHdrComment {this section {prefix "// "}} {
  76.     global CSUserMethod::super
  77.     $this ${CSUserMethod::super}::formatComment $section $prefix
  78.     if {[$this require] != ""} {
  79.         $section append "${prefix}Require: [$this require]\n"
  80.     }
  81.     if {[$this ensure] != ""} {
  82.         $section append "${prefix}Ensure:  [$this ensure]\n"
  83.     }
  84. }
  85.  
  86. method CSUserMethod::subGenerate {this fileT section} {
  87.     global Constraint::beginEnsure
  88.     global Constraint::endEnsure
  89.     global Constraint::beginRequire
  90.     global Constraint::endRequire
  91.  
  92.     $this formatComment $section
  93.     if { $fileT == "cpp" } {
  94.         if {![$this isAbstract]} {
  95.             $this genSignature $fileT $section
  96.             $section append "\n{\n"
  97.             $section indent +
  98.             if {[$this require] != ""} {
  99.                 $section append "${Constraint::beginRequire}\n"
  100.                 $section append "require([$this require]);\n"
  101.                 $section append "${Constraint::endRequire}\n"
  102.             }
  103.             $this genRegenCode $section
  104.             if {[$this ensure] != ""} {
  105.                 $section append "${Constraint::beginEnsure}\n"
  106.                 $section append "ensure([$this ensure]);\n"
  107.                 $section append "#ifdef RETURN\n"
  108.                 $section append "return RETURN;\n"
  109.                 $section append "#undef RETURN\n"
  110.                 $section append "#endif\n"
  111.                 $section append "${Constraint::endEnsure}\n"
  112.             }
  113.             $section indent -
  114.             $section append "}\n"
  115.         }
  116.     } else {
  117.         $this genSignature $fileT $section
  118.     }
  119. }
  120.  
  121. selfPromoter CppUserMethod {this} {
  122.     CSUserMethod promote $this
  123. }
  124.  
  125. Class CSUserAttrib : [customizeTargetModel CppUserAttrib CSUserAttrib] {
  126.     attribute invariant
  127.     method formatComment
  128.     method formatHdrComment
  129. }
  130.  
  131. method CSUserAttrib::formatComment {this section {prefix "// "}} {
  132. }
  133.  
  134. method CSUserAttrib::formatHdrComment {this section {prefix "// "}} {
  135.     global CSUserAttrib::super
  136.     $this ${CSUserAttrib::super}::formatComment $section $prefix
  137.     if {[$this invariant] != ""} {
  138.         $section append "${prefix}Invariants: [$this invariant]\n"
  139.     }
  140. }
  141.  
  142. selfPromoter CppUserAttrib {this} {
  143.     CSUserAttrib promote $this
  144. }
  145.  
  146. Class CSClass : [customizeTargetModel CppClass CSClass] {
  147.     method addHeader
  148. }
  149.  
  150. method CSClass::addHeader {this fileT section} {
  151.  
  152.     if {$fileT == "hdr"} {
  153.         set filename [$this hdrFileName]
  154.     } else {
  155.         set filename [$this cppFileName]
  156.     }
  157.  
  158.     if {$fileT == "hdr" } {
  159.         set name "h++"
  160.     } else {
  161.         set name "c++"
  162.     }
  163.  
  164.     expandHeaderIntoSection $filename $name $section
  165.  
  166.     if { $fileT == "hdr" } {
  167.         $section append "// Class [$this name]\n"
  168.         $this formatComment $section "//    "
  169.         $section append "//\n"
  170.  
  171.         [$this featureSet] foreach feature {
  172.             if [$feature isA CppUserAttrib] {
  173.                 $section append "//   Attribute [$feature name]\n"
  174.                 $feature formatHdrComment $section "//      "
  175.                 $section append "//\n"
  176.             }
  177.         }
  178.         [$this featureSet] foreach feature {
  179.             if [$feature isA CppUserMethod] {
  180.                 $section append "//   Method [$feature name]("
  181.                 set comma ""
  182.                 [$feature paramSet] foreach param {
  183.                     $section append "${comma}[$param name]"
  184.                     set comma ", "
  185.                 }
  186.                 $section append ")\n"
  187.                 $feature formatHdrComment $section "//      "
  188.                 $section append "//\n"
  189.             }
  190.         }
  191.     }
  192.     $section append "\n"
  193. }
  194.  
  195. selfPromoter CppClass {this} {
  196.     CSClass promote $this
  197. }
  198.