Skip to content

Commit

Permalink
feat(service): recognize memidx in memory instrs (close #6)
Browse files Browse the repository at this point in the history
  • Loading branch information
g-plane committed Feb 5, 2025
1 parent 58ca132 commit 26508ff
Show file tree
Hide file tree
Showing 13 changed files with 258 additions and 48 deletions.
84 changes: 53 additions & 31 deletions crates/service/src/binder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,32 @@ fn create_symbol_table(db: &dyn SymbolTablesCtx, uri: InternUri) -> Arc<SymbolTa
})
})
}
fn create_first_optional_ref_symbol(
db: &dyn SymbolTablesCtx,
instr: PlainInstr,
kind: SymbolKind,
) -> Option<Symbol> {
let node = instr.syntax();
node.ancestors()
.find(|node| node.kind() == SyntaxKind::MODULE)
.map(|region| {
let region = SymbolKey::new(&region);
instr
.immediates()
.next()
.and_then(|immediate| create_ref_symbol(db, immediate.syntax(), region, kind))
.unwrap_or_else(|| Symbol {
green: node.green().into(),
key: SymbolKey::new(&node),
region,
kind,
idx: Idx {
num: Some(0),
name: None,
},
})
})
}
fn create_import_desc_symbol(
db: &dyn SymbolTablesCtx,
node: &SyntaxNode,
Expand Down Expand Up @@ -316,36 +342,11 @@ fn create_symbol_table(db: &dyn SymbolTablesCtx, uri: InternUri) -> Arc<SymbolTa
});
}
Some("call_indirect") => {
let Some(region) = node
.ancestors()
.find(|node| node.kind() == SyntaxKind::MODULE)
.map(|node| SymbolKey::new(&node))
else {
continue;
};
symbols.push(
instr
.immediates()
.next()
.and_then(|immediate| {
create_ref_symbol(
db,
immediate.syntax(),
region,
SymbolKind::TableRef,
)
})
.unwrap_or_else(|| Symbol {
green: node.green().into(),
key: SymbolKey::new(&node),
region,
kind: SymbolKind::TableRef,
idx: Idx {
num: Some(0),
name: None,
},
}),
);
if let Some(symbol) =
create_first_optional_ref_symbol(db, instr, SymbolKind::TableRef)
{
symbols.push(symbol);
}
}
Some(
"table.get" | "table.set" | "table.size" | "table.grow" | "table.fill"
Expand Down Expand Up @@ -377,6 +378,27 @@ fn create_symbol_table(db: &dyn SymbolTablesCtx, uri: InternUri) -> Arc<SymbolTa
symbols.push(symbol);
}
}
Some(
"i32.load" | "i64.load" | "f32.load" | "f64.load" | "i32.load8_s"
| "i32.load8_u" | "i32.load16_s" | "i32.load16_u" | "i64.load8_s"
| "i64.load8_u" | "i64.load16_s" | "i64.load16_u" | "i64.load32_s"
| "i64.load32_u" | "i32.store" | "i64.store" | "f32.store" | "f64.store"
| "i32.store8" | "i32.store16" | "i64.store8" | "i64.store16"
| "i64.store32" | "v128.load" | "v128.load8x8_s" | "v128.load8x8_u"
| "v128.load16x4_s" | "v128.load16x4_u" | "v128.load32x2_s"
| "v128.load32x2_u" | "v128.load8_splat" | "v128.load16_splat"
| "v128.load32_splat" | "v128.load64_splat" | "v128.load32_zero"
| "v128.load64_zero" | "v128.store" | "v128.load8_lane"
| "v128.load16_lane" | "v128.load32_lane" | "v128.load64_lane"
| "v128.store8_lane" | "v128.store16_lane" | "v128.store32_lane"
| "v128.store64_lane",
) => {
if let Some(symbol) =
create_first_optional_ref_symbol(db, instr, SymbolKind::MemoryRef)
{
symbols.push(symbol);
}
}
_ => {}
}
}
Expand Down Expand Up @@ -686,7 +708,7 @@ impl Hash for Symbol {
}
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum SymbolKind {
Module,
Func,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,44 @@ expression: response
{
"range": {
"start": {
"line": 0,
"character": 27
"line": 4,
"character": 4
},
"end": {
"line": 0,
"character": 28
"line": 4,
"character": 12
}
},
"severity": 1,
"code": "undef",
"source": "wat",
"message": "cannot find memory `0` in this scope"
},
{
"range": {
"start": {
"line": 7,
"character": 13
},
"end": {
"line": 7,
"character": 14
}
},
"severity": 1,
"code": "undef",
"source": "wat",
"message": "cannot find memory `0` in this scope"
},
{
"range": {
"start": {
"line": 9,
"character": 21
},
"end": {
"line": 9,
"character": 22
}
},
"severity": 1,
Expand Down
12 changes: 11 additions & 1 deletion crates/service/tests/diagnostics/undef.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,17 @@ fn memory_defined() {
#[test]
fn memory_undefined() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = "(module (export \"\" (memory 0)))";
let source = r#"
(module
(func
i32.const 0
i32.load
drop
i32.const 0
i32.load 0
drop)
(export "" (memory 0)))
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
calm(&mut service, uri.clone());
Expand Down
34 changes: 34 additions & 0 deletions crates/service/tests/diagnostics/unused.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,40 @@ fn memory_used() {
assert!(pick_diagnostics(response).is_empty());
}

#[test]
fn memory_implicit() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = r#"
(module
(func $_
i32.const 0
f32.load
drop)
(memory 1))
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let response = service.pull_diagnostics(create_params(uri));
assert!(pick_diagnostics(response).is_empty());
}

#[test]
fn memory_explicit() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = r#"
(module
(func $_
i32.const 0
f32.load 0
drop)
(memory 1))
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let response = service.pull_diagnostics(create_params(uri));
assert!(pick_diagnostics(response).is_empty());
}

#[test]
fn table_unused() {
let uri = "untitled:test".parse::<Uri>().unwrap();
Expand Down
32 changes: 20 additions & 12 deletions crates/service/tests/references/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -511,14 +511,16 @@ fn global_ref_ident_idx() {
#[test]
fn memory_def_int_idx() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = "
let source = r#"
(module
(memory (data))
(export \"\" (memory 0))
(export "" (memory 0))
(data (memory 0))
(func
(i32.store))
)
(module (memory))
";
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let include_decl =
Expand All @@ -531,14 +533,16 @@ fn memory_def_int_idx() {
#[test]
fn memory_def_ident_idx() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = "
let source = r#"
(module
(memory $memory (data))
(export \"\" (memory $memory))
(export "" (memory $memory))
(data (memory $memory))
(func
(f32.store $memory))
)
(module (memory $memory))
";
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let include_decl =
Expand All @@ -551,14 +555,16 @@ fn memory_def_ident_idx() {
#[test]
fn memory_ref_int_idx() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = "
let source = r#"
(module
(memory (data))
(export \"\" (memory 0))
(export "" (memory 0))
(data (memory 0))
(func
(i64.store))
)
(module (memory))
";
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let include_decl =
Expand All @@ -571,14 +577,16 @@ fn memory_ref_int_idx() {
#[test]
fn memory_ref_ident_idx() {
let uri = "untitled:test".parse::<Uri>().unwrap();
let source = "
let source = r#"
(module
(memory $memory (data))
(export \"\" (memory $memory))
(export "" (memory $memory))
(data (memory $memory))
(func
(f64.store $memory))
)
(module (memory $memory))
";
"#;
let mut service = LanguageService::default();
service.commit(uri.clone(), source.into());
let include_decl =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,18 @@ expression: exclude_decl
"character": 25
}
}
},
{
"uri": "untitled:test",
"range": {
"start": {
"line": 6,
"character": 19
},
"end": {
"line": 6,
"character": 26
}
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,18 @@ expression: include_decl
"character": 25
}
}
},
{
"uri": "untitled:test",
"range": {
"start": {
"line": 6,
"character": 19
},
"end": {
"line": 6,
"character": 26
}
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,18 @@ expression: exclude_decl
"character": 19
}
}
},
{
"uri": "untitled:test",
"range": {
"start": {
"line": 6,
"character": 8
},
"end": {
"line": 6,
"character": 19
}
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,18 @@ expression: include_decl
"character": 19
}
}
},
{
"uri": "untitled:test",
"range": {
"start": {
"line": 6,
"character": 8
},
"end": {
"line": 6,
"character": 19
}
}
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,18 @@ expression: exclude_decl
"character": 25
}
}
},
{
"uri": "untitled:test",
"range": {
"start": {
"line": 6,
"character": 19
},
"end": {
"line": 6,
"character": 26
}
}
}
]
Loading

0 comments on commit 26508ff

Please sign in to comment.