diff --git a/src/Refactoring-Core-Tests/RBConditionTest.class.st b/src/Refactoring-Core-Tests/RBConditionTest.class.st index f8d9b90a524..241ecae7f0a 100644 --- a/src/Refactoring-Core-Tests/RBConditionTest.class.st +++ b/src/Refactoring-Core-Tests/RBConditionTest.class.st @@ -295,3 +295,20 @@ RBConditionTest >> testTrue [ self assert: RBCondition true check. self deny: RBCondition true not check. ] + +{ #category : 'tests' } +RBConditionTest >> testViolatorsForNegatedConditionAreCorrect [ + + | abstract concrete condition negation doubleNegation | + abstract := { TestCase . Number }. + concrete := { Object . Point }. + + condition := ReClassesAreAbstractCondition new classes: abstract, concrete. + negation := condition not. + doubleNegation := negation not. + + self assert: condition violators asSet equals: concrete asSet. + self assert: negation violators asSet equals: abstract asSet. + self assert: doubleNegation violators asSet equals: condition violators asSet + +] diff --git a/src/Refactoring-Core/RBNewAbstractCondition.class.st b/src/Refactoring-Core/RBNewAbstractCondition.class.st index 95d4a46fa3d..4637ab181f2 100644 --- a/src/Refactoring-Core/RBNewAbstractCondition.class.st +++ b/src/Refactoring-Core/RBNewAbstractCondition.class.st @@ -37,6 +37,11 @@ RBNewAbstractCondition >> isTrue [ ^ self check ] +{ #category : 'accessing' } +RBNewAbstractCondition >> nonViolators [ + self subclassResponsibility +] + { #category : 'logical operations' } RBNewAbstractCondition >> not [ ^ReNewNegationCondition on: self @@ -53,6 +58,11 @@ RBNewAbstractCondition >> violationMessageOn: aStream [ self subclassResponsibility ] +{ #category : 'accessing' } +RBNewAbstractCondition >> violators [ + self subclassResponsibility +] + { #category : 'logical operations' } RBNewAbstractCondition >> | aCondition [ "(A | B) = (A not & B not) not" diff --git a/src/Refactoring-Core/ReClassesCondition.class.st b/src/Refactoring-Core/ReClassesCondition.class.st index b681a560c41..24b10576a41 100644 --- a/src/Refactoring-Core/ReClassesCondition.class.st +++ b/src/Refactoring-Core/ReClassesCondition.class.st @@ -22,3 +22,9 @@ ReClassesCondition >> classes: aRBClassCollection [ classes := aRBClassCollection. subjects := classes. ] + +{ #category : 'accessing' } +ReClassesCondition >> nonViolators [ + + ^ classes reject: [ :aClass | violators anySatisfy: [:each | each == aClass] ] +] diff --git a/src/Refactoring-Core/ReNewNegationCondition.class.st b/src/Refactoring-Core/ReNewNegationCondition.class.st index e8bcc94b879..87850921970 100644 --- a/src/Refactoring-Core/ReNewNegationCondition.class.st +++ b/src/Refactoring-Core/ReNewNegationCondition.class.st @@ -29,7 +29,18 @@ ReNewNegationCondition >> condition: aCondition [ { #category : 'accessing' } ReNewNegationCondition >> errorString [ - ^ condition errorString + ^ String streamContents: [ :aStream | + self violationMessageOn: aStream ] +] + +{ #category : 'accessing' } +ReNewNegationCondition >> nonViolators [ + ^ condition violators +] + +{ #category : 'logical operations' } +ReNewNegationCondition >> not [ + ^ condition ] { #category : 'accessing' } @@ -40,10 +51,22 @@ ReNewNegationCondition >> nonViolators [ { #category : 'displaying' } ReNewNegationCondition >> violationMessageOn: aWriteStream [ + | method re message message2 | + "If my condition is a negation, return its condition violation message" + condition class == self class + ifTrue: [ ^ condition condition violationMessageOn: aWriteStream ]. + + "Otherwise, send the method defined in the condition to self. + In this way, violators return nonViolators" + method := condition class lookupSelector: #violationMessageOn:. + message := String streamContents: [:s | + method valueWithReceiver: self arguments: { s }]. - aWriteStream - nextPutAll: 'NOT '; - nextPutAll: condition errorString + "Remove 'not' apparitions from the message" + re := '[ ]+not[ ]*' asRegex. + message2 := re copy: message contents replacingMatchesWith: ' '. + message2 == message ifTrue: [ message2 := 'NOT ' + message ]. + aWriteStream nextPutAll: message2 ] { #category : 'accessing' } diff --git a/src/Refactoring-Core/ReReifiedCondition.class.st b/src/Refactoring-Core/ReReifiedCondition.class.st index dd90adcdff1..cad4c815e73 100644 --- a/src/Refactoring-Core/ReReifiedCondition.class.st +++ b/src/Refactoring-Core/ReReifiedCondition.class.st @@ -2,7 +2,7 @@ Class { #name : 'ReReifiedCondition', #superclass : 'RBCondition', #instVars : [ - 'subjects' + 'wrapper' ], #category : 'Refactoring-Core-Conditions', #package : 'Refactoring-Core',