MCMethodDefinition.st
author Claus Gittinger <cg@exept.de>
Wed, 22 Nov 2006 14:09:36 +0100
changeset 52 de0d45ac5b93
child 146 e92158173b96
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/monticello' }"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
MCDefinition subclass:#MCMethodDefinition
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'classIsMeta source category selector className timeStamp'
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:'Definitions'
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Monticello-Modeling'
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
!MCMethodDefinition class methodsFor:'as yet unclassified'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
cachedDefinitions
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
	Definitions ifNil: [Definitions _ WeakIdentityKeyDictionary new.  WeakArray addWeakDependent: Definitions].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
	^ Definitions
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
className: classString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
classIsMeta: metaBoolean
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
selector: selectorString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
category: catString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
timeStamp: timeString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
source: sourceString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	^ self instanceLike:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
		(self new initializeWithClassName: classString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
					classIsMeta: metaBoolean
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
					selector: selectorString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
					category: catString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
					timeStamp: timeString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
					source: sourceString)
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
className: classString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
selector: selectorString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
category: catString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
timeStamp: timeString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
source: sourceString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	^ self	className: classString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
			classIsMeta: false
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
			selector: selectorString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
			category: catString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
			timeStamp: timeString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
			source: sourceString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
forMethodReference: aMethodReference
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
	| definition |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
	definition := self cachedDefinitions at: aMethodReference compiledMethod ifAbsent: [].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
	(definition isNil
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
		or: [definition selector ~= aMethodReference methodSymbol]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
		or: [definition className ~= aMethodReference classSymbol]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
		or: [definition classIsMeta ~= aMethodReference classIsMeta]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
		or: [definition category ~= aMethodReference category])
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
			ifTrue: [definition := self 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
						className: aMethodReference classSymbol
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
						classIsMeta: aMethodReference classIsMeta
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
						selector: aMethodReference methodSymbol
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
						category: aMethodReference category
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
						timeStamp: aMethodReference timeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
						source: aMethodReference source.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
					self cachedDefinitions at: aMethodReference compiledMethod put: definition].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
	^ definition
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
initialize
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
	Smalltalk addToShutDownList: self
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
shutDown
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	WeakArray removeWeakDependent: Definitions.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
	Definitions _ nil.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
!MCMethodDefinition methodsFor:'accessing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
actualClass
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
	^Smalltalk at: className
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
		ifPresent: [:class | classIsMeta ifTrue: [class class] ifFalse: [class]]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
category
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	^ category
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
classIsMeta
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
	^ classIsMeta
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
className
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
	^className
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
fullTimeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
	^TimeStamp fromMethodTimeStamp: timeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
load
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
	self actualClass
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
		compile: source
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
		classified: category
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
		withStamp: timeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
		notifying: (SyntaxError new category: category)
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
selector
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
	^selector
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
source
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
	^ source
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
timeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
	^ timeStamp
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!MCMethodDefinition methodsFor:'annotations'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
printAnnotations: requests on: aStream
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
	"Add a string for an annotation pane, trying to fulfill the annotation requests.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
	These might include anything that
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
		Preferences defaultAnnotationRequests 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
	might return. Which includes anything in
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
		Preferences annotationInfo
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
	To edit these, use:"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
	"Preferences editAnnotations"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
	requests do: [ :aRequest |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
		aRequest == #timeStamp ifTrue: [ aStream nextPutAll: self timeStamp ].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
		aRequest == #messageCategory ifTrue: [ aStream nextPutAll: self category ].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
		aRequest == #requirements ifTrue: [
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
			self requirements do: [ :req |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
				aStream nextPutAll: req ] separatedBy: [ aStream space ]].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
	] separatedBy: [ aStream space ].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
!MCMethodDefinition methodsFor:'comparing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
= aDefinition
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
	^(super = aDefinition)
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
		and: [aDefinition source = self source]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
		and: [aDefinition category = self category]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
		and: [aDefinition timeStamp = self timeStamp]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
hash
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
	| hash |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
	hash _ String stringHash: classIsMeta asString initialHash: 0.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
	hash _ String stringHash: source initialHash: hash.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
	hash _ String stringHash: category initialHash: hash.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
	hash _ String stringHash: className initialHash: hash.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
	^ hash
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
requirements
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
	^ Array with: className
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
sortKey
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
	^ self className, '.', (self classIsMeta ifTrue: ['meta'] ifFalse: ['nonmeta']), '.', self selector
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
!MCMethodDefinition methodsFor:'installing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
isExtensionMethod
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
	^ category beginsWith: '*'
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
isOverrideMethod
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
	"this oughta check the package"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
	^ self isExtensionMethod and: [category endsWith: '-override']
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
postload
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
	self isInitializer ifTrue: [self actualClass theNonMetaClass initialize]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
scanForPreviousVersion
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
	| position prevPos prevFileIndex preamble tokens sourceFilesCopy stamp method file methodCategory |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
	method _ self actualClass compiledMethodAt: selector ifAbsent: [^ nil].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
	position _ method filePosition.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
	sourceFilesCopy _ SourceFiles collect:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
		[:x | x isNil ifTrue: [ nil ]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
				ifFalse: [x readOnlyCopy]].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
	[method fileIndex == 0 ifTrue: [^ nil].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
	file _ sourceFilesCopy at: method fileIndex.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
	[position notNil & file notNil]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
		whileTrue:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
		[file position: (0 max: position-150).  "Skip back to before the preamble"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
		[file position < (position-1)]  "then pick it up from the front"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
			whileTrue: [preamble _ file nextChunk].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
		"Preamble is likely a linked method preamble, if we're in
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
			a changes file (not the sources file).  Try to parse it
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
			for prior source position and file index"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
		prevPos _ nil.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
		stamp _ ''.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
		(preamble findString: 'methodsFor:' startingAt: 1) > 0
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
			ifTrue: [tokens _ Scanner new scanTokens: preamble]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
			ifFalse: [tokens _ Array new  "ie cant be back ref"].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
		((tokens size between: 7 and: 8)
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
			and: [(tokens at: tokens size-5) = #methodsFor:])
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
			ifTrue:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
				[(tokens at: tokens size-3) = #stamp:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
				ifTrue: ["New format gives change stamp and unified prior pointer"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
						stamp _ tokens at: tokens size-2.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
						prevPos _ tokens last.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
						prevFileIndex _ sourceFilesCopy fileIndexFromSourcePointer: prevPos.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
						prevPos _ sourceFilesCopy filePositionFromSourcePointer: prevPos]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
				ifFalse: ["Old format gives no stamp; prior pointer in two parts"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
						prevPos _ tokens at: tokens size-2.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
						prevFileIndex _ tokens last].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
				(prevPos = 0 or: [prevFileIndex = 0]) ifTrue: [prevPos _ nil]].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
		((tokens size between: 5 and: 6)
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
			and: [(tokens at: tokens size-3) = #methodsFor:])
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
			ifTrue:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
				[(tokens at: tokens size-1) = #stamp:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
				ifTrue: ["New format gives change stamp and unified prior pointer"
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
						stamp _ tokens at: tokens size]].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
		methodCategory _ tokens after: #methodsFor: ifAbsent: ['as yet unclassifed'].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
		methodCategory = category ifFalse:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
			[methodCategory = (Smalltalk 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
									at: #Categorizer 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
									ifAbsent: [Smalltalk at: #ClassOrganizer]) 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
										default ifTrue: [methodCategory _ methodCategory, ' '].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
			^ ChangeRecord new file: file position: position type: #method
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
						class: className category: methodCategory meta: classIsMeta stamp: stamp].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
		position _ prevPos.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
		prevPos notNil ifTrue:
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
			[file _ sourceFilesCopy at: prevFileIndex]].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
		^ nil]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
			ensure: [sourceFilesCopy do: [:x | x notNil ifTrue: [x close]]]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
	
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
unload
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
	| previousVersion |
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
	self isOverrideMethod ifTrue: [previousVersion _ self scanForPreviousVersion].
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
	previousVersion
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
		ifNil: [self actualClass ifNotNilDo: [:class | class removeSelector: selector]]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
		ifNotNil: [previousVersion fileIn] 
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
!MCMethodDefinition methodsFor:'printing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
description
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
	^ Array	
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
		with: className
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
		with: selector
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
		with: classIsMeta
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
fullClassName
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
	^ self classIsMeta
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
		ifFalse: [self className]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
		ifTrue: [self className, ' class']
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
summary
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	^ self fullClassName , '>>' , selector
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
!MCMethodDefinition methodsFor:'serializing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
initializeWithClassName: classString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
classIsMeta: metaBoolean
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
selector: selectorString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
category: catString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
timeStamp: timeString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
source: sourceString
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
	className _ classString asSymbol.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
	selector _ selectorString asSymbol.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
	category _ catString asSymbol.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
	timeStamp _ timeString.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
	classIsMeta _ metaBoolean.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
	source _ sourceString withSqueakLineEndings.
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
!MCMethodDefinition methodsFor:'testing'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
isCodeDefinition
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
	^ true
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
isInitializer
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
	^ selector = #initialize and: [classIsMeta]
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
	
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
isMethodDefinition
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
	^true
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
!MCMethodDefinition methodsFor:'visiting'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
accept: aVisitor
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
	^ aVisitor visitMethodDefinition: self
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
!MCMethodDefinition class methodsFor:'documentation'!
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
version
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCMethodDefinition.st,v 1.1 2006-11-22 13:09:36 cg Exp $'
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
! !
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
de0d45ac5b93 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
MCMethodDefinition initialize!