Finalize impl Grammar

This commit is contained in:
Aleksey Kladov 2020-07-30 18:28:28 +02:00
parent c83467796b
commit c5798c4d75
54 changed files with 103 additions and 100 deletions

View file

@ -41,7 +41,7 @@ impl<'a> SubstituteTypeParams<'a> {
source_scope: &'a SemanticsScope<'a>,
// FIXME: there's implicit invariant that `trait_` and `source_scope` match...
trait_: hir::Trait,
impl_def: ast::ImplDef,
impl_def: ast::Impl,
) -> SubstituteTypeParams<'a> {
let substs = get_syntactic_substs(impl_def).unwrap_or_default();
let generic_def: hir::GenericDef = trait_.into();
@ -80,7 +80,7 @@ impl<'a> SubstituteTypeParams<'a> {
// FIXME: It would probably be nicer if we could get this via HIR (i.e. get the
// trait ref, and then go from the types in the substs back to the syntax)
fn get_syntactic_substs(impl_def: ast::ImplDef) -> Option<Vec<ast::TypeRef>> {
fn get_syntactic_substs(impl_def: ast::Impl) -> Option<Vec<ast::TypeRef>> {
let target_trait = impl_def.target_trait()?;
let path_type = match target_trait {
ast::TypeRef::PathType(path) => path,

View file

@ -111,7 +111,7 @@ fn add_missing_impl_members_inner(
label: &'static str,
) -> Option<()> {
let _p = ra_prof::profile("add_missing_impl_members_inner");
let impl_def = ctx.find_node_at_offset::<ast::ImplDef>()?;
let impl_def = ctx.find_node_at_offset::<ast::Impl>()?;
let impl_item_list = impl_def.assoc_item_list()?;
let trait_ = resolve_target_trait(&ctx.sema, &impl_def)?;

View file

@ -122,7 +122,7 @@ fn generate_impl_text(strukt: &ast::Struct, code: &str) -> String {
//
// FIXME: change the new fn checking to a more semantic approach when that's more
// viable (e.g. we process proc macros, etc)
fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<ast::ImplDef>> {
fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<ast::Impl>> {
let db = ctx.db();
let module = strukt.syntax().ancestors().find(|node| {
ast::Module::can_cast(node.kind()) || ast::SourceFile::can_cast(node.kind())
@ -130,7 +130,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<
let struct_def = ctx.sema.to_def(strukt)?;
let block = module.descendants().filter_map(ast::ImplDef::cast).find_map(|impl_blk| {
let block = module.descendants().filter_map(ast::Impl::cast).find_map(|impl_blk| {
let blk = ctx.sema.to_def(&impl_blk)?;
// FIXME: handle e.g. `struct S<T>; impl<U> S<U> {}`
@ -158,7 +158,7 @@ fn find_struct_impl(ctx: &AssistContext, strukt: &ast::Struct) -> Option<Option<
Some(block)
}
fn has_new_fn(imp: &ast::ImplDef) -> bool {
fn has_new_fn(imp: &ast::Impl) -> bool {
if let Some(il) = imp.assoc_item_list() {
for item in il.assoc_items() {
if let ast::AssocItem::Fn(f) = item {

View file

@ -40,7 +40,7 @@ pub(crate) fn introduce_named_lifetime(acc: &mut Assists, ctx: &AssistContext) -
.filter(|lifetime| lifetime.text() == "'_")?;
if let Some(fn_def) = lifetime_token.ancestors().find_map(ast::Fn::cast) {
generate_fn_def_assist(acc, &fn_def, lifetime_token.text_range())
} else if let Some(impl_def) = lifetime_token.ancestors().find_map(ast::ImplDef::cast) {
} else if let Some(impl_def) = lifetime_token.ancestors().find_map(ast::Impl::cast) {
generate_impl_def_assist(acc, &impl_def, lifetime_token.text_range())
} else {
None
@ -93,7 +93,7 @@ fn generate_fn_def_assist(
/// Generate the assist for the impl def case
fn generate_impl_def_assist(
acc: &mut Assists,
impl_def: &ast::ImplDef,
impl_def: &ast::Impl,
lifetime_loc: TextRange,
) -> Option<()> {
let new_lifetime_param = generate_unique_lifetime_param_name(&impl_def.generic_param_list())?;

View file

@ -39,7 +39,7 @@ pub(crate) fn move_bounds_to_where_clause(acc: &mut Assists, ctx: &AssistContext
match parent {
ast::Fn(it) => it.body()?.syntax().clone().into(),
ast::Trait(it) => it.assoc_item_list()?.syntax().clone().into(),
ast::ImplDef(it) => it.assoc_item_list()?.syntax().clone().into(),
ast::Impl(it) => it.assoc_item_list()?.syntax().clone().into(),
ast::Enum(it) => it.variant_list()?.syntax().clone().into(),
ast::Struct(it) => {
it.syntax().children_with_tokens()

View file

@ -56,7 +56,7 @@ pub(crate) fn render_snippet(_cap: SnippetCap, node: &SyntaxNode, cursor: Cursor
pub fn get_missing_assoc_items(
sema: &Semantics<RootDatabase>,
impl_def: &ast::ImplDef,
impl_def: &ast::Impl,
) -> Vec<hir::AssocItem> {
// Names must be unique between constants and functions. However, type aliases
// may share the same name as a function or constant.
@ -109,7 +109,7 @@ pub fn get_missing_assoc_items(
pub(crate) fn resolve_target_trait(
sema: &Semantics<RootDatabase>,
impl_def: &ast::ImplDef,
impl_def: &ast::Impl,
) -> Option<hir::Trait> {
let ast_path = impl_def
.target_trait()

View file

@ -120,8 +120,8 @@ impl HasSource for MacroDef {
}
}
impl HasSource for ImplDef {
type Ast = ast::ImplDef;
fn source(self, db: &dyn HirDatabase) -> InFile<ast::ImplDef> {
type Ast = ast::Impl;
fn source(self, db: &dyn HirDatabase) -> InFile<ast::Impl> {
self.id.lookup(db.upcast()).source(db.upcast())
}
}

View file

@ -584,7 +584,7 @@ to_def_impls![
(crate::Enum, ast::Enum, enum_to_def),
(crate::Union, ast::Union, union_to_def),
(crate::Trait, ast::Trait, trait_to_def),
(crate::ImplDef, ast::ImplDef, impl_to_def),
(crate::ImplDef, ast::Impl, impl_to_def),
(crate::TypeAlias, ast::TypeAlias, type_alias_to_def),
(crate::Const, ast::Const, const_to_def),
(crate::Static, ast::Static, static_to_def),

View file

@ -68,7 +68,7 @@ impl SourceToDefCtx<'_, '_> {
pub(super) fn trait_to_def(&mut self, src: InFile<ast::Trait>) -> Option<TraitId> {
self.to_def(src, keys::TRAIT)
}
pub(super) fn impl_to_def(&mut self, src: InFile<ast::ImplDef>) -> Option<ImplId> {
pub(super) fn impl_to_def(&mut self, src: InFile<ast::Impl>) -> Option<ImplId> {
self.to_def(src, keys::IMPL)
}
pub(super) fn fn_to_def(&mut self, src: InFile<ast::Fn>) -> Option<FunctionId> {
@ -158,7 +158,7 @@ impl SourceToDefCtx<'_, '_> {
let def = self.trait_to_def(container.with_value(it))?;
def.into()
},
ast::ImplDef(it) => {
ast::Impl(it) => {
let def = self.impl_to_def(container.with_value(it))?;
def.into()
},
@ -209,7 +209,7 @@ impl SourceToDefCtx<'_, '_> {
ast::Enum(it) => self.enum_to_def(container.with_value(it))?.into(),
ast::Trait(it) => self.trait_to_def(container.with_value(it))?.into(),
ast::TypeAlias(it) => self.type_alias_to_def(container.with_value(it))?.into(),
ast::ImplDef(it) => self.impl_to_def(container.with_value(it))?.into(),
ast::Impl(it) => self.impl_to_def(container.with_value(it))?.into(),
_ => continue,
}
};

View file

@ -669,7 +669,7 @@ impl ExprCollector<'_> {
(TraitLoc { container, id }.intern(self.db).into(), def.name())
}
ast::Item::ExternBlock(_) => return None, // FIXME: collect from extern blocks
ast::Item::ImplDef(_)
ast::Item::Impl(_)
| ast::Item::Use(_)
| ast::Item::ExternCrate(_)
| ast::Item::Module(_)

View file

@ -420,7 +420,7 @@ mod_items! {
Const in consts -> ast::Const,
Static in statics -> ast::Static,
Trait in traits -> ast::Trait,
Impl in impls -> ast::ImplDef,
Impl in impls -> ast::Impl,
TypeAlias in type_aliases -> ast::TypeAlias,
Mod in mods -> ast::Module,
MacroCall in macro_calls -> ast::MacroCall,
@ -581,7 +581,7 @@ pub struct Impl {
pub target_type: TypeRef,
pub is_negative: bool,
pub items: Box<[AssocItem]>,
pub ast_id: FileAstId<ast::ImplDef>,
pub ast_id: FileAstId<ast::Impl>,
}
#[derive(Debug, Clone, PartialEq, Eq)]

View file

@ -95,7 +95,7 @@ impl Ctx {
// These are handled in their respective `lower_X` method (since we can't just blindly
// walk them).
ast::Item::Trait(_) | ast::Item::ImplDef(_) | ast::Item::ExternBlock(_) => {}
ast::Item::Trait(_) | ast::Item::Impl(_) | ast::Item::ExternBlock(_) => {}
// These don't have inner items.
ast::Item::Module(_) | ast::Item::ExternCrate(_) | ast::Item::Use(_) => {}
@ -112,7 +112,7 @@ impl Ctx {
ast::Item::Const(ast) => Some(self.lower_const(ast).into()),
ast::Item::Module(ast) => self.lower_module(ast).map(Into::into),
ast::Item::Trait(ast) => self.lower_trait(ast).map(Into::into),
ast::Item::ImplDef(ast) => self.lower_impl(ast).map(Into::into),
ast::Item::Impl(ast) => self.lower_impl(ast).map(Into::into),
ast::Item::Use(ast) => Some(ModItems(
self.lower_use(ast).into_iter().map(Into::into).collect::<SmallVec<_>>(),
)),
@ -445,7 +445,7 @@ impl Ctx {
Some(id(self.data().traits.alloc(res)))
}
fn lower_impl(&mut self, impl_def: &ast::ImplDef) -> Option<FileItemTreeId<Impl>> {
fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option<FileItemTreeId<Impl>> {
let generic_params =
self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def);
let target_trait = impl_def.target_trait().map(|tr| self.lower_type_ref(&tr));

View file

@ -274,7 +274,7 @@ fn simple_inner_items() {
inner attrs: Attrs { entries: None }
top-level items:
Impl { generic_params: GenericParamsId(0), target_trait: Some(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("D"))] }, generic_args: [None] })), target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Response"))] }, generic_args: [Some(GenericArgs { args: [Type(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("T"))] }, generic_args: [None] }))], has_self_type: false, bindings: [] })] }), is_negative: false, items: [Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
Impl { generic_params: GenericParamsId(0), target_trait: Some(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("D"))] }, generic_args: [None] })), target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Response"))] }, generic_args: [Some(GenericArgs { args: [Type(Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("T"))] }, generic_args: [None] }))], has_self_type: false, bindings: [] })] }), is_negative: false, items: [Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
> Function { name: Name(Text("foo")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(4294967295), has_self_param: false, is_unsafe: false, params: [], is_varargs: false, ret_type: Tuple([]), ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Fn>(1) }
inner items:
@ -353,7 +353,7 @@ fn impl_attrs() {
top-level items:
#[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("impl_attr"))] }, input: None }]) }]
Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Ty"))] }, generic_args: [None] }), is_negative: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("Ty"))] }, generic_args: [None] }), is_negative: false, items: [Function(Idx::<Function>(0)), Function(Idx::<Function>(1))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
> #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_a"))] }, input: None }]) }]
> Function { name: Name(Text("a")), visibility: RawVisibilityId("pub(self)"), generic_params: GenericParamsId(4294967295), has_self_param: false, is_unsafe: false, params: [], is_varargs: false, ret_type: Tuple([]), ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Fn>(1) }
> #[Attrs { entries: Some([Attr { path: ModPath { kind: Plain, segments: [Name(Text("attr_b"))] }, input: None }]) }]
@ -432,7 +432,7 @@ fn assoc_item_macros() {
inner attrs: Attrs { entries: None }
top-level items:
Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("S"))] }, generic_args: [None] }), is_negative: false, items: [MacroCall(Idx::<MacroCall>(0))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::ImplDef>(0) }
Impl { generic_params: GenericParamsId(4294967295), target_trait: None, target_type: Path(Path { type_anchor: None, mod_path: ModPath { kind: Plain, segments: [Name(Text("S"))] }, generic_args: [None] }), is_negative: false, items: [MacroCall(Idx::<MacroCall>(0))], ast_id: FileAstId::<ra_syntax::ast::generated::nodes::Impl>(0) }
> MacroCall { name: None, path: ModPath { kind: Plain, segments: [Name(Text("items"))] }, is_export: false, is_local_inner: false, is_builtin: false, ast_id: FileAstId::<ra_syntax::ast::generated::nodes::MacroCall>(1) }
"#]],
);

View file

@ -18,7 +18,7 @@ pub const FUNCTION: Key<ast::Fn, FunctionId> = Key::new();
pub const CONST: Key<ast::Const, ConstId> = Key::new();
pub const STATIC: Key<ast::Static, StaticId> = Key::new();
pub const TYPE_ALIAS: Key<ast::TypeAlias, TypeAliasId> = Key::new();
pub const IMPL: Key<ast::ImplDef, ImplId> = Key::new();
pub const IMPL: Key<ast::Impl, ImplId> = Key::new();
pub const TRAIT: Key<ast::Trait, TraitId> = Key::new();
pub const STRUCT: Key<ast::Struct, StructId> = Key::new();
pub const UNION: Key<ast::Union, UnionId> = Key::new();

View file

@ -3,7 +3,7 @@
//! This module adds the completion items related to implementing associated
//! items within a `impl Trait for Struct` block. The current context node
//! must be within either a `FN`, `TYPE_ALIAS`, or `CONST` node
//! and an direct child of an `IMPL_DEF`.
//! and an direct child of an `IMPL`.
//!
//! # Examples
//!
@ -34,7 +34,7 @@
use hir::{self, Docs, HasSource};
use ra_assists::utils::get_missing_assoc_items;
use ra_syntax::{
ast::{self, edit, ImplDef},
ast::{self, edit, Impl},
AstNode, SyntaxKind, SyntaxNode, TextRange, T,
};
use ra_text_edit::TextEdit;
@ -104,7 +104,7 @@ pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext
}
}
fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, ImplDef)> {
fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, Impl)> {
let (trigger, impl_def_offset) = ctx.token.ancestors().find_map(|p| match p.kind() {
SyntaxKind::FN | SyntaxKind::TYPE_ALIAS | SyntaxKind::CONST | SyntaxKind::BLOCK_EXPR => {
Some((p, 2))
@ -114,7 +114,7 @@ fn completion_match(ctx: &CompletionContext) -> Option<(SyntaxNode, ImplDef)> {
})?;
let impl_def = (0..impl_def_offset - 1)
.try_fold(trigger.parent()?, |t, _| t.parent())
.and_then(ast::ImplDef::cast)?;
.and_then(ast::Impl::cast)?;
Some((trigger, impl_def))
}

View file

@ -40,7 +40,7 @@ pub(crate) struct CompletionContext<'a> {
pub(super) record_lit_syntax: Option<ast::RecordExpr>,
pub(super) record_pat_syntax: Option<ast::RecordPat>,
pub(super) record_field_syntax: Option<ast::RecordExprField>,
pub(super) impl_def: Option<ast::ImplDef>,
pub(super) impl_def: Option<ast::Impl>,
/// FIXME: `ActiveParameter` is string-based, which is very very wrong
pub(super) active_parameter: Option<ActiveParameter>,
pub(super) is_param: bool,
@ -325,7 +325,7 @@ impl<'a> CompletionContext<'a> {
.sema
.ancestors_with_macros(self.token.parent())
.take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
.find_map(ast::ImplDef::cast);
.find_map(ast::Impl::cast);
let top_node = name_ref
.syntax()

View file

@ -27,7 +27,7 @@ pub(crate) fn has_impl_parent(element: SyntaxElement) -> bool {
not_same_range_ancestor(element)
.filter(|it| it.kind() == ASSOC_ITEM_LIST)
.and_then(|it| it.parent())
.filter(|it| it.kind() == IMPL_DEF)
.filter(|it| it.kind() == IMPL)
.is_some()
}
#[test]
@ -121,7 +121,7 @@ fn test_has_trait_as_prev_sibling() {
}
pub(crate) fn has_impl_as_prev_sibling(element: SyntaxElement) -> bool {
previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == IMPL_DEF).is_some()
previous_sibling_or_ancestor_sibling(element).filter(|it| it.kind() == IMPL).is_some()
}
#[test]
fn test_has_impl_as_prev_sibling() {

View file

@ -139,7 +139,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
ast::RecordField(it) => decl_with_ascription(it),
ast::Const(it) => decl_with_ascription(it),
ast::Static(it) => decl_with_ascription(it),
ast::ImplDef(it) => {
ast::Impl(it) => {
let target_type = it.target_type()?;
let target_trait = it.target_trait();
let label = match target_trait {
@ -372,7 +372,7 @@ fn very_obsolete() {}
label: "impl E",
navigation_range: 239..240,
node_range: 234..243,
kind: IMPL_DEF,
kind: IMPL,
detail: None,
deprecated: false,
},
@ -381,7 +381,7 @@ fn very_obsolete() {}
label: "impl fmt::Debug for E",
navigation_range: 265..266,
node_range: 245..269,
kind: IMPL_DEF,
kind: IMPL,
detail: None,
deprecated: false,
},

View file

@ -192,15 +192,14 @@ fn text_edit_from_self_param(
self_param: &ast::SelfParam,
new_name: &str,
) -> Option<TextEdit> {
fn target_type_name(impl_def: &ast::ImplDef) -> Option<String> {
fn target_type_name(impl_def: &ast::Impl) -> Option<String> {
if let Some(ast::TypeRef::PathType(p)) = impl_def.target_type() {
return Some(p.path()?.segment()?.name_ref()?.text().to_string());
}
None
}
let impl_def =
find_node_at_offset::<ast::ImplDef>(syn, self_param.syntax().text_range().start())?;
let impl_def = find_node_at_offset::<ast::Impl>(syn, self_param.syntax().text_range().start())?;
let type_name = target_type_name(&impl_def)?;
let mut replacement_text = String::from(new_name);

View file

@ -647,7 +647,7 @@ fn highlight_element(
fn is_child_of_impl(element: &SyntaxElement) -> bool {
match element.parent() {
Some(e) => e.kind() == IMPL_DEF,
Some(e) => e.kind() == IMPL,
_ => false,
}
}

View file

@ -150,7 +150,7 @@ pub(crate) fn reparser(
EXTERN_ITEM_LIST => items::extern_item_list,
TOKEN_TREE if first_child? == T!['{'] => items::token_tree,
ASSOC_ITEM_LIST => match parent? {
IMPL_DEF => items::impl_item_list,
IMPL => items::impl_item_list,
TRAIT => items::trait_item_list,
_ => return None,
},

View file

@ -221,7 +221,7 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
// unsafe default impl Foo {}
T![impl] => {
traits::impl_def(p);
m.complete(p, IMPL_DEF);
m.complete(p, IMPL);
}
// test existential_type

View file

@ -134,7 +134,7 @@ pub enum SyntaxKind {
STATIC,
CONST,
TRAIT,
IMPL_DEF,
IMPL,
TYPE_ALIAS,
MACRO_CALL,
TOKEN_TREE,

View file

@ -100,17 +100,18 @@ impl Fn {
pub fn semicolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct ImplDef {
pub struct Impl {
pub(crate) syntax: SyntaxNode,
}
impl ast::AttrsOwner for ImplDef {}
impl ast::VisibilityOwner for ImplDef {}
impl ast::GenericParamsOwner for ImplDef {}
impl ImplDef {
pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
impl ast::AttrsOwner for Impl {}
impl ast::VisibilityOwner for Impl {}
impl ast::GenericParamsOwner for Impl {}
impl Impl {
pub fn default_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![default]) }
pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![unsafe]) }
pub fn impl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![impl]) }
pub fn const_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![const]) }
pub fn type_ref(&self) -> Option<TypeRef> { support::child(&self.syntax) }
pub fn excl_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!]) }
pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }
pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
@ -1278,7 +1279,7 @@ pub enum Item {
ExternBlock(ExternBlock),
ExternCrate(ExternCrate),
Fn(Fn),
ImplDef(ImplDef),
Impl(Impl),
MacroCall(MacroCall),
Module(Module),
Static(Static),
@ -1477,8 +1478,8 @@ impl AstNode for Fn {
}
fn syntax(&self) -> &SyntaxNode { &self.syntax }
}
impl AstNode for ImplDef {
fn can_cast(kind: SyntaxKind) -> bool { kind == IMPL_DEF }
impl AstNode for Impl {
fn can_cast(kind: SyntaxKind) -> bool { kind == IMPL }
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
@ -2790,8 +2791,8 @@ impl From<ExternCrate> for Item {
impl From<Fn> for Item {
fn from(node: Fn) -> Item { Item::Fn(node) }
}
impl From<ImplDef> for Item {
fn from(node: ImplDef) -> Item { Item::ImplDef(node) }
impl From<Impl> for Item {
fn from(node: Impl) -> Item { Item::Impl(node) }
}
impl From<MacroCall> for Item {
fn from(node: MacroCall) -> Item { Item::MacroCall(node) }
@ -2820,7 +2821,7 @@ impl From<Use> for Item {
impl AstNode for Item {
fn can_cast(kind: SyntaxKind) -> bool {
match kind {
CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL_DEF | MACRO_CALL | MODULE
CONST | ENUM | EXTERN_BLOCK | EXTERN_CRATE | FN | IMPL | MACRO_CALL | MODULE
| STATIC | STRUCT | TRAIT | TYPE_ALIAS | UNION | USE => true,
_ => false,
}
@ -2832,7 +2833,7 @@ impl AstNode for Item {
EXTERN_BLOCK => Item::ExternBlock(ExternBlock { syntax }),
EXTERN_CRATE => Item::ExternCrate(ExternCrate { syntax }),
FN => Item::Fn(Fn { syntax }),
IMPL_DEF => Item::ImplDef(ImplDef { syntax }),
IMPL => Item::Impl(Impl { syntax }),
MACRO_CALL => Item::MacroCall(MacroCall { syntax }),
MODULE => Item::Module(Module { syntax }),
STATIC => Item::Static(Static { syntax }),
@ -2852,7 +2853,7 @@ impl AstNode for Item {
Item::ExternBlock(it) => &it.syntax,
Item::ExternCrate(it) => &it.syntax,
Item::Fn(it) => &it.syntax,
Item::ImplDef(it) => &it.syntax,
Item::Impl(it) => &it.syntax,
Item::MacroCall(it) => &it.syntax,
Item::Module(it) => &it.syntax,
Item::Static(it) => &it.syntax,
@ -3491,7 +3492,7 @@ impl std::fmt::Display for Fn {
std::fmt::Display::fmt(self.syntax(), f)
}
}
impl std::fmt::Display for ImplDef {
impl std::fmt::Display for Impl {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(self.syntax(), f)
}

View file

@ -141,7 +141,7 @@ impl ast::UseTreeList {
}
}
impl ast::ImplDef {
impl ast::Impl {
pub fn target_type(&self) -> Option<ast::TypeRef> {
match self.target() {
(Some(t), None) | (_, Some(t)) => Some(t),
@ -486,5 +486,5 @@ impl ast::DocCommentsOwner for ast::Module {}
impl ast::DocCommentsOwner for ast::Static {}
impl ast::DocCommentsOwner for ast::Const {}
impl ast::DocCommentsOwner for ast::TypeAlias {}
impl ast::DocCommentsOwner for ast::ImplDef {}
impl ast::DocCommentsOwner for ast::Impl {}
impl ast::DocCommentsOwner for ast::MacroCall {}

View file

@ -204,7 +204,7 @@ fn validate_visibility(vis: ast::Visibility, errors: &mut Vec<SyntaxError>) {
_ => return,
}
let impl_def = match parent.parent().and_then(|it| it.parent()).and_then(ast::ImplDef::cast) {
let impl_def = match parent.parent().and_then(|it| it.parent()).and_then(ast::Impl::cast) {
Some(it) => it,
None => return,
};

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..183
IMPL_DEF@0..182
IMPL@0..182
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..13

View file

@ -75,7 +75,7 @@ SOURCE_FILE@0..112
ERROR@54..55
COMMA@54..55 ","
WHITESPACE@55..56 " "
IMPL_DEF@56..60
IMPL@56..60
IMPL_KW@56..60 "impl"
EXPR_STMT@60..61
ERROR@60..61

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..38
IMPL_DEF@0..14
IMPL@0..14
IMPL_KW@0..4 "impl"
GENERIC_PARAM_LIST@4..14
L_ANGLE@4..5 "<"
@ -17,7 +17,7 @@ SOURCE_FILE@0..38
IDENT@8..13 "Clone"
R_ANGLE@13..14 ">"
WHITESPACE@14..15 "\n"
IMPL_DEF@15..37
IMPL@15..37
IMPL_KW@15..19 "impl"
GENERIC_PARAM_LIST@19..22
L_ANGLE@19..20 "<"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..118
IMPL_DEF@0..117
IMPL@0..117
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -17,7 +17,7 @@ SOURCE_FILE@0..30
LIFETIME@16..21 "\'loop"
COLON@21..22 ":"
WHITESPACE@22..23 " "
IMPL_DEF@23..27
IMPL@23..27
IMPL_KW@23..27 "impl"
WHITESPACE@27..28 "\n"
R_CURLY@28..29 "}"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..87
IMPL_DEF@0..12
IMPL@0..12
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..9
@ -12,7 +12,7 @@ SOURCE_FILE@0..87
L_CURLY@10..11 "{"
R_CURLY@11..12 "}"
WHITESPACE@12..13 "\n"
IMPL_DEF@13..33
IMPL@13..33
IMPL_KW@13..17 "impl"
WHITESPACE@17..18 " "
PATH_TYPE@18..24
@ -33,10 +33,10 @@ SOURCE_FILE@0..87
L_CURLY@31..32 "{"
R_CURLY@32..33 "}"
WHITESPACE@33..34 "\n"
IMPL_DEF@34..38
IMPL@34..38
IMPL_KW@34..38 "impl"
WHITESPACE@38..39 " "
IMPL_DEF@39..54
IMPL@39..54
IMPL_KW@39..43 "impl"
WHITESPACE@43..44 " "
PATH_TYPE@44..51
@ -49,7 +49,7 @@ SOURCE_FILE@0..87
L_CURLY@52..53 "{"
R_CURLY@53..54 "}"
WHITESPACE@54..55 "\n"
IMPL_DEF@55..70
IMPL@55..70
IMPL_KW@55..59 "impl"
WHITESPACE@59..60 " "
PATH_TYPE@60..66
@ -60,7 +60,7 @@ SOURCE_FILE@0..87
WHITESPACE@66..67 " "
FOR_KW@67..70 "for"
WHITESPACE@70..71 " "
IMPL_DEF@71..86
IMPL@71..86
IMPL_KW@71..75 "impl"
WHITESPACE@75..76 " "
PATH_TYPE@76..83

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..83
IMPL_DEF@0..82
IMPL@0..82
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..128
IMPL_DEF@0..127
IMPL@0..127
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..69
IMPL_DEF@0..68
IMPL@0..68
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..89
IMPL_DEF@0..88
IMPL@0..88
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..27
IMPL_DEF@0..26
IMPL@0..26
UNSAFE_KW@0..6 "unsafe"
WHITESPACE@6..7 " "
DEFAULT_KW@7..14 "default"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..20
IMPL_DEF@0..19
IMPL@0..19
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
BANG@5..6 "!"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..12
IMPL_DEF@0..11
IMPL@0..11
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..8

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..19
IMPL_DEF@0..18
IMPL@0..18
UNSAFE_KW@0..6 "unsafe"
WHITESPACE@6..7 " "
IMPL_KW@7..11 "impl"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..20
IMPL_DEF@0..19
IMPL@0..19
DEFAULT_KW@0..7 "default"
WHITESPACE@7..8 " "
IMPL_KW@8..12 "impl"

View file

@ -8,7 +8,7 @@ SOURCE_FILE@0..94
L_CURLY@6..7 "{"
R_CURLY@7..8 "}"
WHITESPACE@8..9 "\n"
IMPL_DEF@9..93
IMPL@9..93
IMPL_KW@9..13 "impl"
WHITESPACE@13..14 " "
PATH_TYPE@14..15

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..69
IMPL_DEF@0..68
IMPL@0..68
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..29
IMPL_DEF@0..28
IMPL@0..28
IMPL_KW@0..4 "impl"
GENERIC_PARAM_LIST@4..18
L_ANGLE@4..5 "<"

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..50
IMPL_DEF@0..49
IMPL@0..49
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..27
IMPL_DEF@0..26
IMPL@0..26
DEFAULT_KW@0..7 "default"
WHITESPACE@7..8 " "
UNSAFE_KW@8..14 "unsafe"

View file

@ -8,7 +8,7 @@ SOURCE_FILE@0..199
IDENT@69..72 "Foo"
SEMICOLON@72..73 ";"
WHITESPACE@73..75 "\n\n"
IMPL_DEF@75..141
IMPL@75..141
IMPL_KW@75..79 "impl"
WHITESPACE@79..80 " "
PATH_TYPE@80..83

View file

@ -89,7 +89,7 @@ SOURCE_FILE@0..686
WHITESPACE@461..463 "\n\n"
COMMENT@463..523 "// https://github.com ..."
WHITESPACE@523..524 "\n"
IMPL_DEF@524..685
IMPL@524..685
IMPL_KW@524..528 "impl"
WHITESPACE@528..529 " "
PATH_TYPE@529..537

View file

@ -251,7 +251,7 @@ SOURCE_FILE@0..519
WHITESPACE@234..235 "\n"
R_CURLY@235..236 "}"
WHITESPACE@236..238 "\n\n"
IMPL_DEF@238..519
IMPL@238..519
IMPL_KW@238..242 "impl"
WHITESPACE@242..243 " "
PATH_TYPE@243..244

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..137
IMPL_DEF@0..136
IMPL@0..136
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -1,5 +1,5 @@
SOURCE_FILE@0..46
IMPL_DEF@0..45
IMPL@0..45
IMPL_KW@0..4 "impl"
WHITESPACE@4..5 " "
PATH_TYPE@5..6

View file

@ -42,7 +42,7 @@ pub(crate) fn symbol_kind(syntax_kind: SyntaxKind) -> lsp_types::SymbolKind {
SyntaxKind::RECORD_FIELD => lsp_types::SymbolKind::Field,
SyntaxKind::STATIC => lsp_types::SymbolKind::Constant,
SyntaxKind::CONST => lsp_types::SymbolKind::Constant,
SyntaxKind::IMPL_DEF => lsp_types::SymbolKind::Object,
SyntaxKind::IMPL => lsp_types::SymbolKind::Object,
_ => lsp_types::SymbolKind::Variable,
}
}

View file

@ -104,7 +104,7 @@ pub(crate) const KINDS_SRC: KindsSrc = KindsSrc {
"STATIC",
"CONST",
"TRAIT",
"IMPL_DEF",
"IMPL",
"TYPE_ALIAS",
"MACRO_CALL",
"TOKEN_TREE",

View file

@ -9,7 +9,7 @@ Item =
| ExternBlock
| ExternCrate
| Fn
| ImplDef
| Impl
| MacroCall
| Module
| Static
@ -131,9 +131,12 @@ Trait =
AssocItemList =
'{' AssocItem* '}'
ImplDef =
Attr* Visibility? 'const'? 'default'? 'unsafe'? 'impl' GenericParamList? '!'? 'for'
WhereClause?
Impl =
Attr* Visibility?
'default'? 'unsafe'? 'impl' 'const'? GenericParamList? (
TypeRef
| '!'? TypeRef 'for' TypeRef
) WhereClause?
AssocItemList
ParenType =