Class.st
changeset 7089 c4a27118cc2a
parent 7084 e53302e0134b
child 7103 ec84bd722e16
equal deleted inserted replaced
7088:cc3233554827 7089:c4a27118cc2a
  1170 !
  1170 !
  1171 
  1171 
  1172 source
  1172 source
  1173     "return the classes full source code"
  1173     "return the classes full source code"
  1174 
  1174 
  1175     |code aStream|
  1175     |code aStream tmpFile|
  1176 
  1176 
  1177 " this is too slow for big classes ...
  1177 " this is too slow for big classes ...
  1178     code := String new:1000.
  1178     code := String new:1000.
  1179     aStream := WriteStream on:code.
  1179     aStream := WriteStream on:code.
  1180     self fileOutOn:aStream
  1180     self fileOutOn:aStream
  1181 "
  1181 "
  1182     aStream := FileStream newFileNamed:'__temp'.
  1182     tmpFile := '__temp' asFilename.
  1183     aStream isNil ifTrue:[
  1183     [
  1184         self notify:'cannot create temporary file.'.
  1184         aStream := tmpFile newReadWriteStream.
       
  1185     ] on:FileStream openErrorSignal do:[:ex|
       
  1186         self warn:'cannot create temporary file.'.
  1185         ^ nil
  1187         ^ nil
  1186     ].
  1188     ].
  1187     FileOutErrorSignal handle:[:ex |
  1189     FileOutErrorSignal handle:[:ex |
  1188         aStream nextPutAll:'"no source available"'.
  1190         aStream nextPutAll:'"no source available"'.
  1189     ] do:[
  1191     ] do:[
  1190         self fileOutOn:aStream.
  1192         self fileOutOn:aStream.
  1191     ].
  1193     ].
  1192     aStream close.
  1194     aStream close.
  1193     aStream := FileStream oldFileNamed:'__temp'.
  1195     aStream := tmpFile readStreamOrNil.
  1194     aStream isNil ifTrue:[
  1196     aStream isNil ifTrue:[
  1195         self notify:'oops - cannot reopen temp file'.
  1197         self warn:'oops - cannot reopen temp file'.
  1196         ^ nil
  1198         ^ nil
  1197     ].
  1199     ].
  1198     code := aStream contents.
  1200     code := aStream contents.
  1199     aStream close.
  1201     aStream close.
  1200     OperatingSystem removeFile:'__temp'.
  1202     tmpFile remove.
  1201     ^ code
  1203     ^ code
  1202 !
  1204 !
  1203 
  1205 
  1204 sourceCodeManager
  1206 sourceCodeManager
  1205     "return my source code manager.
  1207     "return my source code manager.
  2426         ] ifFalse:[
  2428         ] ifFalse:[
  2427             newFileName := fileName.
  2429             newFileName := fileName.
  2428             needRename := false
  2430             needRename := false
  2429         ]
  2431         ]
  2430     ].
  2432     ].
  2431 
  2433     [
  2432     aStream := newFileName writeStream.
  2434         aStream := newFileName writeStream.
  2433     aStream isNil ifTrue:[
  2435     ] on:FileStream openErrorSignal do:[:ex|
  2434         savFilename notNil ifTrue:[
  2436         savFilename notNil ifTrue:[
  2435             savFilename delete
  2437             savFilename delete
  2436         ].
  2438         ].
  2437         ^ FileOutErrorSignal 
  2439         ^ FileOutErrorSignal 
  2438                 raiseRequestWith:newFileName
  2440                 raiseRequestWith:newFileName
  2555      This is not logged in that change file (should it be ?)."
  2557      This is not logged in that change file (should it be ?)."
  2556 
  2558 
  2557     |aStream fileName|
  2559     |aStream fileName|
  2558 
  2560 
  2559     fileName := (Smalltalk fileNameForClass:self name), '.st'.
  2561     fileName := (Smalltalk fileNameForClass:self name), '.st'.
  2560     aStream := (aDirectoryName asFilename construct:fileName) writeStream.
  2562     [
  2561     aStream isNil ifTrue:[
  2563         aStream := (aDirectoryName asFilename construct:fileName) writeStream.
       
  2564     ] on:FileStream openErrorSignal do:[:ex|
  2562         ^ FileOutErrorSignal 
  2565         ^ FileOutErrorSignal 
  2563                 raiseRequestWith:fileName
  2566                 raiseRequestWith:fileName
  2564                 errorString:(' - cannot create file:', fileName)
  2567                 errorString:(' - cannot create file:', fileName)
  2565     ].
  2568     ].
  2566     self fileOutOn:aStream.
  2569     self fileOutOn:aStream.
  2927 
  2930 
  2928     |fileName aStream|
  2931     |fileName aStream|
  2929 
  2932 
  2930     fileName := fileNameString asFilename.
  2933     fileName := fileNameString asFilename.
  2931     fileName makeLegalFilename.
  2934     fileName makeLegalFilename.
  2932     fileName := fileName name.
  2935 
  2933 
  2936     [
  2934     aStream := FileStream newFileNamed:fileName.
  2937         aStream := fileName newReadWriteStream.
  2935     aStream isNil ifTrue:[
  2938     ] on:FileStream openErrorSignal do:[:ex|
  2936         ^ FileOutErrorSignal 
  2939         ^ FileOutErrorSignal 
  2937                 raiseRequestWith:fileName
  2940                 raiseRequestWith:fileName name
  2938                 errorString:(' - cannot create file:', fileName)
  2941                 errorString:(' - cannot create file:', fileName name)
  2939     ].
  2942     ].
  2940         
  2943         
  2941     aStream binary.
  2944     aStream binary.
  2942     self binaryFileOutOn:aStream sourceMode:sourceMode.
  2945     self binaryFileOutOn:aStream sourceMode:sourceMode.
  2943     aStream close.
  2946     aStream close.
  3033             raiseRequestWith:self
  3036             raiseRequestWith:self
  3034                  errorString:' - will not fileOut unloaded class: ', self name
  3037                  errorString:' - will not fileOut unloaded class: ', self name
  3035     ].
  3038     ].
  3036 
  3039 
  3037     fileName := fileNameOrString asFilename.
  3040     fileName := fileNameOrString asFilename.
  3038 
  3041     [
  3039     aStream := fileName writeStream.
  3042         aStream := fileName writeStream.
  3040     aStream isNil ifTrue:[
  3043     ] on:FileStream openErrorSignal do:[:ex|
  3041         ^ FileOutErrorSignal 
  3044         ^ FileOutErrorSignal 
  3042                 raiseRequestWith:fileName
  3045                 raiseRequestWith:fileName
  3043                 errorString:(' - cannot create file: ', fileName name)
  3046                 errorString:(' - cannot create file: ', fileName name)
  3044     ].
  3047     ].
  3045     self fileOutXMLOn:aStream.
  3048     self fileOutXMLOn:aStream.
  3046     aStream close.
  3049     aStream close.
  3047 
  3050 
  3048     "
  3051     "
  3049      Class fileOutXMLAs:'test.xml'
  3052      Class fileOutXMLAs:'test.xml'
       
  3053      Class fileOutXMLAs:'/blaDoesNotExist/test.xml'
  3050     "
  3054     "
  3051 !
  3055 !
  3052 
  3056 
  3053 fileOutXMLDefinitionOn:aStream
  3057 fileOutXMLDefinitionOn:aStream
  3054     "append an xml expression on aStream, which defines myself."
  3058     "append an xml expression on aStream, which defines myself."
  3975 currentSourceStream
  3979 currentSourceStream
  3976     "return an open stream on the current source of the receiver"
  3980     "return an open stream on the current source of the receiver"
  3977 
  3981 
  3978     |theWriteStream theCurrentSource|
  3982     |theWriteStream theCurrentSource|
  3979 
  3983 
  3980     theWriteStream := String new writeStream.
  3984     theWriteStream := '' writeStream.
  3981     Method flushSourceStreamCache.
  3985     Method flushSourceStreamCache.
  3982     self fileOutOn:theWriteStream withTimeStamp:false.
  3986     self fileOutOn:theWriteStream withTimeStamp:false.
  3983     theCurrentSource := theWriteStream contents asString.
  3987     theCurrentSource := theWriteStream contents asString.
  3984     theWriteStream close.
  3988     theWriteStream close.
  3985     ^ theCurrentSource
  3989     ^ theCurrentSource
  3998     "/ this is still kept in order to find user-private
  4002     "/ this is still kept in order to find user-private
  3999     "/ classes in her currentDirectory.
  4003     "/ classes in her currentDirectory.
  4000     "/
  4004     "/
  4001     fileName := Smalltalk getSourceFileName:sourceFile.
  4005     fileName := Smalltalk getSourceFileName:sourceFile.
  4002     fileName notNil ifTrue:[
  4006     fileName notNil ifTrue:[
  4003         ^ fileName asFilename readStream.
  4007         ^ fileName asFilename readStreamOrNil.
  4004     ].
  4008     ].
  4005 
  4009 
  4006     (package := self package) notNil ifTrue:[
  4010     (package := self package) notNil ifTrue:[
  4007         "/ newest sceme ...
  4011         "/ newest sceme ...
  4008         packageDir := package copyReplaceAll:$: with:$/.
  4012         packageDir := package copyReplaceAll:$: with:$/.
  4009         packageDir := Smalltalk getPackageFileName:packageDir.
  4013         packageDir := Smalltalk getPackageFileName:packageDir.
  4010         packageDir notNil ifTrue:[
  4014         packageDir notNil ifTrue:[
  4011             "/ present there ?
  4015             "/ present there ?
  4012             packageDir := packageDir asFilename.
  4016             packageDir := packageDir asFilename.
  4013             (fn := packageDir construct:sourceFile) exists ifTrue:[
  4017             (fn := packageDir construct:sourceFile) exists ifTrue:[
  4014                 ^ fn readStream.
  4018                 ^ fn readStreamOrNil.
  4015             ].
  4019             ].
  4016             
  4020             
  4017             "/ a source subdirectory ?
  4021             "/ a source subdirectory ?
  4018             fn := (packageDir construct:'source') construct:sourceFile.
  4022             fn := (packageDir construct:'source') construct:sourceFile.
  4019             fn exists ifTrue:[
  4023             fn exists ifTrue:[
  4020                 ^ fn readStream.
  4024                 ^ fn readStreamOrNil.
  4021             ].
  4025             ].
  4022 
  4026 
  4023             "/ a zip-file ?
  4027             "/ a zip-file ?
  4024             fn := (packageDir construct:'source.zip').
  4028             fn := (packageDir construct:'source.zip').
  4025             fn exists ifTrue:[
  4029             fn exists ifTrue:[
  4039         ] ifFalse:[
  4043         ] ifFalse:[
  4040             package := 'stx/' , package
  4044             package := 'stx/' , package
  4041         ].
  4045         ].
  4042         fileName := Smalltalk getSourceFileName:(package , '/' , sourceFile).
  4046         fileName := Smalltalk getSourceFileName:(package , '/' , sourceFile).
  4043         fileName notNil ifTrue:[
  4047         fileName notNil ifTrue:[
  4044             ^ fileName asFilename readStream.
  4048             ^ fileName asFilename readStreamOrNil.
  4045         ].
  4049         ].
  4046         (package startsWith:'stx/') ifTrue:[
  4050         (package startsWith:'stx/') ifTrue:[
  4047             fileName := Smalltalk getSourceFileName:((package copyFrom:5) , '/' , sourceFile).
  4051             fileName := Smalltalk getSourceFileName:((package copyFrom:5) , '/' , sourceFile).
  4048             fileName notNil ifTrue:[
  4052             fileName notNil ifTrue:[
  4049                 ^ fileName asFilename readStream.
  4053                 ^ fileName asFilename readStreamOrNil.
  4050             ]
  4054             ]
  4051         ]
  4055         ]
  4052     ].
  4056     ].
  4053 
  4057 
  4054     "/
  4058     "/
  4062             dir := info at:#directory ifAbsent:nil.
  4066             dir := info at:#directory ifAbsent:nil.
  4063             dir notNil ifTrue:[
  4067             dir notNil ifTrue:[
  4064                 fn := (module asFilename construct:dir) construct:sourceFile.
  4068                 fn := (module asFilename construct:dir) construct:sourceFile.
  4065                 fileName := Smalltalk getSourceFileName:(fn name).
  4069                 fileName := Smalltalk getSourceFileName:(fn name).
  4066                 fileName notNil ifTrue:[
  4070                 fileName notNil ifTrue:[
  4067                     ^ fileName asFilename readStream.
  4071                     ^ fileName asFilename readStreamOrNil.
  4068                 ].
  4072                 ].
  4069 
  4073 
  4070                 "/ brand new: look for source/<module>/package.zip
  4074                 "/ brand new: look for source/<module>/package.zip
  4071                 "/ containing an entry for <filename>
  4075                 "/ containing an entry for <filename>
  4072 
  4076 
  4577                         (classes includes:self) ifTrue:[
  4581                         (classes includes:self) ifTrue:[
  4578                             f := h pathName.
  4582                             f := h pathName.
  4579                             f := f asFilename directory.
  4583                             f := f asFilename directory.
  4580                             f := f construct:source.
  4584                             f := f construct:source.
  4581                             f exists ifTrue:[
  4585                             f exists ifTrue:[
  4582                                 aStream := f readStream.
  4586                                 aStream := f readStreamOrNil.
  4583                             ].
  4587                             ].
  4584                         ].
  4588                         ].
  4585                     ].
  4589                     ].
  4586                 ]
  4590                 ]
  4587             ].
  4591             ].
  4597 
  4601 
  4598     "/
  4602     "/
  4599     "/ final chance: try current directory
  4603     "/ final chance: try current directory
  4600     "/
  4604     "/
  4601     aStream isNil ifTrue:[
  4605     aStream isNil ifTrue:[
  4602         aStream := source asFilename readStream.
  4606         aStream := source asFilename readStreamOrNil.
  4603     ].
  4607     ].
  4604 
  4608 
  4605     (aStream notNil and:[validated not]) ifTrue:[
  4609     (aStream notNil and:[validated not]) ifTrue:[
  4606         (self validateSourceStream:aStream) ifFalse:[
  4610         (self validateSourceStream:aStream) ifFalse:[
  4607             (Smalltalk releaseIdentification = 'ST/X_free_demo_vsn') ifTrue:[
  4611             (Smalltalk releaseIdentification = 'ST/X_free_demo_vsn') ifTrue:[
  4782 ! !
  4786 ! !
  4783 
  4787 
  4784 !Class class methodsFor:'documentation'!
  4788 !Class class methodsFor:'documentation'!
  4785 
  4789 
  4786 version
  4790 version
  4787     ^ '$Header: /cvs/stx/stx/libbasic/Class.st,v 1.422 2003-02-28 18:11:52 cg Exp $'
  4791     ^ '$Header: /cvs/stx/stx/libbasic/Class.st,v 1.423 2003-03-02 18:42:46 stefan Exp $'
  4788 ! !
  4792 ! !