Explorar el Código

conservative replace:with:, false removes in attr: same as nil

Herbert Vojčík hace 11 años
padre
commit
da922ca459
Se han modificado 4 ficheros con 87 adiciones y 24 borrados
  1. 45 0
      js/Trapped-Frontend.js
  2. 19 17
      js/Trapped-Processors.js
  3. 12 0
      st/Trapped-Frontend.st
  4. 11 7
      st/Trapped-Processors.st

+ 45 - 0
js/Trapped-Frontend.js

@@ -19,6 +19,31 @@ referencedClasses: []
 }),
 smalltalk.TrappedDataCarrier);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "falseAsNilValue",
+category: 'converting',
+fn: function (){
+var self=this;
+var value;
+return smalltalk.withContext(function($ctx1) { 
+var $1,$2;
+value=self._value();
+$1=_st(value).__eq(false);
+if(smalltalk.assert($1)){
+return nil;
+} else {
+$2=value;
+return $2;
+};
+return self}, function($ctx1) {$ctx1.fill(self,"falseAsNilValue",{value:value},smalltalk.TrappedDataCarrier)})},
+args: [],
+source: "falseAsNilValue\x0a\x09| value |\x0a\x09value := self value.\x0a\x09value = false ifTrue: [ ^nil ] ifFalse: [ ^value ]",
+messageSends: ["value", "ifTrue:ifFalse:", "="],
+referencedClasses: []
+}),
+smalltalk.TrappedDataCarrier);
+
 smalltalk.addMethod(
 smalltalk.method({
 selector: "initialize",
@@ -138,6 +163,26 @@ referencedClasses: []
 }),
 smalltalk.TrappedDataCarrier);
 
+smalltalk.addMethod(
+smalltalk.method({
+selector: "value:whenDifferentFrom:",
+category: 'accessing',
+fn: function (anObject,anotherObject){
+var self=this;
+return smalltalk.withContext(function($ctx1) { 
+var $1;
+$1=_st(anObject).__eq(anotherObject);
+if(! smalltalk.assert($1)){
+self._value_(anObject);
+};
+return self}, function($ctx1) {$ctx1.fill(self,"value:whenDifferentFrom:",{anObject:anObject,anotherObject:anotherObject},smalltalk.TrappedDataCarrier)})},
+args: ["anObject", "anotherObject"],
+source: "value: anObject whenDifferentFrom: anotherObject\x0a\x09anObject = anotherObject ifFalse: [ self value: anObject ]",
+messageSends: ["ifFalse:", "=", "value:"],
+referencedClasses: []
+}),
+smalltalk.TrappedDataCarrier);
+
 
 smalltalk.addMethod(
 smalltalk.method({

+ 19 - 17
js/Trapped-Processors.js

@@ -28,7 +28,7 @@ fn: function (aDataCarrier){
 var self=this;
 return smalltalk.withContext(function($ctx1) { 
 var $1,$2;
-$1=_st(aDataCarrier)._value();
+$1=_st(aDataCarrier)._falseAsNilValue();
 if(($receiver = $1) == nil || $receiver == null){
 $2=_st(aDataCarrier)._target();
 $ctx1.sendIdx["target"]=1;
@@ -40,8 +40,8 @@ _st(_st(aDataCarrier)._target())._at_put_(self["@attrName"],value);
 };
 return self}, function($ctx1) {$ctx1.fill(self,"toView:",{aDataCarrier:aDataCarrier},smalltalk.TrappedProcessorAttribute)})},
 args: ["aDataCarrier"],
-source: "toView: aDataCarrier\x0a\x09aDataCarrier value\x0a\x09\x09ifNil: [ aDataCarrier target removeAt: attrName ]\x0a\x09\x09ifNotNil: [ :value | aDataCarrier target at: attrName put: value ]",
-messageSends: ["ifNil:ifNotNil:", "value", "removeAt:", "target", "at:put:"],
+source: "toView: aDataCarrier\x0a\x09aDataCarrier falseAsNilValue\x0a\x09\x09ifNil: [ aDataCarrier target removeAt: attrName ]\x0a\x09\x09ifNotNil: [ :value | aDataCarrier target at: attrName put: value ]",
+messageSends: ["ifNil:ifNotNil:", "falseAsNilValue", "removeAt:", "target", "at:put:"],
 referencedClasses: []
 }),
 smalltalk.TrappedProcessorAttribute);
@@ -516,19 +516,20 @@ selector: "toModel:",
 category: 'data transformation',
 fn: function (aDataCarrier){
 var self=this;
-var replacement;
+var replacement,old;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
+var $1,$2;
 $1=_st(self["@left"])._replace_with_("^\x5c^","");
 $ctx1.sendIdx["replace:with:"]=2;
 replacement=_st($1)._replace_with_("\x5c$$","");
 $ctx1.sendIdx["replace:with:"]=1;
-_st(aDataCarrier)._value_(_st(_st(_st(aDataCarrier)._value())._asString())._replace_with_(self["@right"],replacement));
-_st(aDataCarrier)._proceed();
-return self}, function($ctx1) {$ctx1.fill(self,"toModel:",{aDataCarrier:aDataCarrier,replacement:replacement},smalltalk.TrappedProcessorReplace)})},
+old=_st(_st(aDataCarrier)._value())._asString();
+_st(aDataCarrier)._value_whenDifferentFrom_(_st(old)._replace_with_(self["@right"],replacement),old);
+$2=_st(aDataCarrier)._proceed();
+return self}, function($ctx1) {$ctx1.fill(self,"toModel:",{aDataCarrier:aDataCarrier,replacement:replacement,old:old},smalltalk.TrappedProcessorReplace)})},
 args: ["aDataCarrier"],
-source: "toModel: aDataCarrier\x0a\x09| replacement |\x0a\x09replacement := (left replace: '^\x5c^' with: '') replace: '\x5c$$' with: ''.\x0a\x09aDataCarrier value: (aDataCarrier value asString replace: right with: replacement).\x0a\x09aDataCarrier proceed",
-messageSends: ["replace:with:", "value:", "asString", "value", "proceed"],
+source: "toModel: aDataCarrier\x0a\x09| replacement old |\x0a\x09replacement := (left replace: '^\x5c^' with: '') replace: '\x5c$$' with: ''.\x0a\x09old := aDataCarrier value asString.\x0a\x09aDataCarrier\x0a\x09\x09value: (old replace: right with: replacement) whenDifferentFrom: old;\x0a\x09\x09proceed",
+messageSends: ["replace:with:", "asString", "value", "value:whenDifferentFrom:", "proceed"],
 referencedClasses: []
 }),
 smalltalk.TrappedProcessorReplace);
@@ -539,19 +540,20 @@ selector: "toView:",
 category: 'data transformation',
 fn: function (aDataCarrier){
 var self=this;
-var replacement;
+var replacement,old;
 return smalltalk.withContext(function($ctx1) { 
-var $1;
+var $1,$2;
 $1=_st(self["@right"])._replace_with_("^\x5c^","");
 $ctx1.sendIdx["replace:with:"]=2;
 replacement=_st($1)._replace_with_("\x5c$$","");
 $ctx1.sendIdx["replace:with:"]=1;
-_st(aDataCarrier)._value_(_st(_st(_st(aDataCarrier)._value())._asString())._replace_with_(self["@left"],replacement));
-_st(aDataCarrier)._proceed();
-return self}, function($ctx1) {$ctx1.fill(self,"toView:",{aDataCarrier:aDataCarrier,replacement:replacement},smalltalk.TrappedProcessorReplace)})},
+old=_st(_st(aDataCarrier)._value())._asString();
+_st(aDataCarrier)._value_whenDifferentFrom_(_st(old)._replace_with_(self["@left"],replacement),old);
+$2=_st(aDataCarrier)._proceed();
+return self}, function($ctx1) {$ctx1.fill(self,"toView:",{aDataCarrier:aDataCarrier,replacement:replacement,old:old},smalltalk.TrappedProcessorReplace)})},
 args: ["aDataCarrier"],
-source: "toView: aDataCarrier\x0a\x09| replacement |\x0a\x09replacement := (right replace: '^\x5c^' with: '') replace: '\x5c$$' with: ''.\x0a\x09aDataCarrier value: (aDataCarrier value asString replace: left with: replacement).\x0a\x09aDataCarrier proceed",
-messageSends: ["replace:with:", "value:", "asString", "value", "proceed"],
+source: "toView: aDataCarrier\x0a\x09| replacement old |\x0a\x09replacement := (right replace: '^\x5c^' with: '') replace: '\x5c$$' with: ''.\x0a\x09old := aDataCarrier value asString.\x0a\x09aDataCarrier\x0a\x09\x09value: (old replace: left with: replacement) whenDifferentFrom: old;\x0a\x09\x09proceed",
+messageSends: ["replace:with:", "asString", "value", "value:whenDifferentFrom:", "proceed"],
 referencedClasses: []
 }),
 smalltalk.TrappedProcessorReplace);

+ 12 - 0
st/Trapped-Frontend.st

@@ -31,6 +31,18 @@ value
 
 value: anObject
 	model := anObject
+!
+
+value: anObject whenDifferentFrom: anotherObject
+	anObject = anotherObject ifFalse: [ self value: anObject ]
+! !
+
+!TrappedDataCarrier methodsFor: 'converting'!
+
+falseAsNilValue
+	| value |
+	value := self value.
+	value = false ifTrue: [ ^nil ] ifFalse: [ ^value ]
 ! !
 
 !TrappedDataCarrier methodsFor: 'initialization'!

+ 11 - 7
st/Trapped-Processors.st

@@ -15,7 +15,7 @@ attrName: aString
 !TrappedProcessorAttribute methodsFor: 'data transformation'!
 
 toView: aDataCarrier
-	aDataCarrier value
+	aDataCarrier falseAsNilValue
 		ifNil: [ aDataCarrier target removeAt: attrName ]
 		ifNotNil: [ :value | aDataCarrier target at: attrName put: value ]
 ! !
@@ -277,17 +277,21 @@ right: aString
 !TrappedProcessorReplace methodsFor: 'data transformation'!
 
 toModel: aDataCarrier
-	| replacement |
+	| replacement old |
 	replacement := (left replace: '^\^' with: '') replace: '\$$' with: ''.
-	aDataCarrier value: (aDataCarrier value asString replace: right with: replacement).
-	aDataCarrier proceed
+	old := aDataCarrier value asString.
+	aDataCarrier
+		value: (old replace: right with: replacement) whenDifferentFrom: old;
+		proceed
 !
 
 toView: aDataCarrier
-	| replacement |
+	| replacement old |
 	replacement := (right replace: '^\^' with: '') replace: '\$$' with: ''.
-	aDataCarrier value: (aDataCarrier value asString replace: left with: replacement).
-	aDataCarrier proceed
+	old := aDataCarrier value asString.
+	aDataCarrier
+		value: (old replace: left with: replacement) whenDifferentFrom: old;
+		proceed
 ! !
 
 !TrappedProcessorReplace class methodsFor: 'instance creation'!