3.5 KiB
layout | title | category | tags | order | |||
---|---|---|---|---|---|---|---|
developer-doc | Searcher | runtime |
|
7 |
Searcher
The language auto-completion feature requires an ability to search the codebase using different search criteria. This document describes the Searcher module, which consists of the suggestions database and the ranking algorithm for ordering the results.
Suggestions Database
Suggestions database holds entries for fulfilling the auto-completion requests with additional indexes used to answer the different search criteria. The database is populated partially by analyzing the sources and enriched with the extra information from the runtime.
API data types for the suggestions database are specified in the Language Server Message Specification document.
Database Structure
Implementation utilizes the SQLite database.
Database is created per project and the database file stored in the project directory. That way the index can be preserved between the IDE restarts.
Suggestions Table
id
INTEGER
- unique identifierkind
INTEGER
- type of suggestion entry, i.e. Atom, Method, Function, or Localname
TEXT
- entry nameself_type
TEXT
- self type of the Methodreturn_type
TEXT
- return type of the entrydocumentation
TEXT
- documentation string
Arguments Table
id
INTEGER
- unique identifiersuggestion_id
INTEGER
- suggestion key this argument relates toname
TEXT
- argument nametype
TEXT
- argument type; const 'Any' is used to specify generic typesis_suspended
INTEGER
- indicates whether the argument is lazyhas_defult
INTEGER
- indicates whether the argument has default valuedefault_value
TEXT
- optional default value
Static Analysis
The database is filled by analyzing the Intermediate Representation (IR
)
parsed from the source.
Language constructs for suggestions database extracted from the IR
:
- Atoms
- Methods
- Functions
- Local assignments
- Documentation
In addition, it holds the locality information for each entry. Locality information specifies the scope where the node was defined, which is used in the results ranking algorithm.
Runtime Inspection
The IR
is missing information about the types. Runtime instrumentation is used
to capture the types and refine the database entries.
Information for suggestions database gathered in runtime:
- Types
Search Indexes
The database allows searching the entries by the following criteria, applying the ranking algorithm:
- name
- type
- documentation text
- documentation tags
Results Ranking
The search result has an intrinsic ranking based on the scope and the type.
Scope
The results from the local scope have the highest rank in the search result. As the scope becomes wider, the rank decreases.
const_x = 42
main =
x1 = 0
foo x =
x2 = x + 1
calculate #
For example, when completing the argument of calculate: Number -> Number
function, the search results will have the order of: x2
> x1
> const_x
.
Type
Suggestions based on the type are selected by matching with the string runtime type representation.