diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/findSelectorsFor.arguments.thatAnswer..st b/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/findSelectorsFor.arguments.thatAnswer..st deleted file mode 100644 index 9839c8a..0000000 --- a/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/findSelectorsFor.arguments.thatAnswer..st +++ /dev/null @@ -1,14 +0,0 @@ -examples -findSelectorsFor: receiver arguments: arguments thatAnswer: expectedResult - "Answer all selectors that can be performed by the given receiver with the given arguments to return the expected result. Lightweight alternative for MethodFinder." - " - Sandbox findSelectorsFor: {1. 2. 3. 4} arguments: {[:x | x asWords] ascending} thatAnswer: {4. 1. 3. 2}. - Sandbox findSelectorsFor: Sandbox arguments: {[2 + 3]} thatAnswer: 5. - (Sandbox streamSelectorsFor: [self error: 'foo'] arguments: {[:x | x]} thatAnswer: 'Error: foo') next. - " - - ^ (self - streamSelectorsFor: receiver - arguments: arguments - thatAnswer: expectedResult) - contents as: Set \ No newline at end of file diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/streamSelectorsFor.arguments.thatAnswer..st b/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/streamSelectorsFor.arguments.thatAnswer..st deleted file mode 100644 index 942a9ca..0000000 --- a/packages/SimulationStudio-Sandbox.package/Sandbox.class/class/streamSelectorsFor.arguments.thatAnswer..st +++ /dev/null @@ -1,24 +0,0 @@ -examples -streamSelectorsFor: receiver arguments: arguments thatAnswer: expectedResult - "Answer a generator to stream all selectors that can be performed by the given receiver with the given arguments to return the expected result. Lightweight alternative for MethodFinder." - " - (Sandbox streamSelectorsFor: [self error: 'foo'] arguments: {[:x | x]} thatAnswer: 'Error: foo') next. - " - - | selectors | - selectors := receiver class allSelectors select: [:sel | sel numArgs = arguments size]. - - ^ Generator on: [:generator | - selectors do: [:sel | - | match sandbox | - sandbox := self new. - sandbox stepLimit: 100000. - match := [sandbox - evaluate: [ - | result | - result := (receiver perform: sel withArguments: arguments). - result = expectedResult] - ifFailed: [false]] - on: Error, Warning - do: [false]. - match ifTrue: [generator nextPut: sel] ] ] \ No newline at end of file diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox.class/methodProperties.json b/packages/SimulationStudio-Sandbox.package/Sandbox.class/methodProperties.json index 6e397e1..a29f5f4 100644 --- a/packages/SimulationStudio-Sandbox.package/Sandbox.class/methodProperties.json +++ b/packages/SimulationStudio-Sandbox.package/Sandbox.class/methodProperties.json @@ -5,9 +5,7 @@ "evaluate:" : "ct 3/6/2021 13:12", "evaluate:ifFailed:" : "ct 3/6/2021 13:12", "evaluate:on:do:" : "ct 3/6/2021 13:12", - "findSelectorsFor:arguments:thatAnswer:" : "ct 3/15/2021 12:45", - "fromMemory:" : "ct 3/6/2021 01:39", - "streamSelectorsFor:arguments:thatAnswer:" : "ct 11/13/2021 16:11" }, + "fromMemory:" : "ct 3/6/2021 01:39" }, "instance" : { "addObject:" : "ct 3/22/2021 17:51", "basicEvaluate:" : "ct 11/13/2021 16:12", diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/findSelectorsFor.arguments.thatAnswer..st b/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/findSelectorsFor.arguments.thatAnswer..st deleted file mode 100644 index 927b521..0000000 --- a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/findSelectorsFor.arguments.thatAnswer..st +++ /dev/null @@ -1,14 +0,0 @@ -examples -findSelectorsFor: receiver arguments: arguments thatAnswer: expectedResult - "Answer all selectors that can be performed by the given receiver with the given arguments to return the expected result. Lightweight alternative for MethodFinder." - " - Sandbox2 findSelectorsFor: {1. 2. 3. 4} arguments: {[:x | x asWords] ascending} thatAnswer: {4. 1. 3. 2}. - Sandbox2 findSelectorsFor: Sandbox arguments: {[2 + 3]} thatAnswer: 5. - (Sandbox2 streamSelectorsFor: [self error: 'foo'] arguments: {[:x | x]} thatAnswer: 'Error: foo') next. - " - - ^ (self - streamSelectorsFor: receiver - arguments: arguments - thatAnswer: expectedResult) - contents as: Set \ No newline at end of file diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/streamSelectorsFor.arguments.thatAnswer..st b/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/streamSelectorsFor.arguments.thatAnswer..st deleted file mode 100644 index b55a0d4..0000000 --- a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/class/streamSelectorsFor.arguments.thatAnswer..st +++ /dev/null @@ -1,24 +0,0 @@ -examples -streamSelectorsFor: receiver arguments: arguments thatAnswer: expectedResult - "Answer a generator to stream all selectors that can be performed by the given receiver with the given arguments to return the expected result. Lightweight alternative for MethodFinder." - " - (Sandbox2 streamSelectorsFor: [self error: 'foo'] arguments: {[:x | x]} thatAnswer: 'Error: foo') next. - " - - | selectors | - selectors := receiver class allSelectors select: [:sel | sel numArgs = arguments size]. - - ^ Generator on: [:generator | - selectors do: [:sel | - | match sandbox | - sandbox := self new. - sandbox stepLimit: 100000. - match := [sandbox - evaluate: [ - | result | - result := (receiver perform: sel withArguments: arguments). - result = expectedResult] - ifFailed: [false]] - on: Error, Warning - do: [false]. - match ifTrue: [generator nextPut: sel] ] ] \ No newline at end of file diff --git a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/methodProperties.json b/packages/SimulationStudio-Sandbox.package/Sandbox2.class/methodProperties.json index 9a73afe..814af0a 100644 --- a/packages/SimulationStudio-Sandbox.package/Sandbox2.class/methodProperties.json +++ b/packages/SimulationStudio-Sandbox.package/Sandbox2.class/methodProperties.json @@ -6,9 +6,7 @@ "evaluate:" : "ct 11/13/2021 16:12", "evaluate:ifFailed:" : "ct 11/13/2021 16:12", "evaluate:on:do:" : "ct 11/13/2021 16:12", - "findSelectorsFor:arguments:thatAnswer:" : "ct 11/13/2021 16:11", - "fromMemory:" : "ct 3/6/2021 01:39", - "streamSelectorsFor:arguments:thatAnswer:" : "ct 11/13/2021 16:11" }, + "fromMemory:" : "ct 3/6/2021 01:39" }, "instance" : { "access:indirectors:" : "ct 11/12/2021 23:58", "addObject:" : "ct 3/22/2021 17:51", diff --git a/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/instance/testFindSelectors.st b/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/instance/testFindSelectors.st deleted file mode 100644 index 46a19a7..0000000 --- a/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/instance/testFindSelectors.st +++ /dev/null @@ -1,15 +0,0 @@ -tests -testFindSelectors - - - { - {{1. 2. 3. 4} asOrderedCollection. #(even). #(1 3) asOrderedCollection. #(removeAllSuchThat: reject:)}. - {[self error: self asString]. {[:x | x]}. 'Error: ' , self asString. #(ifError:)}. - } withIndexDo: [:fixture :index | - | selectors | - Transcript showln: ('{1}({2}: {3}' format: {self. index. fixture}). - selectors := self sandboxClass - findSelectorsFor: fixture first - arguments: fixture second - thatAnswer: fixture third. - self assert: (selectors includesAllOf: fixture fourth)]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/methodProperties.json b/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/methodProperties.json index 7af72f4..10d3cd1 100644 --- a/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/methodProperties.json +++ b/packages/SimulationStudio-Tests-Sandbox.package/SandboxTest.class/methodProperties.json @@ -10,7 +10,6 @@ "testClassComment" : "ct 12/29/2021 01:57", "testCompile" : "ct 12/28/2021 23:00", "testExecuteQuickMethod" : "ct 7/1/2022 18:45", - "testFindSelectors" : "ct 12/27/2021 00:32", "testIdentityHashConstant" : "ct 11/13/2021 00:01", "testMemoryHashes" : "ct 11/13/2021 00:01", "testMemoryObjects" : "ct 11/13/2021 00:01", diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/README.md b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/classUnderTest.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/classUnderTest.st new file mode 100644 index 0000000..d6ef3e5 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/classUnderTest.st @@ -0,0 +1,4 @@ +accessing +classUnderTest + + ^ SimulationMethodFinder \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/matches.spec..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/matches.spec..st new file mode 100644 index 0000000..a861640 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/matches.spec..st @@ -0,0 +1,23 @@ +matching +matches: expression spec: spec + + | expectedMethodReference expectedReceiverAndArguments receiverAndArguments | + expectedMethodReference := spec first methodReference. + expectedMethodReference = expression methodReference ifFalse: [^ false]. + + expectedReceiverAndArguments := spec third copyWithFirst: spec second. + receiverAndArguments := expression arguments copyWithFirst: expression receiver. + + expectedReceiverAndArguments size = receiverAndArguments size ifFalse: [^ false]. + expectedReceiverAndArguments with: receiverAndArguments do: [:expectedArgumentSpec :argument | + self class assert: expectedArgumentSpec isArray. + expectedArgumentSpec first isArray + ifTrue: "expectedValue" + [self class + assert: expectedArgumentSpec first isArray; + assert: expectedArgumentSpec first size = 1. + expectedArgumentSpec first first = argument value ifFalse: [^ false]] + ifFalse: "expectedSpec" + [(self matches: argument spec: expectedArgumentSpec) ifFalse: [^ false]]]. + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindComposite.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindComposite.st new file mode 100644 index 0000000..402feb2 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindComposite.st @@ -0,0 +1,14 @@ +tests +testFindComposite + + + self + testMethodFinder: [:finder | + finder + receiver: 1 arguments: {10. 100}; + setExpectedAnswer: 111; + outerSuperclass: Integer; + isCompositeSearch: true] + limit: 1 + shouldFind: + {{SmallInteger >> #+. {SmallInteger >> #+. {{10}}. {{{100}}}}. {{{1}}}}}. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindPredicate.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindPredicate.st new file mode 100644 index 0000000..6464fd7 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindPredicate.st @@ -0,0 +1,16 @@ +tests +testFindPredicate + + + | receiver predicate | + receiver := 10 @ 20 corner: 60 @ 40. + predicate := [:answer | answer isPoint]. + self + testMethodFinder: [:finder | + finder + receiver: receiver arguments: {}; + setPredicate: predicate; + outerSuperclass: Object] + shouldFind: + {{Rectangle >> #extent. {{receiver}}. {}}. + {Rectangle >> #randomPoint. {{receiver}}. {}}}. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindSendingPredicate.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindSendingPredicate.st new file mode 100644 index 0000000..fc7b044 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindSendingPredicate.st @@ -0,0 +1,21 @@ +tests +testFindSendingPredicate + + + | receiver argument sendingPredicate stream | + sendingPredicate := [:messageSend | + (Array streamContents: [:s | + stream := s. + messageSend value]) + = #((1 2) (3 4))]. + receiver := #(1 2 3 4). + argument := [:a :b | stream nextPut: {a. b}]. + self + testMethodFinder: [:finder | + finder + receiver: receiver arguments: {argument}; + setSendingPredicate: sendingPredicate; + outerSuperclass: Object] + shouldFind: + {{SequenceableCollection >> #pairsDo:. {{receiver}}. {{{argument}}}}. + {SequenceableCollection >> #groupsDo:. {{receiver}}. {{{argument}}}}}. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValue.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValue.st new file mode 100644 index 0000000..5713bd1 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValue.st @@ -0,0 +1,47 @@ +tests +testFindValue + + + self + testMethodFinder: [:finder | + finder + receiver: 2 arguments: {3}; + setExpectedAnswer: 5; + outerSuperclass: Object] + shouldFind: + {{SmallInteger >> #+. {{2}}. {{{3}}}}. + {Integer >> #digitAdd:. {{2}}. {{{3}}}}} + butNotFind: + {{SmallInteger >> #+. {{3}}. {{{2}}}}. + {Integer >> #digitAdd:. {{3}}. {{{2}}}}}. + self + testMethodFinder: [:finder | + finder + receiver: 2 arguments: {3}; + setExpectedAnswer: 5; + outerSuperclass: Object; + permutationMode: #receiverAndArguments] + shouldFind: + {{SmallInteger >> #+. {{2}}. {{{3}}}}. + {Integer >> #digitAdd:. {{2}}. {{{3}}}}. + {SmallInteger >> #+. {{3}}. {{{2}}}}. + {Integer >> #digitAdd:. {{3}}. {{{2}}}}}. + + self + testMethodFinder: [:finder | + finder + receiver: 2 arguments: {4. 7}; + setExpectedAnswer: 4; + outerSuperclass: Object; + permutationMode: #arguments] + shouldFind: + {{Magnitude >> #min:max:. {{2}}. {{{7}}. {{4}}}}. + {Magnitude >> #clampLow:high:. {{2}}. {{{4}}. {{7}}}}}. + self + testMethodFinder: [:finder | + finder + receiver: 2 arguments: {4. 7}; + setExpectedAnswer: 4; + outerSuperclass: nil] + shouldFind: + {{Object >> #filterEvent:for:. {{2}}. {{{4}}. {{7}}}}}. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValueBlock.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValueBlock.st new file mode 100644 index 0000000..71147ca --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testFindValueBlock.st @@ -0,0 +1,15 @@ +tests +testFindValueBlock + + + | argument receiver | + receiver := [self error: 'plonk']. + argument := [:x | x]. + self + testMethodFinder: [:finder | + finder + receiver: receiver arguments: {argument}; + setExpectedAnswer: 'Error: plonk'; + outerSuperclass: ProtoObject] + shouldFind: + {{BlockClosure >> #ifError:. {{receiver}}. {{{argument}}}}}. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind..st new file mode 100644 index 0000000..771c89b --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind..st @@ -0,0 +1,8 @@ +tests +testMethodFinder: finderBlock limit: limitOrNil shouldFind: expectedSpecs + + ^ self + testMethodFinder: finderBlock + limit: limitOrNil + shouldFind: expectedSpecs + butNotFind: #() \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind.butNotFind..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind.butNotFind..st new file mode 100644 index 0000000..c60773e --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.limit.shouldFind.butNotFind..st @@ -0,0 +1,27 @@ +tests +testMethodFinder: finderBlock limit: limitOrNil shouldFind: expectedSpecs butNotFind: unexpectedSpecs + + | runner results | + runner := self classUnderTest new + in: finderBlock; + yourself. + + results := [:stream | runner streamMatchesOn: stream] in: [:streamBlock | + limitOrNil + ifNil: [OrderedCollection streamContents: streamBlock] + ifNotNil: [(Generator on: streamBlock) take: limitOrNil]]. + + expectedSpecs do: [:spec | + results + detect: [:result | self matches: result spec: spec] + ifFound: [:expectedResult | + results remove: expectedResult] + ifNone: [self fail]]. + + unexpectedSpecs do: [:spec | + results + detect: [:result | self matches: result spec: spec] + ifFound: [:unexpectedResult | + self fail. + results remove: unexpectedResult] + ifNone: []]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind..st new file mode 100644 index 0000000..d1ec145 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind..st @@ -0,0 +1,7 @@ +tests +testMethodFinder: finderBlock shouldFind: expectedSpecs + + ^ self + testMethodFinder: finderBlock + shouldFind: expectedSpecs + butNotFind: #() \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind.butNotFind..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind.butNotFind..st new file mode 100644 index 0000000..9895463 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/instance/testMethodFinder.shouldFind.butNotFind..st @@ -0,0 +1,8 @@ +tests +testMethodFinder: finderBlock shouldFind: expectedSpecs butNotFind: unexpectedSpecs + + ^ self + testMethodFinder: finderBlock + limit: nil + shouldFind: expectedSpecs + butNotFind: unexpectedSpecs \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/methodProperties.json b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/methodProperties.json new file mode 100644 index 0000000..01b2188 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/methodProperties.json @@ -0,0 +1,15 @@ +{ + "class" : { + }, + "instance" : { + "classUnderTest" : "ct 9/19/2022 22:22", + "matches:spec:" : "ct 9/18/2022 21:25", + "testFindComposite" : "ct 9/20/2022 19:06", + "testFindPredicate" : "ct 9/20/2022 19:06", + "testFindSendingPredicate" : "ct 9/20/2022 19:06", + "testFindValue" : "ct 9/20/2022 19:07", + "testFindValueBlock" : "ct 9/20/2022 19:06", + "testMethodFinder:limit:shouldFind:" : "ct 9/20/2022 19:03", + "testMethodFinder:limit:shouldFind:butNotFind:" : "ct 9/20/2022 19:04", + "testMethodFinder:shouldFind:" : "ct 9/20/2022 19:07", + "testMethodFinder:shouldFind:butNotFind:" : "ct 9/20/2022 19:07" } } diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/properties.json b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/properties.json new file mode 100644 index 0000000..16ed5cd --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderTest.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SimulationStudio-Tests-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + ], + "name" : "SimulationMethodFinderTest", + "pools" : [ + ], + "super" : "SimulationTestCase", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/README.md b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/README.md new file mode 100644 index 0000000..e69de29 diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/classUnderTest.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/classUnderTest.st new file mode 100644 index 0000000..49d3921 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/classUnderTest.st @@ -0,0 +1,4 @@ +accessing +classUnderTest + + ^ SimulationMethodFinderTool \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/performTest.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/performTest.st new file mode 100644 index 0000000..81d0e98 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/performTest.st @@ -0,0 +1,5 @@ +running +performTest + + ^ UIManager simDontAttachToCursorDuring: + [super performTest] \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/tearDown.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/tearDown.st new file mode 100644 index 0000000..4eb6737 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/tearDown.st @@ -0,0 +1,9 @@ +running +tearDown + + [window ifNotNil: #abandon. + finder ifNotNil: + [finder containingWindow ifNotNil: #abandon]] + valueSuppressingMessages: #('*cancel those changes*'). + + ^ super tearDown \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testAccept.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testAccept.st new file mode 100644 index 0000000..5429ccf --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testAccept.st @@ -0,0 +1,31 @@ +tests - ui +testAccept + + finder := (window := self classUnderTest open) model. + + (window findDeepSubmorphThat: [:m | m knownName = #inputsText] ifAbsent: [self fail]) + update: #editString with: '2. 3'. + self deny: finder isSearching. + (window findDeepSubmorphThat: [:m | m knownName = #outputText] ifAbsent: [self fail]) + update: #editString with: '5'; + accept. + window world runStepMethods. + + [finder isSearching] whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window]. + self assert: finder messageList notEmpty. + + + (window findDeepSubmorphThat: [:m | m knownName = #outputText] ifAbsent: [self fail]) + update: #editString with: '6'. + self deny: finder isSearching. + (window findDeepSubmorphThat: [:m | m knownName = #inputsText] ifAbsent: [self fail]) + update: #editString with: '3. 2'; + accept. + window world runStepMethods. + + [finder isSearching] whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window]. + self assert: finder messageList notEmpty. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testDisplayExample.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testDisplayExample.st new file mode 100644 index 0000000..09fab98 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testDisplayExample.st @@ -0,0 +1,10 @@ +tests - ui +testDisplayExample + "Crash test." + + finder := (window := self classUnderTest open) model. + + 5 timesRepeat: + [finder displayExample. + 0.2 seconds wait. + window imageForm]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindPredicate.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindPredicate.st new file mode 100644 index 0000000..3d88fcb --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindPredicate.st @@ -0,0 +1,7 @@ +tests - finding +testFindPredicate + + + + ^ self testMethodFinder: + #('10 @ 20 corner: 60 @ 40' predicate 'answer isPoint' true true Object false ('Rectangle extent' '(10@20 corner: 60@40) extent' 'Rectangle randomPoint' '(10@20 corner: 60@40) randomPoint') ()) \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindRecursive.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindRecursive.st new file mode 100644 index 0000000..ba2dbce --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindRecursive.st @@ -0,0 +1,9 @@ +tests - finding +testFindRecursive + + + + ^ self + testMethodFinder: + #('1. 10. 100' value '111' true true Integer true ('SmallInteger +' '((10) + (100)) + (1)') ()) + take: 1 \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindSend.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindSend.st new file mode 100644 index 0000000..1ba2854 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindSend.st @@ -0,0 +1,10 @@ +tests - finding +testFindSend + + + + ^ self testMethodFinder: + #('#(1 2 3 4). [:a :b | stream nextPut: {a. b}]' sendingPredicate + '(Array streamContents: [:s | + stream := s. + messageSend value]) = #((1 2) (3 4))' true true Object false ('SequenceableCollection pairsDo:' '(#(1 2 3 4)) pairsDo: ([closure] *)' 'SequenceableCollection groupsDo:' '(#(1 2 3 4)) groupsDo: ([closure] *)') ()) \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindValue.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindValue.st new file mode 100644 index 0000000..7f4b0ca --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testFindValue.st @@ -0,0 +1,9 @@ +tests - finding +testFindValue + + + + ^ self testMethodFinder: + #('2. 3' value '5' true true Object false ('SmallInteger +' '(2) + (3)' 'Integer digitAdd:' '(2) digitAdd: (3)') ('(3) + (2)' '(3) digitAdd: (2)') + '2. 3' value '5' false false Object false ('SmallInteger +' '(2) + (3)' 'Integer digitAdd:' '(2) digitAdd: (3)' 'SmallInteger +' '(3) + (2)' 'Integer digitAdd:' '(3) digitAdd: (2)') () + '2. 4. 7' value '4' true true nil false ('Object filterEvent:for:' '(2) filterEvent: (4) for: (7)') ()) \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder..st new file mode 100644 index 0000000..cf533ad --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder..st @@ -0,0 +1,4 @@ +tests - finding +testMethodFinder: specs + + ^ self testMethodFinder: specs take: nil \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder.take..st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder.take..st new file mode 100644 index 0000000..759f160 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testMethodFinder.take..st @@ -0,0 +1,37 @@ +tests - finding +testMethodFinder: specs take: limitOrNil + + finder := (window := self classUnderTest open) model. + + specs groupsDo: [:input :searchMode :output :pinReceiver :pinArguments :outerSuperclassName :compositeSearch :expectedResults :unexpectedResults | + | results | + finder + searchMode: searchMode; + outputText: output; + hasPinnedReceiver: pinReceiver; + hasPinnedArguments: pinArguments; + outerSuperclass: (outerSuperclassName ifNotNil: [self environment classNamed: outerSuperclassName]); + isCompositeSearch: compositeSearch; + inputsText: input. + + (limitOrNil ifNil: [[finder isSearching]] ifNotNil: [[finder messageList size < limitOrNil]]) + whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window]. + + results := OrderedCollection newFrom: finder messageList. + + expectedResults pairsDo: [:mref :string | + | result | + result := results detect: [:ea | string match: ea stringVersion] ifNone: [self fail]. + result ifNotNil: + [results remove: result. + MessageSet parse: mref toClassAndSelector: [:class :selector | + self + assert: class equals: result actualClass; + assert: selector equals: result selector]]]. + unexpectedResults do: [:string | + | result | + result := results detect: [:ea | string match: ea stringVersion] ifNone: []. + self assert: result isNil. + result ifNotNil: [results remove: result]]]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testProgress.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testProgress.st new file mode 100644 index 0000000..fc158fa --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testProgress.st @@ -0,0 +1,34 @@ +tests - ui +testProgress + + + | percentMatcher | + finder := (window := self classUnderTest open) model. + + finder inputsText: '2. 3'. + finder outputText: '5'. + finder isCompositeSearch: true. + + percentMatcher := '(\d+)%' asRegex. + [finder messageList size < 2] whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window. + + self assert: finder isSearching. + self assert: (finder windowTitle includesSubstring: 'searching' caseSensitive: false). + self + assert: (percentMatcher search: finder windowTitle); + assert: ((percentMatcher subexpression: 2 "percent") asNumber between: 0 and: 100)]. + + [finder messageList size < 3] whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window. + + self assert: finder isSearching. + self assert: (finder windowTitle includesSubstring: 'searching' caseSensitive: false). + self + assert: (percentMatcher search: finder windowTitle); + assert: ((percentMatcher subexpression: 2 "percent") asNumber between: 0 and: 100)]. + + window abandon. + self deny: finder isSearching. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testSimple.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testSimple.st new file mode 100644 index 0000000..188472d --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testSimple.st @@ -0,0 +1,14 @@ +tests - ui +testSimple + + finder := (window := self classUnderTest open) model. + + finder inputsText: '2. 3'. + finder outputText: '5'. + self waitUntilDone. + + {SmallInteger >> #+. '(2) + (3)'. + Integer >> #digitAdd:. '(2) digitAdd: (3)'} + pairsDo: [:method :string | | mref | + mref := finder messageList detect: [:ea | ea compiledMethod == method] ifNone: [self fail]. + self assert: string equals: mref stringVersion]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testWindow.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testWindow.st new file mode 100644 index 0000000..6f60fea --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/testWindow.st @@ -0,0 +1,4 @@ +tests - ui +testWindow + + window := self shouldnt: [self classUnderTest open] raise: Error , Warning , Halt. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/waitUntilDone.st b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/waitUntilDone.st new file mode 100644 index 0000000..25c55fd --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/instance/waitUntilDone.st @@ -0,0 +1,6 @@ +support +waitUntilDone + + [finder isSearching] whileTrue: + [(finder stepTimeIn: window) milliSeconds wait. + finder stepIn: window]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/methodProperties.json b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/methodProperties.json new file mode 100644 index 0000000..dc5bc33 --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/methodProperties.json @@ -0,0 +1,19 @@ +{ + "class" : { + }, + "instance" : { + "classUnderTest" : "ct 9/19/2022 22:21", + "performTest" : "ct 9/17/2022 15:23", + "tearDown" : "ct 9/19/2022 22:16", + "testAccept" : "ct 9/17/2022 15:35", + "testDisplayExample" : "ct 9/19/2022 22:04", + "testFindPredicate" : "ct 9/19/2022 21:55", + "testFindRecursive" : "ct 9/19/2022 22:19", + "testFindSend" : "ct 9/19/2022 20:20", + "testFindValue" : "ct 9/19/2022 21:46", + "testMethodFinder:" : "ct 9/17/2022 19:53", + "testMethodFinder:take:" : "ct 9/19/2022 22:18", + "testProgress" : "ct 9/19/2022 20:28", + "testSimple" : "ct 9/17/2022 15:33", + "testWindow" : "ct 9/17/2022 15:21", + "waitUntilDone" : "ct 9/17/2022 15:31" } } diff --git a/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/properties.json b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/properties.json new file mode 100644 index 0000000..425759b --- /dev/null +++ b/packages/SimulationStudio-Tests-Tools.package/SimulationMethodFinderToolTest.class/properties.json @@ -0,0 +1,15 @@ +{ + "category" : "SimulationStudio-Tests-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "", + "instvars" : [ + "finder", + "window" ], + "name" : "SimulationMethodFinderToolTest", + "pools" : [ + ], + "super" : "SimulationTestCase", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tests-Tools.package/monticello.meta/categories.st b/packages/SimulationStudio-Tests-Tools.package/monticello.meta/categories.st index 96b3a6b..832e16d 100644 --- a/packages/SimulationStudio-Tests-Tools.package/monticello.meta/categories.st +++ b/packages/SimulationStudio-Tests-Tools.package/monticello.meta/categories.st @@ -1 +1,2 @@ +SystemOrganization addCategory: #'SimulationStudio-Tests-Tools-MethodFinder'! SystemOrganization addCategory: #'SimulationStudio-Tests-Tools-ProtocolExplorer'! diff --git a/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/instance/simAllOrderedSubsetsDo..st b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/instance/simAllOrderedSubsetsDo..st new file mode 100644 index 0000000..4ed55c7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/instance/simAllOrderedSubsetsDo..st @@ -0,0 +1,10 @@ +*SimulationStudio-Tools-MethodFinder-enumerating +simAllOrderedSubsetsDo: subsetBlock + + | subset | + 0 to: 2 ** self size - 1 do: [:i | + subset := Array new: self size streamContents: [:stream | + 1 to: self size do: [:j | + (i bitAt: j) = 1 ifTrue: + [stream nextPut: (self at: j)]]]. + subsetBlock value: subset]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/methodProperties.json b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/methodProperties.json new file mode 100644 index 0000000..b1c07d1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "simAllOrderedSubsetsDo:" : "ct 9/19/2022 18:17" } } diff --git a/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/properties.json b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/properties.json new file mode 100644 index 0000000..62ec613 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/ArrayedCollection.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "ArrayedCollection" } diff --git a/packages/SimulationStudio-Tools.package/DateAndTime.extension/instance/simRemainingTimeForProgress..st b/packages/SimulationStudio-Tools.package/DateAndTime.extension/instance/simRemainingTimeForProgress..st new file mode 100644 index 0000000..2bdf72f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/DateAndTime.extension/instance/simRemainingTimeForProgress..st @@ -0,0 +1,8 @@ +*SimulationStudio-Tools-MethodFinder +simRemainingTimeForProgress: progress + + | elapsed overall | + elapsed := self class now - self. + overall := elapsed / progress. + ^ overall - elapsed + diff --git a/packages/SimulationStudio-Tools.package/DateAndTime.extension/methodProperties.json b/packages/SimulationStudio-Tools.package/DateAndTime.extension/methodProperties.json new file mode 100644 index 0000000..414a82d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/DateAndTime.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "simRemainingTimeForProgress:" : "ct 9/19/2022 22:54" } } diff --git a/packages/SimulationStudio-Tools.package/DateAndTime.extension/properties.json b/packages/SimulationStudio-Tools.package/DateAndTime.extension/properties.json new file mode 100644 index 0000000..43b042d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/DateAndTime.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "DateAndTime" } diff --git a/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintOn..st b/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintOn..st new file mode 100644 index 0000000..8a276e8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintOn..st @@ -0,0 +1,18 @@ +*SimulationStudio-Tools-MethodFinder-printing +simShortPrintOn: aStream + + "Format as per ANSI 5.8.2.16: [-]D:HH:MM:SS" | d h m s | + d := self days abs. + h := self hours abs. + m := self minutes abs. + s := self seconds abs truncated. + self negative ifTrue: [ aStream nextPut: $- ]. + d > 0 ifTrue: + [d printOn: aStream. aStream nextPut: $:]. + d + h > 0 ifTrue: + [h < 10 ifTrue: [ aStream nextPut: $0. ]. + h printOn: aStream. aStream nextPut: $:]. + m < 10 ifTrue: [ aStream nextPut: $0. ]. + m printOn: aStream. aStream nextPut: $:. + s < 10 ifTrue: [ aStream nextPut: $0. ]. + s printOn: aStream. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintString.st b/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintString.st new file mode 100644 index 0000000..16500eb --- /dev/null +++ b/packages/SimulationStudio-Tools.package/Duration.extension/instance/simShortPrintString.st @@ -0,0 +1,4 @@ +*SimulationStudio-Tools-MethodFinder-printing +simShortPrintString + + ^ String streamContents: [:stream | self simShortPrintOn: stream] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/Duration.extension/methodProperties.json b/packages/SimulationStudio-Tools.package/Duration.extension/methodProperties.json new file mode 100644 index 0000000..1ba457a --- /dev/null +++ b/packages/SimulationStudio-Tools.package/Duration.extension/methodProperties.json @@ -0,0 +1,6 @@ +{ + "class" : { + }, + "instance" : { + "simShortPrintOn:" : "ct 9/19/2022 22:10", + "simShortPrintString" : "ct 9/19/2022 22:09" } } diff --git a/packages/SimulationStudio-Tools.package/Duration.extension/properties.json b/packages/SimulationStudio-Tools.package/Duration.extension/properties.json new file mode 100644 index 0000000..512e0f0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/Duration.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "Duration" } diff --git a/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/instance/simAllOrderedSubsetsDo..st b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/instance/simAllOrderedSubsetsDo..st new file mode 100644 index 0000000..2ad0b30 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/instance/simAllOrderedSubsetsDo..st @@ -0,0 +1,4 @@ +*SimulationStudio-Tools-MethodFinder-enumerating +simAllOrderedSubsetsDo: subsetBlock + + ^ self asArray simAllOrderedSubsetsDo: subsetBlock \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/methodProperties.json b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/methodProperties.json new file mode 100644 index 0000000..15d7f84 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/methodProperties.json @@ -0,0 +1,5 @@ +{ + "class" : { + }, + "instance" : { + "simAllOrderedSubsetsDo:" : "ct 9/19/2022 18:18" } } diff --git a/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/properties.json b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/properties.json new file mode 100644 index 0000000..3b2523c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SequenceableCollection.extension/properties.json @@ -0,0 +1,2 @@ +{ + "name" : "SequenceableCollection" } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/README.md b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/README.md new file mode 100644 index 0000000..4616029 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/README.md @@ -0,0 +1 @@ +I am a variation of Squeak's traditional MethodFinder that finds all methods for a given set of inputs to match a given output. However, instead of a hardcoded allow-list of selectors, I consider arbitrary messages in the image by evaluating them safely in a SimulationStudio Sandbox. Additionally, I provide a number of advanced configuration options such as reordering arguments (permutationMode), limiting the class hierarchy for search (outerSuperclass), using a predicate or block instead of a constant value for matching message send results (searchMode), and searching in multiple steps (isCompositeSearch) for constructing complex expressions. I also provide some progress variables to support concurrent progress indication. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/browseSelectorPopularities.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/browseSelectorPopularities.st new file mode 100644 index 0000000..9783e01 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/browseSelectorPopularities.st @@ -0,0 +1,6 @@ +support +browseSelectorPopularities + + ^ ((SelectorPopularities associations sorted: [:assoc | assoc value] descending) + as: OrderedDictionary) + explore \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/cleanUp..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/cleanUp..st new file mode 100644 index 0000000..88c3db4 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/cleanUp..st @@ -0,0 +1,4 @@ +initialize-release +cleanUp: aggressive + + SelectorPopularities := nil. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/example.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/example.st new file mode 100644 index 0000000..ebb72da --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/example.st @@ -0,0 +1,8 @@ +documentation +example + + (SimulationMethodFinder new + receiver: 2 arguments: {3}; + setExpectedAnswer: 5; + allMatches) + contents \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/hasSelectorPopularities.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/hasSelectorPopularities.st new file mode 100644 index 0000000..cd4f8ea --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/hasSelectorPopularities.st @@ -0,0 +1,4 @@ +support +hasSelectorPopularities + + ^ SelectorPopularities notNil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initialize.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initialize.st new file mode 100644 index 0000000..b6ffa83 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initialize.st @@ -0,0 +1,4 @@ +initialize-release +initialize + + self initializeSelectorPopularities. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initializeSelectorPopularities.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initializeSelectorPopularities.st new file mode 100644 index 0000000..a687b11 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/initializeSelectorPopularities.st @@ -0,0 +1,10 @@ +support +initializeSelectorPopularities + + | counts | + counts := Dictionary new. + self systemNavigation allSelectorsAndMethodsDo: [:behavior :selector :method | + method allLiteralsDo: [:literal | + literal isSymbol ifTrue: + [counts at: literal put: (counts at: literal ifAbsent: [0]) + 1]]]. + SelectorPopularities := counts. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/popularityOfSelector..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/popularityOfSelector..st new file mode 100644 index 0000000..129b5f7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/popularityOfSelector..st @@ -0,0 +1,5 @@ +support +popularityOfSelector: aSymbol + + ^ (SelectorPopularities ifNil: [^ Float nan]) + at: aSymbol ifAbsent: [0] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/todo.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/todo.st new file mode 100644 index 0000000..597c10d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/class/todo.st @@ -0,0 +1,12 @@ +documentation +todo + + "Ideas for further features: + * Omit or reuse (for composite search) arguments (place them n<>1 times in the final expression) + * Generate arguments (symbolic execution?) + * Specify multiple samples for testing + * For #sendingPredicate: Make it possible to reevaluate the inputs text together with the predicate for each selector? + + Current limitations: + * Side effects for composite search are not preserved (i.e., ((an OrderedCollection(1)) removeAll) size will never be found) - could be solved by importing/exporting SandboxMemorys + * For #sendingPredicate: Only blocks within receiver/arguments may refer to context provided by the predicate" \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allMatches.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allMatches.st new file mode 100644 index 0000000..6fcdd0f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allMatches.st @@ -0,0 +1,5 @@ +finding +allMatches + + ^ Generator on: [:stream | + self streamMatchesOn: stream] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allPermutationModes.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allPermutationModes.st new file mode 100644 index 0000000..bf943de --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allPermutationModes.st @@ -0,0 +1,4 @@ +accessing - constants +allPermutationModes + + ^ #(nil arguments receiverAndArguments) \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allSearchModes.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allSearchModes.st new file mode 100644 index 0000000..9a3e079 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/allSearchModes.st @@ -0,0 +1,4 @@ +accessing - constants +allSearchModes + + ^ #(value predicate sendingPredicate) \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/assuredTranscripter.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/assuredTranscripter.st new file mode 100644 index 0000000..3b1d365 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/assuredTranscripter.st @@ -0,0 +1,5 @@ +private +assuredTranscripter + + ^ transcripter ifNil: + [transcripter := Project current transcript] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthProgress.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthProgress.st new file mode 100644 index 0000000..479a715 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthProgress.st @@ -0,0 +1,4 @@ +accessing - log and debug +currentDepthProgress + + ^ currentDepthProgress \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthStartTime.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthStartTime.st new file mode 100644 index 0000000..dff4e6b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentDepthStartTime.st @@ -0,0 +1,4 @@ +accessing - log and debug +currentDepthStartTime + + ^ currentDepthStartTime \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentSearchDepth.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentSearchDepth.st new file mode 100644 index 0000000..8893bcc --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/currentSearchDepth.st @@ -0,0 +1,4 @@ +accessing - log and debug +currentSearchDepth + + ^ currentDepthIndex \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/defaultIsCompositeSearch.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/defaultIsCompositeSearch.st new file mode 100644 index 0000000..c43047f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/defaultIsCompositeSearch.st @@ -0,0 +1,4 @@ +initialize-release +defaultIsCompositeSearch + + ^ false \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer..st new file mode 100644 index 0000000..e5dbac0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer..st @@ -0,0 +1,4 @@ +accessing +expectedAnswer: anObject + + expectedAnswer := anObject. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer.st new file mode 100644 index 0000000..47a0ec5 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/expectedAnswer.st @@ -0,0 +1,4 @@ +accessing +expectedAnswer + + ^ expectedAnswer \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/initialize.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/initialize.st new file mode 100644 index 0000000..7f2d8ea --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/initialize.st @@ -0,0 +1,6 @@ +initialize-release +initialize + + super initialize. + + self isCompositeSearch: self defaultIsCompositeSearch. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch..st new file mode 100644 index 0000000..494296a --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch..st @@ -0,0 +1,4 @@ +accessing +isCompositeSearch: aBoolean + + isCompositeSearch := aBoolean. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch.st new file mode 100644 index 0000000..3b3f0d1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/isCompositeSearch.st @@ -0,0 +1,4 @@ +accessing +isCompositeSearch + + ^ isCompositeSearch \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/matchesResult..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/matchesResult..st new file mode 100644 index 0000000..c45e5af --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/matchesResult..st @@ -0,0 +1,6 @@ +private +matchesResult: answer + + ^ self searchMode caseOf: + {[#value] -> [answer = expectedAnswer]. + [#predicate] -> [predicate value: answer]} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass..st new file mode 100644 index 0000000..3191632 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass..st @@ -0,0 +1,4 @@ +accessing +outerSuperclass: aClassDescriptionOrNil + + outerSuperclass := aClassDescriptionOrNil. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass.st new file mode 100644 index 0000000..fa82cb8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/outerSuperclass.st @@ -0,0 +1,4 @@ +accessing +outerSuperclass + + ^ outerSuperclass \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode..st new file mode 100644 index 0000000..cedee01 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode..st @@ -0,0 +1,5 @@ +accessing +permutationMode: aSymbol + + self assert: (self allPermutationModes includes: aSymbol). + permutationMode := aSymbol. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode.st new file mode 100644 index 0000000..4b03393 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/permutationMode.st @@ -0,0 +1,4 @@ +accessing +permutationMode + + ^ permutationMode \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate..st new file mode 100644 index 0000000..02fe3e6 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate..st @@ -0,0 +1,4 @@ +accessing +predicate: aBlock + + predicate := aBlock. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate.st new file mode 100644 index 0000000..437fef8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/predicate.st @@ -0,0 +1,4 @@ +accessing +predicate + + ^ predicate \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiver.arguments..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiver.arguments..st new file mode 100644 index 0000000..68ec283 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiver.arguments..st @@ -0,0 +1,4 @@ +accessing +receiver: receiver arguments: arguments + + self receiverAndArguments: (arguments copyWithFirst: receiver). \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments..st new file mode 100644 index 0000000..97e5053 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments..st @@ -0,0 +1,4 @@ +accessing +receiverAndArguments: anArray + + receiverAndArguments := anArray. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments.st new file mode 100644 index 0000000..fc39ddd --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/receiverAndArguments.st @@ -0,0 +1,4 @@ +accessing +receiverAndArguments + + ^ receiverAndArguments \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxClass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxClass.st new file mode 100644 index 0000000..f2b4472 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxClass.st @@ -0,0 +1,4 @@ +accessing - constants +sandboxClass + + ^ Sandbox2 \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxedDo.ifFailed..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxedDo.ifFailed..st new file mode 100644 index 0000000..3e1cbf7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/sandboxedDo.ifFailed..st @@ -0,0 +1,14 @@ +private +sandboxedDo: aBlock ifFailed: failBlock + + | sandbox | + sandbox := self sandboxClass new. + sandbox stepLimit: 100000. + ^ [sandbox + evaluate: aBlock + ifFailed: failBlock] + on: SandboxError "e.g., stepLimit exceeded" do: failBlock + on: Error, Warning do: [:ex | + self assuredTranscripter + openIfNone; showln: ex. + failBlock value] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode..st new file mode 100644 index 0000000..3910296 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode..st @@ -0,0 +1,5 @@ +accessing +searchMode: aSymbol + + self assert: (self allSearchModes includes: aSymbol). + searchMode := aSymbol. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode.st new file mode 100644 index 0000000..5c3ac37 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/searchMode.st @@ -0,0 +1,4 @@ +accessing +searchMode + + ^ searchMode \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setExpectedAnswer..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setExpectedAnswer..st new file mode 100644 index 0000000..9854695 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setExpectedAnswer..st @@ -0,0 +1,5 @@ +accessing +setExpectedAnswer: anObject + + self expectedAnswer: anObject. + self searchMode: #value. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setPredicate..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setPredicate..st new file mode 100644 index 0000000..68f0a9d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setPredicate..st @@ -0,0 +1,5 @@ +accessing +setPredicate: aBlock + + self predicate: aBlock. + self searchMode: #predicate. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setSendingPredicate..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setSendingPredicate..st new file mode 100644 index 0000000..835cf3c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/setSendingPredicate..st @@ -0,0 +1,5 @@ +accessing +setSendingPredicate: aBlock + + self predicate: aBlock. + self searchMode: #sendingPredicate. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/streamMatchesOn..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/streamMatchesOn..st new file mode 100644 index 0000000..467cade --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/streamMatchesOn..st @@ -0,0 +1,106 @@ +finding +streamMatchesOn: aWriteStream + + | queueIndex queueSizeForCurrentDepth | + currentSearchQueue := OrderedCollection with: + {self receiverAndArguments collect: [:eachArgument | + SimulationMethodFinderExpression leaf: eachArgument]. + 0}. + + currentDepthProgress := 0. + currentDepthIndex := Float negativeInfinity. + [currentSearchQueue isEmpty] whileFalse: + [| searchItem availableRcvrargs recursionDepth rcvrargSubsets | + searchItem := currentSearchQueue removeFirst. + availableRcvrargs := searchItem first. + recursionDepth := searchItem second. + + "Update progress variables" + recursionDepth > currentDepthIndex ifTrue: + [currentDepthIndex := recursionDepth. + currentDepthStartTime := DateAndTime now. + queueSizeForCurrentDepth := currentSearchQueue size. + queueIndex := 0]. + currentDepthProgress := queueIndex / (queueSizeForCurrentDepth + 1). + queueIndex := queueIndex + 1. + + "1) For all subsets of receiver/arguments ..." + rcvrargSubsets := self isCompositeSearch + ifFalse: [{availableRcvrargs}] + ifTrue: + [(Array new: 2 ** availableRcvrargs size streamContents: [:stream | + availableRcvrargs simAllOrderedSubsetsDo: [:rcvrargSubset | stream nextPut: rcvrargSubset]]) + reversed]. + rcvrargSubsets withIndexDo: [:rvrargSubset :rvrargSubsetIndex | + | omittedRcvrargs usedRvrargs usedReceiverCount | + omittedRcvrargs := availableRcvrargs difference: rvrargSubset. + usedRvrargs := rvrargSubset asArray. + + "2) For each possible receiver from the current set ..." + usedReceiverCount := self permutationMode = #receiverAndArguments + ifTrue: [usedRvrargs size] + ifFalse: [1 min: usedRvrargs size]. + 1 to: usedReceiverCount do: [:usedReceiverIndex | + | usedReceiver usedReceiverValue usedArgSet selectors usedArgsPermutations | + usedReceiver := usedRvrargs at: usedReceiverIndex. + usedReceiverValue := usedReceiver value. + usedArgSet := (usedRvrargs first: usedReceiverIndex - 1) + , (usedRvrargs allButFirst: usedReceiverIndex). + + "3) For each selector that is understood by this receiver ..." + selectors := (self outerSuperclass isNil or: [usedReceiverValue isKindOf: self outerSuperclass]) + ifFalse: [#()] + ifTrue: + [((usedReceiverValue class allSelectorsBelow: self outerSuperclass) + select: [:sel | sel numArgs = usedArgSet size]) + sorted: [:sel | self class popularityOfSelector: sel] descending]. + + "4) For each permutation of the remaining arguments from the set ..." + usedArgsPermutations := self permutationMode + ifNil: [{usedArgSet}] + ifNotNil: + [Array new: usedArgSet size factorial streamContents: [:stream | + usedArgSet permutationsDo: [:usedArgs | stream nextPut: usedArgs copy]]]. + selectors withIndexDo: [:selector :selectorIndex | + usedArgsPermutations withIndexDo: [:usedArgs :usedArgsIndex | + | usedArgValues expression hasMatched | + usedArgValues := usedArgs collect: [:eachArgument | eachArgument value]. + + expression := SimulationMethodFinderExpression + selector: selector + receiver: usedReceiver + arguments: usedArgs. + transcripter ifNotNil: [transcripter showln: expression]. + hasMatched := false. + + self flag: #forLater. "Add option to omit arguments" + omittedRcvrargs ifEmpty: + ["a) Send message and test the result" + self trySendAndMatch: usedReceiverValue selector: selector arguments: usedArgValues ifMatch: [:result | + transcripter ifNotNil: [transcripter showln: ' match: '; show: ([result printString] ifError: ['' format: {result class}])]. + aWriteStream nextPut: + (expression withValue: result)]]. + + (self isCompositeSearch and: [hasMatched not "avoid useless loops/cycles"]) ifTrue: + ["b) Send message and store the intermediate result in the queue" + | matchResult | + matchResult := self trySend: usedReceiverValue selector: selector arguments: usedArgValues ifSuccess: [:result | + transcripter ifNotNil: [transcripter showln: ' intermediate: '; show: ([result printString] ifError: ['' format: {result class}])]. + result == usedReceiverValue ifFalse: + [transcripter ifNotNil: [transcripter show: ' (enqueue)']. + self flag: #forLater. "Add option to reuse arguments" + currentSearchQueue addLast: + {omittedRcvrargs copyWithFirst: + (expression withValue: result). + recursionDepth + 1}]]]. + + transcripter ifNotNil: [transcripter show: '.']. + + "Update progress variables" + currentDepthIndex = 0 ifTrue: + [currentDepthProgress := selectorIndex / selectors size + - 1 + usedReceiverIndex / usedReceiverCount + - 1 + rvrargSubsetIndex / rcvrargSubsets size + - 1 + queueIndex / (queueSizeForCurrentDepth + 1)]. + + Processor yield]]]]]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter..st new file mode 100644 index 0000000..0e2d0a9 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter..st @@ -0,0 +1,5 @@ +accessing - log and debug +transcripter: aTranscriptStream + "A TranscriptStream that may be set for debugging purposes, or nil." + + transcripter := aTranscriptStream. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter.st new file mode 100644 index 0000000..b48d49d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/transcripter.st @@ -0,0 +1,5 @@ +accessing - log and debug +transcripter + "A TranscriptStream that may be set for debugging purposes, or nil." + + ^ transcripter \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySend.selector.arguments.ifSuccess..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySend.selector.arguments.ifSuccess..st new file mode 100644 index 0000000..a7496b7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySend.selector.arguments.ifSuccess..st @@ -0,0 +1,13 @@ +finding +trySend: receiver selector: selector arguments: arguments ifSuccess: resultBlock + + | results | + results := self + sandboxedDo: + [{receiver perform: selector withArguments: arguments}] + ifFailed: [nil]. + + results ifNotNil: + [^ resultBlock value: results first]. + + ^ nil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySendAndMatch.selector.arguments.ifMatch..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySendAndMatch.selector.arguments.ifMatch..st new file mode 100644 index 0000000..f2f1634 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/instance/trySendAndMatch.selector.arguments.ifMatch..st @@ -0,0 +1,25 @@ +finding +trySendAndMatch: receiver selector: selector arguments: arguments ifMatch: resultBlock + + | matchedResults | + matchedResults := self + sandboxedDo: + [self searchMode = #sendingPredicate + ifFalse: + [| result | + result := receiver perform: selector withArguments: arguments. + (self matchesResult: result) + ifTrue: [{result}]] + ifTrue: + [(predicate value: + (MessageSend + receiver: receiver + selector: selector + arguments: arguments)) + ifTrue: [{nil}]]] + ifFailed: [nil]. + + matchedResults ifNotNil: + [^ resultBlock value: matchedResults first]. + + ^ nil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/methodProperties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/methodProperties.json new file mode 100644 index 0000000..8ce4866 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/methodProperties.json @@ -0,0 +1,46 @@ +{ + "class" : { + "browseSelectorPopularities" : "ct 9/19/2022 23:15", + "cleanUp:" : "ct 9/18/2022 20:10", + "example" : "ct 9/19/2022 22:53", + "hasSelectorPopularities" : "ct 9/18/2022 20:10", + "initialize" : "ct 9/18/2022 20:09", + "initializeSelectorPopularities" : "ct 9/18/2022 20:09", + "popularityOfSelector:" : "ct 9/17/2022 20:49", + "todo" : "ct 9/19/2022 23:03" }, + "instance" : { + "allMatches" : "ct 9/19/2022 22:51", + "allPermutationModes" : "ct 9/18/2022 19:34", + "allSearchModes" : "ct 9/18/2022 20:04", + "assuredTranscripter" : "ct 9/19/2022 18:42", + "currentDepthProgress" : "ct 9/19/2022 19:43", + "currentDepthStartTime" : "ct 9/19/2022 19:45", + "currentSearchDepth" : "ct 9/19/2022 19:36", + "defaultIsCompositeSearch" : "ct 9/18/2022 20:07", + "expectedAnswer" : "ct 9/18/2022 20:16", + "expectedAnswer:" : "ct 9/19/2022 19:37", + "initialize" : "ct 9/18/2022 20:07", + "isCompositeSearch" : "ct 9/18/2022 20:05", + "isCompositeSearch:" : "ct 9/18/2022 19:35", + "matchesResult:" : "ct 9/18/2022 21:33", + "outerSuperclass" : "ct 9/18/2022 20:07", + "outerSuperclass:" : "ct 9/18/2022 20:05", + "permutationMode" : "ct 9/18/2022 20:16", + "permutationMode:" : "ct 9/18/2022 19:34", + "predicate" : "ct 9/18/2022 20:17", + "predicate:" : "ct 9/19/2022 19:38", + "receiver:arguments:" : "ct 9/18/2022 20:03", + "receiverAndArguments" : "ct 9/18/2022 20:17", + "receiverAndArguments:" : "ct 9/18/2022 19:29", + "sandboxClass" : "ct 9/18/2022 20:11", + "sandboxedDo:ifFailed:" : "ct 9/19/2022 18:55", + "searchMode" : "ct 9/18/2022 20:17", + "searchMode:" : "ct 9/18/2022 19:29", + "setExpectedAnswer:" : "ct 9/19/2022 19:37", + "setPredicate:" : "ct 9/19/2022 19:38", + "setSendingPredicate:" : "ct 9/19/2022 19:39", + "streamMatchesOn:" : "ct 9/20/2022 19:46", + "transcripter" : "ct 9/19/2022 22:03", + "transcripter:" : "ct 9/19/2022 22:03", + "trySend:selector:arguments:ifSuccess:" : "ct 9/19/2022 18:52", + "trySendAndMatch:selector:arguments:ifMatch:" : "ct 9/19/2022 18:52" } } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/properties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/properties.json new file mode 100644 index 0000000..4ba990e --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinder.class/properties.json @@ -0,0 +1,25 @@ +{ + "category" : "SimulationStudio-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + "SelectorPopularities" ], + "commentStamp" : "ct 9/20/2022 19:22", + "instvars" : [ + "receiverAndArguments", + "searchMode", + "expectedAnswer", + "predicate", + "outerSuperclass", + "permutationMode", + "isCompositeSearch", + "currentSearchQueue", + "currentDepthIndex", + "currentDepthStartTime", + "currentDepthProgress", + "transcripter" ], + "name" : "SimulationMethodFinder", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/README.md b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/README.md new file mode 100644 index 0000000..0d7a32f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/README.md @@ -0,0 +1 @@ +I represent an expression that was constructed by a SimulationMethodFinder. I'm like a MessageSend but can also store the resulting value. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/leaf..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/leaf..st new file mode 100644 index 0000000..faba775 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/leaf..st @@ -0,0 +1,6 @@ +instance creation +leaf: anObject + + ^ self new + value: anObject; + yourself \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/selector.receiver.arguments..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/selector.receiver.arguments..st new file mode 100644 index 0000000..5edb813 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/class/selector.receiver.arguments..st @@ -0,0 +1,8 @@ +instance creation +selector: aSymbol receiver: receiver arguments: arguments + + ^ self new + selector: aSymbol; + receiver: receiver; + arguments: arguments; + yourself \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments..st new file mode 100644 index 0000000..d474da4 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments..st @@ -0,0 +1,4 @@ +accessing +arguments: anArray + + arguments := anArray. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments.st new file mode 100644 index 0000000..95607a7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/arguments.st @@ -0,0 +1,4 @@ +accessing +arguments + + ^ arguments \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/compiledMethod.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/compiledMethod.st new file mode 100644 index 0000000..4ca4a57 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/compiledMethod.st @@ -0,0 +1,4 @@ +accessing +compiledMethod + + ^ self receiver valueClass lookupSelector: self selector \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/isLeaf.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/isLeaf.st new file mode 100644 index 0000000..aad17e5 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/isLeaf.st @@ -0,0 +1,4 @@ +testing +isLeaf + + ^ self selector isNil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/methodReference.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/methodReference.st new file mode 100644 index 0000000..d9ad88d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/methodReference.st @@ -0,0 +1,7 @@ +accessing +methodReference + + self receiver ifNil: [^ nil]. + ^ self compiledMethod methodReference + stringVersion: self printString; + yourself \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printOn..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printOn..st new file mode 100644 index 0000000..549b5f0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printOn..st @@ -0,0 +1,26 @@ +printing +printOn: aStream + + self isLeaf ifTrue: + [aStream + nextPut: $(; + print: self value; + nextPut: $). + ^ self]. + + self + printReceiverOrArgument: self receiver + on: aStream. + + aStream space. + + self arguments ifEmpty: [^ aStream nextPutAll: self selector]. + self arguments with: self selector keywords do: [:arg :word | + aStream + nextPutAll: word; + space. + self + printReceiverOrArgument: arg + on: aStream. + aStream space]. + aStream skip: -1. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printReceiverOrArgument.on..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printReceiverOrArgument.on..st new file mode 100644 index 0000000..e65f50b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/printReceiverOrArgument.on..st @@ -0,0 +1,10 @@ +printing +printReceiverOrArgument: argument on: aStream + + aStream + nextPut: $(; + print: + (argument isLeaf + ifTrue: [argument value] + ifFalse: [argument]); + nextPut: $). \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver..st new file mode 100644 index 0000000..e1ea354 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver..st @@ -0,0 +1,4 @@ +accessing +receiver: anObject + + receiver := anObject. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver.st new file mode 100644 index 0000000..198ec6c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/receiver.st @@ -0,0 +1,4 @@ +accessing +receiver + + ^ receiver \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector..st new file mode 100644 index 0000000..d3ee7d6 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector..st @@ -0,0 +1,4 @@ +accessing +selector: aSymbol + + selector := aSymbol. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector.st new file mode 100644 index 0000000..bf5601b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/selector.st @@ -0,0 +1,4 @@ +accessing +selector + + ^ selector \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value..st new file mode 100644 index 0000000..60f9632 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value..st @@ -0,0 +1,4 @@ +accessing +value: anObject + + value := anObject. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value.st new file mode 100644 index 0000000..ddcd5a1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/value.st @@ -0,0 +1,4 @@ +accessing +value + + ^ value \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/valueClass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/valueClass.st new file mode 100644 index 0000000..828ff5b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/valueClass.st @@ -0,0 +1,4 @@ +accessing +valueClass + + ^ self value class \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/withValue..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/withValue..st new file mode 100644 index 0000000..644091b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/instance/withValue..st @@ -0,0 +1,4 @@ +copying +withValue: anObject + + ^ self copy value: anObject \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/methodProperties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/methodProperties.json new file mode 100644 index 0000000..d984335 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/methodProperties.json @@ -0,0 +1,20 @@ +{ + "class" : { + "leaf:" : "ct 9/18/2022 21:08", + "selector:receiver:arguments:" : "ct 9/19/2022 18:36" }, + "instance" : { + "arguments" : "ct 9/18/2022 21:20", + "arguments:" : "ct 9/18/2022 21:12", + "compiledMethod" : "ct 9/18/2022 21:18", + "isLeaf" : "ct 9/18/2022 21:23", + "methodReference" : "ct 9/19/2022 20:14", + "printOn:" : "ct 9/19/2022 21:34", + "printReceiverOrArgument:on:" : "ct 9/19/2022 21:35", + "receiver" : "ct 9/18/2022 21:17", + "receiver:" : "ct 9/18/2022 21:12", + "selector" : "ct 9/18/2022 21:14", + "selector:" : "ct 9/18/2022 21:12", + "value" : "ct 9/18/2022 21:09", + "value:" : "ct 9/18/2022 21:08", + "valueClass" : "ct 9/18/2022 21:17", + "withValue:" : "ct 9/19/2022 18:37" } } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/properties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/properties.json new file mode 100644 index 0000000..76084ca --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderExpression.class/properties.json @@ -0,0 +1,17 @@ +{ + "category" : "SimulationStudio-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + "SelectorPopularities" ], + "commentStamp" : "ct 9/19/2022 22:48", + "instvars" : [ + "selector", + "receiver", + "arguments", + "value" ], + "name" : "SimulationMethodFinderExpression", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/README.md b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/README.md new file mode 100644 index 0000000..eb457cf --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/README.md @@ -0,0 +1 @@ +I provide the user interface for a SimulationMethodFinder. I'm a very rough complement of Squeak's traditional SelectorBrowser, but offer more configuration options, run searches asynchronously, and display results incrementally together with some progress indication. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/appName.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/appName.st new file mode 100644 index 0000000..a995c85 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/appName.st @@ -0,0 +1,4 @@ +constants +appName + + ^ 'Simulation Method Finder' \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/initialize.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/initialize.st new file mode 100644 index 0000000..3a6f2fe --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/initialize.st @@ -0,0 +1,4 @@ +initialize-release +initialize + + self registerInWorldMenu. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/open.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/open.st new file mode 100644 index 0000000..40c9993 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/open.st @@ -0,0 +1,4 @@ +opening +open + + ^ self new open \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/registerInWorldMenu.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/registerInWorldMenu.st new file mode 100644 index 0000000..bde59d1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/registerInWorldMenu.st @@ -0,0 +1,4 @@ +initialize-release +registerInWorldMenu + + TheWorldMenu registerOpenCommand: {self appName. {self. #open}} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/todo.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/todo.st new file mode 100644 index 0000000..5a3be95 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/todo.st @@ -0,0 +1,4 @@ +documentation +todo + + ^ SimulationMethodFinder todo \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unload.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unload.st new file mode 100644 index 0000000..ad29517 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unload.st @@ -0,0 +1,4 @@ +initialize-release +unload + + self unregisterInWorldMenu. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unregisterInWorldMenu.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unregisterInWorldMenu.st new file mode 100644 index 0000000..e29376e --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/class/unregisterInWorldMenu.st @@ -0,0 +1,4 @@ +initialize-release +unregisterInWorldMenu + + TheWorldMenu unregisterOpenCommand: self appName. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/aboutToStyle.requestor..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/aboutToStyle.requestor..st new file mode 100644 index 0000000..191dd8b --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/aboutToStyle.requestor..st @@ -0,0 +1,21 @@ +accessing - toolbuilder +aboutToStyle: styler requestor: requestor + + styler context: + (requestor knownName + caseOf: + {[#inputsText] -> []. + [#outputText] -> + [(self searchMode + caseOf: + {[#predicate] -> [self makeContextForPredicate]. + [#sendingPredicate] -> [self makeContextForSendingPredicate]} + otherwise: [])]} + otherwise: + [self selection ifNil: [^ false]. + ^ super aboutToStyle: styler requestor: requestor]). + + styler parseAMethod: false. + styler workspace: self. + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/addModelItemsToWindowMenu..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/addModelItemsToWindowMenu..st new file mode 100644 index 0000000..659b52d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/addModelItemsToWindowMenu..st @@ -0,0 +1,8 @@ +toolbuilder +addModelItemsToWindowMenu: aMenu + + aMenu addLine. + aMenu + add: 'show transcripter' + target: self + action: #showTranscripter. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/bindingOf..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/bindingOf..st new file mode 100644 index 0000000..f1113b3 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/bindingOf..st @@ -0,0 +1,8 @@ +bindings +bindingOf: aString + + bindings ifNil: [^ super bindingOf: aString]. + + (bindings includesKey: aString) ifFalse: [ + bindings at: aString put: nil]. + ^ bindings associationAt: aString \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildControlPaneWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildControlPaneWith..st new file mode 100644 index 0000000..e4bb4b1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildControlPaneWith..st @@ -0,0 +1,13 @@ +toolbuilder +buildControlPaneWith: builder + + ^ self + buildWindow: + (builder pluggablePanelSpec new + children: OrderedCollection new; + wantsResizeHandles: true; + yourself) + with: builder + specs: + {(0 @ 0 corner: 2 / 3 @ 1) -> [self buildInputsPaneWith: builder]. + (2 / 3 @ 0 corner: 1 @ 1) -> [self buildOutputPaneWith: builder]} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildInputsPaneWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildInputsPaneWith..st new file mode 100644 index 0000000..66dfdcb --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildInputsPaneWith..st @@ -0,0 +1,72 @@ +toolbuilder +buildInputsPaneWith: builder + + ^ builder pluggablePanelSpec new + children: + (OrderedCollection new + add: + (builder pluggableCodePaneSpec new + frame: + (LayoutFrame fullFrame + bottomOffset: self buttonHeight negated; + yourself); + name: #inputsText; + model: self; + help: self inputsPaneHelp; + getText: #inputsText; + setText: #inputsText:requestor:; + yourself); + add: + (builder pluggablePanelSpec new + frame: + (LayoutFrame fullFrame + topFraction: 1; + topOffset: self buttonHeight negated; + yourself); + layout: #horizontal; + children: + (OrderedCollection new + add: + (builder pluggableButtonSpec new + model: self; + label: 'pin receiver'; + help: 'Search methods that are defined on the first entered item only. If disabled, methods will be tested with all entered items as receiver.'; + state: #hasPinnedReceiver; + action: #togglePinnedReceiver; + yourself); + add: + (builder pluggableButtonSpec new + model: self; + label: 'pin arguments'; + help: 'Honor the order of entered arguments. If disabled, methods will be tested with all permutations of the arguments.'; + state: #hasPinnedArguments; + action: #togglePinnedArguments; + yourself); + add: + (builder pluggableButtonSpec new + style: #menuButton; + model: self; + help: 'only find methods below (excluding) a certain class'; + label: #outerSuperclassLabel; + state: #hasOuterSuperclass; + action: #setOuterSuperclass; + yourself); + add: + (builder pluggableButtonSpec new + model: self; + label: 'recursive'; + help: 'also find composite message expressions (slower)'; + state: #isCompositeSearch; + action: #toggleCompositeSearch; + yourself); + add: + (builder pluggableActionButtonSpec new + model: self; + label: 'example'; + help: 'Too complex UI? Click here to fill in some example config to understand it in action! (hold shift to see all examples)'; + action: #displayExample; + yourself); + yourself); + yourself); + yourself); + yourself \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildOutputPaneWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildOutputPaneWith..st new file mode 100644 index 0000000..1ea4830 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildOutputPaneWith..st @@ -0,0 +1,57 @@ +toolbuilder +buildOutputPaneWith: builder + + ^ builder pluggablePanelSpec new + children: + (OrderedCollection new + add: + (builder pluggableCodePaneSpec new + frame: + (LayoutFrame fullFrame + bottomOffset: self buttonHeight negated; + yourself); + name: #outputText; + model: self; + help: #outputPaneHelp; + getText: #outputText; + setText: #outputText:requestor:; + yourself); + add: + (builder pluggablePanelSpec new + frame: + (LayoutFrame fullFrame + topFraction: 1; + topOffset: self buttonHeight negated; + yourself); + layout: #horizontal; + spacing: -1 px; + children: + (OrderedCollection new + add: + (builder pluggableRadioButtonSpec new + model: self; + label: 'value'; + help: 'specify an expression that will be matched against the answer of each method'; + state: #isOutputValue; + action: #setOutputValue; + yourself); + add: + (builder pluggableRadioButtonSpec new + model: self; + label: 'predicate'; + help: 'specify a boolean expression that will be evaluated for the answer of each tested method'; + state: #isOutputPredicate; + action: #setOutputPredicate; + yourself); + add: + (builder pluggableRadioButtonSpec new + model: self; + label: 'send'; + help: 'specify an expression that will be evaluated for each messageSend and sets up a context, evaluates the messageSend, and answers a boolean'; + state: #isOutputSendingPredicate; + action: #setOutputSendingPredicate; + yourself); + yourself); + yourself); + yourself); + yourself \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildResultsPaneWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildResultsPaneWith..st new file mode 100644 index 0000000..85ef386 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildResultsPaneWith..st @@ -0,0 +1,13 @@ +toolbuilder +buildResultsPaneWith: builder + + ^ self + buildWindow: + (builder pluggablePanelSpec new + children: OrderedCollection new; + wantsResizeHandles: true; + yourself) + with: builder + specs: + {(0 @ 0 corner: 1 / 2 @ 1) -> [self buildMessageListWith: builder]. + (1 / 2 @ 0 corner: 1 @ 1) -> [self buildCodePaneWith: builder]} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildWith..st new file mode 100644 index 0000000..6bdf8bd --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/buildWith..st @@ -0,0 +1,8 @@ +toolbuilder +buildWith: builder + + | spec | + spec := self buildWindowWith: builder specs: + {(0 @ 0 corner: 1 @ self verticalOffset) -> [self buildControlPaneWith: builder]. + (0 @ self verticalOffset corner: 1 @ 1) -> [self buildResultsPaneWith: builder]}. + ^ builder build: spec \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/checkForUnacceptedEditsIn.ifTrueAcceptDeferredAnd..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/checkForUnacceptedEditsIn.ifTrueAcceptDeferredAnd..st new file mode 100644 index 0000000..c5643a3 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/checkForUnacceptedEditsIn.ifTrueAcceptDeferredAnd..st @@ -0,0 +1,12 @@ +private +checkForUnacceptedEditsIn: textViewSelector ifTrueAcceptDeferredAnd: trueBlock + + | morph | + morph := (self dependentTextPaneWithSelector: textViewSelector) ifNil: [^ self]. + morph hasUnacceptedEdits ifFalse: [^ self]. + + Project current addDeferredUIMessage: + [morph handleEdit: "to ensure the editor has the correct model to access bindings" + [morph accept]]. + + ^ trueBlock value \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/compilerClass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/compilerClass.st new file mode 100644 index 0000000..0f416fc --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/compilerClass.st @@ -0,0 +1,4 @@ +accessing - constants +compilerClass + + ^ Compiler \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/contents.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/contents.st new file mode 100644 index 0000000..23aa5ff --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/contents.st @@ -0,0 +1,5 @@ +accessing - toolbuilder +contents + + self selection ifNil: [^ self emptyContents]. + ^ super contents \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedArguments.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedArguments.st new file mode 100644 index 0000000..d35a9e7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedArguments.st @@ -0,0 +1,4 @@ +initialize-release +defaultHasPinnedArguments + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedReceiver.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedReceiver.st new file mode 100644 index 0000000..4dfb1ee --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultHasPinnedReceiver.st @@ -0,0 +1,4 @@ +initialize-release +defaultHasPinnedReceiver + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultIsCompositeSearch.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultIsCompositeSearch.st new file mode 100644 index 0000000..c43047f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultIsCompositeSearch.st @@ -0,0 +1,4 @@ +initialize-release +defaultIsCompositeSearch + + ^ false \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultOuterSuperclass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultOuterSuperclass.st new file mode 100644 index 0000000..fbe07ef --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultOuterSuperclass.st @@ -0,0 +1,4 @@ +initialize-release +defaultOuterSuperclass + + ^ Object \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultSearchMode.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultSearchMode.st new file mode 100644 index 0000000..9c9d620 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/defaultSearchMode.st @@ -0,0 +1,4 @@ +initialize-release +defaultSearchMode + + ^ #value \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/displayExample.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/displayExample.st new file mode 100644 index 0000000..cb35149 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/displayExample.st @@ -0,0 +1,25 @@ +actions +displayExample + + | spec stream | + self okToChange ifFalse: [^ self]. + + spec := Sensor shiftPressed + ifFalse: [self exampleSpecs atRandom] + ifTrue: + [(Project uiManager chooseFromLabeledValues: + (self exampleSpecs collect: [:ea | ('{1}. {2}' format: ea) -> ea] as: OrderedDictionary)) + ifNil: [^ self]]. + + self initializeDefaults. + + stream := spec readStream skip: 2. + stream next ifNotNil: [:symbol | self searchMode: symbol]. + stream next ifNotNil: [:bool | self hasPinnedReceiver: bool]. + stream next ifNotNil: [:bool | self hasPinnedArguments: bool]. + stream next ifNotNil: [:className | self outerSuperclass: (self environment classNamed: className)]. + stream next ifNotNil: [:bool | self isCompositeSearch: bool]. + self assert: stream atEnd. + self + outputText: spec second; + inputsText: spec first. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/emptyContents.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/emptyContents.st new file mode 100644 index 0000000..28b6774 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/emptyContents.st @@ -0,0 +1,11 @@ +accessing - toolbuilder +emptyContents + + ^ 'This tool allows you to find all methods that convert a given set of inputs into an expected output. Enter inputs (receiver + arguments) and output in the text panes above and press {1} to start the search. For some help or inspiration, you can also press the example button. + +Note: To speed up long searches, {2} from time to time after adding/changing/removing a lot of code in your image.' asText format: + {"Character startOfHeader asString asText addAttribute: (KeyboardEvent new + type: #keyStroke readFrom: '0 96 115 83' readStream; + asMorph) asTextAnchor; yourself." + 'Cmd + S'. + 'rebuild the optional selector index' asText addAttribute: (PluggableTextAttribute evalBlock: [self rebuildSelectorIndex]); yourself} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/exampleSpecs.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/exampleSpecs.st new file mode 100644 index 0000000..66fa0eb --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/exampleSpecs.st @@ -0,0 +1,22 @@ +accessing - constants +exampleSpecs + + ^ #(('2. 3' '5') + ('2. 3' '8') + ('6. 7' '42' value nil nil Magnitude) + ('2. 4. 7' '4' value true false) + ('1. 10. 100' '111' value nil nil Integer true) + ('#(2 1 4 3)' '#(1 2 3 4)') + ('#(2 1 4 3). #asWords' '#(4 1 3 2)' value nil nil nil true) + ('#(7 2 9 8 4). 2' '#(8 9)' value nil nil nil true) + ('''carpe squeak''' '''Carpe squeak''') + ('''carpe squeak''' '#carpeSqueak') + ('''carpe squeak''' 'answer isSymbol' predicate nil nil nil nil) + ('10 @ 20 corner: 60 @ 40' 'answer isPoint' predicate nil nil nil nil) + ('10 @ 20 corner: 60 @ 40' 'answer isPoint and: [(10 @ 20 corner: 60 @ 40) containsPoint: answer]' predicate nil nil nil nil) + ('Sandbox. [2 + 3]' '5') + ('[self error: ''plonk'']. [:x | x]' '''Error: plonk''') + ('#(1 2 3 4). [:a :b | stream nextPut: {a. b}]' +'(Array streamContents: [:s | + stream := s. + messageSend value]) = #((1 2) (3 4))' sendingPredicate)) \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/findMethods.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/findMethods.st new file mode 100644 index 0000000..3a305f5 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/findMethods.st @@ -0,0 +1,17 @@ +actions +findMethods + + self stopSearching. + + self inputsText isEmptyOrNil ifTrue: [^ self changed: #flash]. + self outputText isEmptyOrNil ifTrue: [^ self changed: #flash]. + + resultQueue := SharedQueue new. + backgroundProcess := [finder streamMatchesOn: resultQueue] + forkAt: Processor systemBackgroundPriority. + + self initializeMessageList: #(). + self messageListIndex: 0. + self changed: #messageList. + self changed: #labelString. + self changed: #windowTitle. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/finderClass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/finderClass.st new file mode 100644 index 0000000..e9b7a3f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/finderClass.st @@ -0,0 +1,4 @@ +accessing - constants +finderClass + + ^ SimulationMethodFinder \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingOf..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingOf..st new file mode 100644 index 0000000..4b9c2a1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingOf..st @@ -0,0 +1,5 @@ +bindings +hasBindingOf: aString + + ^ bindings notNil and: + [bindings includesKey: aString] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingThatBeginsWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingThatBeginsWith..st new file mode 100644 index 0000000..5667691 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasBindingThatBeginsWith..st @@ -0,0 +1,7 @@ +bindings +hasBindingThatBeginsWith: aString + + bindings ifNil: [^ super hasBindingThatBeginsWith: aString]. + + ^ bindings keys anySatisfy: [:each | + each beginsWith: aString] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasOuterSuperclass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasOuterSuperclass.st new file mode 100644 index 0000000..e2561e1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasOuterSuperclass.st @@ -0,0 +1,4 @@ +accessing - toolbuilder +hasOuterSuperclass + + ^ self outerSuperclass notNil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments..st new file mode 100644 index 0000000..be6d35c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments..st @@ -0,0 +1,11 @@ +accessing +hasPinnedArguments: aBoolean + + aBoolean + ifTrue: + [finder permutationMode: nil] + ifFalse: + [finder permutationMode ifNil: + [finder permutationMode: #arguments]]. + + self changed: #hasPinnedArguments. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments.st new file mode 100644 index 0000000..69fa6b0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedArguments.st @@ -0,0 +1,4 @@ +accessing +hasPinnedArguments + + ^ finder permutationMode isNil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver..st new file mode 100644 index 0000000..10ae5f0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver..st @@ -0,0 +1,12 @@ +accessing +hasPinnedReceiver: aBoolean + + aBoolean + ifTrue: + [finder permutationMode = #receiverAndArguments ifTrue: + [finder permutationMode: #arguments]] + ifFalse: + [finder permutationMode: #receiverAndArguments]. + + self changed: #hasPinnedReceiver. + self changed: #hasPinnedArguments. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver.st new file mode 100644 index 0000000..09250ce --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/hasPinnedReceiver.st @@ -0,0 +1,4 @@ +accessing +hasPinnedReceiver + + ^ finder permutationMode ~= #receiverAndArguments \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initialize.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initialize.st new file mode 100644 index 0000000..b252a60 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initialize.st @@ -0,0 +1,9 @@ +initialize-release +initialize + + super initialize. + + windowLabel := self class appName. + finder := self finderClass new. + + self initializeDefaults. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initializeDefaults.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initializeDefaults.st new file mode 100644 index 0000000..4092f96 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/initializeDefaults.st @@ -0,0 +1,8 @@ +initialize-release +initializeDefaults + + self hasPinnedReceiver: self defaultHasPinnedReceiver. + self hasPinnedArguments: self defaultHasPinnedArguments. + self outerSuperclass: self defaultOuterSuperclass. + self isCompositeSearch: self defaultIsCompositeSearch. + self searchMode: self defaultSearchMode. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsPaneHelp.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsPaneHelp.st new file mode 100644 index 0000000..62a48ff --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsPaneHelp.st @@ -0,0 +1,4 @@ +accessing - toolbuilder +inputsPaneHelp + + ^ 'receiver. argument1. argument2. ...' \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText..st new file mode 100644 index 0000000..7b389a1 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText..st @@ -0,0 +1,5 @@ +accessing +inputsText: aStringOrText + + (self inputsText: aStringOrText requestor: nil) + ifTrue: [self changed: #inputsText]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.requestor..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.requestor..st new file mode 100644 index 0000000..e6262d8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.requestor..st @@ -0,0 +1,23 @@ +accessing - toolbuilder +inputsText: aStringOrText requestor: requestor + + | arrayText inputs | + arrayText := ('\{{1}\}' as: aStringOrText species) format: {aStringOrText}. + + inputs := self compilerClass new + evaluate: arrayText + in: nil + to: nil + notifying: requestor + ifFail: [^ false]. + inputsText := aStringOrText. + + finder receiverAndArguments: (inputs ifEmpty: [nil]). + + self + checkForUnacceptedEditsIn: #outputText + ifTrueAcceptDeferredAnd: [^ true]. + + self findMethods. + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.st new file mode 100644 index 0000000..c88e314 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/inputsText.st @@ -0,0 +1,4 @@ +accessing +inputsText + + ^ inputsText \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch..st new file mode 100644 index 0000000..b9c41f6 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch..st @@ -0,0 +1,6 @@ +accessing +isCompositeSearch: aBoolean + + finder isCompositeSearch: aBoolean. + + self changed: #isCompositeSearch. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch.st new file mode 100644 index 0000000..e3a8223 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isCompositeSearch.st @@ -0,0 +1,4 @@ +accessing +isCompositeSearch + + ^ finder isCompositeSearch \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputPredicate.st new file mode 100644 index 0000000..7df5a68 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputPredicate.st @@ -0,0 +1,4 @@ +accessing - toolbuilder +isOutputPredicate + + ^ self searchMode = #predicate \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputSendingPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputSendingPredicate.st new file mode 100644 index 0000000..314aa53 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputSendingPredicate.st @@ -0,0 +1,4 @@ +accessing - toolbuilder +isOutputSendingPredicate + + ^ self searchMode = #sendingPredicate \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputValue.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputValue.st new file mode 100644 index 0000000..7d2eb11 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isOutputValue.st @@ -0,0 +1,4 @@ +accessing - toolbuilder +isOutputValue + + ^ self searchMode = #value \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isSearching.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isSearching.st new file mode 100644 index 0000000..cb8fa25 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/isSearching.st @@ -0,0 +1,4 @@ +testing +isSearching + + ^ backgroundProcess notNil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicate.st new file mode 100644 index 0000000..000e2fe --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicate.st @@ -0,0 +1,4 @@ +private +makeContextForPredicate + + ^ [self makeContextForPredicateWith: Object new] once \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicateWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicateWith..st new file mode 100644 index 0000000..52b67c4 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForPredicateWith..st @@ -0,0 +1,4 @@ +private +makeContextForPredicateWith: answer + + ^ thisContext \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicate.st new file mode 100644 index 0000000..28c0f32 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicate.st @@ -0,0 +1,4 @@ +private +makeContextForSendingPredicate + + ^ [self makeContextForSendingPredicateWith: MessageSend basicNew] once \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicateWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicateWith..st new file mode 100644 index 0000000..58278d8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/makeContextForSendingPredicateWith..st @@ -0,0 +1,4 @@ +private +makeContextForSendingPredicateWith: messageSend + + ^ thisContext \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/open.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/open.st new file mode 100644 index 0000000..7bfb65e --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/open.st @@ -0,0 +1,4 @@ +toolbuilder +open + + ^ ToolBuilder open: self \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass..st new file mode 100644 index 0000000..e4fe4b2 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass..st @@ -0,0 +1,7 @@ +accessing +outerSuperclass: aClassDescription + + finder outerSuperclass: aClassDescription. + + self changed: #outerSuperclassLabel. + self changed: #hasOuterSuperclass. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass.st new file mode 100644 index 0000000..21e52ab --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclass.st @@ -0,0 +1,4 @@ +accessing +outerSuperclass + + ^ finder outerSuperclass \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclassLabel.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclassLabel.st new file mode 100644 index 0000000..1d7c5d0 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outerSuperclassLabel.st @@ -0,0 +1,6 @@ +accessing - toolbuilder +outerSuperclassLabel + + ^ self outerSuperclass + ifNil: ['entire class hierarchy'] + ifNotNil: [:class | 'below {1}' format: {class}] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputMode..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputMode..st new file mode 100644 index 0000000..887dc4c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputMode..st @@ -0,0 +1,5 @@ +accessing +outputMode: aSymbol + + self deprecated. + ^ self searchMode: aSymbol \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputPaneHelp.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputPaneHelp.st new file mode 100644 index 0000000..31f1d0f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputPaneHelp.st @@ -0,0 +1,10 @@ +accessing - toolbuilder +outputPaneHelp + + ^ self searchMode caseOf: + {[#value] -> ['value']. + [#predicate] -> ['answer > 0']. + [#sendingPredicate] -> [ +'var := OrderedCollection new. +messageSend value. +var notEmpty']} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText..st new file mode 100644 index 0000000..44dc088 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText..st @@ -0,0 +1,5 @@ +accessing +outputText: aStringOrText + + (self outputText: aStringOrText requestor: nil) + ifTrue: [self changed: #outputText]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.requestor..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.requestor..st new file mode 100644 index 0000000..1be2c8e --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.requestor..st @@ -0,0 +1,62 @@ +accessing - toolbuilder +outputText: aStringOrText requestor: requestor + + self resetOutput. + self searchMode caseOf: + {[#value] -> + [finder expectedAnswer: + (self compilerClass new + evaluate: aStringOrText + in: nil + to: nil + notifying: requestor + ifFail: [^ false])]. + [#predicate] -> + [| predicateMethod | + predicateMethod := self compilerClass new + compiledMethodFor: aStringOrText + in: self makeContextForPredicate + to: nil + notifying: requestor + ifFail: [^ false]. + finder predicate: [:result | + predicateMethod valueWithReceiver: nil arguments: + {self pseudoContextForPredicateWith: result}]]. + [#sendingPredicate] -> + [| predicateMethod | + bindings := Dictionary new. + predicateMethod := self compilerClass new + compiledMethodFor: aStringOrText + in: self makeContextForSendingPredicate + to: nil + notifying: requestor + ifFail: [^ false]. + finder predicate: [:messageSend | + predicateMethod valueWithReceiver: nil arguments: + {self pseudoContextForPredicateWith: messageSend}]. + self prepareSendingPredicate ifFalse: + [| missingExpression | + missingExpression := 'messageSend value'. + self inform: ('Your predicate does not evaluate the message send. Make sure that it contains the following expression:\\{1}' withCRs asText format: + {((TextStyler for: #Smalltalk) + ifNotNil: [:stylerClass | + stylerClass new + in: [:styler | self aboutToStyle: styler requestor: requestor]; + styledTextFor: missingExpression asText] + ifNil: [missingExpression]) + asText + addAttribute: (TextIndent tabs: 1); + yourself})]. + self changed: #style. + "Make sure inputs are recompiled for the new bindings" + (self dependentTextPaneWithSelector: #inputsText) ifNotNil: [:m | + m hasUnacceptedEdits: true]]}. + outputText := aStringOrText. + + self + checkForUnacceptedEditsIn: #inputsText + ifTrueAcceptDeferredAnd: [^ true]. + + self findMethods. + + ^ true \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.st new file mode 100644 index 0000000..5a52a6f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/outputText.st @@ -0,0 +1,4 @@ +accessing +outputText + + ^ outputText \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/prepareSendingPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/prepareSendingPredicate.st new file mode 100644 index 0000000..9d50ad2 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/prepareSendingPredicate.st @@ -0,0 +1,9 @@ +private +prepareSendingPredicate + "Evaluate the predicate for a pseudo message send, generating all bindings through #bindingOf:. Answer false iff the message send was not evaluated." + + finder predicate value: + (MessageSend + receiver: [^ true] + selector: #value). + ^ false \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/pseudoContextForPredicateWith..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/pseudoContextForPredicateWith..st new file mode 100644 index 0000000..5aaf233 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/pseudoContextForPredicateWith..st @@ -0,0 +1,4 @@ +private +pseudoContextForPredicateWith: answer + + ^ SimulationPseudoContext forTemporaries: {answer} \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/rebuildSelectorIndex.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/rebuildSelectorIndex.st new file mode 100644 index 0000000..c61704c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/rebuildSelectorIndex.st @@ -0,0 +1,14 @@ +actions +rebuildSelectorIndex + + Cursor wait showWhile: + [finder class initializeSelectorPopularities]. + + (Project uiManager + chooseOptionFromLabeledValues: + (OrderedDictionary new + at: 'OK' put: []; + at: 'Inspect' put: [finder class browseSelectorPopularities]; + yourself) + title: 'Selector index was rebuilt!') + value. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/receiveNewResults.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/receiveNewResults.st new file mode 100644 index 0000000..fcfce79 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/receiveNewResults.st @@ -0,0 +1,12 @@ +updating +receiveNewResults + + | newResults | + newResults := Array streamContents: [:stream | + | method | + [method := resultQueue nextOrNil] whileNotNil: + [stream nextPut: method]]. + newResults ifNotEmpty: + [messageList addAll: + (newResults collect: [:result | result methodReference]). + self changed: #messageList]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/refusesToAcceptCodeFor..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/refusesToAcceptCodeFor..st new file mode 100644 index 0000000..f50ea47 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/refusesToAcceptCodeFor..st @@ -0,0 +1,6 @@ +accessing - toolbuilder +refusesToAcceptCodeFor: requestor + + (#(inputsText outputText) includes: requestor knownName) ifTrue: [^ false]. + + ^ super refusesToAcceptCodeFor: requestor \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/resetOutput.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/resetOutput.st new file mode 100644 index 0000000..a09b251 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/resetOutput.st @@ -0,0 +1,9 @@ +private +resetOutput + + self stopSearching. + + finder + expectedAnswer: nil; + predicate: nil. + bindings := self searchMode = #sendingPredicate ifTrue: [bindings ifNil: [Dictionary new]]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode..st new file mode 100644 index 0000000..d497213 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode..st @@ -0,0 +1,12 @@ +accessing +searchMode: aSymbol + + finder searchMode: aSymbol. + + self resetOutput. + + self changed: #isOutputValue. + self changed: #isOutputPredicate. + self changed: #isOutputSendingPredicate. + self changed: #outputPaneHelp. + self changed: #style. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode.st new file mode 100644 index 0000000..70c0eb7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/searchMode.st @@ -0,0 +1,4 @@ +accessing +searchMode + + ^ finder searchMode \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOuterSuperclass.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOuterSuperclass.st new file mode 100644 index 0000000..8b06175 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOuterSuperclass.st @@ -0,0 +1,16 @@ +actions +setOuterSuperclass + + | choice | + choice := Project uiManager + chooseFromLabeledValues: + ((((self systemNavigation allClasses collect: [:class | class name -> class]) + sorted: [:assoc | assoc key] ascending) + copyWithFirst: ('entire class hierarchy' asText addAttribute: TextEmphasis italic; yourself) -> #all) + as: OrderedDictionary) + title: 'Choose outer superclass'. + choice ifNil: [^ self]. + + self outerSuperclass: (choice = #all ifFalse: [choice]). + + self findMethods. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputPredicate.st new file mode 100644 index 0000000..61e1d2a --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputPredicate.st @@ -0,0 +1,4 @@ +actions +setOutputPredicate + + ^ self setSearchMode: #predicate \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputSendingPredicate.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputSendingPredicate.st new file mode 100644 index 0000000..612a8e6 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputSendingPredicate.st @@ -0,0 +1,4 @@ +actions +setOutputSendingPredicate + + ^ self setSearchMode: #sendingPredicate \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputValue.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputValue.st new file mode 100644 index 0000000..9f59293 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setOutputValue.st @@ -0,0 +1,4 @@ +actions +setOutputValue + + ^ self setSearchMode: #value. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setSearchMode..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setSearchMode..st new file mode 100644 index 0000000..92ca1ea --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/setSearchMode..st @@ -0,0 +1,8 @@ +accessing - toolbuilder +setSearchMode: aSymbol + + self searchMode: aSymbol. + + self changed: #inputRequested with: #outputText. + (self dependentTextPaneWithSelector: #outputText) + ifNotNil: [:m | m hasUnacceptedEdits: true]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/showTranscripter.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/showTranscripter.st new file mode 100644 index 0000000..70792e2 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/showTranscripter.st @@ -0,0 +1,4 @@ +actions +showTranscripter + + finder assuredTranscripter open. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepIn..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepIn..st new file mode 100644 index 0000000..618f6ae --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepIn..st @@ -0,0 +1,15 @@ +updating +stepIn: window + + super stepIn: window. + + self isSearching ifTrue: + [ + backgroundProcess isTerminated ifTrue: + [backgroundProcess := nil]. + self receiveNewResults. + backgroundProcess ifNil: + [resultQueue := nil]. + + self changed: #labelString. + self changed: #windowTitle]. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepTimeIn..st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepTimeIn..st new file mode 100644 index 0000000..8249692 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stepTimeIn..st @@ -0,0 +1,4 @@ +updating +stepTimeIn: window + + ^ 500 "milliSeconds" \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stopSearching.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stopSearching.st new file mode 100644 index 0000000..c12bd1f --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/stopSearching.st @@ -0,0 +1,8 @@ +private +stopSearching + + backgroundProcess ifNotNil: #terminate. + backgroundProcess := nil. + + self changed: #labelString. + self changed: #windowTitle. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/toggleCompositeSearch.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/toggleCompositeSearch.st new file mode 100644 index 0000000..46078c7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/toggleCompositeSearch.st @@ -0,0 +1,6 @@ +actions +toggleCompositeSearch + + self isCompositeSearch: self isCompositeSearch not. + + self findMethods. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedArguments.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedArguments.st new file mode 100644 index 0000000..1eea19c --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedArguments.st @@ -0,0 +1,6 @@ +actions +togglePinnedArguments + + self hasPinnedArguments: self hasPinnedArguments not. + + self findMethods. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedReceiver.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedReceiver.st new file mode 100644 index 0000000..baa98ab --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/togglePinnedReceiver.st @@ -0,0 +1,6 @@ +actions +togglePinnedReceiver + + self hasPinnedReceiver: self hasPinnedReceiver not. + + self findMethods. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/verticalOffset.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/verticalOffset.st new file mode 100644 index 0000000..ade4690 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/verticalOffset.st @@ -0,0 +1,4 @@ +toolbuilder +verticalOffset + + ^ 1 / 3 \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowColorToUse.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowColorToUse.st new file mode 100644 index 0000000..c452ed7 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowColorToUse.st @@ -0,0 +1,4 @@ +toolbuilder +windowColorToUse + + ^ SelectorBrowser basicNew windowColorToUse \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowIsClosing.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowIsClosing.st new file mode 100644 index 0000000..51e87a8 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowIsClosing.st @@ -0,0 +1,6 @@ +updating +windowIsClosing + + self stopSearching. + + ^ super windowIsClosing \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowTitle.st b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowTitle.st new file mode 100644 index 0000000..fe66db4 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/instance/windowTitle.st @@ -0,0 +1,39 @@ +accessing - toolbuilder +windowTitle + + ^ String streamContents: [:stream | + stream + nextPutAll: windowLabel; + space. + + self isSearching + ifFalse: + [stream + nextPut: $[; + print: messageList size; + nextPut: $]] + ifTrue: + [stream nextPutAll: '(searching...'. + + finder currentSearchDepth ifNotNil: [:depth | + depth > 0 ifTrue: + [stream + space; + nextPutAll: 'depth '; + print: depth; + nextPut: $,]]. + + finder currentDepthProgress ifNotNil: [:progress | + stream + space; + print: (progress * 100) rounded; + nextPut: $%. + + finder currentDepthStartTime ifNotNil: [:startTime | + (progress > 0 and: [DateAndTime now - startTime > 3 seconds]) ifTrue: + [stream + nextPutAll: ', '; + nextPutAll: (startTime simRemainingTimeForProgress: progress) simShortPrintString; + nextPutAll: ' left']]]. + + stream nextPutAll: ')']] \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/methodProperties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/methodProperties.json new file mode 100644 index 0000000..738c4d9 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/methodProperties.json @@ -0,0 +1,87 @@ +{ + "class" : { + "appName" : "ct 9/16/2022 21:14", + "initialize" : "ct 9/18/2022 20:09", + "open" : "ct 9/15/2022 22:22", + "registerInWorldMenu" : "ct 9/16/2022 19:56", + "todo" : "ct 9/19/2022 23:04", + "unload" : "ct 9/16/2022 19:57", + "unregisterInWorldMenu" : "ct 9/16/2022 19:56" }, + "instance" : { + "aboutToStyle:requestor:" : "ct 9/19/2022 23:12", + "addModelItemsToWindowMenu:" : "ct 9/20/2022 19:47", + "bindingOf:" : "ct 9/17/2022 16:46", + "buildControlPaneWith:" : "ct 9/15/2022 22:52", + "buildInputsPaneWith:" : "ct 9/19/2022 21:57", + "buildOutputPaneWith:" : "ct 9/19/2022 19:14", + "buildResultsPaneWith:" : "ct 9/15/2022 22:52", + "buildWith:" : "ct 9/15/2022 22:13", + "checkForUnacceptedEditsIn:ifTrueAcceptDeferredAnd:" : "ct 9/18/2022 03:11", + "compilerClass" : "ct 9/15/2022 22:42", + "contents" : "ct 9/19/2022 23:04", + "defaultHasPinnedArguments" : "ct 9/16/2022 21:09", + "defaultHasPinnedReceiver" : "ct 9/16/2022 21:09", + "defaultIsCompositeSearch" : "ct 9/19/2022 19:32", + "defaultOuterSuperclass" : "ct 9/16/2022 20:11", + "defaultSearchMode" : "ct 9/19/2022 19:10", + "displayExample" : "ct 9/19/2022 20:24", + "emptyContents" : "ct 9/20/2022 17:35", + "exampleSpecs" : "ct 9/19/2022 20:20", + "findMethods" : "ct 9/19/2022 22:23", + "finderClass" : "ct 9/19/2022 22:22", + "hasBindingOf:" : "ct 9/17/2022 16:54", + "hasBindingThatBeginsWith:" : "ct 9/17/2022 21:49", + "hasOuterSuperclass" : "ct 9/19/2022 21:57", + "hasPinnedArguments" : "ct 9/19/2022 22:23", + "hasPinnedArguments:" : "ct 9/19/2022 22:23", + "hasPinnedReceiver" : "ct 9/19/2022 22:23", + "hasPinnedReceiver:" : "ct 9/19/2022 22:23", + "initialize" : "ct 9/19/2022 22:23", + "initializeDefaults" : "ct 9/19/2022 19:32", + "inputsPaneHelp" : "ct 9/15/2022 22:33", + "inputsText" : "ct 9/15/2022 22:27", + "inputsText:" : "ct 9/16/2022 21:30", + "inputsText:requestor:" : "ct 9/20/2022 19:00", + "isCompositeSearch" : "ct 9/19/2022 22:23", + "isCompositeSearch:" : "ct 9/19/2022 22:23", + "isOutputPredicate" : "ct 9/19/2022 19:11", + "isOutputSendingPredicate" : "ct 9/19/2022 19:14", + "isOutputValue" : "ct 9/19/2022 19:13", + "isSearching" : "ct 9/15/2022 23:58", + "makeContextForPredicate" : "ct 9/17/2022 16:08", + "makeContextForPredicateWith:" : "ct 9/17/2022 16:09", + "makeContextForSendingPredicate" : "ct 9/19/2022 22:21", + "makeContextForSendingPredicateWith:" : "ct 9/19/2022 22:20", + "open" : "ct 9/15/2022 22:22", + "outerSuperclass" : "ct 9/19/2022 22:23", + "outerSuperclass:" : "ct 9/19/2022 22:23", + "outerSuperclassLabel" : "ct 9/16/2022 20:12", + "outputMode:" : "ct 9/19/2022 19:08", + "outputPaneHelp" : "ct 9/19/2022 19:12", + "outputText" : "ct 9/15/2022 22:31", + "outputText:" : "ct 9/16/2022 21:30", + "outputText:requestor:" : "ct 9/20/2022 19:00", + "prepareSendingPredicate" : "ct 9/19/2022 22:23", + "pseudoContextForPredicateWith:" : "ct 9/17/2022 16:10", + "rebuildSelectorIndex" : "ct 9/19/2022 23:15", + "receiveNewResults" : "ct 9/19/2022 20:13", + "refusesToAcceptCodeFor:" : "ct 9/15/2022 22:57", + "resetOutput" : "ct 9/19/2022 22:23", + "searchMode" : "ct 9/19/2022 22:23", + "searchMode:" : "ct 9/19/2022 22:23", + "setOuterSuperclass" : "ct 9/16/2022 23:58", + "setOutputPredicate" : "ct 9/19/2022 19:11", + "setOutputSendingPredicate" : "ct 9/19/2022 19:14", + "setOutputValue" : "ct 9/19/2022 19:11", + "setSearchMode:" : "ct 9/19/2022 19:08", + "showTranscripter" : "ct 9/20/2022 19:47", + "stepIn:" : "ct 9/19/2022 20:14", + "stepTimeIn:" : "ct 9/17/2022 01:06", + "stopSearching" : "ct 9/17/2022 21:56", + "toggleCompositeSearch" : "ct 9/19/2022 19:33", + "togglePinnedArguments" : "ct 9/16/2022 21:08", + "togglePinnedReceiver" : "ct 9/17/2022 15:49", + "verticalOffset" : "ct 9/15/2022 22:13", + "windowColorToUse" : "ct 9/16/2022 21:17", + "windowIsClosing" : "ct 9/17/2022 21:53", + "windowTitle" : "ct 9/19/2022 22:55" } } diff --git a/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/properties.json b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/properties.json new file mode 100644 index 0000000..6328c56 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationMethodFinderTool.class/properties.json @@ -0,0 +1,19 @@ +{ + "category" : "SimulationStudio-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + "SelectorPopularities" ], + "commentStamp" : "ct 9/20/2022 19:21", + "instvars" : [ + "finder", + "inputsText", + "outputText", + "bindings", + "backgroundProcess", + "resultQueue" ], + "name" : "SimulationMethodFinderTool", + "pools" : [ + ], + "super" : "MessageSet", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/README.md b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/README.md new file mode 100644 index 0000000..fb6380e --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/README.md @@ -0,0 +1 @@ +I'm a stub class that mocks a DoItContext for evaluating code in a sandbox. I'm a workaround that is only necessary as long as real Context instances cannot be accessed from within a sandbox because their methodMap is protected with a mutex, and sandboxes cannot handle mutexes at the moment. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/class/forTemporaries..st b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/class/forTemporaries..st new file mode 100644 index 0000000..82671fb --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/class/forTemporaries..st @@ -0,0 +1,4 @@ +instance creation +forTemporaries: temporaries + + ^ self new setTemporaries: temporaries \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/namedTempAt..st b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/namedTempAt..st new file mode 100644 index 0000000..bbaa520 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/namedTempAt..st @@ -0,0 +1,4 @@ +accessing +namedTempAt: index + + ^ temporaries at: index \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/receiver.st b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/receiver.st new file mode 100644 index 0000000..5b89239 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/receiver.st @@ -0,0 +1,4 @@ +accessing +receiver + + ^ nil \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/setTemporaries..st b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/setTemporaries..st new file mode 100644 index 0000000..43b10ad --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/setTemporaries..st @@ -0,0 +1,4 @@ +initialize-release +setTemporaries: anArray + + temporaries := anArray. \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/temporaries.st b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/temporaries.st new file mode 100644 index 0000000..57ef76d --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/instance/temporaries.st @@ -0,0 +1,4 @@ +accessing +temporaries + + ^ temporaries \ No newline at end of file diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/methodProperties.json b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/methodProperties.json new file mode 100644 index 0000000..6bccfa3 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/methodProperties.json @@ -0,0 +1,8 @@ +{ + "class" : { + "forTemporaries:" : "ct 9/16/2022 19:46" }, + "instance" : { + "namedTempAt:" : "ct 9/16/2022 19:45", + "receiver" : "ct 9/17/2022 16:35", + "setTemporaries:" : "ct 9/16/2022 19:45", + "temporaries" : "ct 9/16/2022 19:45" } } diff --git a/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/properties.json b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/properties.json new file mode 100644 index 0000000..a203830 --- /dev/null +++ b/packages/SimulationStudio-Tools.package/SimulationPseudoContext.class/properties.json @@ -0,0 +1,14 @@ +{ + "category" : "SimulationStudio-Tools-MethodFinder", + "classinstvars" : [ + ], + "classvars" : [ + ], + "commentStamp" : "ct 9/20/2022 09:34", + "instvars" : [ + "temporaries" ], + "name" : "SimulationPseudoContext", + "pools" : [ + ], + "super" : "Object", + "type" : "normal" } diff --git a/packages/SimulationStudio-Tools.package/monticello.meta/categories.st b/packages/SimulationStudio-Tools.package/monticello.meta/categories.st index e51350f..5943af9 100644 --- a/packages/SimulationStudio-Tools.package/monticello.meta/categories.st +++ b/packages/SimulationStudio-Tools.package/monticello.meta/categories.st @@ -1 +1,2 @@ SystemOrganization addCategory: #'SimulationStudio-Tools-ProtocolExplorer'! +SystemOrganization addCategory: #'SimulationStudio-Tools-MethodFinder'!