home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / stgrammar.tcl < prev    next >
Text File  |  1997-12-01  |  25KB  |  928 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            : stgrammar.tcl
  17. #       Author          : 
  18. #       Original date   : November 1997
  19. #       Description     : Classes for code generation
  20. #
  21. #---------------------------------------------------------------------------
  22.  
  23.  
  24. #      File:           @(#)stclassimp.tcl    /main/titanic/2
  25.  
  26.  
  27. # This class represents all code generated to implement one class.
  28. # It is also responsible for method and category management:
  29. # keeping names unique and creating and assigning categories.
  30.  
  31. Class STClassImplementation : {GCObject} {
  32.     method destructor
  33.     method generate
  34.     method getInstanceMethodImplementation
  35.     method getClassMethodImplementation
  36.     method getMethodImplementation
  37.     method methodExists
  38.     method classMethodExists
  39.     constructor
  40.     method addExpression
  41.     method addCommentLine
  42.     method addInstanceVariable
  43.     method addClassVariable
  44.     method addPoolDictionary
  45.  
  46.     # Name of the class.
  47.     #
  48.     attribute name
  49.  
  50.     # The comment for this implementation.
  51.     #
  52.     attribute comment
  53.  
  54.     # List of instance variables of the class.
  55.     #
  56.     attribute instanceVars
  57.  
  58.     # List of class variables of the class.
  59.     #
  60.     attribute classVars
  61.  
  62.     # List of pool dictionaries of the class.
  63.     #
  64.     attribute poolDicts
  65.  
  66.     # The name of the super class of this class.
  67.     #
  68.     attribute super
  69.  
  70.     # Category of this class.
  71.     #
  72.     attribute category
  73.  
  74.     # Type of inheritance, empty for normal, or variable or variableByte.
  75.     #
  76.     attribute inheritanceType
  77.     attribute initialize
  78.     attribute release
  79.     attribute printOn
  80.     attribute printVars
  81.     attribute expressionSet
  82.     attribute classMethodCategory
  83.     attribute instanceMethodCategory
  84.     attribute instanceMethodImplementation
  85.     attribute classMethodImplementation
  86. }
  87.  
  88. method STClassImplementation::destructor {this} {
  89.     # Start destructor user section
  90.     # End destructor user section
  91. }
  92.  
  93.  
  94. # Generates all the code to implement one class on section stSection.
  95. # Order: Class declaration, class comment, class message categories, instance message categories,
  96. # expressions.
  97. #
  98. method STClassImplementation::generate {this stSection} {
  99.     # if there is no superclass no code was generated for this class
  100.     if { [$this super] == "" } {
  101.         return
  102.     }
  103.  
  104.     $stSection append "[$this super] [$this inheritanceType]"
  105.  
  106.     if {[$this inheritanceType] == "" } {
  107.         $stSection append "subclass"
  108.     } else {
  109.         $stSection append "Subclass"
  110.     }
  111.  
  112.     $stSection append ": #[$this name]\n"
  113.     $stSection indent +
  114.  
  115.     $stSection append "instanceVariableNames: \'"
  116.     $stSection append "[[$this instanceVars] contents]\'\n"
  117.  
  118.     $stSection append "classVariableNames: \'"
  119.     $stSection append "[[$this classVars] contents]\'\n"
  120.  
  121.     $stSection append "poolDictionaries: \'"
  122.     $stSection append "[[$this poolDicts] contents]\'\n"
  123.  
  124.     $stSection append "category: \'[$this category]\'!\n"
  125.     $stSection indent -
  126.     
  127.     if {[$this comment] != "" } {
  128.         $stSection append "\n"
  129.         $stSection append "[$this name] comment: \'"
  130.         $stSection append "[$this comment]\'!\n"
  131.     }
  132.  
  133.     foreach category [[$this classMethodCategory] values] {
  134.         $stSection append "\n"
  135.         $category generate $stSection
  136.     }
  137.  
  138.     foreach category [[$this instanceMethodCategory] values] {
  139.         $stSection append "\n"
  140.         $category generate $stSection
  141.     }
  142.  
  143.     [$this expressionSet] foreach expression {
  144.         $stSection append "\n"
  145.         $expression generate $stSection
  146.         $stSection append "!"
  147.     }
  148. }
  149.  
  150.  
  151. # Gets a method implementation object for <selector>;
  152. # creates it in category <category> if it didn't exist yet. If it existed already
  153. # the category is updated.
  154. # The old category is deleted if it is empty.
  155. # The category <category> is created if it didn't exist yet.
  156. # if <category> is empty, the implementation object is returned if it existed already.
  157. #
  158. method STClassImplementation::getInstanceMethodImplementation {this selector category} {
  159.     set selDict [$this instanceMethodImplementation]
  160.     set catDict [$this instanceMethodCategory]
  161.     return [$this getMethodImplementation $selector $category $selDict $catDict ""]
  162. }
  163.  
  164. method STClassImplementation::getClassMethodImplementation {this selector category} {
  165.     set selDict [$this classMethodImplementation]
  166.     set catDict [$this classMethodCategory]
  167.     return [$this getMethodImplementation $selector $category $selDict $catDict "class"]
  168. }
  169.  
  170.  
  171. # Shared code for getInstanceMethodImplementation and
  172. # getClassMethodImplementation.
  173. #
  174. method STClassImplementation::getMethodImplementation {this selector category selectorDict categoryDict type} {
  175.     # if category is "" return implementation if it exists
  176.     if { $category == "" } {
  177.         return [$selectorDict set $selector]
  178.     }
  179.  
  180.     # create category if needed
  181.     if [$categoryDict exists $category] {
  182.         set methodCategory [$categoryDict set $category]
  183.     } else {
  184.         set methodCategory [STMethodCategory new [$this name] $category $type]
  185.         $categoryDict set $category $methodCategory
  186.     }
  187.  
  188.     # If selector existed: check if old category gets empty:
  189.     # and delete if this is the case
  190.     if [$selectorDict exists $selector] {
  191.         set implementation [$selectorDict set $selector]
  192.         set oldCategory [$implementation methodCategory]
  193.         $implementation methodCategory $methodCategory
  194.         if [$oldCategory isEmpty] {
  195.             $categoryDict unset [$oldCategory categoryName]
  196.         }
  197.         # trash prevention: remove arguments in case method is both
  198.         # generated and defined by user.
  199.         if { ![[$implementation arguments] empty] } {
  200.             [$implementation arguments] remove 0 end
  201.         }
  202.     } else {
  203.         set implementation [STMethodImplementation new $selector $methodCategory]
  204.         $selectorDict set $selector $implementation
  205.     }  
  206.     return $implementation
  207. }
  208.  
  209.  
  210. # Returns 1 if the there is a method implementation object with the specified selector
  211. # in the instanceMethodImplementation association.
  212. #
  213. method STClassImplementation::methodExists {this selector} {
  214.     return [[$this instanceMethodImplementation] exists $selector]
  215. }
  216.  
  217.  
  218. # Returns 1 if there is a class method object with the specified selector
  219. # in the classMethodImplementation association.
  220. #
  221. method STClassImplementation::classMethodExists {this selector} {
  222.     return [[$this classMethodImplementation] exists $selector]
  223. }
  224.  
  225.  
  226. # Initializes all attributes to their specified types (lists and dictionaries)
  227. # and stores <name> in name.
  228. #
  229. constructor STClassImplementation {class this name} {
  230.     set this [GCObject::constructor $class $this]
  231.     $this instanceVars [List new]
  232.     $this classVars [List new]
  233.     $this poolDicts [List new]
  234.     $this expressionSet [List new]
  235.     $this classMethodCategory [Dictionary new]
  236.     $this instanceMethodCategory [Dictionary new]
  237.     $this instanceMethodImplementation [Dictionary new]
  238.     $this classMethodImplementation [Dictionary new]
  239.     $this name $name
  240.     # Start constructor user section
  241.     # End constructor user section
  242.     return $this
  243. }
  244.  
  245.  
  246. # Creates a new expression with contents <contents>, add it to the expression association and return it.
  247. #
  248. method STClassImplementation::addExpression {this contents} {
  249.     set expression [STExpression new $contents]
  250.     [$this expressionSet] append $expression
  251.     return $expression
  252. }
  253.  
  254.  
  255. # Add a new comment line with contents commentText to instance variable comment.
  256. #
  257. method STClassImplementation::addCommentLine {this commentText} {
  258.     if { [$this comment] != "" } {
  259.         $this comment "[$this comment]\n$commentText"
  260.     } else {
  261.         $this comment $commentText
  262.     }
  263. }
  264.  
  265.  
  266. # Adds name to instance variable list.
  267. #
  268. method STClassImplementation::addInstanceVariable {this name} {
  269.     [$this instanceVars] append $name
  270. }
  271.  
  272.  
  273. # Add name to class variable list.
  274. #
  275. method STClassImplementation::addClassVariable {this name} {
  276.     [$this classVars] append $name
  277. }
  278.  
  279.  
  280. # Add name to pool dictionary list.
  281. #
  282. method STClassImplementation::addPoolDictionary {this name} {
  283.     [$this poolDicts] append $name
  284. }
  285.  
  286. # Do not delete this line -- regeneration end marker
  287.  
  288.  
  289.  
  290. #---------------------------------------------------------------------------
  291. #      File:           @(#)stexprpart.tcl    /main/titanic/2
  292.  
  293.  
  294. # Part of a smalltalk expression. Objects of this class are additional parts,
  295. # objects of subclass Expression are first parts.
  296.  
  297. Class STExprPart : {GCObject} {
  298.     method destructor
  299.     constructor
  300.     method generate
  301.     method generateExpressions
  302.     method addExpression
  303.     method addArgument
  304.  
  305.     # Contents of expression part.
  306.     #
  307.     attribute contents
  308.  
  309.     # Used to store block arguments.
  310.     #
  311.     attribute arguments
  312.     attribute expressionSet
  313. }
  314.  
  315. method STExprPart::destructor {this} {
  316.     # Start destructor user section
  317.     # End destructor user section
  318. }
  319.  
  320.  
  321. # Initializes the expression association, 
  322. # the arguments list and sets contents to <contents>.
  323. #
  324. constructor STExprPart {class this contents} {
  325.     set this [GCObject::constructor $class $this]
  326.     $this contents $contents
  327.     $this expressionSet [List new]
  328.     $this arguments [List new]
  329.     return $this
  330. }
  331.  
  332.  
  333. # Generates on stSection.
  334. #
  335. method STExprPart::generate {this stSection} {
  336.     # put it on same line if one line, on new lines otherwise
  337.     $stSection append [$this contents]
  338.     $stSection indent +
  339.     $this generateExpressions $stSection    
  340.     $stSection indent -
  341. }
  342.  
  343.  
  344. # Generates the subexpressions and block arguments of this expression on stSection.
  345. #
  346. method STExprPart::generateExpressions {this stSection} {
  347.     # Do block argument if it exists
  348.     set blockArgument ""
  349.     if { ![[$this arguments] empty] } {
  350.         [$this arguments] foreach argument {
  351.             set blockArgument "$blockArgument :$argument"
  352.         }
  353.         set blockArgument "$blockArgument | "
  354.     }
  355.  
  356.     # put on new line if multiple lines or line too long.
  357.     if {![[$this expressionSet] empty]} {
  358.         if {[[$this expressionSet] length] > 1 } {
  359.             set newLine 1
  360.         } else {
  361.             set contentsLength [string length [$this contents]]
  362.             set contentsLength [expr $contentsLength+[string length $blockArgument]]
  363.             set expression [[$this expressionSet] index 0]
  364.             set expressionLength [string length [$expression contents]]
  365.             if {[expr $contentsLength+$expressionLength+4] > 70 } {
  366.                 set newLine 1
  367.             } else {
  368.                 set newLine 0
  369.             }
  370.         }
  371.         
  372.         if $newLine {
  373.             $stSection append "\n\[$blockArgument"
  374.         } else {
  375.             $stSection append " \[$blockArgument"
  376.         }
  377.  
  378.         set first 1
  379.         [$this expressionSet] foreach expression {
  380.             if $first {
  381.                 set first 0
  382.             } else {
  383.                 $stSection append ".\n"
  384.             }
  385.             $expression generate $stSection
  386.         }
  387.         
  388.         $stSection append "\]"
  389.     }
  390. }
  391.  
  392.  
  393. # Create a new expression object, add it to the expression association and return it.
  394. #
  395. method STExprPart::addExpression {this contents} {
  396.     set expression [STExpression new $contents]
  397.     [$this expressionSet] append $expression
  398.     return $expression
  399. }
  400.  
  401.  
  402. # Add argument to arguments list.
  403. #
  404. method STExprPart::addArgument {this name} {
  405.     [$this arguments] append $name
  406. }
  407.  
  408. # Do not delete this line -- regeneration end marker
  409.  
  410.  
  411.  
  412. #---------------------------------------------------------------------------
  413. #      File:           @(#)stmethodca.tcl    /main/titanic/2
  414.  
  415.  
  416. # This class represents the code generated for a method category.
  417.  
  418. Class STMethodCategory : {GCObject} {
  419.     method destructor
  420.     constructor
  421.     method generate
  422.     method isEmpty
  423.     method methodImplementationSet
  424.  
  425.     # Name of the category.
  426.     #
  427.     attribute categoryName
  428.  
  429.     # Class to which this category belongs.
  430.     #
  431.     attribute className
  432.  
  433.     # Type of this category: class or instance.
  434.     #
  435.     attribute categoryType
  436.     attribute _methodImplementationSet
  437. }
  438.  
  439. method STMethodCategory::destructor {this} {
  440.     # Start destructor user section
  441.     # End destructor user section
  442. }
  443.  
  444.  
  445. # Sets className to <className>, categoryName to <categoryName>,
  446. # categoryType to <categoryType> and initialize methodImplementation.
  447. #
  448. constructor STMethodCategory {class this className categoryName categoryType} {
  449.     set this [GCObject::constructor $class $this]
  450.     $this className $className
  451.     $this categoryName $categoryName
  452.     $this categoryType $categoryType
  453.     $this _methodImplementationSet [List new]
  454.     return $this
  455. }
  456.  
  457.  
  458. # This method generates the method category on stSection.
  459. #
  460. method STMethodCategory::generate {this stSection} {
  461.     # category header
  462.     $stSection append "![$this className] "
  463.     if { [$this categoryType] == "class" } {
  464.         $stSection append "class "
  465.     }
  466.     $stSection append "methodsFor: \'[$this categoryName]\'!\n\n"
  467.     
  468.     # methods in this category
  469.     set first 1
  470.     [$this methodImplementationSet] foreach implementation {
  471.         if  !$first {
  472.             $stSection append "\n\n"
  473.         } else {
  474.             set first 0
  475.         }
  476.         $implementation generate $stSection
  477.     }
  478.  
  479.     # closing !
  480.     $stSection append " !\n"
  481. }
  482.  
  483.  
  484. # Returns whether this category is empty
  485. # e.g. the methodImplementation association is empty.
  486. #
  487. method STMethodCategory::isEmpty {this} {
  488.     return [[$this methodImplementationSet] empty]
  489. }
  490.  
  491. # Do not delete this line -- regeneration end marker
  492.  
  493. method STMethodCategory::methodImplementationSet {this} {
  494.     return [$this _methodImplementationSet]
  495. }
  496.  
  497.  
  498.  
  499. #---------------------------------------------------------------------------
  500. #      File:           @(#)stfile.tcl    /main/titanic/3
  501.  
  502.  
  503. # This class represents the contents of a Smalltalk file.
  504.  
  505. Class STFile : {GCObject} {
  506.     constructor
  507.     method destructor
  508.     method generate
  509.     method getImplementation
  510.     method setImplementation
  511.     method removeImplementation
  512.     attribute implementation
  513. }
  514.  
  515. constructor STFile {class this} {
  516.     set this [GCObject::constructor $class $this]
  517.     $this implementation [Dictionary new]
  518.     # Start constructor user section
  519.     # End constructor user section
  520.     return $this
  521. }
  522.  
  523. method STFile::destructor {this} {
  524.     # Start destructor user section
  525.     # End destructor user section
  526. }
  527.  
  528.  
  529. # Generates the contents of all associated objects in stSection.
  530. #
  531. method STFile::generate {this stSection} {
  532.     set first 1    
  533.     [$this implementation] foreach name implementation {
  534.         if $first {
  535.             set first 0
  536.         } else {
  537.             $stSection append "\n\n\n"
  538.         }
  539.         $implementation generate $stSection
  540.     }
  541. }
  542.  
  543.  
  544. # Gets a STClassImplementation object for class 'name' and creates it if it didn't exist yet.
  545. #
  546. method STFile::getImplementation {this name} {
  547.     if [[$this implementation] exists $name] {
  548.         return [[$this implementation] set $name]
  549.     }
  550.  
  551.     set newImplementation [STClassImplementation new $name]
  552.     [[$this implementation] set $name $newImplementation
  553.     return $newImplementation
  554. }
  555.  
  556. # Do not delete this line -- regeneration end marker
  557.  
  558. method STFile::setImplementation {this name newImplementation} {
  559.     [$this implementation] set $name $newImplementation
  560. }
  561.  
  562. method STFile::removeImplementation {this name} {
  563.     [$this implementation] unset $name
  564. }
  565.  
  566.  
  567.  
  568. #---------------------------------------------------------------------------
  569. #      File:           @(#)stmethodim.tcl    /main/titanic/2
  570.  
  571.  
  572. # This class represents a method implementation: the header, the temporary variables and the 
  573. # expressions in the body. It is also responsible for creating unique argument names.
  574.  
  575. Class STMethodImplementation : {GCObject} {
  576.     method destructor
  577.     constructor
  578.     method generate
  579.     method getNewUniqueArgumentName
  580.     method getUniqueArgumentName
  581.     method addExpression
  582.     method insertExpression
  583.     method addCommentLine
  584.     method addArgument
  585.     method addTemporary
  586.     method getArguments
  587.     method isEmpty
  588.     method methodCategory
  589.  
  590.     # The message selector of this implementation.
  591.     #
  592.     attribute selector
  593.  
  594.     # Stores argument name for each part of the selector.
  595.     # Needed for initialize.
  596.     #
  597.     attribute selectorpartToArgument
  598.  
  599.     # Used to store the non unique argument names and number of occurrences.
  600.     # Needed for efficient generation of unique names.
  601.     #
  602.     attribute argumentToFrequency
  603.  
  604.     # The argument names of this method.
  605.     #
  606.     attribute arguments
  607.  
  608.     # Temporary variables of this method.
  609.     #
  610.     attribute temporaries
  611.  
  612.     # The method comment (appears between method header and method implementation).
  613.     #
  614.     attribute comment
  615.  
  616.     # Indicates whether this method has a user code part. 
  617.     # Is considered to be 1 if isUserDefined is set.
  618.     #
  619.     attribute hasUserCodePart
  620.  
  621.     # Set if user code was found during
  622.     # regeneration.
  623.     #
  624.     attribute hasUserCode
  625.  
  626.     # Indicates whether this is a user defined method implementation.
  627.     #
  628.     attribute isUserDefined
  629.     attribute _methodCategory
  630.     attribute expressionSet
  631. }
  632.  
  633. method STMethodImplementation::destructor {this} {
  634.     # Start destructor user section
  635.     # End destructor user section
  636. }
  637.  
  638.  
  639. # Initializes the dictionaries, the associations
  640. # comment to the empty string, the *User* attributes to
  641. # 0 and the lists and sets selector to <selector>
  642. # and methodCategory to <category>.
  643. #
  644. constructor STMethodImplementation {class this selector category} {
  645.     set this [GCObject::constructor $class $this]
  646.     $this selector $selector
  647.     $this methodCategory $category
  648.     $this selectorpartToArgument [Dictionary new]
  649.     $this argumentToFrequency [Dictionary new]
  650.     $this arguments [List new]
  651.     $this temporaries [List new]
  652.     $this expressionSet [List new]
  653.     $this comment ""
  654.     $this isUserDefined 0
  655.     $this hasUserCodePart 0
  656.     $this hasUserCode 0
  657.     return $this
  658. }
  659.  
  660.  
  661. # Generates the method implementation on section stSection.
  662. # Insert regeneration markers if required.
  663. # Generate a not implemented comment if the implementation
  664. # has no expressions.
  665. #
  666. method STMethodImplementation::generate {this stSection} {
  667.     # method header
  668.     if [[$this arguments] empty] {
  669.         $stSection append "[$this selector]"
  670.     } elseif { [[$this arguments] length] == 1 } {
  671.         # Workaround for operator- as mentioned in STGOperation
  672.         if { [$this selector] == "operator-" } {
  673.             $stSection append "- [[$this arguments] index 0]"
  674.         } else {
  675.             $stSection append "[$this selector] [[$this arguments] index 0]"
  676.         }
  677.     } else {
  678.         set index 0
  679.         set selectorPartList [split [$this selector] ':']
  680.         [$this arguments] foreach argument { 
  681.             if { $index > 0 } {
  682.                 $stSection append " "
  683.             }
  684.             set selectorPart [lindex $selectorPartList $index]
  685.             # trash prevention: should go away once qualifier initializer bug
  686.             # is fixed.
  687.             if { $selectorPart == "" } {
  688.                 break
  689.             }
  690.             $stSection append "$selectorPart: $argument"
  691.             set index [expr $index+1]
  692.         }
  693.     }
  694.     
  695.     # comment,     temporaries, "Generated" comment
  696.     # This comment is put in methods without user code
  697.     $stSection indent +
  698.     if {[$this comment] != ""} {
  699.         $stSection append "\n\"[$this comment]\""
  700.     }
  701.     if { (![$this isUserDefined]) && ![$this hasUserCodePart] } {
  702.         $stSection append "\n\"Generated\""
  703.     }
  704.     if {![[$this temporaries] empty]} {
  705.         $stSection append "\n| [[$this temporaries] contents] |"
  706.     }
  707.  
  708.     # expressions
  709.     set index 0
  710.     set exprCnt [[$this expressionSet] length]
  711.     [$this expressionSet] foreach expression {
  712.         if { $index > 0 } {
  713.             $stSection append ".\n"
  714.         } else {
  715.             $stSection append "\n"
  716.         }
  717.         
  718.         # if there was user added code it is in the last expression
  719.         # generate this without indent and place a separator if necessary
  720.         if  { [$this hasUserCode] && ($index == [expr $exprCnt-1]) } {
  721.             if { $index > 0 } {
  722.                 $stSection append "[$globals startUserCodeMarker]\n"
  723.             }
  724.             $stSection indent -
  725.         }
  726.         
  727.         $expression generate $stSection
  728.         
  729.         set index [expr $index+1]
  730.     }
  731.     
  732.     if  ![$this hasUserCode] {
  733.         if [$this isUserDefined] {
  734.             if { $exprCnt > 0 } {
  735.                 $stSection append ".\n[$globals startUserCodeMarker]"
  736.             }
  737.             $stSection append "\n\"Not yet implemented\""
  738.         } elseif [$this hasUserCodePart] {
  739.             if { $exprCnt > 0 } {
  740.                 $stSection append "."
  741.             }
  742.             $stSection append "\n[$globals startUserCodeMarker]"
  743.         }
  744.         $stSection indent -
  745.     }
  746.     # closing !
  747.     $stSection append "!"
  748. }
  749.  
  750.  
  751. # Gets a new unique argument name and adds it to argument list.
  752. #
  753. method STMethodImplementation::getNewUniqueArgumentName {this name} {
  754.     if [[$this argumentToFrequency] exists $name] {
  755.         set frequency [[$this argumentToFrequency] set $name]
  756.         set uniqueName "$name$frequency"
  757.         [$this argumentToFrequency] set $name [expr $frequency+1]
  758.     } else {
  759.         set uniqueName $name
  760.         [$this argumentToFrequency] set $name 1
  761.     }
  762.     
  763.     [$this arguments] append $uniqueName
  764.     return $uniqueName
  765. }
  766.  
  767.  
  768. # If selectorpart existed in selectorpartToArgument, return argument.
  769. # If not get unique argument name for this selector part and store it in selectorPartToArgument.
  770. #
  771. method STMethodImplementation::getUniqueArgumentName {this selectorpart {name ""}} {
  772.     if [[$this selectorpartToArgument] exists $selectorpart] {
  773.         return [[$this selectorpartToArgument] set $selectorpart]
  774.     }
  775.  
  776.     set uniqueName [$this getNewUniqueArgumentName $name]
  777.     [$this selectorpartToArgument] set $selectorpart $uniqueName
  778.     return $uniqueName
  779. }
  780.  
  781.  
  782. # Create new expression object with contents <contents>, add it to the expression association and return it.
  783. #
  784. method STMethodImplementation::addExpression {this contents} {
  785.     set expression [STExpression new $contents]
  786.     [$this expressionSet] append $expression
  787.     return $expression
  788. }
  789.  
  790.  
  791. # Create new expression with contents contents, insert in the expression association and return it.
  792. #
  793. method STMethodImplementation::insertExpression {this contents} {
  794.     set expression [STExpression new $contents]
  795.     [$this expressionSet] insert $expression
  796.     return $expression
  797. }
  798.  
  799.  
  800. # Add new line with <commentText> to comment.
  801. #
  802. method STMethodImplementation::addCommentLine {this commentText} {
  803.     if { [$this comment] != "" } {
  804.         $this comment "[$this comment]\n$commentText"
  805.     } else {
  806.         $this comment $commentText
  807.     }
  808. }
  809.  
  810.  
  811. # Add argument name to argument list.
  812. #
  813. method STMethodImplementation::addArgument {this name} {
  814.     [$this arguments] append $name
  815. }
  816.  
  817.  
  818. # Add temporary name to temporaries list.
  819. #
  820. method STMethodImplementation::addTemporary {this name} {
  821.     [$this temporaries] append $name
  822. }
  823.  
  824.  
  825. # Return list of argument names.
  826. #
  827. method STMethodImplementation::getArguments {this} {
  828.     return [$this arguments]
  829. }
  830.  
  831.  
  832. # Returns 1 if the expression association is empty, 0 otherwise.
  833. #
  834. method STMethodImplementation::isEmpty {this} {
  835.     return [[$this expressionSet] empty]
  836. }
  837.  
  838. # Do not delete this line -- regeneration end marker
  839.  
  840. method STMethodImplementation::methodCategory {this args} {
  841.     if {$args == ""} {
  842.         return [$this _methodCategory]
  843.     }
  844.     set ref [$this _methodCategory]
  845.     if {$ref != ""} {
  846.         [$ref _methodImplementationSet] removeValue $this
  847.     }
  848.     set obj [lindex $args 0]
  849.     if {$obj != ""} {
  850.         [$obj _methodImplementationSet] append $this
  851.     }
  852.     $this _methodCategory $obj
  853. }
  854.  
  855.  
  856.  
  857. #---------------------------------------------------------------------------
  858. #      File:           @(#)stexpressi.tcl    /main/titanic/2
  859.  
  860.  
  861. # This class represents one Smalltalk expression.
  862. # It always contains the first part of an expression. If there are more
  863. # parts, these are stored in STExprPart objects.
  864. # This is an optimization compared to the syntax,
  865. # suggested by the fact that additional parts are not very often used by the code generator.
  866. # For regeneration the user added expressions are considered as one expression.
  867.  
  868. Class STExpression : {STExprPart} {
  869.     constructor
  870.     method destructor
  871.     method generate
  872.     method addExpressionPart
  873.     attribute expressionPartSet
  874. }
  875.  
  876. constructor STExpression {class this contents} {
  877.     set this [STExprPart::constructor $class $this $contents]
  878.     $this expressionPartSet [List new]
  879.     # Start constructor user section
  880.     # End constructor user section
  881.     return $this
  882. }
  883.  
  884. method STExpression::destructor {this} {
  885.     # Start destructor user section
  886.     # End destructor user section
  887.     $this STExprPart::destructor
  888. }
  889.  
  890.  
  891. # Generates expression contents on stSection.
  892. #
  893. method STExpression::generate {this stSection} {
  894.     $stSection append [$this contents]
  895.     $stSection indent +
  896.  
  897.     # if there are xpression parts use extra indent
  898.     set numberParts [[$this expressionPartSet] length]
  899.     if $numberParts {
  900.         $stSection indent +
  901.     }
  902.  
  903.     $this generateExpressions $stSection
  904.  
  905.     $stSection indent -
  906.     
  907.     # now the other expression parts    
  908.     if $numberParts {
  909.         [$this expressionPartSet] foreach expressionPart {
  910.             $stSection append "\n"
  911.             $expressionPart generate $stSection
  912.         }
  913.         $stSection indent -
  914.     }
  915. }
  916.  
  917.  
  918. # Creates an ExprPart object, adds it to the expressionPart association and returns it.
  919. #
  920. method STExpression::addExpressionPart {this contents} {
  921.     set expressionPart [STExprPart new $contents]
  922.     [$this expressionPartSet] append $expressionPart
  923.     return $expressionPart
  924. }
  925.  
  926. # Do not delete this line -- regeneration end marker
  927.  
  928.