Forward compat
This commit is contained in:
parent
ca9a5dd165
commit
c1244c853c
@ -236,7 +236,7 @@ fn index(&self, pat: PatId) -> &Pat {
|
|||||||
|
|
||||||
impl BodySourceMap {
|
impl BodySourceMap {
|
||||||
pub fn expr_syntax(&self, expr: ExprId) -> Result<ExprSource, SyntheticSyntax> {
|
pub fn expr_syntax(&self, expr: ExprId) -> Result<ExprSource, SyntheticSyntax> {
|
||||||
self.expr_map_back[expr]
|
self.expr_map_back[expr].clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option<ExprId> {
|
pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option<ExprId> {
|
||||||
@ -255,7 +255,7 @@ pub fn field_init_shorthand_expr(&self, node: InFile<&ast::RecordField>) -> Opti
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn pat_syntax(&self, pat: PatId) -> Result<PatSource, SyntheticSyntax> {
|
pub fn pat_syntax(&self, pat: PatId) -> Result<PatSource, SyntheticSyntax> {
|
||||||
self.pat_map_back[pat]
|
self.pat_map_back[pat].clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn node_pat(&self, node: InFile<&ast::Pat>) -> Option<PatId> {
|
pub fn node_pat(&self, node: InFile<&ast::Pat>) -> Option<PatId> {
|
||||||
@ -264,6 +264,6 @@ pub fn node_pat(&self, node: InFile<&ast::Pat>) -> Option<PatId> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn field_syntax(&self, expr: ExprId, field: usize) -> AstPtr<ast::RecordField> {
|
pub fn field_syntax(&self, expr: ExprId, field: usize) -> AstPtr<ast::RecordField> {
|
||||||
self.field_map[&(expr, field)]
|
self.field_map[&(expr, field)].clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,7 @@ fn collect(
|
|||||||
fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId {
|
fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId {
|
||||||
let ptr = Either::Left(ptr);
|
let ptr = Either::Left(ptr);
|
||||||
let src = self.expander.to_source(ptr);
|
let src = self.expander.to_source(ptr);
|
||||||
let id = self.make_expr(expr, Ok(src));
|
let id = self.make_expr(expr, Ok(src.clone()));
|
||||||
self.source_map.expr_map.insert(src, id);
|
self.source_map.expr_map.insert(src, id);
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
@ -118,7 +118,7 @@ fn alloc_expr_desugared(&mut self, expr: Expr) -> ExprId {
|
|||||||
fn alloc_expr_field_shorthand(&mut self, expr: Expr, ptr: AstPtr<ast::RecordField>) -> ExprId {
|
fn alloc_expr_field_shorthand(&mut self, expr: Expr, ptr: AstPtr<ast::RecordField>) -> ExprId {
|
||||||
let ptr = Either::Right(ptr);
|
let ptr = Either::Right(ptr);
|
||||||
let src = self.expander.to_source(ptr);
|
let src = self.expander.to_source(ptr);
|
||||||
let id = self.make_expr(expr, Ok(src));
|
let id = self.make_expr(expr, Ok(src.clone()));
|
||||||
self.source_map.expr_map.insert(src, id);
|
self.source_map.expr_map.insert(src, id);
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
@ -136,7 +136,7 @@ fn make_expr(&mut self, expr: Expr, src: Result<ExprSource, SyntheticSyntax>) ->
|
|||||||
|
|
||||||
fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId {
|
fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId {
|
||||||
let src = self.expander.to_source(ptr);
|
let src = self.expander.to_source(ptr);
|
||||||
let id = self.make_pat(pat, Ok(src));
|
let id = self.make_pat(pat, Ok(src.clone()));
|
||||||
self.source_map.pat_map.insert(src, id);
|
self.source_map.pat_map.insert(src, id);
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ fn message(&self) -> String {
|
|||||||
"unresolved module".to_string()
|
"unresolved module".to_string()
|
||||||
}
|
}
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.decl.into() }
|
InFile { file_id: self.file, value: self.decl.clone().into() }
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
self
|
self
|
||||||
|
@ -90,7 +90,7 @@ fn erased_ast_id(&self, item: &SyntaxNode) -> ErasedFileAstId {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn get<N: AstNode>(&self, id: FileAstId<N>) -> AstPtr<N> {
|
pub(crate) fn get<N: AstNode>(&self, id: FileAstId<N>) -> AstPtr<N> {
|
||||||
self.arena[id.raw].cast::<N>().unwrap()
|
self.arena[id.raw].clone().cast::<N>().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn alloc(&mut self, item: &SyntaxNode) -> ErasedFileAstId {
|
fn alloc(&mut self, item: &SyntaxNode) -> ErasedFileAstId {
|
||||||
|
@ -21,7 +21,7 @@ fn message(&self) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.field.into() }
|
InFile { file_id: self.file, value: self.field.clone().into() }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
@ -45,7 +45,7 @@ fn message(&self) -> String {
|
|||||||
buf
|
buf
|
||||||
}
|
}
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.field_list.into() }
|
InFile { file_id: self.file, value: self.field_list.clone().into() }
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
self
|
self
|
||||||
@ -78,7 +78,7 @@ fn message(&self) -> String {
|
|||||||
buf
|
buf
|
||||||
}
|
}
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.field_list.into() }
|
InFile { file_id: self.file, value: self.field_list.clone().into() }
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
self
|
self
|
||||||
@ -97,7 +97,7 @@ fn message(&self) -> String {
|
|||||||
String::from("Missing match arm")
|
String::from("Missing match arm")
|
||||||
}
|
}
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.match_expr.into() }
|
InFile { file_id: self.file, value: self.match_expr.clone().into() }
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
self
|
self
|
||||||
@ -115,7 +115,7 @@ fn message(&self) -> String {
|
|||||||
"wrap return expression in Ok".to_string()
|
"wrap return expression in Ok".to_string()
|
||||||
}
|
}
|
||||||
fn source(&self) -> InFile<SyntaxNodePtr> {
|
fn source(&self) -> InFile<SyntaxNodePtr> {
|
||||||
InFile { file_id: self.file, value: self.expr.into() }
|
InFile { file_id: self.file, value: self.expr.clone().into() }
|
||||||
}
|
}
|
||||||
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
fn as_any(&self) -> &(dyn Any + Send + 'static) {
|
||||||
self
|
self
|
||||||
|
@ -89,7 +89,7 @@ fn create_record_literal_missing_fields_diagnostic(
|
|||||||
let (_, source_map) = db.body_with_source_map(self.func.into());
|
let (_, source_map) = db.body_with_source_map(self.func.into());
|
||||||
|
|
||||||
if let Ok(source_ptr) = source_map.expr_syntax(id) {
|
if let Ok(source_ptr) = source_map.expr_syntax(id) {
|
||||||
if let Some(expr) = source_ptr.value.left() {
|
if let Some(expr) = source_ptr.value.as_ref().left() {
|
||||||
let root = source_ptr.file_syntax(db.upcast());
|
let root = source_ptr.file_syntax(db.upcast());
|
||||||
if let ast::Expr::RecordLit(record_lit) = expr.to_node(&root) {
|
if let ast::Expr::RecordLit(record_lit) = expr.to_node(&root) {
|
||||||
if let Some(field_list) = record_lit.record_field_list() {
|
if let Some(field_list) = record_lit.record_field_list() {
|
||||||
@ -120,7 +120,7 @@ fn create_record_pattern_missing_fields_diagnostic(
|
|||||||
let (_, source_map) = db.body_with_source_map(self.func.into());
|
let (_, source_map) = db.body_with_source_map(self.func.into());
|
||||||
|
|
||||||
if let Ok(source_ptr) = source_map.pat_syntax(id) {
|
if let Ok(source_ptr) = source_map.pat_syntax(id) {
|
||||||
if let Some(expr) = source_ptr.value.left() {
|
if let Some(expr) = source_ptr.value.as_ref().left() {
|
||||||
let root = source_ptr.file_syntax(db.upcast());
|
let root = source_ptr.file_syntax(db.upcast());
|
||||||
if let ast::Pat::RecordPat(record_pat) = expr.to_node(&root) {
|
if let ast::Pat::RecordPat(record_pat) = expr.to_node(&root) {
|
||||||
if let Some(field_list) = record_pat.record_field_pat_list() {
|
if let Some(field_list) = record_pat.record_field_pat_list() {
|
||||||
@ -205,7 +205,7 @@ fn validate_match(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Ok(source_ptr) = source_map.expr_syntax(id) {
|
if let Ok(source_ptr) = source_map.expr_syntax(id) {
|
||||||
if let Some(expr) = source_ptr.value.left() {
|
if let Some(expr) = source_ptr.value.as_ref().left() {
|
||||||
let root = source_ptr.file_syntax(db.upcast());
|
let root = source_ptr.file_syntax(db.upcast());
|
||||||
if let ast::Expr::MatchExpr(match_expr) = expr.to_node(&root) {
|
if let ast::Expr::MatchExpr(match_expr) = expr.to_node(&root) {
|
||||||
if let (Some(match_expr), Some(arms)) =
|
if let (Some(match_expr), Some(arms)) =
|
||||||
|
@ -87,7 +87,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String {
|
|||||||
}
|
}
|
||||||
Err(SyntheticSyntax) => continue,
|
Err(SyntheticSyntax) => continue,
|
||||||
};
|
};
|
||||||
types.push((syntax_ptr, ty));
|
types.push((syntax_ptr.clone(), ty));
|
||||||
if let Some(mismatch) = inference_result.type_mismatch_for_expr(expr) {
|
if let Some(mismatch) = inference_result.type_mismatch_for_expr(expr) {
|
||||||
mismatches.push((syntax_ptr, mismatch));
|
mismatches.push((syntax_ptr, mismatch));
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
/// A pointer to a syntax node inside a file. It can be used to remember a
|
/// A pointer to a syntax node inside a file. It can be used to remember a
|
||||||
/// specific node across reparses of the same file.
|
/// specific node across reparses of the same file.
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
pub struct SyntaxNodePtr {
|
pub struct SyntaxNodePtr {
|
||||||
pub(crate) range: TextRange,
|
pub(crate) range: TextRange,
|
||||||
kind: SyntaxKind,
|
kind: SyntaxKind,
|
||||||
@ -21,7 +21,7 @@ pub fn new(node: &SyntaxNode) -> SyntaxNodePtr {
|
|||||||
SyntaxNodePtr { range: node.text_range(), kind: node.kind() }
|
SyntaxNodePtr { range: node.text_range(), kind: node.kind() }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_node(self, root: &SyntaxNode) -> SyntaxNode {
|
pub fn to_node(&self, root: &SyntaxNode) -> SyntaxNode {
|
||||||
assert!(root.parent().is_none());
|
assert!(root.parent().is_none());
|
||||||
successors(Some(root.clone()), |node| {
|
successors(Some(root.clone()), |node| {
|
||||||
node.children().find(|it| self.range.is_subrange(&it.text_range()))
|
node.children().find(|it| self.range.is_subrange(&it.text_range()))
|
||||||
@ -30,11 +30,11 @@ pub fn to_node(self, root: &SyntaxNode) -> SyntaxNode {
|
|||||||
.unwrap_or_else(|| panic!("can't resolve local ptr to SyntaxNode: {:?}", self))
|
.unwrap_or_else(|| panic!("can't resolve local ptr to SyntaxNode: {:?}", self))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn range(self) -> TextRange {
|
pub fn range(&self) -> TextRange {
|
||||||
self.range
|
self.range
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn kind(self) -> SyntaxKind {
|
pub fn kind(&self) -> SyntaxKind {
|
||||||
self.kind
|
self.kind
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,10 +53,9 @@ pub struct AstPtr<N: AstNode> {
|
|||||||
_ty: PhantomData<fn() -> N>,
|
_ty: PhantomData<fn() -> N>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<N: AstNode> Copy for AstPtr<N> {}
|
|
||||||
impl<N: AstNode> Clone for AstPtr<N> {
|
impl<N: AstNode> Clone for AstPtr<N> {
|
||||||
fn clone(&self) -> AstPtr<N> {
|
fn clone(&self) -> AstPtr<N> {
|
||||||
*self
|
AstPtr { raw: self.raw.clone(), _ty: PhantomData }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,13 +78,13 @@ pub fn new(node: &N) -> AstPtr<N> {
|
|||||||
AstPtr { raw: SyntaxNodePtr::new(node.syntax()), _ty: PhantomData }
|
AstPtr { raw: SyntaxNodePtr::new(node.syntax()), _ty: PhantomData }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_node(self, root: &SyntaxNode) -> N {
|
pub fn to_node(&self, root: &SyntaxNode) -> N {
|
||||||
let syntax_node = self.raw.to_node(root);
|
let syntax_node = self.raw.to_node(root);
|
||||||
N::cast(syntax_node).unwrap()
|
N::cast(syntax_node).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn syntax_node_ptr(self) -> SyntaxNodePtr {
|
pub fn syntax_node_ptr(&self) -> SyntaxNodePtr {
|
||||||
self.raw
|
self.raw.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cast<U: AstNode>(self) -> Option<AstPtr<U>> {
|
pub fn cast<U: AstNode>(self) -> Option<AstPtr<U>> {
|
||||||
|
Loading…
Reference in New Issue
Block a user