Sfoglia il codice sorgente

Added support for regex searching in ReferencesBrowser.

Göran Krampe 12 anni fa
parent
commit
e935b3e89c
4 ha cambiato i file con 205 aggiunte e 43 eliminazioni
  1. 13 6
      css/amber.css
  2. 60 10
      js/IDE.deploy.js
  3. 90 20
      js/IDE.js
  4. 42 7
      st/IDE.st

+ 13 - 6
css/amber.css

@@ -423,30 +423,37 @@ body.jtalkBody {
 
 .jtalkTool .jt_box .jt_column.implementors,
 .jtalkTool .jt_box .jt_column.senders,
-.jtalkTool .jt_box .jt_column.referenced_classes {
+.jtalkTool .jt_box .jt_column.referenced_classes,
+.jtalkTool .jt_box .jt_column.matches {
 	top: 20px;
 	height: auto;
 	bottom: 0;
-	width: 33.333%;
+	width: 25%;
 }
 
 .jtalkTool .jt_box .jt_column.senders {
-	left: 33.333%
+	left: 25%
 }
 
 .jtalkTool .jt_box .jt_column.referenced_classes {
-        left: 66.67%
+        left: 50%
+}
+
+.jtalkTool .jt_box .jt_column.matches {
+        left: 75%
 }
 
 .jtalkTool .jt_box .jt_column.implementors .column_label, 
 .jtalkTool .jt_box .jt_column.senders .column_label,
-.jtalkTool .jt_box .jt_column.referenced_classes .column_label {
+.jtalkTool .jt_box .jt_column.referenced_classes .column_label,
+.jtalkTool .jt_box .jt_column.matches .column_label {
 	background: #dbdbdb
 }
 
 .jtalkTool .jt_box .jt_column.implementors .column_label:hover,
 .jtalkTool .jt_box .jt_column.senders .column_label:hover,
-.jtalkTool .jt_box .jt_column.referenced_classes .column_label:hover {
+.jtalkTool .jt_box .jt_column.referenced_classes .column_label:hover,
+.jtalkTool .jt_box .jt_column.matches .column_label:hover {
 	font-weight: bold;
 	color: #000;
 	cursor: default

+ 60 - 10
js/IDE.deploy.js

@@ -2591,7 +2591,7 @@ smalltalk.ProgressBar);
 
 
 
-smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
+smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList', 'matches', 'matchesList'], 'IDE');
 smalltalk.addMethod(
 unescape('_canBeClosed'),
 smalltalk.method({
@@ -2648,6 +2648,17 @@ return self;}
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_matches'),
+smalltalk.method({
+selector: unescape('matches'),
+fn: function (){
+var self=this;
+return (($receiver = self['@matches']) == nil || $receiver == undefined) ? (function(){return (self['@matches']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self;}
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_openBrowserOn_'),
 smalltalk.method({
@@ -2679,7 +2690,7 @@ smalltalk.method({
 selector: unescape('renderBoxOn%3A'),
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
+(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);return smalltalk.send($rec, "_renderMatchesOn_", [html]);})(self);
 return self;}
 }),
 smalltalk.ReferencesBrowser);
@@ -2709,6 +2720,18 @@ return self;}
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_renderMatchesOn_'),
+smalltalk.method({
+selector: unescape('renderMatchesOn%3A'),
+fn: function (html){
+var self=this;
+(self['@matchesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column matches"]));
+smalltalk.send(self, "_updateMatchesList", []);
+return self;}
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_renderReferencedClassesOn_'),
 smalltalk.method({
@@ -2739,16 +2762,29 @@ smalltalk.method({
 selector: unescape('search%3A'),
 fn: function (aString){
 var self=this;
-(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
+(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);smalltalk.send($rec, "_updateReferencedClassesList", []);return smalltalk.send($rec, "_updateMatchesList", []);})(self);
 return self;}
 }),
 smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_searchReferencedClassesFor_'),
+unescape('_searchMethodSource'),
 smalltalk.method({
-selector: unescape('searchReferencedClassesFor%3A'),
-fn: function (aString){
+selector: unescape('searchMethodSource'),
+fn: function (){
+var self=this;
+var regex=nil;
+(regex=smalltalk.send(self['@selector'], "_allButFirst", []));
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_source", []), "_match_", [regex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_matches", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_matches", []), "_add_", [value]);})]));})]);})]);
+return self;}
+}),
+smalltalk.ReferencesBrowser);
+
+smalltalk.addMethod(
+unescape('_searchReferencedClasses'),
+smalltalk.method({
+selector: unescape('searchReferencedClasses'),
+fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
 return self;}
@@ -2765,16 +2801,18 @@ var self=this;
 (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
 (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
 (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
+(self['@matches']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(self, "_searchMethodSource", []);
+((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferences", []);})() : (function(){return smalltalk.send(self, "_searchReferencedClasses", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferences", []);}), (function(){return smalltalk.send(self, "_searchReferencedClasses", []);})]));
 return self;}
 }),
 smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_searchSelectorReferencesFor_'),
+unescape('_searchSelectorReferences'),
 smalltalk.method({
-selector: unescape('searchSelectorReferencesFor%3A'),
-fn: function (aString){
+selector: unescape('searchSelectorReferences'),
+fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
 return self;}
@@ -2826,6 +2864,18 @@ return self;}
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_updateMatchesList'),
+smalltalk.method({
+selector: unescape('updateMatchesList'),
+fn: function (){
+var self=this;
+smalltalk.send(self['@matchesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Regex%20matches%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_matches", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_matches", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
+return self;}
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_updateReferencedClassesList'),
 smalltalk.method({

+ 90 - 20
js/IDE.js

@@ -3646,7 +3646,7 @@ smalltalk.ProgressBar);
 
 
 
-smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList'], 'IDE');
+smalltalk.addClass('ReferencesBrowser', smalltalk.TabWidget, ['implementors', 'senders', 'implementorsList', 'input', 'timer', 'selector', 'sendersList', 'referencedClasses', 'referencedClassesList', 'matches', 'matchesList'], 'IDE');
 smalltalk.addMethod(
 unescape('_canBeClosed'),
 smalltalk.method({
@@ -3728,6 +3728,22 @@ referencedClasses: []
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_matches'),
+smalltalk.method({
+selector: unescape('matches'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return (($receiver = self['@matches']) == nil || $receiver == undefined) ? (function(){return (self['@matches']=smalltalk.send((smalltalk.Array || Array), "_new", []));})() : $receiver;
+return self;},
+args: [],
+source: unescape('matches%0A%09%5Ematches%20ifNil%3A%20%5Bmatches%20%3A%3D%20Array%20new%5D'),
+messageSends: ["ifNil:", "new"],
+referencedClasses: ["Array"]
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_openBrowserOn_'),
 smalltalk.method({
@@ -3770,11 +3786,11 @@ selector: unescape('renderBoxOn%3A'),
 category: 'rendering',
 fn: function (html){
 var self=this;
-(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);return smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);})(self);
+(function($rec){smalltalk.send($rec, "_renderInputOn_", [html]);smalltalk.send($rec, "_renderImplementorsOn_", [html]);smalltalk.send($rec, "_renderSendersOn_", [html]);smalltalk.send($rec, "_renderReferencedClassesOn_", [html]);return smalltalk.send($rec, "_renderMatchesOn_", [html]);})(self);
 return self;},
 args: ["html"],
-source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderInputOn%3A%20html%3B%0A%09%09renderImplementorsOn%3A%20html%3B%0A%09%09renderSendersOn%3A%20html%3B%0A%09%09renderReferencedClassesOn%3A%20html'),
-messageSends: ["renderInputOn:", "renderImplementorsOn:", "renderSendersOn:", "renderReferencedClassesOn:"],
+source: unescape('renderBoxOn%3A%20html%0A%09self%20%0A%09%09renderInputOn%3A%20html%3B%0A%09%09renderImplementorsOn%3A%20html%3B%0A%09%09renderSendersOn%3A%20html%3B%0A%09%09renderReferencedClassesOn%3A%20html%3B%0A%09%09renderMatchesOn%3A%20html'),
+messageSends: ["renderInputOn:", "renderImplementorsOn:", "renderSendersOn:", "renderReferencedClassesOn:", "renderMatchesOn:"],
 referencedClasses: []
 }),
 smalltalk.ReferencesBrowser);
@@ -3814,6 +3830,23 @@ referencedClasses: []
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_renderMatchesOn_'),
+smalltalk.method({
+selector: unescape('renderMatchesOn%3A'),
+category: 'rendering',
+fn: function (html){
+var self=this;
+(self['@matchesList']=smalltalk.send(smalltalk.send(html, "_ul", []), "_class_", ["jt_column matches"]));
+smalltalk.send(self, "_updateMatchesList", []);
+return self;},
+args: ["html"],
+source: unescape('renderMatchesOn%3A%20html%0A%09matchesList%20%3A%3D%20html%20ul%20class%3A%20%27jt_column%20matches%27.%0A%09self%20updateMatchesList'),
+messageSends: ["class:", "ul", "updateMatchesList"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_renderReferencedClassesOn_'),
 smalltalk.method({
@@ -3855,26 +3888,44 @@ selector: unescape('search%3A'),
 category: 'actions',
 fn: function (aString){
 var self=this;
-(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);return smalltalk.send($rec, "_updateReferencedClassesList", []);})(self);
+(function($rec){smalltalk.send($rec, "_searchReferencesFor_", [aString]);smalltalk.send($rec, "_updateImplementorsList", []);smalltalk.send($rec, "_updateSendersList", []);smalltalk.send($rec, "_updateReferencedClassesList", []);return smalltalk.send($rec, "_updateMatchesList", []);})(self);
 return self;},
 args: ["aString"],
-source: unescape('search%3A%20aString%0A%09self%20%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09updateImplementorsList%3B%0A%09%09updateSendersList%3B%0A%09%09updateReferencedClassesList'),
-messageSends: ["searchReferencesFor:", "updateImplementorsList", "updateSendersList", "updateReferencedClassesList"],
+source: unescape('search%3A%20aString%0A%09self%20%0A%09%09searchReferencesFor%3A%20aString%3B%0A%09%09updateImplementorsList%3B%0A%09%09updateSendersList%3B%0A%09%09updateReferencedClassesList%3B%0A%09%09updateMatchesList'),
+messageSends: ["searchReferencesFor:", "updateImplementorsList", "updateSendersList", "updateReferencedClassesList", "updateMatchesList"],
 referencedClasses: []
 }),
 smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_searchReferencedClassesFor_'),
+unescape('_searchMethodSource'),
 smalltalk.method({
-selector: unescape('searchReferencedClassesFor%3A'),
+selector: unescape('searchMethodSource'),
 category: 'actions',
-fn: function (aString){
+fn: function (){
+var self=this;
+var regex=nil;
+(regex=smalltalk.send(self['@selector'], "_allButFirst", []));
+smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_source", []), "_match_", [regex])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_matches", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_matches", []), "_add_", [value]);})]));})]);})]);
+return self;},
+args: [],
+source: unescape('searchMethodSource%0A%09%7C%20regex%20%7C%0A%09regex%20%3A%3D%20selector%20allButFirst.%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Avalue%20%7C%0A%09%09%09%28value%20source%20match%3A%20regex%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20matches%20add%3A%20value%5D%5D%5D'),
+messageSends: ["allButFirst", "do:", "classesAndMetaclasses", "values", "methodDictionary", "ifTrue:", "match:", "source", "add:", "matches"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
+
+smalltalk.addMethod(
+unescape('_searchReferencedClasses'),
+smalltalk.method({
+selector: unescape('searchReferencedClasses'),
+category: 'actions',
+fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_values", []), "_do_", [(function(value){return ((($receiver = smalltalk.send(smalltalk.send(value, "_referencedClasses", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_referencedClasses", []), "_add_", [value]);})]));})]);})]);
 return self;},
-args: ["aString"],
-source: unescape('searchReferencedClassesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Avalue%20%7C%0A%09%09%09%28value%20referencedClasses%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20referencedClasses%20add%3A%20value%5D%5D%5D'),
+args: [],
+source: unescape('searchReferencedClasses%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%0A%09%09each%20methodDictionary%20values%20do%3A%20%5B%3Avalue%20%7C%0A%09%09%09%28value%20referencedClasses%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20referencedClasses%20add%3A%20value%5D%5D%5D'),
 messageSends: ["do:", "classesAndMetaclasses", "values", "methodDictionary", "ifTrue:", "includes:", "referencedClasses", "add:"],
 referencedClasses: []
 }),
@@ -3891,26 +3942,28 @@ var self=this;
 (self['@implementors']=smalltalk.send((smalltalk.Array || Array), "_new", []));
 (self['@senders']=smalltalk.send((smalltalk.Array || Array), "_new", []));
 (self['@referencedClasses']=smalltalk.send((smalltalk.Array || Array), "_new", []));
-((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);})() : (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferencesFor_", [self['@selector']]);}), (function(){return smalltalk.send(self, "_searchReferencedClassesFor_", [self['@selector']]);})]));
+(self['@matches']=smalltalk.send((smalltalk.Array || Array), "_new", []));
+smalltalk.send(self, "_searchMethodSource", []);
+((($receiver = smalltalk.send(self['@selector'], "_match_", [unescape("%5E%5BA-Z%5D")])).klass === smalltalk.Boolean) ? (! $receiver ? (function(){return smalltalk.send(self, "_searchSelectorReferences", []);})() : (function(){return smalltalk.send(self, "_searchReferencedClasses", []);})()) : smalltalk.send($receiver, "_ifFalse_ifTrue_", [(function(){return smalltalk.send(self, "_searchSelectorReferences", []);}), (function(){return smalltalk.send(self, "_searchReferencedClasses", []);})]));
 return self;},
 args: ["aString"],
-source: unescape('searchReferencesFor%3A%20aString%0A%09selector%20%3A%3D%20aString.%0A%09implementors%20%3A%3D%20Array%20new.%0A%09senders%20%3A%3D%20Array%20new.%0A%09referencedClasses%20%3A%3D%20Array%20new.%0A%09%28selector%20match%3A%20%27%5E%5BA-Z%5D%27%29%20%0A%09%09ifFalse%3A%20%5Bself%20searchSelectorReferencesFor%3A%20selector%5D%0A%09%09ifTrue%3A%20%5Bself%20searchReferencedClassesFor%3A%20selector%5D'),
-messageSends: ["new", "ifFalse:ifTrue:", "match:", "searchSelectorReferencesFor:", "searchReferencedClassesFor:"],
+source: unescape('searchReferencesFor%3A%20aString%0A%09selector%20%3A%3D%20aString.%0A%09implementors%20%3A%3D%20Array%20new.%0A%09senders%20%3A%3D%20Array%20new.%0A%09referencedClasses%20%3A%3D%20Array%20new.%0A%09matches%20%3A%3D%20Array%20new.%0A%09self%20searchMethodSource.%0A%09%28selector%20match%3A%20%27%5E%5BA-Z%5D%27%29%20%0A%09%09ifFalse%3A%20%5Bself%20searchSelectorReferences%5D%0A%09%09ifTrue%3A%20%5Bself%20searchReferencedClasses%5D'),
+messageSends: ["new", "searchMethodSource", "ifFalse:ifTrue:", "match:", "searchSelectorReferences", "searchReferencedClasses"],
 referencedClasses: ["Array"]
 }),
 smalltalk.ReferencesBrowser);
 
 smalltalk.addMethod(
-unescape('_searchSelectorReferencesFor_'),
+unescape('_searchSelectorReferences'),
 smalltalk.method({
-selector: unescape('searchSelectorReferencesFor%3A'),
+selector: unescape('searchSelectorReferences'),
 category: 'actions',
-fn: function (aString){
+fn: function (){
 var self=this;
 smalltalk.send(smalltalk.send(self, "_classesAndMetaclasses", []), "_do_", [(function(each){return smalltalk.send(smalltalk.send(each, "_methodDictionary", []), "_keysAndValuesDo_", [(function(key, value){((($receiver = smalltalk.send(key, "__eq", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_implementors", []), "_add_", [value]);})]));return ((($receiver = smalltalk.send(smalltalk.send(value, "_messageSends", []), "_includes_", [self['@selector']])).klass === smalltalk.Boolean) ? ($receiver ? (function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})() : nil) : smalltalk.send($receiver, "_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(self, "_senders", []), "_add_", [value]);})]));})]);})]);
 return self;},
-args: ["aString"],
-source: unescape('searchSelectorReferencesFor%3A%20aString%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09each%20methodDictionary%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%20%0A%09%09%09key%20%3D%20selector%20ifTrue%3A%20%5Bself%20implementors%20add%3A%20value%5D.%0A%09%09%09%28value%20messageSends%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20senders%20add%3A%20value%5D%5D%5D'),
+args: [],
+source: unescape('searchSelectorReferences%0A%09self%20classesAndMetaclasses%20do%3A%20%5B%3Aeach%20%7C%20%0A%09%09each%20methodDictionary%20keysAndValuesDo%3A%20%5B%3Akey%20%3Avalue%20%7C%20%0A%09%09%09key%20%3D%20selector%20ifTrue%3A%20%5Bself%20implementors%20add%3A%20value%5D.%0A%09%09%09%28value%20messageSends%20includes%3A%20selector%29%20ifTrue%3A%20%5B%0A%09%09%09%09self%20senders%20add%3A%20value%5D%5D%5D'),
 messageSends: ["do:", "classesAndMetaclasses", "keysAndValuesDo:", "methodDictionary", "ifTrue:", unescape("%3D"), "add:", "implementors", "includes:", "messageSends", "senders"],
 referencedClasses: []
 }),
@@ -3981,6 +4034,23 @@ referencedClasses: []
 }),
 smalltalk.ReferencesBrowser);
 
+smalltalk.addMethod(
+unescape('_updateMatchesList'),
+smalltalk.method({
+selector: unescape('updateMatchesList'),
+category: 'updating',
+fn: function (){
+var self=this;
+smalltalk.send(self['@matchesList'], "_contents_", [(function(html){(function($rec){smalltalk.send($rec, "_class_", ["column_label"]);smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(unescape("Regex%20matches%20%28"), "__comma", [smalltalk.send(smalltalk.send(smalltalk.send(self, "_matches", []), "_size", []), "_asString", [])]), "__comma", [unescape("%29")])]);return smalltalk.send($rec, "_style_", [unescape("font-weight%3A%20bold")]);})(smalltalk.send(html, "_li", []));return smalltalk.send(smalltalk.send(self, "_matches", []), "_do_", [(function(each){var li=nil;
+(li=smalltalk.send(html, "_li", []));return (function($rec){smalltalk.send($rec, "_with_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(each, "_methodClass", []), "_asString", []), "__comma", [unescape("%20%3E%3E%20")]), "__comma", [smalltalk.send(each, "_selector", [])])]);return smalltalk.send($rec, "_onClick_", [(function(){return smalltalk.send(self, "_openBrowserOn_", [each]);})]);})(li);})]);})]);
+return self;},
+args: [],
+source: unescape('updateMatchesList%0A%20%20%20%20matchesList%20contents%3A%20%5B%3Ahtml%20%7C%0A%09html%20li%0A%09%09class%3A%20%27column_label%27%3B%20%0A%09%09with%3A%20%27Regex%20matches%20%28%27%2C%20self%20matches%20size%20asString%2C%20%27%29%27%3B%0A%09%09style%3A%20%27font-weight%3A%20bold%27.%0A%09self%20matches%20do%3A%20%5B%3Aeach%20%7C%7C%20li%20%7C%0A%09%20%20%20%20li%20%3A%3D%20html%20li.%0A%09%20%20%20%20li%0A%09%09with%3A%20%28each%20methodClass%20asString%2C%20%27%20%3E%3E%20%27%2C%20each%20selector%29%3B%0A%09%09onClick%3A%20%5Bself%20openBrowserOn%3A%20each%5D%5D%5D'),
+messageSends: ["contents:", "class:", "with:", unescape("%2C"), "asString", "size", "matches", "style:", "li", "do:", "methodClass", "selector", "onClick:", "openBrowserOn:"],
+referencedClasses: []
+}),
+smalltalk.ReferencesBrowser);
+
 smalltalk.addMethod(
 unescape('_updateReferencedClassesList'),
 smalltalk.method({

+ 42 - 7
st/IDE.st

@@ -1768,7 +1768,7 @@ updatePercent: aNumber
 ! !
 
 TabWidget subclass: #ReferencesBrowser
-	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList'
+	instanceVariableNames: 'implementors senders implementorsList input timer selector sendersList referencedClasses referencedClassesList matches matchesList'
 	package: 'IDE'!
 
 !ReferencesBrowser methodsFor: 'accessing'!
@@ -1785,6 +1785,10 @@ label
 	^'[References]'
 !
 
+matches
+	^matches ifNil: [matches := Array new]
+!
+
 referencedClasses
 	^referencedClasses ifNil: [referencedClasses := Array new]
 !
@@ -1814,10 +1818,20 @@ search: aString
 		searchReferencesFor: aString;
 		updateImplementorsList;
 		updateSendersList;
-		updateReferencedClassesList
+		updateReferencedClassesList;
+		updateMatchesList
+!
+
+searchMethodSource
+	| regex |
+	regex := selector allButFirst.
+	self classesAndMetaclasses do: [:each |
+		each methodDictionary values do: [:value |
+			(value source match: regex) ifTrue: [
+				self matches add: value]]]
 !
 
-searchReferencedClassesFor: aString
+searchReferencedClasses
 	self classesAndMetaclasses do: [:each |
 		each methodDictionary values do: [:value |
 			(value referencedClasses includes: selector) ifTrue: [
@@ -1829,12 +1843,14 @@ searchReferencesFor: aString
 	implementors := Array new.
 	senders := Array new.
 	referencedClasses := Array new.
+	matches := Array new.
+	self searchMethodSource.
 	(selector match: '^[A-Z]') 
-		ifFalse: [self searchSelectorReferencesFor: selector]
-		ifTrue: [self searchReferencedClassesFor: selector]
+		ifFalse: [self searchSelectorReferences]
+		ifTrue: [self searchReferencedClasses]
 !
 
-searchSelectorReferencesFor: aString
+searchSelectorReferences
 	self classesAndMetaclasses do: [:each | 
 		each methodDictionary keysAndValuesDo: [:key :value | 
 			key = selector ifTrue: [self implementors add: value].
@@ -1864,7 +1880,8 @@ renderBoxOn: html
 		renderInputOn: html;
 		renderImplementorsOn: html;
 		renderSendersOn: html;
-		renderReferencedClassesOn: html
+		renderReferencedClassesOn: html;
+		renderMatchesOn: html
 !
 
 renderImplementorsOn: html
@@ -1880,6 +1897,11 @@ renderInputOn: html
 	self setInputEvents
 !
 
+renderMatchesOn: html
+	matchesList := html ul class: 'jt_column matches'.
+	self updateMatchesList
+!
+
 renderReferencedClassesOn: html
 	referencedClassesList := html ul class: 'jt_column referenced_classes'.
 	self updateReferencedClassesList
@@ -1911,6 +1933,19 @@ updateImplementorsList
 		onClick: [self openBrowserOn: each]]]
 !
 
+updateMatchesList
+    matchesList contents: [:html |
+	html li
+		class: 'column_label'; 
+		with: 'Regex matches (', self matches size asString, ')';
+		style: 'font-weight: bold'.
+	self matches do: [:each || li |
+	    li := html li.
+	    li
+		with: (each methodClass asString, ' >> ', each selector);
+		onClick: [self openBrowserOn: each]]]
+!
+
 updateReferencedClassesList
 	referencedClassesList contents: [:html |
 	html li