From 8c6ef478d93e9f323d0089bf60e9ff242320d17b Mon Sep 17 00:00:00 2001
From: Viet Dinh <54ckb0y789@gmail.com>
Date: Sat, 2 Dec 2023 16:57:24 -0500
Subject: [PATCH] feat: goto-definitions for mapped access
---
src/analyze.rs | 13 +-
src/backend.rs | 8 +-
src/index/record.rs | 4 +
src/index/symbol.rs | 7 +
src/main.rs | 29 ++--
src/model.rs | 304 ++++++++++++++++++++++++++++++++++++++-
src/python.rs | 339 +++++++++-----------------------------------
src/xml.rs | 2 +-
8 files changed, 408 insertions(+), 298 deletions(-)
diff --git a/src/analyze.rs b/src/analyze.rs
index b7709b8..b125ecd 100644
--- a/src/analyze.rs
+++ b/src/analyze.rs
@@ -6,7 +6,7 @@ use tree_sitter::{Node, QueryCursor};
use odoo_lsp::{
index::interner,
- model::{FieldKind, ModelName},
+ model::ModelName,
utils::{ByteRange, Erase, PreTravel, RangeExt},
ImStr,
};
@@ -323,13 +323,10 @@ impl Backend {
};
let ident = String::from_utf8_lossy(ident);
let ident = interner.get_or_intern(ident.as_ref());
- let entry = self.populate_field_names(model, &[])?;
- let entry = block_on(entry);
- let field = entry.fields.as_ref()?.get(&ident.into())?;
- match field.kind {
- FieldKind::Relational(model) => Some(Type::Model(interner.resolve(&model).into())),
- FieldKind::Value => None,
- }
+ block_on(self.index.models.populate_field_names(model, &[])?);
+ let relation =
+ block_on(self.index.models.normalize_field_relation(ident.into(), model.into()))?;
+ Some(Type::Model(interner.resolve(&relation).into()))
}
_ => None,
}
diff --git a/src/backend.rs b/src/backend.rs
index 2fea47f..c09af59 100644
--- a/src/backend.rs
+++ b/src/backend.rs
@@ -232,7 +232,7 @@ impl Backend {
}
let model_key = interner().get_or_intern(&model);
let range = char_range_to_lsp_range(range, rope).ok_or_else(|| diagnostic!("range"))?;
- let Some(entry) = self.populate_field_names(model_key.into(), &[]) else {
+ let Some(entry) = self.index.models.populate_field_names(model_key.into(), &[]) else {
return Ok(());
};
let entry = entry.await;
@@ -373,7 +373,7 @@ impl Backend {
pub async fn jump_def_field_name(&self, field: &str, model: &str) -> miette::Result