diff -r 17ba167b8ee1 -r 553a5456963b compiler/PPCContextMemento.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/compiler/PPCContextMemento.st Sun Oct 26 01:03:31 2014 +0000 @@ -0,0 +1,115 @@ +"{ Package: 'stx:goodies/petitparser/compiler' }" + +Object subclass:#PPCContextMemento + instanceVariableNames:'position properties' + classVariableNames:'' + poolDictionaries:'' + category:'PetitCompiler-Context' +! + +PPCContextMemento comment:'' +! + +!PPCContextMemento methodsFor:'accessing'! + +position + ^ position +! + +position: anInteger + position := anInteger +! ! + +!PPCContextMemento methodsFor:'accessing - properties'! + +hasProperty: aKey + "Test if the property aKey is present." + + ^ properties notNil and: [ properties includesKey: aKey ] +! + +keysAndValuesDo: aBlock + properties ifNil: [ ^ self ]. + properties keysAndValuesDo: [ :key :value | aBlock value: key value: value copy ] +! + +propertiesSize + properties ifNil: [ ^ 0 ]. + ^ properties size. +! + +propertyAt: aKey + "Answer the property value associated with aKey." + + ^ self propertyAt: aKey ifAbsent: [ self error: 'Property not found' ] +! + +propertyAt: aKey ifAbsent: aBlock + "Answer the property value associated with aKey or, if aKey isn't found, answer the result of evaluating aBlock." + + properties isNil + ifTrue: [ ^ aBlock value ] + ifFalse: [ + (properties includesKey: aKey) ifTrue: [ + ^ (properties at: aKey) copy + ]. + ^ aBlock value + ] + + "Created: / 26-10-2014 / 01:23:09 / Jan Vrany " +! + +propertyAt: aKey ifAbsentPut: aBlock + "Answer the property associated with aKey or, if aKey isn't found store the result of evaluating aBlock as new value." + + ^ self propertyAt: aKey ifAbsent: [ self propertyAt: aKey put: aBlock value ] +! + +propertyAt: aKey put: anObject + "Set the property at aKey to be anObject. If aKey is not found, create a new entry for aKey and set is value to anObject. Answer anObject." + + ^ (properties ifNil: [ properties := Dictionary new: 1 ]) + at: aKey put: (anObject copy) +! + +removeProperty: aKey + "Remove the property with aKey. Answer the property or raise an error if aKey isn't found." + + ^ self removeProperty: aKey ifAbsent: [ self error: 'Property not found' ] +! + +removeProperty: aKey ifAbsent: aBlock + "Remove the property with aKey. Answer the value or, if aKey isn't found, answer the result of evaluating aBlock." + + | answer | + properties isNil ifTrue: [ ^ aBlock value ]. + answer := properties removeKey: aKey ifAbsent: aBlock. + properties isEmpty ifTrue: [ properties := nil ]. + ^ answer +! ! + +!PPCContextMemento methodsFor:'comparing'! + += anObject + + (self == anObject) ifTrue: [ ^ true ]. + (anObject class = PPCContextMemento) ifFalse: [ ^ false ]. + + (anObject position = position) ifFalse: [ ^ false ]. + + (self propertiesSize = anObject propertiesSize) ifFalse: [ ^ false ]. + + self keysAndValuesDo: [ :key :value | + (anObject hasProperty: key) ifFalse: [ ^ false ]. + ((anObject propertyAt: key) = value) ifFalse: [ ^ false ]. + ]. + + ^ true. +! + +hash + ^ position hash bitXor: properties hash. + + "Modified: / 26-10-2014 / 01:46:37 / Jan Vrany " +! ! +