3170 aStream := self streamForChange:changeNr. |
3170 aStream := self streamForChange:changeNr. |
3171 aStream isNil ifTrue:[^ self]. |
3171 aStream isNil ifTrue:[^ self]. |
3172 |
3172 |
3173 className := self classNameOfChange:changeNr. |
3173 className := self classNameOfChange:changeNr. |
3174 className notNil ifTrue:[ |
3174 className notNil ifTrue:[ |
3175 className := className asSymbol. |
3175 className := className asSymbol. |
3176 changeClass := Smalltalk at:className ifAbsent:[]. |
3176 changeClass := Smalltalk at:className ifAbsent:[]. |
3177 changeClass notNil ifTrue:[ |
3177 changeClass isNil ifTrue:[ |
3178 changeClass autoload |
3178 changeClass := self classOfChange:changeNr. |
3179 ] |
3179 ]. |
|
3180 changeClass notNil ifTrue:[ |
|
3181 changeClass autoload |
|
3182 ] |
3180 ]. |
3183 ]. |
3181 |
3184 |
3182 changeNrProcessed := changeNr. |
3185 changeNrProcessed := changeNr. |
3183 aborted := false. |
3186 aborted := false. |
3184 |
3187 |
3185 applyAction := |
3188 applyAction := |
3186 [ |
3189 [ |
3187 (skipSignal notNil) ifTrue:[ |
3190 (skipSignal notNil) ifTrue:[ |
3188 sig := skipSignal |
3191 sig := skipSignal |
3189 ] ifFalse:[ |
3192 ] ifFalse:[ |
3190 sig := AbortOperationRequest |
3193 sig := AbortOperationRequest |
3191 ]. |
3194 ]. |
3192 sig handle:[:ex | |
3195 sig handle:[:ex | |
3193 aborted := true. |
3196 aborted := true. |
3194 ex return. |
3197 ex return. |
3195 ] do:[ |
3198 ] do:[ |
3196 nameSpace := self nameSpaceForApply. |
3199 nameSpace := self nameSpaceForApply. |
3197 |
3200 |
3198 pkg := enforcedPackage ? Class packageQuerySignal query. |
3201 pkg := enforcedPackage ? Class packageQuerySignal query. |
3199 Class packageQuerySignal answer:pkg |
3202 Class packageQuerySignal answer:pkg |
3200 do:[ |
3203 do:[ |
3201 Class nameSpaceQuerySignal answer:nameSpace |
3204 Class nameSpaceQuerySignal answer:nameSpace |
3202 do:[ |
3205 do:[ |
3203 "/ a followup methodsFor: chunk ... |
3206 "/ a followup methodsFor: chunk ... |
3204 (self changeIsFollowupMethodChange:changeNr) ifTrue:[ |
3207 (self changeIsFollowupMethodChange:changeNr) ifTrue:[ |
3205 methodsForChunk := (changeChunks at:changeNr). |
3208 methodsForChunk := (changeChunks at:changeNr). |
3206 ] ifFalse:[ |
3209 ] ifFalse:[ |
3207 doItChunk := aStream nextChunk. "/ an empty chunk sometimes ... |
3210 doItChunk := aStream nextChunk. "/ an empty chunk sometimes ... |
3208 doItChunk notEmpty ifTrue:[ |
3211 doItChunk notEmpty ifTrue:[ |
3209 Compiler evaluate:doItChunk notifying:self. |
3212 Compiler evaluate:doItChunk notifying:self. |
3210 ] ifFalse:[ |
3213 ] ifFalse:[ |
3211 methodsForChunk := aStream nextChunk. "/ the real one |
3214 methodsForChunk := aStream nextChunk. "/ the real one |
3212 ] |
3215 ] |
3213 ]. |
3216 ]. |
3214 methodsForChunk notNil ifTrue:[ |
3217 methodsForChunk notNil ifTrue:[ |
3215 changeClass isNil ifTrue:[ |
3218 changeClass isNil ifTrue:[ |
3216 orgClassName := className. |
3219 orgClassName := className. |
3217 |
3220 |
3218 (className includes:$:) ifTrue:[ |
3221 (className includes:$:) ifTrue:[ |
3219 ownerName := className copyTo:(className lastIndexOf:$:) - 1. |
3222 ownerName := className copyTo:(className lastIndexOf:$:) - 1. |
3220 (ownerName endsWith:$:) ifTrue:[ |
3223 (ownerName endsWith:$:) ifTrue:[ |
3221 ownerName := ownerName copyWithoutLast:1. |
3224 ownerName := ownerName copyWithoutLast:1. |
3222 ]. |
3225 ]. |
3223 |
3226 |
3224 ownerClass := Smalltalk at:(ownerName asSymbol) ifAbsent:[]. |
3227 ownerClass := Smalltalk at:(ownerName asSymbol) ifAbsent:[]. |
3225 ownerClass notNil ifTrue:[ |
3228 ownerClass notNil ifTrue:[ |
3226 ownerClass autoload |
3229 ownerClass autoload |
3227 ]. |
3230 ]. |
3228 ]. |
3231 ]. |
3229 (nameSpace notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[ |
3232 (nameSpace notNil and:[nameSpace ~~ Smalltalk]) ifTrue:[ |
3230 changeClass := nameSpace at:className ifAbsent:[]. |
3233 changeClass := nameSpace at:className ifAbsent:[]. |
3231 ]. |
3234 ]. |
3232 changeClass isNil ifTrue:[ |
3235 changeClass isNil ifTrue:[ |
3233 changeClass := Smalltalk at:className ifAbsent:[]. |
3236 changeClass := Smalltalk at:className ifAbsent:[]. |
3234 ]. |
3237 ]. |
3235 [changeClass isNil] whileTrue:[ |
3238 [changeClass isNil] whileTrue:[ |
3236 (NameSpace allNamespaces |
3239 (NameSpace allNamespaces |
3237 detect:[:ns | (nsClass := (ns at:className)) notNil] ifNone:nil) |
3240 detect:[:ns | (nsClass := (ns at:className)) notNil] ifNone:nil) |
3238 notNil ifTrue:[ |
3241 notNil ifTrue:[ |
3239 shortName := nsClass name. |
3242 shortName := nsClass name. |
3240 ] ifFalse:[ |
3243 ] ifFalse:[ |
3241 shortName := className copyFrom:(className lastIndexOf:$:) + 1. |
3244 shortName := className copyFrom:(className lastIndexOf:$:) + 1. |
3242 shortName = className ifTrue:[ |
3245 shortName = className ifTrue:[ |
3243 shortName := '' |
3246 shortName := '' |
3244 ]. |
3247 ]. |
3245 ]. |
3248 ]. |
3246 className := Dialog |
3249 className := Dialog |
3247 request:'No class ''' , className , ''' for change. Add to which class ?' |
3250 request:'No class ''' , className , ''' for change. Add to which class ?' |
3248 initialAnswer:shortName. |
3251 initialAnswer:shortName. |
3249 |
3252 |
3250 className size == 0 ifTrue:[ |
3253 className size == 0 ifTrue:[ |
3251 ^ self |
3254 ^ self |
3252 ]. |
3255 ]. |
3253 alternativeClass := Smalltalk classNamed:className. |
3256 alternativeClass := Smalltalk classNamed:className. |
3254 alternativeClass notNil ifTrue:[ |
3257 alternativeClass notNil ifTrue:[ |
3255 changeClass := alternativeClass |
3258 changeClass := alternativeClass |
3256 ] |
3259 ] |
3257 ]. |
3260 ]. |
3258 methodsForChunk := methodsForChunk copyFrom:(methodsForChunk indexOfSeparator). |
3261 methodsForChunk := methodsForChunk copyFrom:(methodsForChunk indexOfSeparator). |
3259 methodsForChunk := changeClass name , methodsForChunk. |
3262 methodsForChunk := changeClass name , methodsForChunk. |
3260 ]. |
3263 ]. |
3261 |
3264 |
3262 reader := Compiler evaluate:methodsForChunk notifying:self. |
3265 reader := Compiler evaluate:methodsForChunk notifying:self. |
3263 reader fileInFrom:aStream notifying:self passChunk:false single:true. |
3266 reader fileInFrom:aStream notifying:self passChunk:false single:true. |
3264 ] |
3267 ] |
3265 ] |
3268 ] |
3266 ] |
3269 ] |
3267 ]. |
3270 ]. |
3268 changeNrProcessed := nil. |
3271 changeNrProcessed := nil. |
3269 ]. |
3272 ]. |
3270 |
3273 |
3271 "/ |
3274 "/ |
3272 "/ if I am showing the changes file, dont update it |
3275 "/ if I am showing the changes file, dont update it |
3273 "/ |
3276 "/ |
3274 changeFileName = ObjectMemory nameForChanges ifTrue:[ |
3277 changeFileName = ObjectMemory nameForChanges ifTrue:[ |
3275 Class withoutUpdatingChangesDo:[ |
3278 Class withoutUpdatingChangesDo:[ |
3276 Class updateChangeListQuerySignal answer:updateChangeSet value do:applyAction |
3279 Class updateChangeListQuerySignal answer:updateChangeSet value do:applyAction |
3277 ] |
3280 ] |
3278 ] ifFalse:[ |
3281 ] ifFalse:[ |
3279 applyAction value |
3282 applyAction value |
3280 ]. |
3283 ]. |
3281 aStream close. |
3284 aStream close. |
3282 |
3285 |
3283 ^ aborted not |
3286 ^ aborted not |
3284 |
3287 |
4342 classOfChange:changeNr ifAbsent:exceptionBlock |
4348 classOfChange:changeNr ifAbsent:exceptionBlock |
4343 |className cls isMeta ownerClassName ownerClass| |
4349 |className cls isMeta ownerClassName ownerClass| |
4344 |
4350 |
4345 className := self realClassNameOfChange:changeNr. |
4351 className := self realClassNameOfChange:changeNr. |
4346 className isNil ifTrue:[ |
4352 className isNil ifTrue:[ |
4347 ^ exceptionBlock value:nil |
4353 ^ exceptionBlock value:nil |
4348 ]. |
4354 ]. |
4349 |
4355 |
4350 isMeta := false. |
4356 isMeta := false. |
4351 (className endsWith:' class') ifTrue:[ |
4357 (className endsWith:' class') ifTrue:[ |
4352 className := className copyWithoutLast:6. |
4358 className := className copyWithoutLast:6. |
4353 isMeta := true. |
4359 isMeta := true. |
4354 ]. |
4360 ]. |
4355 |
4361 |
4356 (cls := (self nameSpaceForApply) classNamed:className) isNil ifTrue:[ |
4362 (cls := (self nameSpaceForApply) classNamed:className) isNil ifTrue:[ |
4357 cls := Smalltalk classNamed:className |
4363 cls := Smalltalk classNamed:className |
4358 ]. |
4364 ]. |
4359 |
4365 |
4360 cls isNil ifTrue:[ |
4366 cls isNil ifTrue:[ |
4361 (className includes:$:) ifTrue:[ |
4367 (className includes:$:) ifTrue:[ |
4362 ownerClassName := className copyTo:(className lastIndexOf:$:)-1. |
4368 ownerClassName := className copyTo:(className lastIndexOf:$:)-1. |
4363 (ownerClassName endsWith:$:) ifTrue:[ ownerClassName := ownerClassName copyWithoutLast:1 ]. |
4369 (ownerClassName endsWith:$:) ifTrue:[ |
4364 ownerClass := Smalltalk classNamed:ownerClassName. |
4370 ownerClassName := ownerClassName copyWithoutLast:1 |
4365 ownerClass isBehavior ifTrue:[ |
4371 ]. |
4366 ownerClass isLoaded ifFalse:[ |
4372 ownerClass := Smalltalk classNamed:ownerClassName. |
4367 "/ self halt. |
4373 ownerClass isBehavior ifTrue:[ |
4368 ]. |
4374 ownerClass isLoaded ifFalse:[ |
4369 ]. |
4375 autoloadAsRequired value == true ifTrue:[ |
4370 ]. |
4376 ownerClass autoload. |
4371 ^ exceptionBlock value:className |
4377 cls := Smalltalk classNamed:className |
4372 ]. |
4378 ]. |
4373 |
4379 ]. |
|
4380 ]. |
|
4381 ]. |
|
4382 ]. |
|
4383 cls isNil ifTrue:[ |
|
4384 ^ exceptionBlock value:className |
|
4385 ]. |
4374 isMeta ifTrue:[ |
4386 isMeta ifTrue:[ |
4375 cls := cls class |
4387 cls := cls class |
4376 ]. |
4388 ]. |
4377 ^ cls |
4389 ^ cls |
4378 ! |
4390 ! |
4379 |
4391 |
4380 doApply |
4392 doApply |