From f5ac3130001ab7fe64dd542fd866a18012ee9971 Mon Sep 17 00:00:00 2001 From: Timo Freiberg Date: Tue, 9 Jun 2020 23:11:16 +0200 Subject: Add quickfix to add a struct field --- crates/ra_hir/src/semantics.rs | 15 +++++++++++++-- crates/ra_hir/src/source_analyzer.rs | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/semantics.rs b/crates/ra_hir/src/semantics.rs index a232a5856..6a49c424a 100644 --- a/crates/ra_hir/src/semantics.rs +++ b/crates/ra_hir/src/semantics.rs @@ -6,9 +6,9 @@ use std::{cell::RefCell, fmt, iter::successors}; use hir_def::{ resolver::{self, HasResolver, Resolver}, - AsMacroCall, TraitId, + AsMacroCall, TraitId, VariantId, }; -use hir_expand::{hygiene::Hygiene, ExpansionInfo}; +use hir_expand::{diagnostics::AstDiagnostic, hygiene::Hygiene, ExpansionInfo}; use hir_ty::associated_type_shorthand_candidates; use itertools::Itertools; use ra_db::{FileId, FileRange}; @@ -104,6 +104,13 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { tree } + pub fn ast(&self, d: &T) -> ::AST { + let file_id = d.source().file_id; + let root = self.db.parse_or_expand(file_id).unwrap(); + self.cache(root, file_id); + d.ast(self.db) + } + pub fn expand(&self, macro_call: &ast::MacroCall) -> Option { let macro_call = self.find_file(macro_call.syntax().clone()).with_value(macro_call); let sa = self.analyze2(macro_call.map(|it| it.syntax()), None); @@ -247,6 +254,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { self.analyze(path.syntax()).resolve_path(self.db, path) } + pub fn resolve_variant(&self, record_lit: ast::RecordLit) -> Option { + self.analyze(record_lit.syntax()).resolve_variant(self.db, record_lit) + } + pub fn lower_path(&self, path: &ast::Path) -> Option { let src = self.find_file(path.syntax().clone()); Path::from_src(path.clone(), &Hygiene::new(self.db.upcast(), src.file_id.into())) diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs index 7c6bbea13..757d1e397 100644 --- a/crates/ra_hir/src/source_analyzer.rs +++ b/crates/ra_hir/src/source_analyzer.rs @@ -313,6 +313,16 @@ impl SourceAnalyzer { })?; Some(macro_call_id.as_file()) } + + pub(crate) fn resolve_variant( + &self, + db: &dyn HirDatabase, + record_lit: ast::RecordLit, + ) -> Option { + let infer = self.infer.as_ref()?; + let expr_id = self.expr_id(db, &record_lit.into())?; + infer.variant_resolution_for_expr(expr_id) + } } fn scope_for( -- cgit v1.2.3