Trait hir::db::AstDatabase[][src]

pub trait AstDatabase: Database + HasQueryGroup<AstDatabaseStorage> + SourceDatabase {
    fn ast_id_map(&self, file_id: HirFileId) -> Arc<AstIdMap>;
fn parse_or_expand(
        file_id: HirFileId
    ) -> Option<SyntaxNode<RustLanguage>>;
fn parse_macro_expansion(
        macro_file: MacroFile
    ) -> ExpandResult<Option<(Parse<SyntaxNode<RustLanguage>>, Arc<TokenMap>)>>;
fn intern_macro_call(&self, macro_call: MacroCallLoc) -> MacroCallId;
fn lookup_intern_macro_call(&self, key: MacroCallId) -> MacroCallLoc;
fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(Subtree, TokenMap)>>;
fn macro_arg_text(&self, id: MacroCallId) -> Option<GreenNode>;
fn macro_def(
        id: MacroDefId
    ) -> Result<Arc<TokenExpander>, ParseError>;
fn macro_expand(
        macro_call: MacroCallId
    ) -> ExpandResult<Option<Arc<Subtree>>>;
fn expand_proc_macro(&self, call: MacroCallId) -> ExpandResult<Subtree>;
fn macro_expand_error(&self, macro_call: MacroCallId) -> Option<ExpandError>;
fn hygiene_frame(&self, file_id: HirFileId) -> Arc<HygieneFrame>; }

Required methods

Main public API – parses a hir file, not caring whether it’s a real file or a macro expansion.

Implementation for the macro case.

Macro ids. That’s probably the tricksiest bit in rust-analyzer, and the reason why we use salsa at all.

We encode macro definitions into ids of macro calls, this what allows us to be incremental.

Lowers syntactic macro call to a token tree representation.

Extracts syntax node, corresponding to a macro call. That’s a firewall query, only typing in the macro call itself changes the returned subtree.

Gets the expander for this macro. This compiles declarative macros, and just fetches procedural ones.

Expand macro call to a token tree. This query is LRUed (we keep 128 or so results in memory)

Special case of the previous query for procedural macros. We can’t LRU proc macros, since they are not deterministic in general, and non-determinism breaks salsa in a very, very, very bad way. @edwin0cheng heroically debugged this once!

Firewall query that returns the error from the macro_expand query.