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