# Copyright (c) Meta Platforms, Inc. and affiliates. schema codemarkup.search.1 { import code.24 import codemarkup import codemarkup.types import search.code # # Public API # # Note the Insensitive case implies you did toLower on the argument type SearchCase = enum { Sensitive | Insensitive } # # search for entities by identifier name, either case insensitive or not # with optional symbol kind and language filter constraints # predicate SearchByName: { searchcase: SearchCase, name: string, entity: code.Entity, location: codemarkup.types.Location, kind: maybe codemarkup.types.SymbolKind, language: code.Language # optional language filter, could be wild } { SearchCase, Name, Entity, Location, Kind, Language } where if (Insensitive = SearchCase) then ( ( search.code.SearchByLowerCaseNameKindAndLanguage { Name, Language, Kind, Entity }; codemarkup.EntityLocation { Entity, Location } ) | ( # old form search.code.SearchByLowerCaseNameAndLanguage { Name, Language, Entity }; EntityLocationAndKind { Entity, Location, Kind } ) ) else ( # case sensitive, either kinded or not ( search.code.SearchByNameKindAndLanguage { Name, Language, Kind, Entity }; codemarkup.EntityLocation { Entity, Location } ) | ( # old form search.code.SearchByNameAndLanguage { Name, Language, Entity }; EntityLocationAndKind { Entity, Location, Kind } ) ); # # search by name and scope, with language and kind filters. # predicate SearchByScope: { searchcase: SearchCase, name: string, scope: [string], entity: code.Entity, location: codemarkup.types.Location, kind: maybe codemarkup.types.SymbolKind, language: code.Language } { SearchCase, Name, Scope, Entity, Location, Kind, Language } where if (Insensitive = SearchCase) then ( ( search.code.SearchByLowerCaseScopeAndKind { Name, Scope, Language, Kind, Entity }; codemarkup.EntityLocation { Entity, Location } ) | ( # old form search.code.SearchByLowerCaseScope { Name, Scope, Language, Entity }; EntityLocationAndKind { Entity, Location, Kind } ) ) else ( ( search.code.SearchByScopeAndKind { Name, Scope, Language, Kind, Entity }; codemarkup.EntityLocation { Entity, Location } ) | ( # old form search.code.SearchByScope { Name, Scope, Language, Entity }; EntityLocationAndKind { Entity, Location, Kind }; ) ); # Symbol kind of entity, where kind is optional. # We can avoid this post-query filter with kind-optimized lookups predicate EntityLocationAndKind: { entity: code.Entity, location: codemarkup.types.Location, kind: maybe codemarkup.types.SymbolKind } { Entity, Location, MKind } where codemarkup.EntityLocation { Entity, Location }; (if codemarkup.EntityKind { Entity, Kind } then { just = Kind } else nothing) = MKind; }