Diagnose unimplemented built-in macros

This commit is contained in:
Jonas Schievink 2021-05-30 04:19:47 +02:00
parent 06b301e2f8
commit cb5454db86
6 changed files with 87 additions and 18 deletions

View file

@ -227,3 +227,27 @@ impl Diagnostic for MacroError {
true
}
}
#[derive(Debug)]
pub struct UnimplementedBuiltinMacro {
pub file: HirFileId,
pub node: SyntaxNodePtr,
}
impl Diagnostic for UnimplementedBuiltinMacro {
fn code(&self) -> DiagnosticCode {
DiagnosticCode("unimplemented-builtin-macro")
}
fn message(&self) -> String {
"unimplemented built-in macro".to_string()
}
fn display_source(&self) -> InFile<SyntaxNodePtr> {
InFile::new(self.file, self.node.clone())
}
fn as_any(&self) -> &(dyn Any + Send + 'static) {
self
}
}

View file

@ -36,8 +36,8 @@ use std::{iter, sync::Arc};
use arrayvec::ArrayVec;
use base_db::{CrateDisplayName, CrateId, Edition, FileId};
use diagnostics::{
InactiveCode, MacroError, UnresolvedExternCrate, UnresolvedImport, UnresolvedMacroCall,
UnresolvedModule, UnresolvedProcMacro,
InactiveCode, MacroError, UnimplementedBuiltinMacro, UnresolvedExternCrate, UnresolvedImport,
UnresolvedMacroCall, UnresolvedModule, UnresolvedProcMacro,
};
use either::Either;
use hir_def::{
@ -565,6 +565,14 @@ impl Module {
};
sink.push(MacroError { file, node: ast, message: message.clone() });
}
DefDiagnosticKind::UnimplementedBuiltinMacro { ast } => {
let node = ast.to_node(db.upcast());
// Must have a name, otherwise we wouldn't emit it.
let name = node.name().expect("unimplemented builtin macro with no name");
let ptr = SyntaxNodePtr::from(AstPtr::new(&name));
sink.push(UnimplementedBuiltinMacro { file: ast.file_id, node: ptr });
}
}
}
for decl in self.declarations(db) {