pub struct Semantics<'db, DB> {
pub db: &'db DB,
/* private fields */
}
Expand description
Primary API to get semantic information, like types, from syntax trees.
Fields§
§db: &'db DB
Implementations§
source§impl<'db, DB> Semantics<'db, DB>where
DB: HirDatabase,
impl<'db, DB> Semantics<'db, DB>where
DB: HirDatabase,
pub fn new(db: &DB) -> Semantics<'_, DB>
pub fn hir_file_for(&self, syntax_node: &SyntaxNode<RustLanguage>) -> HirFileId
pub fn token_ancestors_with_macros( &self, token: SyntaxToken<RustLanguage> ) -> impl Iterator<Item = SyntaxNode<RustLanguage>>
sourcepub fn find_node_at_offset_with_macros<N>(
&self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> Option<N>where
N: AstNode,
pub fn find_node_at_offset_with_macros<N>(
&self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> Option<N>where
N: AstNode,
Find an AstNode by offset inside SyntaxNode, if it is inside Macrofile, search up until it is of the target AstNode type
sourcepub fn find_node_at_offset_with_descend<N>(
&self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> Option<N>where
N: AstNode,
pub fn find_node_at_offset_with_descend<N>(
&self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> Option<N>where
N: AstNode,
Find an AstNode by offset inside SyntaxNode, if it is inside MacroCall, descend it and find again
sourcepub fn find_nodes_at_offset_with_descend<'slf, N>(
&'slf self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> impl Iterator<Item = N> + 'slfwhere
N: AstNode + 'slf,
pub fn find_nodes_at_offset_with_descend<'slf, N>(
&'slf self,
node: &SyntaxNode<RustLanguage>,
offset: TextSize
) -> impl Iterator<Item = N> + 'slfwhere
N: AstNode + 'slf,
Find an AstNode by offset inside SyntaxNode, if it is inside MacroCall, descend it and find again
pub fn resolve_await_to_poll(&self, await_expr: &AwaitExpr) -> Option<Function>
pub fn resolve_prefix_expr(&self, prefix_expr: &PrefixExpr) -> Option<Function>
pub fn resolve_index_expr(&self, index_expr: &IndexExpr) -> Option<Function>
pub fn resolve_bin_expr(&self, bin_expr: &BinExpr) -> Option<Function>
pub fn resolve_try_expr(&self, try_expr: &TryExpr) -> Option<Function>
pub fn resolve_variant(&self, record_lit: RecordExpr) -> Option<VariantDef>
pub fn file_to_module_def(&self, file: FileId) -> Option<Module>
pub fn file_to_module_defs(&self, file: FileId) -> impl Iterator<Item = Module>
pub fn to_adt_def(&self, a: &Adt) -> Option<Adt>
pub fn to_const_def(&self, c: &Const) -> Option<Const>
pub fn to_enum_def(&self, e: &Enum) -> Option<Enum>
pub fn to_enum_variant_def(&self, v: &Variant) -> Option<Variant>
pub fn to_fn_def(&self, f: &Fn) -> Option<Function>
pub fn to_impl_def(&self, i: &Impl) -> Option<Impl>
pub fn to_macro_def(&self, m: &Macro) -> Option<Macro>
pub fn to_module_def(&self, m: &Module) -> Option<Module>
pub fn to_static_def(&self, s: &Static) -> Option<Static>
pub fn to_struct_def(&self, s: &Struct) -> Option<Struct>
pub fn to_trait_alias_def(&self, t: &TraitAlias) -> Option<TraitAlias>
pub fn to_trait_def(&self, t: &Trait) -> Option<Trait>
pub fn to_type_alias_def(&self, t: &TypeAlias) -> Option<TypeAlias>
pub fn to_union_def(&self, u: &Union) -> Option<Union>
Methods from Deref<Target = SemanticsImpl<'db>>§
pub fn parse(&self, file_id: FileId) -> SourceFile
pub fn parse_or_expand(&self, file_id: HirFileId) -> SyntaxNode<RustLanguage>
pub fn expand(&self, macro_call: &MacroCall) -> Option<SyntaxNode<RustLanguage>>
sourcepub fn expand_attr_macro(&self, item: &Item) -> Option<SyntaxNode<RustLanguage>>
pub fn expand_attr_macro(&self, item: &Item) -> Option<SyntaxNode<RustLanguage>>
If item
has an attribute macro attached to it, expands it.
pub fn expand_derive_as_pseudo_attr_macro( &self, attr: &Attr ) -> Option<SyntaxNode<RustLanguage>>
pub fn resolve_derive_macro(&self, attr: &Attr) -> Option<Vec<Option<Macro>>>
pub fn expand_derive_macro( &self, attr: &Attr ) -> Option<Vec<SyntaxNode<RustLanguage>>>
pub fn is_derive_annotated(&self, adt: &Adt) -> bool
pub fn is_attr_macro_call(&self, item: &Item) -> bool
sourcepub fn speculative_expand(
&self,
actual_macro_call: &MacroCall,
speculative_args: &TokenTree,
token_to_map: SyntaxToken<RustLanguage>
) -> Option<(SyntaxNode<RustLanguage>, SyntaxToken<RustLanguage>)>
pub fn speculative_expand( &self, actual_macro_call: &MacroCall, speculative_args: &TokenTree, token_to_map: SyntaxToken<RustLanguage> ) -> Option<(SyntaxNode<RustLanguage>, SyntaxToken<RustLanguage>)>
Expand the macro call with a different token tree, mapping the token_to_map
down into the
expansion. token_to_map
should be a token from the speculative args
node.
sourcepub fn speculative_expand_attr_macro(
&self,
actual_macro_call: &Item,
speculative_args: &Item,
token_to_map: SyntaxToken<RustLanguage>
) -> Option<(SyntaxNode<RustLanguage>, SyntaxToken<RustLanguage>)>
pub fn speculative_expand_attr_macro( &self, actual_macro_call: &Item, speculative_args: &Item, token_to_map: SyntaxToken<RustLanguage> ) -> Option<(SyntaxNode<RustLanguage>, SyntaxToken<RustLanguage>)>
Expand the macro call with a different item as the input, mapping the token_to_map
down into the
expansion. token_to_map
should be a token from the speculative args
node.
pub fn speculative_expand_derive_as_pseudo_attr_macro( &self, actual_macro_call: &Attr, speculative_args: &Attr, token_to_map: SyntaxToken<RustLanguage> ) -> Option<(SyntaxNode<RustLanguage>, SyntaxToken<RustLanguage>)>
pub fn as_format_args_parts( &self, string: &String ) -> Option<Vec<(TextRange, Option<PathResolution>)>>
pub fn check_for_format_args_template( &self, original_token: SyntaxToken<RustLanguage>, offset: TextSize ) -> Option<(TextRange, Option<PathResolution>)>
sourcepub fn descend_node_into_attributes<N>(&self, node: N) -> SmallVec<[N; 1]>where
N: AstNode,
pub fn descend_node_into_attributes<N>(&self, node: N) -> SmallVec<[N; 1]>where
N: AstNode,
Maps a node down by mapping its first and last token down.
sourcepub fn descend_into_macros(
&self,
mode: DescendPreference,
token: SyntaxToken<RustLanguage>
) -> SmallVec<[SyntaxToken<RustLanguage>; 1]>
pub fn descend_into_macros( &self, mode: DescendPreference, token: SyntaxToken<RustLanguage> ) -> SmallVec<[SyntaxToken<RustLanguage>; 1]>
Descend the token into its macro call if it is part of one, returning the tokens in the expansion that it is associated with.
pub fn descend_into_macros_single( &self, mode: DescendPreference, token: SyntaxToken<RustLanguage> ) -> SyntaxToken<RustLanguage>
sourcepub fn original_range(&self, node: &SyntaxNode<RustLanguage>) -> FileRange
pub fn original_range(&self, node: &SyntaxNode<RustLanguage>) -> FileRange
Attempts to map the node out of macro expanded files returning the original file range. If upmapping is not possible, this will fall back to the range of the macro call of the macro file the node resides in.
sourcepub fn original_range_opt(
&self,
node: &SyntaxNode<RustLanguage>
) -> Option<FileRange>
pub fn original_range_opt( &self, node: &SyntaxNode<RustLanguage> ) -> Option<FileRange>
Attempts to map the node out of macro expanded files returning the original file range.
sourcepub fn original_ast_node<N>(&self, node: N) -> Option<N>where
N: AstNode,
pub fn original_ast_node<N>(&self, node: N) -> Option<N>where
N: AstNode,
Attempts to map the node out of macro expanded files. This only work for attribute expansions, as other ones do not have nodes as input.
sourcepub fn original_syntax_node_rooted(
&self,
node: &SyntaxNode<RustLanguage>
) -> Option<SyntaxNode<RustLanguage>>
pub fn original_syntax_node_rooted( &self, node: &SyntaxNode<RustLanguage> ) -> Option<SyntaxNode<RustLanguage>>
Attempts to map the node out of macro expanded files. This only work for attribute expansions, as other ones do not have nodes as input.
pub fn diagnostics_display_range( &self, src: InFileWrapper<HirFileId, SyntaxNodePtr<RustLanguage>> ) -> FileRange
sourcepub fn ancestors_with_macros(
&self,
node: SyntaxNode<RustLanguage>
) -> impl Iterator<Item = SyntaxNode<RustLanguage>> + Clone
pub fn ancestors_with_macros( &self, node: SyntaxNode<RustLanguage> ) -> impl Iterator<Item = SyntaxNode<RustLanguage>> + Clone
Iterates the ancestors of the given node, climbing up macro expansions while doing so.
pub fn ancestors_at_offset_with_macros( &self, node: &SyntaxNode<RustLanguage>, offset: TextSize ) -> impl Iterator<Item = SyntaxNode<RustLanguage>>
pub fn resolve_lifetime_param( &self, lifetime: &Lifetime ) -> Option<LifetimeParam>
pub fn resolve_label(&self, lifetime: &Lifetime) -> Option<Label>
pub fn resolve_type(&self, ty: &Type) -> Option<Type>
pub fn resolve_trait(&self, path: &Path) -> Option<Trait>
pub fn expr_adjustments(&self, expr: &Expr) -> Option<Vec<Adjustment>>
pub fn type_of_expr(&self, expr: &Expr) -> Option<TypeInfo>
pub fn type_of_pat(&self, pat: &Pat) -> Option<TypeInfo>
sourcepub fn type_of_binding_in_pat(&self, pat: &IdentPat) -> Option<Type>
pub fn type_of_binding_in_pat(&self, pat: &IdentPat) -> Option<Type>
It also includes the changes that binding mode makes in the type. For example in
let ref x @ Some(_) = None
the result of type_of_pat
is Option<T>
but the result
of this function is &mut Option<T>
pub fn type_of_self(&self, param: &SelfParam) -> Option<Type>
pub fn pattern_adjustments(&self, pat: &Pat) -> SmallVec<[Type; 1]>
pub fn binding_mode_of_pat(&self, pat: &IdentPat) -> Option<BindingMode>
pub fn resolve_expr_as_callable(&self, call: &Expr) -> Option<Callable>
pub fn resolve_method_call(&self, call: &MethodCallExpr) -> Option<Function>
sourcepub fn resolve_method_call_fallback(
&self,
call: &MethodCallExpr
) -> Option<Either<Function, Field>>
pub fn resolve_method_call_fallback( &self, call: &MethodCallExpr ) -> Option<Either<Function, Field>>
Attempts to resolve this call expression as a method call falling back to resolving it as a field.
pub fn resolve_method_call_as_callable( &self, call: &MethodCallExpr ) -> Option<Callable>
pub fn resolve_field( &self, field: &FieldExpr ) -> Option<Either<Field, TupleField>>
pub fn resolve_field_fallback( &self, field: &FieldExpr ) -> Option<Either<Either<Field, TupleField>, Function>>
pub fn resolve_record_field( &self, field: &RecordExprField ) -> Option<(Field, Option<Local>, Type)>
pub fn resolve_record_pat_field( &self, field: &RecordPatField ) -> Option<(Field, Type)>
pub fn resolve_macro_call(&self, macro_call: &MacroCall) -> Option<Macro>
pub fn is_proc_macro_call(&self, macro_call: &MacroCall) -> bool
pub fn is_unsafe_macro_call(&self, macro_call: &MacroCall) -> bool
pub fn resolve_attr_macro_call(&self, item: &Item) -> Option<Macro>
pub fn resolve_path(&self, path: &Path) -> Option<PathResolution>
pub fn resolve_bind_pat_to_const(&self, pat: &IdentPat) -> Option<ModuleDef>
pub fn record_literal_missing_fields( &self, literal: &RecordExpr ) -> Vec<(Field, Type)>
pub fn record_pattern_missing_fields( &self, pattern: &RecordPat ) -> Vec<(Field, Type)>
pub fn to_def<T>(&self, src: &T) -> Option<<T as ToDef>::Def>where
T: ToDef,
pub fn scope( &self, node: &SyntaxNode<RustLanguage> ) -> Option<SemanticsScope<'db>>
pub fn scope_at_offset( &self, node: &SyntaxNode<RustLanguage>, offset: TextSize ) -> Option<SemanticsScope<'db>>
sourcepub fn source<Def>(
&self,
def: Def
) -> Option<InFileWrapper<HirFileId, <Def as HasSource>::Ast>>
pub fn source<Def>( &self, def: Def ) -> Option<InFileWrapper<HirFileId, <Def as HasSource>::Ast>>
Search for a definition’s source and cache its syntax tree
pub fn assert_contains_node(&self, node: &SyntaxNode<RustLanguage>)
pub fn is_unsafe_method_call(&self, method_call_expr: &MethodCallExpr) -> bool
pub fn is_unsafe_ref_expr(&self, ref_expr: &RefExpr) -> bool
pub fn is_unsafe_ident_pat(&self, ident_pat: &IdentPat) -> bool
sourcepub fn is_inside_unsafe(&self, expr: &Expr) -> bool
pub fn is_inside_unsafe(&self, expr: &Expr) -> bool
Returns true
if the node
is inside an unsafe
context.
Trait Implementations§
Auto Trait Implementations§
impl<'db, DB> !Freeze for Semantics<'db, DB>
impl<'db, DB> !RefUnwindSafe for Semantics<'db, DB>
impl<'db, DB> !Send for Semantics<'db, DB>
impl<'db, DB> !Sync for Semantics<'db, DB>
impl<'db, DB> Unpin for Semantics<'db, DB>
impl<'db, DB> !UnwindSafe for Semantics<'db, DB>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Cast for T
impl<T> Cast for T
source§fn cast<U>(self, interner: <U as HasInterner>::Interner) -> Uwhere
Self: CastTo<U>,
U: HasInterner,
fn cast<U>(self, interner: <U as HasInterner>::Interner) -> Uwhere
Self: CastTo<U>,
U: HasInterner,
U
using CastTo
.