From 49f721e61d36d66252af7cb7dd04243cb9e2b6c6 Mon Sep 17 00:00:00 2001
From: Viet Dinh <54ckb0y789@gmail.com>
Date: Tue, 28 Nov 2023 17:10:51 -0500
Subject: [PATCH] feat: complete mixins' fields
---
src/analyze.rs | 12 ++---
src/backend.rs | 37 +++++--------
src/index.rs | 5 +-
src/main.rs | 2 +-
src/model.rs | 19 +++++--
src/python.rs | 128 +++++++++++++++++++++++++++-----------------
src/utils.rs | 2 +
src/utils/future.rs | 23 ++++++++
src/xml.rs | 10 ++--
9 files changed, 143 insertions(+), 95 deletions(-)
create mode 100644 src/utils/future.rs
diff --git a/src/analyze.rs b/src/analyze.rs
index 87c0fc7..b7709b8 100644
--- a/src/analyze.rs
+++ b/src/analyze.rs
@@ -5,10 +5,9 @@ use log::debug;
use tree_sitter::{Node, QueryCursor};
use odoo_lsp::{
- format_loc,
index::interner,
model::{FieldKind, ModelName},
- utils::{ByteRange, Erase, PreTravel, RangeExt, TryResultExt},
+ utils::{ByteRange, Erase, PreTravel, RangeExt},
ImStr,
};
use ts_macros::query;
@@ -272,9 +271,6 @@ impl Backend {
// What transforms value types?
// 1. foo.bar;
// foo: Model('t) => bar: Model('t).field('bar')
- // 2. foo.mapped('field')
- // foo: Model('t) => foo.mapped('field'): Model('t).mapped('field')
- // debug!("type_of {} range={:?}", node.kind(), node.byte_range());
if node.byte_range().len() <= 64 {
debug!(
"type_of {} '{}'",
@@ -327,9 +323,9 @@ impl Backend {
};
let ident = String::from_utf8_lossy(ident);
let ident = interner.get_or_intern(ident.as_ref());
- let mut entry = self.index.models.try_get_mut(&model).expect(format_loc!("deadlock"))?;
- let fields = block_on(self.populate_field_names(&mut entry, interner.resolve(&model), &[]));
- let field = fields.ok()?.get(&ident.into())?;
+ 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,
diff --git a/src/backend.rs b/src/backend.rs
index 66b1e7e..1bba6fc 100644
--- a/src/backend.rs
+++ b/src/backend.rs
@@ -232,16 +232,15 @@ impl Backend {
return Ok(());
}
let model_key = interner().get_or_intern(&model);
- let Some(mut entry) = self
- .index
- .models
- .try_get_mut(&model_key.into())
- .expect(format_loc!("deadlock"))
- else {
+ 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 {
return Ok(());
};
- let range = char_range_to_lsp_range(range, rope).ok_or_else(|| diagnostic!("range"))?;
- let fields = self.populate_field_names(&mut entry, &model, &[]).await?;
+ let entry = entry.await;
+ let fields = entry
+ .fields
+ .as_ref()
+ .expect(format_loc!("(complete_field_name) no fields for {model}"));
let completions = fields.iter().flat_map(|(key, _)| {
let field_name = interner().resolve(&Spur::try_from_usize(*key as usize).unwrap());
field_name.contains(needle).then(|| CompletionItem {
@@ -378,15 +377,10 @@ impl Backend {
}
pub async fn jump_def_field_name(&self, field: &str, model: &str) -> miette::Result