Querying with GT search filters by example

One of the design principles behind Glamorous Toolkit is that search must be universal. Search filters are snippets of code, written in plain Pharo, that we can use to get information about a package, a class, a method or an object that satisfies one or more conditions.

Let’s see an example: a search for all the methods annotated with the #gtExample pragma.

gtExamplePragmas
	<gtExample>
	| filter |
	filter := #gtExample gtPragmas.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#gtExamplePragmas).
	^ filter
    

There can be many kinds of such search queries in the image. The key is that should return a filter object. Here is a list:

Methods referencing a symbol:

referencesOfReferences
	<gtExample>
	| filter |
	filter := #assert: gtReferences.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#referencesOfReferences).
	^ filter
    

Methods referencing a class:

methodsWithClassReferencesFilter
	<gtExample>
	| filter |
	filter := GtSearchMethodFilterExamples gtReferences.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#methodsWithClassReferencesFilter).
	^ filter.
    

Methods implementing a symbol:

implementorsOfThisMessage
	<gtExample>
	| filter |
	filter := #implementorsOfThisMessage gtImplementors.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#implementorsOfThisMessage).
	^ filter
    

Methods annotated with pragmas:

gtExamplePragmas
	<gtExample>
	| filter |
	filter := #gtExample gtPragmas.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#gtExamplePragmas).
	^ filter
    

Methods in class:

methodsInClassFilter
	<gtExample>
	| filter |
	filter := GtSearchMethodFilterExamples gtMethodsInClass.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#methodsInClassFilter).
	
	^ filter.
    

Methods in class matching a name pattern:

methodsWithClassPatternFilter
	<gtExample>
	| filter |
	filter := #FilterExamples gtClassMatches.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#methodsWithClassPatternFilter).
	
	^ filter.
    

Methods in package:

methodsInPackageFilter
	<gtExample>
	| filter |
	
	filter := 'GToolkit-Pharo-Coder-Examples' asPackage gtMethodsInPackage.
	self assert: filter notEmpty.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#methodsInPackageFilter).	
	^ filter.
    

Methods with literal substring matching:

methodsWithSubstringLiteralFilter
	<gtExample>
	| filter |
	filter := 'empty' gtSubstringLiteralMatch.
	self assert: filter notEmpty description: 'it should not be empty'.
	self assert: (filter matches: GtSearchMethodFilterExamples>>#methodsWithSubstringLiteralFilter).
	
	^ filter.
    

Search filters can be combined.

Intersection:

gtExamplePragmasAndReferencesToMethodCoder
	<gtExample>
	| filter |
	filter := self gtExamplePragmas & GtPharoMethodCoder gtReferences.
	self assert: (filter matches: GtSearchMethodReferencesFilterExamples>>#gtExamplePragmasAndReferencesToMethodCoder).
	self assert: filter notEmpty.
	^ filter
    

Union:

unionFilterIsAllGtSearchMethodsFilterKind
	<gtExample>
	| filter |
	filter := #childrenDo: gtReferences | #children gtReferences.
	self assert: filter gtAreAllGtSearchMethodsFilterKind.
	^ filter
    

Negation:

negatedReferencesToSampleB
	<gtExample>
	| filter |
	
	filter := self referencesToSampleB not.
	self assert: (filter matches: GtFilterStubSampleA >> #methodReferencingSampleB) not.
	self assert: (filter matches: GtFilterStubSampleA >> #anotherMethodReferencingSampleBAndSendingNew) not.
	
	^ filter