Forward compat

This commit is contained in:
Aleksey Kladov 2020-04-11 00:27:00 +02:00
parent ca9a5dd165
commit c1244c853c
8 changed files with 25 additions and 26 deletions

View File

@ -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()
} }
} }

View File

@ -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
} }

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -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)) =

View File

@ -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));
} }

View File

@ -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>> {