Skip to content

Commit 6850af1

Browse files
committed
fix: add support for missing package
Prior to this, a proto file without a package declaration didn't supported any operation as parser required that a package be present. For missing package we now consider . as package
1 parent 89a878f commit 6850af1

File tree

6 files changed

+34
-32
lines changed

6 files changed

+34
-32
lines changed

sample/test.proto

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,17 @@ message SomeMessage {
99

1010
CustomType another = 2;
1111
}
12+
13+
message A {
14+
// B is a b
15+
message B {
16+
17+
}
18+
19+
B b = 1;
20+
}
21+
22+
message C {
23+
A.B ab = 1;
24+
A a = 2;
25+
}

src/lsp.rs

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -135,18 +135,13 @@ impl LanguageServer for ProtoLanguageServer {
135135

136136
let content = self.state.get_content(&uri);
137137
let hv = tree.get_hoverable_at_position(&pos, content.as_bytes());
138-
let current_package_name = tree.get_package_name(content.as_bytes());
138+
let current_package_name = tree.get_package_name(content.as_bytes()).unwrap_or(".");
139139

140140
let Some(hv) = hv else {
141141
error!(uri=%uri, "failed to get hoverable identifier");
142142
return Box::pin(async move { Ok(None) });
143143
};
144144

145-
let Some(current_package_name) = current_package_name else {
146-
error!(uri=%uri, "failed to get package name");
147-
return Box::pin(async move { Ok(None) });
148-
};
149-
150145
let ipath = self.configs.get_include_paths(&uri).unwrap_or_default();
151146
let result = self.state.hover(&ipath, current_package_name.as_ref(), hv);
152147

@@ -220,10 +215,7 @@ impl LanguageServer for ProtoLanguageServer {
220215

221216
let content = self.state.get_content(&uri);
222217

223-
let Some(current_package) = tree.get_package_name(content.as_bytes()) else {
224-
error!(uri=%uri, "failed to get package name");
225-
return Box::pin(async move { Ok(None) });
226-
};
218+
let current_package = tree.get_package_name(content.as_bytes()).unwrap_or(".");
227219

228220
let Some((edit, otext, ntext)) = tree.rename_tree(&pos, &new_name, content.as_bytes())
229221
else {
@@ -240,7 +232,6 @@ impl LanguageServer for ProtoLanguageServer {
240232
let progress_sender = work_done_token.map(|token| self.with_report_progress(token));
241233

242234
let mut h = HashMap::new();
243-
h.insert(tree.uri.clone(), edit);
244235
h.extend(self.state.rename_fields(
245236
current_package,
246237
&otext,
@@ -249,6 +240,8 @@ impl LanguageServer for ProtoLanguageServer {
249240
progress_sender,
250241
));
251242

243+
h.entry(tree.uri).or_insert(edit.clone()).extend(edit);
244+
252245
let response = Some(WorkspaceEdit {
253246
changes: Some(h),
254247
..Default::default()
@@ -272,10 +265,7 @@ impl LanguageServer for ProtoLanguageServer {
272265

273266
let content = self.state.get_content(&uri);
274267

275-
let Some(current_package) = tree.get_package_name(content.as_bytes()) else {
276-
error!(uri=%uri, "failed to get package name");
277-
return Box::pin(async move { Ok(None) });
278-
};
268+
let current_package = tree.get_package_name(content.as_bytes()).unwrap_or(".");
279269

280270
let Some((mut refs, otext)) = tree.reference_tree(&pos, content.as_bytes()) else {
281271
error!(uri=%uri, "failed to find references in a tree");
@@ -321,18 +311,13 @@ impl LanguageServer for ProtoLanguageServer {
321311

322312
let content = self.state.get_content(&uri);
323313
let jump = tree.get_jumpable_at_position(&pos, content.as_bytes());
324-
let current_package_name = tree.get_package_name(content.as_bytes());
314+
let current_package_name = tree.get_package_name(content.as_bytes()).unwrap_or(".");
325315

326316
let Some(jump) = jump else {
327317
error!(uri=%uri, "failed to get jump identifier");
328318
return Box::pin(async move { Ok(None) });
329319
};
330320

331-
let Some(current_package_name) = current_package_name else {
332-
error!(uri=%uri, "failed to get package name");
333-
return Box::pin(async move { Ok(None) });
334-
};
335-
336321
let ipath = self.configs.get_include_paths(&uri).unwrap_or_default();
337322
let locations = self
338323
.state
@@ -407,9 +392,9 @@ impl LanguageServer for ProtoLanguageServer {
407392
return ControlFlow::Continue(());
408393
};
409394

410-
if let Some(diagnostics) = self
411-
.state
412-
.upsert_file(&uri, content, &ipath, 8, &pconf.config, true)
395+
if let Some(diagnostics) =
396+
self.state
397+
.upsert_file(&uri, content, &ipath, 8, &pconf.config, true)
413398
{
414399
if let Err(e) = self.client.publish_diagnostics(diagnostics) {
415400
error!(error=%e, "failed to publish diagnostics")
@@ -434,9 +419,9 @@ impl LanguageServer for ProtoLanguageServer {
434419
return ControlFlow::Continue(());
435420
};
436421

437-
if let Some(diagnostics) = self
438-
.state
439-
.upsert_file(&uri, content, &ipath, 8, &pconf.config, true)
422+
if let Some(diagnostics) =
423+
self.state
424+
.upsert_file(&uri, content, &ipath, 8, &pconf.config, true)
440425
{
441426
if let Err(e) = self.client.publish_diagnostics(diagnostics) {
442427
error!(error=%e, "failed to publish diagnostics")
@@ -457,7 +442,10 @@ impl LanguageServer for ProtoLanguageServer {
457442
return ControlFlow::Continue(());
458443
};
459444

460-
if let Some(diagnostics) = self.state.upsert_file(&uri, content, &ipath, 8, &pconf.config, false) {
445+
if let Some(diagnostics) =
446+
self.state
447+
.upsert_file(&uri, content, &ipath, 8, &pconf.config, false)
448+
{
461449
if let Err(e) = self.client.publish_diagnostics(diagnostics) {
462450
error!(error=%e, "failed to publish diagnostics")
463451
}

src/parser/definition.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ impl ParsedTree {
1111
self.definition_impl(identifier, self.tree.root_node(), &mut results, content);
1212
results
1313
}
14+
1415
fn definition_impl(
1516
&self,
1617
identifier: &str,

src/state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl ProtoLanguageState {
6868
.filter(|tree| {
6969
let content = self.get_content(&tree.uri);
7070
tree.get_package_name(content.as_bytes())
71-
.unwrap_or_default()
71+
.unwrap_or(".")
7272
== package
7373
})
7474
.map(ToOwned::to_owned)

src/utils.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ pub fn is_inner_identifier(s: &str) -> bool {
3737
}
3838

3939
pub fn split_identifier_package(s: &str) -> (&str, &str) {
40-
// trim beginning dots, some use `.` prefix for fully qualified field names
4140
let s = s.trim_start_matches(".");
4241
if is_inner_identifier(s) || !s.contains('.') {
4342
return ("", s);

src/workspace/rename.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl ProtoLanguageState {
2323
.into_iter()
2424
.fold(HashMap::new(), |mut h, tree| {
2525
let content = self.get_content(&tree.uri);
26-
let package = tree.get_package_name(content.as_ref()).unwrap_or_default();
26+
let package = tree.get_package_name(content.as_ref()).unwrap_or(".");
2727
let mut old = identifier.to_string();
2828
let mut new = new_text.to_string();
2929
if current_package != package {
@@ -52,7 +52,7 @@ impl ProtoLanguageState {
5252
.into_iter()
5353
.fold(Vec::<Location>::new(), |mut v, tree| {
5454
let content = self.get_content(&tree.uri);
55-
let package = tree.get_package_name(content.as_ref()).unwrap_or_default();
55+
let package = tree.get_package_name(content.as_ref()).unwrap_or(".");
5656
let mut old = identifier.to_owned();
5757
if current_package != package {
5858
old = format!("{current_package}.{old}");

0 commit comments

Comments
 (0)