Repository: bytecodealliance/wasm-tools
Pull request #1212 (2023-09-20 19:29:40)

 Add support for semicolon delimiters to wit-parser 
This commit is an implementation of https://github.com/WebAssembly/component-model/issues/142 to
add semicolon delimiters to the WIT text format. The intention of this
change is to be rolled out gradually to minimize ecosystem disruption
(although some is inevitable). The strategy implemented in this commit
is to add support to parse semicolons but optionally do so. Requiring
semicolons is configured via:

* A new `WIT_REQUIRE_SEMICOLONS` environment variable is now read. If
  set to `1` then semicolons are required during parsing.
* A new `SourceMap::set_require_semicolons` is provided to
  programmatically indicate what to do.

When semicolons are not required they are still parsed, but a failure is
not generated if they're not present. This should allow semicolon-using
WIT to coexist with non-semicolon-using WIT for a transitionary period.
After a release or two the default for requiring semicolons will
switch to `true` from the current `false`. That means that
`WIT_REQUIRE_SEMICOLONS=0` can be used to keep old WITs compiling. The
after a few releases of that support for optionally parsing semicolons
will be removed and they'll be unconditionally required.


Patch:
diff --git a/crates/wasm-compose/README.md b/crates/wasm-compose/README.md
index 6ab8bc7b..644b1932 100644
--- a/crates/wasm-compose/README.md
+++ b/crates/wasm-compose/README.md
@@ -75,7 +75,7 @@ of composing WebAssembly components together.
 ## License
 
 This project is licensed under the Apache 2.0 license with the LLVM exception.
-See [LICENSE](LICENSE) for more details.
+See [LICENSE](../../LICENSE) for more details.
 
 ### Contribution
 
diff --git a/crates/wasm-mutate/README.md b/crates/wasm-mutate/README.md
index 3eb29d0b..fd7e099c 100644
--- a/crates/wasm-mutate/README.md
+++ b/crates/wasm-mutate/README.md
@@ -138,7 +138,7 @@ wasm-tools mutate original.wasm --seed 0 -o out.wasm --preserve-semantics
 # License
 
 This project is licensed under the Apache 2.0 license with the LLVM exception.
-See [LICENSE](LICENSE) for more details.
+See [LICENSE](../../LICENSE) for more details.
 
 ### Contribution
 
diff --git a/crates/wasm-smith/README.md b/crates/wasm-smith/README.md
index a4f2603d..489918ac 100644
--- a/crates/wasm-smith/README.md
+++ b/crates/wasm-smith/README.md
@@ -5,7 +5,6 @@
 [![](https://docs.rs/wasm-smith/badge.svg)](https://docs.rs/wasm-smith/)
 [![](https://img.shields.io/crates/v/wasm-smith.svg)](https://crates.io/crates/wasm-smith)
 [![](https://img.shields.io/crates/d/wasm-smith.svg)](https://crates.io/crates/wasm-smith)
-![Rust](https://github.com/fitzgen/wasm-smith/workflows/Rust/badge.svg)
 
 * [Features](#features)
 * [Usage](#usage)
@@ -76,7 +75,7 @@ $ cargo fuzz run my_wasm_smith_fuzz_target
 ```
 
 > **Note:** Also check out [the `validate` fuzz
-> target](https://github.com/bytecodealliance/wasm-tools/blob/main/fuzz/fuzz_targets/validate.rs)
+> target](https://github.com/bytecodealliance/wasm-tools/blob/main/fuzz/src/validate.rs)
 > defined in this repository. Using the `wasmparser` crate, it checks that every
 > module generated by `wasm-smith` validates successfully.
 
diff --git a/crates/wast/src/core/expr.rs b/crates/wast/src/core/expr.rs
index 3fd511a1..f89624e2 100644
--- a/crates/wast/src/core/expr.rs
+++ b/crates/wast/src/core/expr.rs
@@ -98,18 +98,18 @@ enum Level<'a> {
     TryArm,
 }
 
-/// Possible states of "what should be parsed next?" in an `if` expression.
+/// Possible states of "what is currently being parsed?" in an `if` expression.
 enum If<'a> {
-    /// Only the `if` has been parsed, next thing to parse is the clause, if
-    /// any, of the `if` instruction.
+    /// Only the `if` instructoin has been parsed, next thing to parse is the
+    /// clause, if any, of the `if` instruction.
+    ///
+    /// This parse ends when `(then ...)` is encountered.
     Clause(Instruction<'a>),
-    /// Next thing to parse is the `then` block
-    Then(Instruction<'a>),
-    /// Next thing to parse is the `else` block
+    /// Currently parsing the `then` block, and afterwards a closing paren is
+    /// required or an `(else ...)` expression.
+    Then,
+    /// Parsing the `else` expression, nothing can come after.
     Else,
-    /// This `if` statement has finished parsing and if anything remains it's a
-    /// syntax error.
-    End,
 }
 
 /// Possible state of "what should be parsed next?" in a `try` expression.
@@ -216,9 +216,6 @@ impl<'a> ExpressionParser<'a> {
                     // items in the `if` statement. Otherwise we're just careful
                     // to terminate with an `end` instruction.
                     Level::If(If::Clause(_)) => {
-                        return Err(parser.error("previous `if` had no clause"));
-                    }
-                    Level::If(If::Then(_)) => {
                         return Err(parser.error("previous `if` had no `then`"));
                     }
                     Level::If(_) => {
@@ -281,23 +278,16 @@ impl<'a> ExpressionParser<'a> {
         })
     }
 
-    /// Handles all parsing of an `if` statement.
+    /// State transitions with parsing an `if` statement.
     ///
     /// The syntactical form of an `if` stament looks like:
     ///
     /// ```wat
-    /// (if $clause (then $then) (else $else))
+    /// (if ($clause)... (then $then) (else $else))
     /// ```
     ///
-    /// but it turns out we practically see a few things in the wild:
-    ///
-    /// * inside the `(if ...)` every sub-thing is surrounded by parens
-    /// * The `then` and `else` keywords are optional
-    /// * The `$then` and `$else` blocks don't need to be surrounded by parens
-    ///
-    /// That's all attempted to be handled here. The part about all sub-parts
-    /// being surrounded by `(` and `)` means that we hook into the `LParen`
-    /// parsing above to call this method there unconditionally.
+    /// THis method is called after a `(` is parsed within the `(if ...` block.
+    /// This determines what to do next.
     ///
     /// Returns `true` if the rest of the arm above should be skipped, or
     /// `false` if we should parse the next item as an instruction (because we
@@ -309,53 +299,37 @@ impl<'a> ExpressionParser<'a> {
             _ => return Ok(false),
         };
 
-        // The first thing parsed in an `if` statement is the clause. If the
-        // clause starts with `then`, however, then we know to skip the clause
-        // and fall through to below.
-        if let If::Clause(if_instr) = i {
-            let instr = mem::replace(if_instr, Instruction::End(None));
-            *i = If::Then(instr);
-            if !parser.peek::<kw::then>()? {
-                return Ok(false);
-            }
-        }
-
-        // All `if` statements are required to have a `then`. This is either the
-        // second s-expr (with or without a leading `then`) or the first s-expr
-        // with a leading `then`. The optionality of `then` isn't strictly what
-        // the text spec says but it matches wabt for now.
-        //
-        // Note that when we see the `then`, that's when we actually add the
-        // original `if` instruction to the stream.
-        if let If::Then(if_instr) = i {
-            let instr = mem::replace(if_instr, Instruction::End(None));
-            self.instrs.push(instr);
-            *i = If::Else;
-            if parser.parse::<Option<kw::then>>()?.is_some() {
+        match i {
+            // If the clause is still being parsed then interpret this `(` as a
+            // folded instruction unless it starts with `then`, in which case
+            // this transitions to the `Then` state and a new level has been
+            // reached.
+            If::Clause(if_instr) => {
+                if !parser.peek::<kw::then>()? {
+                    return Ok(false);
+                }
+                parser.parse::<kw::then>()?;
+                let instr = mem::replace(if_instr, Instruction::End(None));
+                self.instrs.push(instr);
+                *i = If::Then;
                 self.stack.push(Level::IfArm);
-                return Ok(true);
+                Ok(true)
             }
-            return Ok(false);
-        }
 
-        // effectively the same as the `then` parsing above
-        if let If::Else = i {
-            self.instrs.push(Instruction::Else(None));
-            if parser.parse::<Option<kw::r#else>>()?.is_some() {
-                if parser.is_empty() {
-                    self.instrs.pop();
-                }
+            // Previously we were parsing the `(then ...)` clause so this next
+            // `(` must be followed by `else`.
+            If::Then => {
+                parser.parse::<kw::r#else>()?;
+                self.instrs.push(Instruction::Else(None));
+                *i = If::Else;
                 self.stack.push(Level::IfArm);
-                return Ok(true);
+                Ok(true)
             }
-            *i = If::End;
-            return Ok(false);
-        }
 
-        // If we made it this far then we're at `If::End` which means that there
-        // were too many s-expressions inside the `(if)` and we don't want to
-        // parse anything else.
-        Err(parser.error("unexpected token: too many payloads inside of `(if)`"))
+            // If after a `(else ...` clause is parsed there's another `(` then
+            // that's not syntactically allowed.
+            If::Else => Err(parser.error("unexpected token: too many payloads inside of `(if)`")),
+        }
     }
 
     /// Handles parsing of a `try` statement. A `try` statement is simpler
diff --git a/crates/wit-component/src/printing.rs b/crates/wit-component/src/printing.rs
index 0599fd87..331c6785 100644
--- a/crates/wit-component/src/printing.rs
+++ b/crates/wit-component/src/printing.rs
@@ -4,6 +4,9 @@ use std::fmt::{self, Write};
 use std::mem;
 use wit_parser::*;
 
+// NB: keep in sync with `crates/wit-parser/src/ast/lex.rs`
+const PRINT_SEMICOLONS_DEFAULT: bool = false;
+
 /// A utility for printing WebAssembly interface definitions to a string.
 pub struct WitPrinter {
     output: Output,
@@ -14,6 +17,8 @@ pub struct WitPrinter {
 
     // Whether to print doc comments.
     emit_docs: bool,
+
+    print_semicolons: bool,
 }
 
 impl Default for WitPrinter {
@@ -22,6 +27,10 @@ impl Default for WitPrinter {
             output: Default::default(),
             any_items: false,
             emit_docs: true,
+            print_semicolons: match std::env::var("WIT_REQUIRE_SEMICOLONS") {
+                Ok(s) => s == "1",
+                Err(_) => PRINT_SEMICOLONS_DEFAULT,
+            },
         }
     }
 }
@@ -68,6 +77,12 @@ impl WitPrinter {
         Ok(std::mem::take(&mut self.output).into())
     }
 
+    fn print_semicolon(&mut self) {
+        if self.print_semicolons {
+            self.output.push_str(";");
+        }
+    }
+
     fn new_item(&mut self) {
         if self.any_items {
             self.output.push_str("\n");
@@ -106,6 +121,7 @@ impl WitPrinter {
             self.print_name(name);
             self.output.push_str(": ");
             self.print_function(resolve, func)?;
+            self.print_semicolon();
             self.output.push_str("\n");
         }
 
@@ -181,7 +197,9 @@ impl WitPrinter {
                     self.print_name(my_name);
                 }
             }
-            writeln!(&mut self.output, "}}")?;
+            write!(&mut self.output, "}}")?;
+            self.print_semicolon();
+            self.output.push_str("\n");
         }
 
         for id in types_to_declare {
@@ -205,6 +223,7 @@ impl WitPrinter {
         self.output.push_str("resource ");
         self.print_name(ty.name.as_ref().expect("resources must be named"));
         if funcs.is_empty() {
+            self.print_semicolon();
             self.output.push_str("\n");
             return Ok(());
         }
@@ -228,6 +247,7 @@ impl WitPrinter {
                 FunctionKind::Freestanding => unreachable!(),
             }
             self.print_function(resolve, func)?;
+            self.print_semicolon();
             self.output.push_str("\n");
         }
         self.output.push_str("}\n");
@@ -362,6 +382,7 @@ impl WitPrinter {
                     }
                     WorldItem::Function(f) => {
                         self.print_function(resolve, f)?;
+                        self.print_semicolon();
                         self.output.push_str("\n");
                     }
                     // Types are handled separately
@@ -374,6 +395,7 @@ impl WitPrinter {
                     _ => unreachable!(),
                 }
                 self.print_path_to_interface(resolve, *id, cur_pkg)?;
+                self.print_semicolon();
                 self.output.push_str("\n");
             }
         }
@@ -616,6 +638,7 @@ impl WitPrinter {
                             self.print_name(name);
                             self.output.push_str(" = ");
                             self.print_type_name(resolve, inner)?;
+                            self.print_semicolon();
                             self.output.push_str("\n");
                         }
                         None => bail!("unnamed type in document"),
@@ -646,6 +669,7 @@ impl WitPrinter {
                 // own<b>`. By forcing a handle to be printed here it's staying
                 // true to what's in the WIT document.
                 self.print_handle_type(resolve, handle, true)?;
+                self.print_semicolon();
                 self.output.push_str("\n");
 
                 Ok(())
@@ -690,6 +714,7 @@ impl WitPrinter {
             self.print_name(name);
             self.output.push_str(" = ");
             self.print_tuple_type(resolve, tuple)?;
+            self.print_semicolon();
             self.output.push_str("\n");
         }
         Ok(())
@@ -751,6 +776,7 @@ impl WitPrinter {
             self.print_name(name);
             self.output.push_str(" = ");
             self.print_option_type(resolve, payload)?;
+            self.print_semicolon();
             self.output.push_str("\n");
         }
         Ok(())
@@ -767,6 +793,7 @@ impl WitPrinter {
             self.print_name(name);
             self.output.push_str(" = ");
             self.print_result_type(resolve, result)?;
+            self.print_semicolon();
             self.output.push_str("\n");
         }
         Ok(())
@@ -795,7 +822,9 @@ impl WitPrinter {
             self.print_name(name);
             self.output.push_str(" = list<");
             self.print_type_name(resolve, ty)?;
-            self.output.push_str(">\n");
+            self.output.push_str(">");
+            self.print_semicolon();
+            self.output.push_str("\n");
             return Ok(());
         }
 
diff --git a/crates/wit-parser/src/ast.rs b/crates/wit-parser/src/ast.rs
index 46551771..df335990 100644
--- a/crates/wit-parser/src/ast.rs
+++ b/crates/wit-parser/src/ast.rs
@@ -189,6 +189,7 @@ impl<'a> ToplevelUse<'a> {
         } else {
             None
         };
+        tokens.expect_semicolon()?;
         Ok(ToplevelUse { item, as_ })
     }
 }
@@ -306,7 +307,9 @@ impl<'a> ExternKind<'a> {
             // import foo: func(...)
             if clone.clone().eat(Token::Func)? {
                 *tokens = clone;
-                return Ok(ExternKind::Func(id, Func::parse(tokens)?));
+                let ret = ExternKind::Func(id, Func::parse(tokens)?);
+                tokens.expect_semicolon()?;
+                return Ok(ret);
             }
 
             // import foo: interface { ... }
@@ -319,7 +322,9 @@ impl<'a> ExternKind<'a> {
         // import foo
         // import foo/bar
         // import foo:bar/baz
-        Ok(ExternKind::Path(UsePath::parse(tokens)?))
+        let ret = ExternKind::Path(UsePath::parse(tokens)?);
+        tokens.expect_semicolon()?;
+        Ok(ret)
     }
 
     fn span(&self) -> Span {
@@ -448,6 +453,7 @@ impl<'a> Use<'a> {
                 break;
             }
         }
+        tokens.expect_semicolon()?;
         Ok(Use { from, names })
     }
 }
@@ -480,6 +486,7 @@ impl<'a> Include<'a> {
                 },
             )?
         } else {
+            tokens.expect_semicolon()?;
             Vec::new()
         };
 
@@ -579,6 +586,7 @@ impl<'a> ResourceFunc<'a> {
                     let ty = Type::parse(tokens)?;
                     Ok((name, ty))
                 })?;
+                tokens.expect_semicolon()?;
                 Ok(ResourceFunc::Constructor(NamedFunc {
                     docs,
                     name: Id {
@@ -600,6 +608,7 @@ impl<'a> ResourceFunc<'a> {
                     ResourceFunc::Method
                 };
                 let func = Func::parse(tokens)?;
+                tokens.expect_semicolon()?;
                 Ok(ctor(NamedFunc { docs, name, func }))
             }
             other => Err(err_expected(tokens, "`constructor` or identifier", other).into()),
@@ -749,6 +758,7 @@ impl<'a> TypeDef<'a> {
         let name = parse_id(tokens)?;
         tokens.expect(Token::Equals)?;
         let ty = Type::parse(tokens)?;
+        tokens.expect_semicolon()?;
         Ok(TypeDef { docs, name, ty })
     }
 
@@ -777,6 +787,8 @@ impl<'a> TypeDef<'a> {
             while !tokens.eat(Token::RightBrace)? {
                 funcs.push(ResourceFunc::parse(parse_docs(tokens)?, tokens)?);
             }
+        } else {
+            tokens.expect_semicolon()?;
         }
         let ty = Type::Resource(Resource { funcs });
         Ok(TypeDef { docs, name, ty })
@@ -850,6 +862,7 @@ impl<'a> NamedFunc<'a> {
         let name = parse_id(tokens)?;
         tokens.expect(Token::Colon)?;
         let func = Func::parse(tokens)?;
+        tokens.expect_semicolon()?;
         Ok(NamedFunc { docs, name, func })
     }
 }
@@ -1147,6 +1160,7 @@ fn err_expected(
 pub struct SourceMap {
     sources: Vec<Source>,
     offset: u32,
+    require_semicolons: Option<bool>,
 }
 
 #[derive(Clone)]
@@ -1162,6 +1176,11 @@ impl SourceMap {
         SourceMap::default()
     }
 
+    #[doc(hidden)] // NB: only here for a transitionary period
+    pub fn set_require_semicolons(&mut self, enable: bool) {
+        self.require_semicolons = Some(enable);
+    }
+
     /// Reads the file `path` on the filesystem and appends its contents to this
     /// [`SourceMap`].
     pub fn push_file(&mut self, path: &Path) -> Result<()> {
@@ -1237,7 +1256,7 @@ impl SourceMap {
             let mut srcs = self.sources.iter().collect::<Vec<_>>();
             srcs.sort_by_key(|src| &src.path);
             for src in srcs {
-                let mut tokens = Tokenizer::new(&src.contents, src.offset)
+                let mut tokens = Tokenizer::new(&src.contents, src.offset, self.require_semicolons)
                     .with_context(|| format!("failed to tokenize path: {}", src.path.display()))?;
                 let ast = Ast::parse(&mut tokens)?;
                 resolver.push(ast).with_context(|| {
@@ -1347,7 +1366,7 @@ pub(crate) enum AstUsePath {
 }
 
 pub(crate) fn parse_use_path(s: &str) -> Result<AstUsePath> {
-    let mut tokens = Tokenizer::new(s, 0)?;
+    let mut tokens = Tokenizer::new(s, 0, Some(true))?;
     let path = UsePath::parse(&mut tokens)?;
     if tokens.next()?.is_some() {
         bail!("trailing tokens in path specifier");
diff --git a/crates/wit-parser/src/ast/lex.rs b/crates/wit-parser/src/ast/lex.rs
index 44b51f80..fb7a5e2b 100644
--- a/crates/wit-parser/src/ast/lex.rs
+++ b/crates/wit-parser/src/ast/lex.rs
@@ -12,6 +12,7 @@ pub struct Tokenizer<'a> {
     input: &'a str,
     span_offset: u32,
     chars: CrlfFold<'a>,
+    require_semicolons: bool,
 }
 
 #[derive(Clone)]
@@ -115,8 +116,15 @@ pub enum Error {
     },
 }
 
+// NB: keep in sync with `crates/wit-component/src/printing.rs`.
+const REQUIRE_SEMICOLONS_BY_DEFAULT: bool = false;
+
 impl<'a> Tokenizer<'a> {
-    pub fn new(input: &'a str, span_offset: u32) -> Result<Tokenizer<'a>> {
+    pub fn new(
+        input: &'a str,
+        span_offset: u32,
+        require_semicolons: Option<bool>,
+    ) -> Result<Tokenizer<'a>> {
         detect_invalid_input(input)?;
 
         let mut t = Tokenizer {
@@ -125,12 +133,27 @@ impl<'a> Tokenizer<'a> {
             chars: CrlfFold {
                 chars: input.char_indices(),
             },
+            require_semicolons: require_semicolons.unwrap_or_else(|| {
+                match std::env::var("WIT_REQUIRE_SEMICOLONS") {
+                    Ok(s) => s == "1",
+                    Err(_) => REQUIRE_SEMICOLONS_BY_DEFAULT,
+                }
+            }),
         };
         // Eat utf-8 BOM
         t.eatc('\u{feff}');
         Ok(t)
     }
 
+    pub fn expect_semicolon(&mut self) -> Result<()> {
+        if self.require_semicolons {
+            self.expect(Token::Semicolon)?;
+        } else {
+            self.eat(Token::Semicolon)?;
+        }
+        Ok(())
+    }
+
     pub fn input(&self) -> &'a str {
         self.input
     }
@@ -631,7 +654,7 @@ fn test_validate_id() {
 #[test]
 fn test_tokenizer() {
     fn collect(s: &str) -> Result<Vec<Token>> {
-        let mut t = Tokenizer::new(s, 0)?;
+        let mut t = Tokenizer::new(s, 0, Some(true))?;
         let mut tokens = Vec::new();
         while let Some(token) = t.next()? {
             tokens.push(token.1);
diff --git a/crates/wit-parser/src/ast/resolve.rs b/crates/wit-parser/src/ast/resolve.rs
index e7ece4cf..b1c9d08d 100644
--- a/crates/wit-parser/src/ast/resolve.rs
+++ b/crates/wit-parser/src/ast/resolve.rs
@@ -1295,7 +1295,7 @@ impl<'a> Resolver<'a> {
     }
 
     fn resolve_params(&mut self, params: &ParamList<'_>, kind: &FunctionKind) -> Result<Params> {
-        let mut ret = Vec::new();
+        let mut ret = IndexMap::new();
         match *kind {
             // These kinds of methods don't have any adjustments to the
             // parameters, so do nothing here.
@@ -1311,13 +1311,20 @@ impl<'a> Resolver<'a> {
                     name: None,
                     owner: TypeOwner::None,
                 });
-                ret.push(("self".to_string(), shared));
+                ret.insert("self".to_string(), shared);
             }
         }
         for (name, ty) in params {
-            ret.push((name.name.to_string(), self.resolve_type(ty)?));
+            let prev = ret.insert(name.name.to_string(), self.resolve_type(ty)?);
+            if prev.is_some() {
+                return Err(Error {
+                    span: name.span,
+                    msg: format!("param `{}` is defined more than once", name.name),
+                }
+                .into());
+            }
         }
-        Ok(ret)
+        Ok(ret.into_iter().collect())
     }
 
     fn resolve_results(


Test patch:
diff --git a/crates/wit-component/tests/components/adapt-empty-interface/adapt-old.wit b/crates/wit-component/tests/components/adapt-empty-interface/adapt-old.wit
index 3a1842c8..32540813 100644
--- a/crates/wit-component/tests/components/adapt-empty-interface/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-empty-interface/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    thunk-that-is-not-called: func()
+    thunk-that-is-not-called: func();
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-export-default/adapt-old.wit b/crates/wit-component/tests/components/adapt-export-default/adapt-old.wit
index 8e9934c7..52d2cbb4 100644
--- a/crates/wit-component/tests/components/adapt-export-default/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-export-default/adapt-old.wit
@@ -1,3 +1,3 @@
 world adapt-old {
-  export entrypoint: func()
+  export entrypoint: func();
 }
diff --git a/crates/wit-component/tests/components/adapt-export-namespaced/adapt-old.wit b/crates/wit-component/tests/components/adapt-export-namespaced/adapt-old.wit
index 177d5d17..27d1cf9d 100644
--- a/crates/wit-component/tests/components/adapt-export-namespaced/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-export-namespaced/adapt-old.wit
@@ -1,7 +1,7 @@
 interface new {
-  entrypoint: func()
+  entrypoint: func();
 }
 
 world adapt-old {
-  export new
+  export new;
 }
diff --git a/crates/wit-component/tests/components/adapt-export-reallocs/adapt-old.wit b/crates/wit-component/tests/components/adapt-export-reallocs/adapt-old.wit
index 33ecfc28..a3441b23 100644
--- a/crates/wit-component/tests/components/adapt-export-reallocs/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-export-reallocs/adapt-old.wit
@@ -1,6 +1,6 @@
 world adapt-old {
   import new: interface {
-    read: func(amt: u32) -> list<u8>
+    read: func(amt: u32) -> list<u8>;
   }
-  export entrypoint: func(args: list<string>)
+  export entrypoint: func(args: list<string>);
 }
diff --git a/crates/wit-component/tests/components/adapt-export-save-args/adapt-old.wit b/crates/wit-component/tests/components/adapt-export-save-args/adapt-old.wit
index 2185e1f1..c8750a0a 100644
--- a/crates/wit-component/tests/components/adapt-export-save-args/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-export-save-args/adapt-old.wit
@@ -1,3 +1,3 @@
 world adapt-old {
-  export entrypoint: func(nargs: u32)
+  export entrypoint: func(nargs: u32);
 }
diff --git a/crates/wit-component/tests/components/adapt-export-with-post-return/adapt-old.wit b/crates/wit-component/tests/components/adapt-export-with-post-return/adapt-old.wit
index 5f8405e2..ef3210f0 100644
--- a/crates/wit-component/tests/components/adapt-export-with-post-return/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-export-with-post-return/adapt-old.wit
@@ -1,7 +1,7 @@
 interface new {
-  foo: func() -> string
+  foo: func() -> string;
 }
 
 world adapt-old {
-  export new
+  export new;
 }
diff --git a/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/adapt-unused.wit b/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/adapt-unused.wit
index a434c40e..91d3c57d 100644
--- a/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/adapt-unused.wit
+++ b/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/adapt-unused.wit
@@ -1,9 +1,9 @@
 interface adapter-imports {
-  foo: func(x: string)
+  foo: func(x: string);
 }
 
 world adapt-unused {
-  import adapter-imports
+  import adapter-imports;
 
-  export adapter-bar: func(x: string)
+  export adapter-bar: func(x: string);
 }
diff --git a/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/module.wit b/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/module.wit
index 25ed69fa..d6ff08b3 100644
--- a/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/module.wit
+++ b/crates/wit-component/tests/components/adapt-import-only-used-in-adapter/module.wit
@@ -1,6 +1,6 @@
 package foo:foo
 
 world module {
-  import foo: func(x: string)
-  export bar: func()
+  import foo: func(x: string);
+  export bar: func();
 }
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wat b/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wat
index 5fc81bcb..403204da 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wat
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wat
@@ -25,7 +25,7 @@
 
     ;; `wit-component` should have injected a call to a function that allocates
     ;; the stack and sets $allocation_state to 2
-    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (unreachable))
+    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (then (unreachable)))
 
     ;; First, allocate a page using $cabi_realloc and write to it.  This tests
     ;; that we can use the main module's allocator if present (or else a
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wit b/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wit
index dab8bec0..a9f798e8 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-adapt-realloc/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    get-two: func() -> (a: u32, b: u32)
+    get-two: func() -> (a: u32, b: u32);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc-no-state/adapt-old.wit b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc-no-state/adapt-old.wit
index dab8bec0..a9f798e8 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc-no-state/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc-no-state/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    get-two: func() -> (a: u32, b: u32)
+    get-two: func() -> (a: u32, b: u32);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wat b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wat
index 5fc81bcb..403204da 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wat
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wat
@@ -25,7 +25,7 @@
 
     ;; `wit-component` should have injected a call to a function that allocates
     ;; the stack and sets $allocation_state to 2
-    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (unreachable))
+    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (then (unreachable)))
 
     ;; First, allocate a page using $cabi_realloc and write to it.  This tests
     ;; that we can use the main module's allocator if present (or else a
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wit b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wit
index dab8bec0..a9f798e8 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-realloc/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    get-two: func() -> (a: u32, b: u32)
+    get-two: func() -> (a: u32, b: u32);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wat b/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wat
index 4d5b998b..6626b29b 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wat
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wat
@@ -24,7 +24,7 @@
 
     ;; `wit-component` should have injected a call to a function that allocates
     ;; the stack and sets $allocation_state to 2
-    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (unreachable))
+    (if (i32.ne (global.get $allocation_state) (i32.const 2)) (then (unreachable)))
 
     ;; Allocate 8 bytes of stack space for the two u32 return values. The
     ;; original stack pointer is saved in local 0 and the stack frame for this
diff --git a/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wit b/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wit
index dab8bec0..a9f798e8 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-inject-stack-with-reallocing-adapter/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    get-two: func() -> (a: u32, b: u32)
+    get-two: func() -> (a: u32, b: u32);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-inject-stack/adapt-old.wit b/crates/wit-component/tests/components/adapt-inject-stack/adapt-old.wit
index dab8bec0..a9f798e8 100644
--- a/crates/wit-component/tests/components/adapt-inject-stack/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-inject-stack/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    get-two: func() -> (a: u32, b: u32)
+    get-two: func() -> (a: u32, b: u32);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-list-return/adapt-old.wit b/crates/wit-component/tests/components/adapt-list-return/adapt-old.wit
index 35bcef4a..693bd57e 100644
--- a/crates/wit-component/tests/components/adapt-list-return/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-list-return/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    read: func() -> list<u8>
+    read: func() -> list<u8>;
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-memory-simple/adapt-old.wit b/crates/wit-component/tests/components/adapt-memory-simple/adapt-old.wit
index 5dd4f661..5e15bfae 100644
--- a/crates/wit-component/tests/components/adapt-memory-simple/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-memory-simple/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    log: func(s: string)
+    log: func(s: string);
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-multiple/adapt-foo.wit b/crates/wit-component/tests/components/adapt-multiple/adapt-foo.wit
index 20e46ac8..6949592d 100644
--- a/crates/wit-component/tests/components/adapt-multiple/adapt-foo.wit
+++ b/crates/wit-component/tests/components/adapt-multiple/adapt-foo.wit
@@ -1,8 +1,8 @@
 world adapt-foo {
   import other1: interface {
-    foo: func()
+    foo: func();
   }
   import other2: interface {
-    bar: func()
+    bar: func();
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-preview1/adapt-wasi-snapshot-preview1.wit b/crates/wit-component/tests/components/adapt-preview1/adapt-wasi-snapshot-preview1.wit
index c1ffe08a..0c677473 100644
--- a/crates/wit-component/tests/components/adapt-preview1/adapt-wasi-snapshot-preview1.wit
+++ b/crates/wit-component/tests/components/adapt-preview1/adapt-wasi-snapshot-preview1.wit
@@ -2,11 +2,11 @@
 // to implement the `wasi_snapshot_preview1` interface.
 
 interface my-wasi {
-  random-get: func(size: u32) -> list<u8>
-  proc-exit: func(code: u32)
-  something-not-used: func()
+  random-get: func(size: u32) -> list<u8>;
+  proc-exit: func(code: u32);
+  something-not-used: func();
 }
 
 world adapt-wasi-snapshot-preview1 {
-  import my-wasi
+  import my-wasi;
 }
diff --git a/crates/wit-component/tests/components/adapt-preview1/module.wit b/crates/wit-component/tests/components/adapt-preview1/module.wit
index 419a16cf..424bf36e 100644
--- a/crates/wit-component/tests/components/adapt-preview1/module.wit
+++ b/crates/wit-component/tests/components/adapt-preview1/module.wit
@@ -2,6 +2,6 @@ package foo:foo
 
 world module {
   import foo: interface {
-    foo: func()
+    foo: func();
   }
 }
diff --git a/crates/wit-component/tests/components/adapt-unused/adapt-old.wit b/crates/wit-component/tests/components/adapt-unused/adapt-old.wit
index 5dd4f661..5e15bfae 100644
--- a/crates/wit-component/tests/components/adapt-unused/adapt-old.wit
+++ b/crates/wit-component/tests/components/adapt-unused/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    log: func(s: string)
+    log: func(s: string);
   }
 }
diff --git a/crates/wit-component/tests/components/bare-funcs/module.wit b/crates/wit-component/tests/components/bare-funcs/module.wit
index 3796acf5..1d914732 100644
--- a/crates/wit-component/tests/components/bare-funcs/module.wit
+++ b/crates/wit-component/tests/components/bare-funcs/module.wit
@@ -1,7 +1,7 @@
 package foo:foo
 world module {
-  import foo: func()
-  import bar: func() -> string
-  export baz: func()
-  export foo2: func(x: string) -> option<list<u8>>
+  import foo: func();
+  import bar: func() -> string;
+  export baz: func();
+  export foo2: func(x: string) -> option<list<u8>>;
 }
diff --git a/crates/wit-component/tests/components/ensure-default-type-exports/module.wit b/crates/wit-component/tests/components/ensure-default-type-exports/module.wit
index a206eb9c..f3cf3e2c 100644
--- a/crates/wit-component/tests/components/ensure-default-type-exports/module.wit
+++ b/crates/wit-component/tests/components/ensure-default-type-exports/module.wit
@@ -1,17 +1,17 @@
 package foo:foo
 
 interface foo {
-  type foo = u8
+  type foo = u8;
 
   record bar {
       x: foo
   }
 
-  a: func(b: bar)
+  a: func(b: bar);
 }
 
 world module {
-  import foo
+  import foo;
 
-  export a: func(b: u8)
+  export a: func(b: u8);
 }
diff --git a/crates/wit-component/tests/components/error-adapt-missing-memory/adapt-old.wit b/crates/wit-component/tests/components/error-adapt-missing-memory/adapt-old.wit
index 5dd4f661..5e15bfae 100644
--- a/crates/wit-component/tests/components/error-adapt-missing-memory/adapt-old.wit
+++ b/crates/wit-component/tests/components/error-adapt-missing-memory/adapt-old.wit
@@ -1,5 +1,5 @@
 world adapt-old {
   import new: interface {
-    log: func(s: string)
+    log: func(s: string);
   }
 }
diff --git a/crates/wit-component/tests/components/error-default-export-sig-mismatch/module.wit b/crates/wit-component/tests/components/error-default-export-sig-mismatch/module.wit
index e1370a6e..a6e65017 100644
--- a/crates/wit-component/tests/components/error-default-export-sig-mismatch/module.wit
+++ b/crates/wit-component/tests/components/error-default-export-sig-mismatch/module.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world module {
-  export a: func(x: string) -> string
+  export a: func(x: string) -> string;
 }
diff --git a/crates/wit-component/tests/components/error-export-sig-mismatch/module.wit b/crates/wit-component/tests/components/error-export-sig-mismatch/module.wit
index 99c485e5..4a65a60d 100644
--- a/crates/wit-component/tests/components/error-export-sig-mismatch/module.wit
+++ b/crates/wit-component/tests/components/error-export-sig-mismatch/module.wit
@@ -2,6 +2,6 @@ package foo:foo
 
 world module {
   export foo: interface {
-    a: func(x: string) -> string
+    a: func(x: string) -> string;
   }
 }
diff --git a/crates/wit-component/tests/components/error-import-resource-rep/module.wit b/crates/wit-component/tests/components/error-import-resource-rep/module.wit
index 142cbde3..c840169b 100644
--- a/crates/wit-component/tests/components/error-import-resource-rep/module.wit
+++ b/crates/wit-component/tests/components/error-import-resource-rep/module.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 world module {
-  resource a
+  resource a;
 }
diff --git a/crates/wit-component/tests/components/error-import-resource-wrong-signature/module.wit b/crates/wit-component/tests/components/error-import-resource-wrong-signature/module.wit
index 142cbde3..c840169b 100644
--- a/crates/wit-component/tests/components/error-import-resource-wrong-signature/module.wit
+++ b/crates/wit-component/tests/components/error-import-resource-wrong-signature/module.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 world module {
-  resource a
+  resource a;
 }
diff --git a/crates/wit-component/tests/components/error-import-sig-mismatch/module.wit b/crates/wit-component/tests/components/error-import-sig-mismatch/module.wit
index cc3a41c5..092c0788 100644
--- a/crates/wit-component/tests/components/error-import-sig-mismatch/module.wit
+++ b/crates/wit-component/tests/components/error-import-sig-mismatch/module.wit
@@ -2,6 +2,6 @@ package foo:foo
 
 world module {
   import foo: interface {
-    bar: func(s: string)
+    bar: func(s: string);
   }
 }
diff --git a/crates/wit-component/tests/components/error-link-duplicate-symbols/lib-foo.wit b/crates/wit-component/tests/components/error-link-duplicate-symbols/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/error-link-duplicate-symbols/lib-foo.wit
+++ b/crates/wit-component/tests/components/error-link-duplicate-symbols/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/error-link-missing-needed/lib-foo.wit b/crates/wit-component/tests/components/error-link-missing-needed/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/error-link-missing-needed/lib-foo.wit
+++ b/crates/wit-component/tests/components/error-link-missing-needed/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/error-link-missing-symbols/lib-foo.wit b/crates/wit-component/tests/components/error-link-missing-symbols/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/error-link-missing-symbols/lib-foo.wit
+++ b/crates/wit-component/tests/components/error-link-missing-symbols/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/error-missing-default-export/module.wit b/crates/wit-component/tests/components/error-missing-default-export/module.wit
index 4ae9b6cf..05ce617d 100644
--- a/crates/wit-component/tests/components/error-missing-default-export/module.wit
+++ b/crates/wit-component/tests/components/error-missing-default-export/module.wit
@@ -1,4 +1,4 @@
 package foo:foo
 world module {
-  export a: func()
+  export a: func();
 }
diff --git a/crates/wit-component/tests/components/error-missing-export/module.wit b/crates/wit-component/tests/components/error-missing-export/module.wit
index 9ea114f4..e9425172 100644
--- a/crates/wit-component/tests/components/error-missing-export/module.wit
+++ b/crates/wit-component/tests/components/error-missing-export/module.wit
@@ -2,6 +2,6 @@ package foo:foo
 
 world module {
   export foo: interface {
-    a: func()
+    a: func();
   }
 }
diff --git a/crates/wit-component/tests/components/error-missing-import-func/module.wit b/crates/wit-component/tests/components/error-missing-import-func/module.wit
index 38300fed..40a7a903 100644
--- a/crates/wit-component/tests/components/error-missing-import-func/module.wit
+++ b/crates/wit-component/tests/components/error-missing-import-func/module.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface foo {
-  a: func()
+  a: func();
 }
 
 world module {
-  import foo
+  import foo;
 }
diff --git a/crates/wit-component/tests/components/export-interface-using-import/module.wit b/crates/wit-component/tests/components/export-interface-using-import/module.wit
index 4f202a33..fc83a1c7 100644
--- a/crates/wit-component/tests/components/export-interface-using-import/module.wit
+++ b/crates/wit-component/tests/components/export-interface-using-import/module.wit
@@ -12,6 +12,6 @@ interface foo {
 
 world module {
   export x: interface {
-    use foo.{r}
+    use foo.{r};
   }
 }
diff --git a/crates/wit-component/tests/components/export-name-shuffling/module.wit b/crates/wit-component/tests/components/export-name-shuffling/module.wit
index bb6cef41..2ac3826d 100644
--- a/crates/wit-component/tests/components/export-name-shuffling/module.wit
+++ b/crates/wit-component/tests/components/export-name-shuffling/module.wit
@@ -7,11 +7,11 @@ interface name {
 }
 
 world module {
-  export name
+  export name;
 
   export name: interface {
-    use name.{foo}
+    use name.{foo};
 
-    a: func(f: foo)
+    a: func(f: foo);
   }
 }
diff --git a/crates/wit-component/tests/components/export-resource/module.wit b/crates/wit-component/tests/components/export-resource/module.wit
index 1ee91cdc..80725353 100644
--- a/crates/wit-component/tests/components/export-resource/module.wit
+++ b/crates/wit-component/tests/components/export-resource/module.wit
@@ -3,9 +3,9 @@ package foo:bar
 world module {
   export foo: interface {
     resource a {
-      constructor()
+      constructor();
 
-      other-new: static func() -> a
+      other-new: static func() -> a;
     }
   }
 }
diff --git a/crates/wit-component/tests/components/export-type-name-conflict/module.wit b/crates/wit-component/tests/components/export-type-name-conflict/module.wit
index 1bfa1a49..6765b838 100644
--- a/crates/wit-component/tests/components/export-type-name-conflict/module.wit
+++ b/crates/wit-component/tests/components/export-type-name-conflict/module.wit
@@ -8,8 +8,8 @@ interface foo {
 
 world module {
   export bar: interface {
-    use foo.{foo as bar}
+    use foo.{foo as bar};
 
-    foo: func() -> bar
+    foo: func() -> bar;
   }
 }
diff --git a/crates/wit-component/tests/components/export-with-type-alias/module.wit b/crates/wit-component/tests/components/export-with-type-alias/module.wit
index ad5e636c..986120d6 100644
--- a/crates/wit-component/tests/components/export-with-type-alias/module.wit
+++ b/crates/wit-component/tests/components/export-with-type-alias/module.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface foo {
-  type a = u8
-  type b = a
-  c: func(a: a) -> b
+  type a = u8;
+  type b = a;
+  c: func(a: a) -> b;
 }
 
 world module {
-  export foo
+  export foo;
 }
diff --git a/crates/wit-component/tests/components/exports/module.wit b/crates/wit-component/tests/components/exports/module.wit
index 922df002..a4062cb5 100644
--- a/crates/wit-component/tests/components/exports/module.wit
+++ b/crates/wit-component/tests/components/exports/module.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 world module {
-  export a: func()
-  export b: func(a: s8, b: s16, c: s32, d: s64) -> string
-  export c: func() -> tuple<s8, s16, s32, s64>
+  export a: func();
+  export b: func(a: s8, b: s16, c: s32, d: s64) -> string;
+  export c: func() -> tuple<s8, s16, s32, s64>;
 
   export bar: interface {
     flags x {
@@ -12,7 +12,7 @@ world module {
         c
     }
 
-    a: func(x: x)
+    a: func(x: x);
   }
 
   export foo: interface {
@@ -22,8 +22,8 @@ world module {
         c(s64)
     }
 
-    a: func()
-    b: func(x: string) -> x
-    c: func(x: x) -> string
+    a: func();
+    b: func(x: string) -> x;
+    c: func(x: x) -> string;
   }
 }
diff --git a/crates/wit-component/tests/components/import-and-export-resource/module.wit b/crates/wit-component/tests/components/import-and-export-resource/module.wit
index 03e55351..55a93431 100644
--- a/crates/wit-component/tests/components/import-and-export-resource/module.wit
+++ b/crates/wit-component/tests/components/import-and-export-resource/module.wit
@@ -1,12 +1,12 @@
 package foo:bar
 
 interface foo {
-  resource a
+  resource a;
 }
 
 world module {
-  import foo
-  use foo.{a}
+  import foo;
+  use foo.{a};
 
-  export foo
+  export foo;
 }
diff --git a/crates/wit-component/tests/components/import-conflict/module.wit b/crates/wit-component/tests/components/import-conflict/module.wit
index bb1345b3..49ae768d 100644
--- a/crates/wit-component/tests/components/import-conflict/module.wit
+++ b/crates/wit-component/tests/components/import-conflict/module.wit
@@ -1,19 +1,19 @@
 package foo:foo
 
 interface foo {
-  a: func()
+  a: func();
 }
 
 interface bar {
-  a: func(x: u64, y: string)
+  a: func(x: u64, y: string);
 }
 
 interface baz {
-  baz: func(x: list<u8>) -> list<u8>
+  baz: func(x: list<u8>) -> list<u8>;
 }
 
 world module {
-  import bar
-  import baz
-  import foo
+  import bar;
+  import baz;
+  import foo;
 }
diff --git a/crates/wit-component/tests/components/import-export-same-iface-name/deps/dep/foo.wit b/crates/wit-component/tests/components/import-export-same-iface-name/deps/dep/foo.wit
index c315c9fc..d36f7235 100644
--- a/crates/wit-component/tests/components/import-export-same-iface-name/deps/dep/foo.wit
+++ b/crates/wit-component/tests/components/import-export-same-iface-name/deps/dep/foo.wit
@@ -1,5 +1,5 @@
 package foo:dep
 
 interface the-name {
-  a: func()
+  a: func();
 }
diff --git a/crates/wit-component/tests/components/import-export-same-iface-name/module.wit b/crates/wit-component/tests/components/import-export-same-iface-name/module.wit
index ce27d8cb..1b46c164 100644
--- a/crates/wit-component/tests/components/import-export-same-iface-name/module.wit
+++ b/crates/wit-component/tests/components/import-export-same-iface-name/module.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface the-name {
-  a: func()
+  a: func();
 }
 
 world module {
-  import foo:dep/the-name
-  import the-name
-  export the-name
+  import foo:dep/the-name;
+  import the-name;
+  export the-name;
 }
diff --git a/crates/wit-component/tests/components/import-export/module.wit b/crates/wit-component/tests/components/import-export/module.wit
index d90fee1f..92f96bf6 100644
--- a/crates/wit-component/tests/components/import-export/module.wit
+++ b/crates/wit-component/tests/components/import-export/module.wit
@@ -2,13 +2,13 @@ package foo:foo
 
 world module {
   import foo: interface {
-    a: func() -> string
+    a: func() -> string;
   }
 
   export bar: interface {
-    a: func()
-    b: func() -> string
+    a: func();
+    b: func() -> string;
   }
 
-  export a: func(x: string) -> tuple<string, u32, string>
+  export a: func(x: string) -> tuple<string, u32, string>;
 }
diff --git a/crates/wit-component/tests/components/import-in-adapter-and-main-module/adapt-old.wit b/crates/wit-component/tests/components/import-in-adapter-and-main-module/adapt-old.wit
index 904c79ea..c1753320 100644
--- a/crates/wit-component/tests/components/import-in-adapter-and-main-module/adapt-old.wit
+++ b/crates/wit-component/tests/components/import-in-adapter-and-main-module/adapt-old.wit
@@ -1,9 +1,9 @@
 world adapt-old {
-  import foo:shared-dependency/doc
+  import foo:shared-dependency/doc;
 
   import adapter-dep: interface {
-    use foo:shared-dependency/types.{a-typedef}
+    use foo:shared-dependency/types.{a-typedef};
 
-    foo: func() -> a-typedef
+    foo: func() -> a-typedef;
   }
 }
diff --git a/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/doc.wit b/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/doc.wit
index ad3cbdc5..acd02ff1 100644
--- a/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/doc.wit
+++ b/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/doc.wit
@@ -1,13 +1,13 @@
 package foo:shared-dependency
 
 interface doc {
-  f1: func()
-  f2: func()
-  f3: func()
+  f1: func();
+  f2: func();
+  f3: func();
 
-  g1: func() -> string
-  g2: func() -> string
-  g3: func() -> string
+  g1: func() -> string;
+  g2: func() -> string;
+  g3: func() -> string;
 
-  unused-in-adapter: func()
+  unused-in-adapter: func();
 }
diff --git a/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/types.wit b/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/types.wit
index 4119e948..bf42b9e5 100644
--- a/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/types.wit
+++ b/crates/wit-component/tests/components/import-in-adapter-and-main-module/deps/shared-dependency/types.wit
@@ -1,3 +1,3 @@
 interface types {
-  type a-typedef = u32
+  type a-typedef = u32;
 }
diff --git a/crates/wit-component/tests/components/import-in-adapter-and-main-module/module.wit b/crates/wit-component/tests/components/import-in-adapter-and-main-module/module.wit
index 2df745b5..d8dd5083 100644
--- a/crates/wit-component/tests/components/import-in-adapter-and-main-module/module.wit
+++ b/crates/wit-component/tests/components/import-in-adapter-and-main-module/module.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 world module {
-  import foo:shared-dependency/doc
+  import foo:shared-dependency/doc;
 
   import main-dep: interface {
-    use foo:shared-dependency/types.{a-typedef}
+    use foo:shared-dependency/types.{a-typedef};
 
-    foo: func() -> a-typedef
+    foo: func() -> a-typedef;
   }
 }
diff --git a/crates/wit-component/tests/components/import-partial-export-full/module.wit b/crates/wit-component/tests/components/import-partial-export-full/module.wit
index f85121db..eab9e3bd 100644
--- a/crates/wit-component/tests/components/import-partial-export-full/module.wit
+++ b/crates/wit-component/tests/components/import-partial-export-full/module.wit
@@ -12,8 +12,8 @@ interface name {
 }
 
 world module {
-  import name
-  use name.{name}
+  import name;
+  use name.{name};
 
-  export name
+  export name;
 }
diff --git a/crates/wit-component/tests/components/import-resource-in-interface/module.wit b/crates/wit-component/tests/components/import-resource-in-interface/module.wit
index d8f184d4..d912f5b6 100644
--- a/crates/wit-component/tests/components/import-resource-in-interface/module.wit
+++ b/crates/wit-component/tests/components/import-resource-in-interface/module.wit
@@ -3,9 +3,9 @@ package foo:bar
 world module {
   import foo: interface {
     resource a {
-      constructor()
+      constructor();
 
-      other-new: static func() -> a
+      other-new: static func() -> a;
     }
   }
 }
diff --git a/crates/wit-component/tests/components/import-resource-simple/module.wit b/crates/wit-component/tests/components/import-resource-simple/module.wit
index bf927dc0..7cf52a9e 100644
--- a/crates/wit-component/tests/components/import-resource-simple/module.wit
+++ b/crates/wit-component/tests/components/import-resource-simple/module.wit
@@ -2,8 +2,8 @@ package foo:bar
 
 world module {
   resource a {
-    constructor()
+    constructor();
 
-    other-new: static func() -> a
+    other-new: static func() -> a;
   }
 }
diff --git a/crates/wit-component/tests/components/imports/module.wit b/crates/wit-component/tests/components/imports/module.wit
index eedc42c8..984e66c4 100644
--- a/crates/wit-component/tests/components/imports/module.wit
+++ b/crates/wit-component/tests/components/imports/module.wit
@@ -6,23 +6,23 @@ world module {
         a: u8
     }
 
-    bar1: func(x: string)
-    bar2: func(x: x)
+    bar1: func(x: string);
+    bar2: func(x: x);
   }
 
   import baz: interface {
-    type x = s8
+    type x = s8;
 
-    baz1: func(x: list<string>)
-    baz2: func()
-    baz3: func(x: x)
+    baz1: func(x: list<string>);
+    baz2: func();
+    baz3: func(x: x);
   }
 
   import foo: interface {
-    foo1: func()
-    foo2: func(x: u8)
-    foo3: func(x: float32)
-    unused: func()
+    foo1: func();
+    foo2: func(x: u8);
+    foo3: func(x: float32);
+    unused: func();
 
     // doesn't show up in the wit output despite being exported here since it's
     // not actually used by anything
diff --git a/crates/wit-component/tests/components/lift-options/module.wit b/crates/wit-component/tests/components/lift-options/module.wit
index a491d67e..430ed616 100644
--- a/crates/wit-component/tests/components/lift-options/module.wit
+++ b/crates/wit-component/tests/components/lift-options/module.wit
@@ -17,24 +17,24 @@ interface my-default {
       s(u32)
   }
 
-  a: func()
-  b: func(x: list<string>)
-  c: func(x: r)
-  d: func(x: v)
-  e: func(x: r-no-string)
-  f: func(x: v-no-string)
-  g: func(x: list<r>)
-  h: func(x: list<v>)
-  i: func(x: list<u32>)
-  j: func(x: u32)
-  k: func() -> tuple<u32, u32>
-  l: func() -> string
-  m: func() -> list<u32>
-  n: func() -> u32
-  o: func() -> v
-  p: func() -> list<v-no-string>
+  a: func();
+  b: func(x: list<string>);
+  c: func(x: r);
+  d: func(x: v);
+  e: func(x: r-no-string);
+  f: func(x: v-no-string);
+  g: func(x: list<r>);
+  h: func(x: list<v>);
+  i: func(x: list<u32>);
+  j: func(x: u32);
+  k: func() -> tuple<u32, u32>;
+  l: func() -> string;
+  m: func() -> list<u32>;
+  n: func() -> u32;
+  o: func() -> v;
+  p: func() -> list<v-no-string>;
 }
 
 world module {
-  export my-default
+  export my-default;
 }
diff --git a/crates/wit-component/tests/components/link-bare-funcs/lib-foo.wit b/crates/wit-component/tests/components/link-bare-funcs/lib-foo.wit
index acf258e5..411d20f9 100644
--- a/crates/wit-component/tests/components/link-bare-funcs/lib-foo.wit
+++ b/crates/wit-component/tests/components/link-bare-funcs/lib-foo.wit
@@ -1,7 +1,7 @@
 package test:test
 world lib-foo {
-  import foo1: func()
-  import bar: func() -> string
-  export baz: func()
-  export foo2: func(x: string) -> option<list<u8>>
+  import foo1: func();
+  import bar: func() -> string;
+  export baz: func();
+  export foo2: func(x: string) -> option<list<u8>>;
 }
diff --git a/crates/wit-component/tests/components/link-circular/lib-foo.wit b/crates/wit-component/tests/components/link-circular/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/link-circular/lib-foo.wit
+++ b/crates/wit-component/tests/components/link-circular/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/link-dl-openable/dlopen-lib-foo.wit b/crates/wit-component/tests/components/link-dl-openable/dlopen-lib-foo.wit
index 84c5de2b..c8e34b36 100644
--- a/crates/wit-component/tests/components/link-dl-openable/dlopen-lib-foo.wit
+++ b/crates/wit-component/tests/components/link-dl-openable/dlopen-lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world dlopen-lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/link-got-func/lib-foo.wit b/crates/wit-component/tests/components/link-got-func/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/link-got-func/lib-foo.wit
+++ b/crates/wit-component/tests/components/link-got-func/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/link-stubs/lib-foo.wit b/crates/wit-component/tests/components/link-stubs/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/link-stubs/lib-foo.wit
+++ b/crates/wit-component/tests/components/link-stubs/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/link-weak-import/lib-foo.wit b/crates/wit-component/tests/components/link-weak-import/lib-foo.wit
index aa6fced0..38e89df9 100644
--- a/crates/wit-component/tests/components/link-weak-import/lib-foo.wit
+++ b/crates/wit-component/tests/components/link-weak-import/lib-foo.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   foo: func(v: s32) -> s32
+   foo: func(v: s32) -> s32;
 }
 
 world lib-foo {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/link/lib-bar.wit b/crates/wit-component/tests/components/link/lib-bar.wit
index 065f4240..021f0115 100644
--- a/crates/wit-component/tests/components/link/lib-bar.wit
+++ b/crates/wit-component/tests/components/link/lib-bar.wit
@@ -1,10 +1,10 @@
 package test:test
 
 interface test {
-   bar: func(v: s32) -> s32
+   bar: func(v: s32) -> s32;
 }
 
 world lib-bar {
-    import test
-    export test
+    import test;
+    export test;
 }
diff --git a/crates/wit-component/tests/components/live-exports-dead-imports/module.wit b/crates/wit-component/tests/components/live-exports-dead-imports/module.wit
index edbfe333..449fcb38 100644
--- a/crates/wit-component/tests/components/live-exports-dead-imports/module.wit
+++ b/crates/wit-component/tests/components/live-exports-dead-imports/module.wit
@@ -2,11 +2,11 @@ package foo:foo
 
 interface a {
   resource r {
-    constructor()
+    constructor();
   }
 }
 
 world module {
-  import a
-  export a
+  import a;
+  export a;
 }
diff --git a/crates/wit-component/tests/components/lower-options/module.wit b/crates/wit-component/tests/components/lower-options/module.wit
index f39ea6b6..d5136341 100644
--- a/crates/wit-component/tests/components/lower-options/module.wit
+++ b/crates/wit-component/tests/components/lower-options/module.wit
@@ -17,24 +17,24 @@ interface foo {
       s(u32)
   }
 
-  a: func()
-  b: func(x: list<string>)
-  c: func(x: r)
-  d: func(x: v)
-  e: func(x: r-no-string)
-  f: func(x: v-no-string)
-  g: func(x: list<r>)
-  h: func(x: list<v>)
-  i: func(x: list<u32>)
-  j: func(x: u32)
-  k: func() -> tuple<u32, u32>
-  l: func() -> string
-  m: func() -> list<u32>
-  n: func() -> u32
-  o: func() -> v
-  p: func() -> list<v-no-string>
+  a: func();
+  b: func(x: list<string>);
+  c: func(x: r);
+  d: func(x: v);
+  e: func(x: r-no-string);
+  f: func(x: v-no-string);
+  g: func(x: list<r>);
+  h: func(x: list<v>);
+  i: func(x: list<u32>);
+  j: func(x: u32);
+  k: func() -> tuple<u32, u32>;
+  l: func() -> string;
+  m: func() -> list<u32>;
+  n: func() -> u32;
+  o: func() -> v;
+  p: func() -> list<v-no-string>;
 }
 
 world module {
-  import foo
+  import foo;
 }
diff --git a/crates/wit-component/tests/components/many-same-names/module.wit b/crates/wit-component/tests/components/many-same-names/module.wit
index 36cab31a..f666247b 100644
--- a/crates/wit-component/tests/components/many-same-names/module.wit
+++ b/crates/wit-component/tests/components/many-same-names/module.wit
@@ -11,11 +11,11 @@ interface name {
 }
 
 world module {
-  import name
-  export name
+  import name;
+  export name;
 
   export name: interface {
-    use name.{r2}
-    a: func()
+    use name.{r2};
+    a: func();
   }
 }
diff --git a/crates/wit-component/tests/components/no-realloc-required/module.wit b/crates/wit-component/tests/components/no-realloc-required/module.wit
index 5c8d4124..8d025350 100644
--- a/crates/wit-component/tests/components/no-realloc-required/module.wit
+++ b/crates/wit-component/tests/components/no-realloc-required/module.wit
@@ -2,6 +2,6 @@ package foo:foo
 
 world module {
   import foo: interface {
-    log: func(s: string)
+    log: func(s: string);
   }
 }
diff --git a/crates/wit-component/tests/components/post-return/module.wit b/crates/wit-component/tests/components/post-return/module.wit
index 0d0580fa..ab6cd338 100644
--- a/crates/wit-component/tests/components/post-return/module.wit
+++ b/crates/wit-component/tests/components/post-return/module.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world module {
-  export a: func() -> string
+  export a: func() -> string;
 }
diff --git a/crates/wit-component/tests/components/rename-import-interface/module.wit b/crates/wit-component/tests/components/rename-import-interface/module.wit
index fc1e9373..6959e22b 100644
--- a/crates/wit-component/tests/components/rename-import-interface/module.wit
+++ b/crates/wit-component/tests/components/rename-import-interface/module.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface foo {
-  the-func: func()
+  the-func: func();
 }
 
 world module {
-  import foo
+  import foo;
 }
diff --git a/crates/wit-component/tests/components/rename-interface/module.wit b/crates/wit-component/tests/components/rename-interface/module.wit
index fb54dda2..4a3a6410 100644
--- a/crates/wit-component/tests/components/rename-interface/module.wit
+++ b/crates/wit-component/tests/components/rename-interface/module.wit
@@ -5,14 +5,14 @@ interface foo {
     f: u8,
   }
 
-  a: func() -> bar
+  a: func() -> bar;
 }
 
 world module {
-  import foo
+  import foo;
   import other-name: interface {
-    use foo.{bar}
+    use foo.{bar};
 
-    a: func() -> bar
+    a: func() -> bar;
   }
 }
diff --git a/crates/wit-component/tests/components/resource-intrinsics-with-just-import/module.wit b/crates/wit-component/tests/components/resource-intrinsics-with-just-import/module.wit
index 850aec0a..046b0699 100644
--- a/crates/wit-component/tests/components/resource-intrinsics-with-just-import/module.wit
+++ b/crates/wit-component/tests/components/resource-intrinsics-with-just-import/module.wit
@@ -2,6 +2,6 @@ package foo:bar
 
 world module {
   import foo: interface {
-    resource a
+    resource a;
   }
 }
diff --git a/crates/wit-component/tests/components/resource-used-through-import/module.wit b/crates/wit-component/tests/components/resource-used-through-import/module.wit
index 789eeee3..fdbf6261 100644
--- a/crates/wit-component/tests/components/resource-used-through-import/module.wit
+++ b/crates/wit-component/tests/components/resource-used-through-import/module.wit
@@ -1,13 +1,13 @@
 package foo:bar
 
 interface a {
-  resource r
+  resource r;
 }
 
 world module {
   export b: interface {
-    use a.{r}
+    use a.{r};
 
-    foo: func() -> r
+    foo: func() -> r;
   }
 }
diff --git a/crates/wit-component/tests/components/resource-using-export/module.wit b/crates/wit-component/tests/components/resource-using-export/module.wit
index de8c41bf..93e84670 100644
--- a/crates/wit-component/tests/components/resource-using-export/module.wit
+++ b/crates/wit-component/tests/components/resource-using-export/module.wit
@@ -1,16 +1,16 @@
 package foo:bar
 
 interface foo {
-  resource r
+  resource r;
 
-  type handle = own<r>
+  type handle = own<r>;
 }
 
 world module {
-  export foo
+  export foo;
   export anon: interface {
-    use foo.{handle}
-    f: func() -> handle
+    use foo.{handle};
+    f: func() -> handle;
   }
 }
 
diff --git a/crates/wit-component/tests/components/simple/module.wit b/crates/wit-component/tests/components/simple/module.wit
index 38d41e86..bf0ad3f7 100644
--- a/crates/wit-component/tests/components/simple/module.wit
+++ b/crates/wit-component/tests/components/simple/module.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
 world module {
-  export a: func()
-  export b: func() -> string
-  export c: func(x: string) -> string
+  export a: func();
+  export b: func() -> string;
+  export c: func(x: string) -> string;
 }
diff --git a/crates/wit-component/tests/components/tricky-order/module.wit b/crates/wit-component/tests/components/tricky-order/module.wit
index 2abf9b64..54e4abec 100644
--- a/crates/wit-component/tests/components/tricky-order/module.wit
+++ b/crates/wit-component/tests/components/tricky-order/module.wit
@@ -7,14 +7,14 @@ interface name1 {
 }
 
 interface name2 {
-  use name1.{name}
+  use name1.{name};
 }
 
 world module {
-  import name1
-  import name2
+  import name1;
+  import name2;
   export name: interface {
-    use name1.{name}
-    use name2.{name as name1}
+    use name1.{name};
+    use name2.{name as name1};
   }
 }
diff --git a/crates/wit-component/tests/components/tricky-resources/module.wit b/crates/wit-component/tests/components/tricky-resources/module.wit
index c6e16e3d..0a057e3f 100644
--- a/crates/wit-component/tests/components/tricky-resources/module.wit
+++ b/crates/wit-component/tests/components/tricky-resources/module.wit
@@ -1,19 +1,19 @@
 package foo:bar
 
 interface a {
-  resource r
+  resource r;
 }
 
 interface b {
-  use a.{r}
+  use a.{r};
 }
 
 world module {
-  export b
+  export b;
   export some-name: interface {
-    use b.{r}
+    use b.{r};
 
-    f: func() -> r
+    f: func() -> r;
   }
-  export a
+  export a;
 }
diff --git a/crates/wit-component/tests/components/tricky-resources2/module.wit b/crates/wit-component/tests/components/tricky-resources2/module.wit
index 90519061..443b3bec 100644
--- a/crates/wit-component/tests/components/tricky-resources2/module.wit
+++ b/crates/wit-component/tests/components/tricky-resources2/module.wit
@@ -1,14 +1,14 @@
 package foo:bar
 
 interface a {
-  resource r
+  resource r;
 }
 
 world module {
   export anon: interface {
-    use a.{r}
+    use a.{r};
 
-    foo: func() -> r
+    foo: func() -> r;
   }
-  export a
+  export a;
 }
diff --git a/crates/wit-component/tests/components/tricky-resources3/module.wit b/crates/wit-component/tests/components/tricky-resources3/module.wit
index 23fd7ce8..483accff 100644
--- a/crates/wit-component/tests/components/tricky-resources3/module.wit
+++ b/crates/wit-component/tests/components/tricky-resources3/module.wit
@@ -1,17 +1,17 @@
 package foo:bar
 
 interface foo {
-  resource name
+  resource name;
 }
 
 interface name {
-  use foo.{name}
+  use foo.{name};
 }
 
 world module {
-  export foo
-  export name
+  export foo;
+  export name;
   export name: interface {
-    use name.{name}
+    use name.{name};
   }
 }
diff --git a/crates/wit-component/tests/components/tricky-resources4/module.wit b/crates/wit-component/tests/components/tricky-resources4/module.wit
index 5dbeb191..080e43ab 100644
--- a/crates/wit-component/tests/components/tricky-resources4/module.wit
+++ b/crates/wit-component/tests/components/tricky-resources4/module.wit
@@ -1,16 +1,16 @@
 package foo:bar
 
 interface name {
-  resource name
+  resource name;
 
-  type handle = name
+  type handle = name;
 
-  foo: func() -> handle
+  foo: func() -> handle;
 }
 
 world module {
-  export name
+  export name;
   export name: interface {
-    use name.{handle}
+    use name.{handle};
   }
 }
diff --git a/crates/wit-component/tests/components/unused-import/module.wit b/crates/wit-component/tests/components/unused-import/module.wit
index 770ec45c..d7e956c8 100644
--- a/crates/wit-component/tests/components/unused-import/module.wit
+++ b/crates/wit-component/tests/components/unused-import/module.wit
@@ -3,10 +3,10 @@ package foo:foo
 interface bar {}
 
 interface foo {
-  name: func(x: bool)
+  name: func(x: bool);
 }
 
 world module {
-  import bar // unused
-  import foo
+  import bar; // unused
+  import foo;
 }
diff --git a/crates/wit-component/tests/components/worlds-with-type-renamings/module.wit b/crates/wit-component/tests/components/worlds-with-type-renamings/module.wit
index 8226c89b..3efe949f 100644
--- a/crates/wit-component/tests/components/worlds-with-type-renamings/module.wit
+++ b/crates/wit-component/tests/components/worlds-with-type-renamings/module.wit
@@ -5,13 +5,13 @@ interface i {
     f: u8,
   }
 
-  the-func: func() -> some-type
+  the-func: func() -> some-type;
 }
 
 
 world module {
-  use i.{some-type as other-name}
+  use i.{some-type as other-name};
 
-  import i
-  export i
+  import i;
+  export i;
 }
diff --git a/crates/wit-component/tests/components/worlds-with-types/module.wit b/crates/wit-component/tests/components/worlds-with-types/module.wit
index 44177ec9..8c0fd863 100644
--- a/crates/wit-component/tests/components/worlds-with-types/module.wit
+++ b/crates/wit-component/tests/components/worlds-with-types/module.wit
@@ -1,10 +1,10 @@
 package foo:foo
 
 world module {
-  type t = u32
+  type t = u32;
   record r {
     x: t
   }
 
-  export a: func(r: r) -> t
+  export a: func(r: r) -> t;
 }
diff --git a/crates/wit-component/tests/interfaces/console.wit b/crates/wit-component/tests/interfaces/console.wit
index 655e2517..1c6cbe79 100644
--- a/crates/wit-component/tests/interfaces/console.wit
+++ b/crates/wit-component/tests/interfaces/console.wit
@@ -1,5 +1,5 @@
 package foo:console
 
 interface console {
-  log: func(arg: string)
+  log: func(arg: string);
 }
diff --git a/crates/wit-component/tests/interfaces/diamond-disambiguate/join.wit b/crates/wit-component/tests/interfaces/diamond-disambiguate/join.wit
index 3fe026c2..bde25922 100644
--- a/crates/wit-component/tests/interfaces/diamond-disambiguate/join.wit
+++ b/crates/wit-component/tests/interfaces/diamond-disambiguate/join.wit
@@ -2,9 +2,9 @@ package foo:foo
 
 world w1 {
   import foo: interface {
-    use shared1.{t1}
+    use shared1.{t1};
   }
   import bar: interface {
-    use shared2.{t2}
+    use shared2.{t2};
   }
 }
diff --git a/crates/wit-component/tests/interfaces/diamond-disambiguate/shared1.wit b/crates/wit-component/tests/interfaces/diamond-disambiguate/shared1.wit
index e376a9a6..2cc83253 100644
--- a/crates/wit-component/tests/interfaces/diamond-disambiguate/shared1.wit
+++ b/crates/wit-component/tests/interfaces/diamond-disambiguate/shared1.wit
@@ -1,3 +1,3 @@
 interface shared1 {
-  type t1 = u8
+  type t1 = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/diamond-disambiguate/shared2.wit b/crates/wit-component/tests/interfaces/diamond-disambiguate/shared2.wit
index 0b6e9c84..bd42d792 100644
--- a/crates/wit-component/tests/interfaces/diamond-disambiguate/shared2.wit
+++ b/crates/wit-component/tests/interfaces/diamond-disambiguate/shared2.wit
@@ -1,3 +1,3 @@
 interface shared2 {
-  type t2 = u8
+  type t2 = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/diamond.wit b/crates/wit-component/tests/interfaces/diamond.wit
index f9312951..17f8efbb 100644
--- a/crates/wit-component/tests/interfaces/diamond.wit
+++ b/crates/wit-component/tests/interfaces/diamond.wit
@@ -8,24 +8,24 @@ interface shared-items {
 
 world w1 {
   import foo: interface {
-    use shared-items.{the-enum}
+    use shared-items.{the-enum};
   }
   import bar: interface {
-    use shared-items.{the-enum}
+    use shared-items.{the-enum};
   }
 }
 
 world w2 {
   import foo: interface {
-    use shared-items.{the-enum}
+    use shared-items.{the-enum};
   }
   export bar: interface {
-    use shared-items.{the-enum}
+    use shared-items.{the-enum};
   }
 }
 
 world w3 {
   export bar: interface {
-    use shared-items.{the-enum}
+    use shared-items.{the-enum};
   }
 }
diff --git a/crates/wit-component/tests/interfaces/doc-comments/foo.wit b/crates/wit-component/tests/interfaces/doc-comments/foo.wit
index 0ce880a9..c1ac4d6b 100644
--- a/crates/wit-component/tests/interfaces/doc-comments/foo.wit
+++ b/crates/wit-component/tests/interfaces/doc-comments/foo.wit
@@ -4,7 +4,7 @@ package foo:foo
 /// interface docs
 interface coverage-iface {
   /// basic typedef docs
-  type t = u32
+  type t = u32;
 
   /// record typedef docs
   record r {
@@ -33,35 +33,35 @@ interface coverage-iface {
 
   resource res {
     /// constructor docs
-    constructor()
+    constructor();
     /// method docs
-    m: func()
+    m: func();
     /// static func docs
-    s: static func()
+    s: static func();
   }
 
   /// interface func docs
-  f: func()
+  f: func();
 }
 
 /// world docs
 world coverage-world {
   /// world func import docs
-  import imp: func()
+  import imp: func();
 
   /// world typedef docs
-  type t = u32
+  type t = u32;
 
   /// world inline interface docs
   export i: interface {
     /// inline interface typedef docs
-    type t = u32
+    type t = u32;
 
     /// inline interface func docs
-    f: func()
+    f: func();
   }
   /// world func export docs
-  export exp: func()
+  export exp: func();
 }
 
 /** other comment forms
@@ -70,10 +70,10 @@ interface other-comment-forms {
   /// one doc line
   // non-doc in the middle
   /// another doc line
-  multiple-lines-split: func()
+  multiple-lines-split: func();
 
   /// mixed forms; line doc
   /** plus block doc
       multi-line */
-  mixed-forms: func()
-}
\ No newline at end of file
+  mixed-forms: func();
+}
diff --git a/crates/wit-component/tests/interfaces/empty.wit b/crates/wit-component/tests/interfaces/empty.wit
index fce4c42d..e8739065 100644
--- a/crates/wit-component/tests/interfaces/empty.wit
+++ b/crates/wit-component/tests/interfaces/empty.wit
@@ -3,9 +3,9 @@ package foo:empty
 interface empty {}
 
 world empty-world {
-  import empty
+  import empty;
   import empty: interface {}
-  export empty
+  export empty;
   export empty2: interface {}
 }
 
diff --git a/crates/wit-component/tests/interfaces/export-other-packages-interface/deps/the-dep/the-doc.wit b/crates/wit-component/tests/interfaces/export-other-packages-interface/deps/the-dep/the-doc.wit
index a95f6a37..d107c858 100644
--- a/crates/wit-component/tests/interfaces/export-other-packages-interface/deps/the-dep/the-doc.wit
+++ b/crates/wit-component/tests/interfaces/export-other-packages-interface/deps/the-dep/the-doc.wit
@@ -1,9 +1,9 @@
 package foo:the-dep
 
 interface the-interface {
-  type t = u8
+  type t = u8;
 }
 
 interface unused-interface {
-  type u = u32
+  type u = u32;
 }
diff --git a/crates/wit-component/tests/interfaces/export-other-packages-interface/foo.wit b/crates/wit-component/tests/interfaces/export-other-packages-interface/foo.wit
index 63721d40..f25eaa68 100644
--- a/crates/wit-component/tests/interfaces/export-other-packages-interface/foo.wit
+++ b/crates/wit-component/tests/interfaces/export-other-packages-interface/foo.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  export foo:the-dep/the-interface
+  export foo:the-dep/the-interface;
 }
diff --git a/crates/wit-component/tests/interfaces/exports.wit b/crates/wit-component/tests/interfaces/exports.wit
index 542abad8..fb225b1c 100644
--- a/crates/wit-component/tests/interfaces/exports.wit
+++ b/crates/wit-component/tests/interfaces/exports.wit
@@ -5,9 +5,9 @@ interface foo {
     a: u32,
   }
 
-  my-function: func(a: my-struct) -> string
+  my-function: func(a: my-struct) -> string;
 }
 
 world export-foo {
-  export foo
+  export foo;
 }
diff --git a/crates/wit-component/tests/interfaces/flags.wit b/crates/wit-component/tests/interfaces/flags.wit
index 6f23fdd3..229040ca 100644
--- a/crates/wit-component/tests/interfaces/flags.wit
+++ b/crates/wit-component/tests/interfaces/flags.wit
@@ -149,21 +149,21 @@ interface imports {
     b63,
   }
 
-  roundtrip-flag1: func(x: flag1) -> flag1
+  roundtrip-flag1: func(x: flag1) -> flag1;
 
-  roundtrip-flag2: func(x: flag2) -> flag2
+  roundtrip-flag2: func(x: flag2) -> flag2;
 
-  roundtrip-flag4: func(x: flag4) -> flag4
+  roundtrip-flag4: func(x: flag4) -> flag4;
 
-  roundtrip-flag8: func(x: flag8) -> flag8
+  roundtrip-flag8: func(x: flag8) -> flag8;
 
-  roundtrip-flag16: func(x: flag16) -> flag16
+  roundtrip-flag16: func(x: flag16) -> flag16;
 
-  roundtrip-flag32: func(x: flag32) -> flag32
+  roundtrip-flag32: func(x: flag32) -> flag32;
 
-  roundtrip-flag64: func(x: flag64) -> flag64
+  roundtrip-flag64: func(x: flag64) -> flag64;
 }
 
 world flags-world {
-  import imports
+  import imports;
 }
diff --git a/crates/wit-component/tests/interfaces/floats.wit b/crates/wit-component/tests/interfaces/floats.wit
index 53618a77..40b9b13f 100644
--- a/crates/wit-component/tests/interfaces/floats.wit
+++ b/crates/wit-component/tests/interfaces/floats.wit
@@ -1,12 +1,12 @@
 package foo:floats
 
 interface floats {
-  float32-param: func(x: float32)
-  float64-param: func(x: float64)
-  float32-result: func() -> float32
-  float64-result: func() -> float64
+  float32-param: func(x: float32);
+  float64-param: func(x: float64);
+  float32-result: func() -> float32;
+  float64-result: func() -> float64;
 }
 
 world floats-world {
-  import floats
+  import floats;
 }
diff --git a/crates/wit-component/tests/interfaces/foreign-use-chain/deps/bar/bar.wit b/crates/wit-component/tests/interfaces/foreign-use-chain/deps/bar/bar.wit
index 896c8d9d..ad6fb099 100644
--- a/crates/wit-component/tests/interfaces/foreign-use-chain/deps/bar/bar.wit
+++ b/crates/wit-component/tests/interfaces/foreign-use-chain/deps/bar/bar.wit
@@ -1,9 +1,9 @@
 package foo:bar
 
 interface bar {
-  use the-interface.{the-type as bar}
+  use the-interface.{the-type as bar};
 }
 
 interface the-interface {
-  type the-type = u8
+  type the-type = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/foreign-use-chain/foo.wit b/crates/wit-component/tests/interfaces/foreign-use-chain/foo.wit
index 74225fc2..461bcaf9 100644
--- a/crates/wit-component/tests/interfaces/foreign-use-chain/foo.wit
+++ b/crates/wit-component/tests/interfaces/foreign-use-chain/foo.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  import foo:bar/bar
+  import foo:bar/bar;
 }
diff --git a/crates/wit-component/tests/interfaces/import-and-export.wit b/crates/wit-component/tests/interfaces/import-and-export.wit
index 3aabe670..ea2aa1be 100644
--- a/crates/wit-component/tests/interfaces/import-and-export.wit
+++ b/crates/wit-component/tests/interfaces/import-and-export.wit
@@ -1,14 +1,14 @@
 package foo:foo
 
 interface foo {
-  foo: func()
+  foo: func();
 }
 
 interface bar {
-  bar: func()
+  bar: func();
 }
 
 world import-and-export {
-  import foo
-  export bar
+  import foo;
+  export bar;
 }
diff --git a/crates/wit-component/tests/interfaces/integers.wit b/crates/wit-component/tests/interfaces/integers.wit
index 47b04b7d..91452f8b 100644
--- a/crates/wit-component/tests/interfaces/integers.wit
+++ b/crates/wit-component/tests/interfaces/integers.wit
@@ -1,27 +1,27 @@
 package foo:foo
 
 interface integers {
-  a1: func(x: u8)
-  a2: func(x: s8)
-  a3: func(x: u16)
-  a4: func(x: s16)
-  a5: func(x: u32)
-  a6: func(x: s32)
-  a7: func(x: u64)
-  a8: func(x: s64)
-  a9: func(p1: u8, p2: s8, p3: u16, p4: s16, p5: u32, p6: s32, p7: u64, p8: s64)
-  r1: func() -> u8
-  r2: func() -> s8
-  r3: func() -> u16
-  r4: func() -> s16
-  r5: func() -> u32
-  r6: func() -> s32
-  r7: func() -> u64
-  r8: func() -> s64
-  pair-ret: func() -> tuple<s64, u8>
-  multi-ret: func() -> (a: s64, b: u8)
+  a1: func(x: u8);
+  a2: func(x: s8);
+  a3: func(x: u16);
+  a4: func(x: s16);
+  a5: func(x: u32);
+  a6: func(x: s32);
+  a7: func(x: u64);
+  a8: func(x: s64);
+  a9: func(p1: u8, p2: s8, p3: u16, p4: s16, p5: u32, p6: s32, p7: u64, p8: s64);
+  r1: func() -> u8;
+  r2: func() -> s8;
+  r3: func() -> u16;
+  r4: func() -> s16;
+  r5: func() -> u32;
+  r6: func() -> s32;
+  r7: func() -> u64;
+  r8: func() -> s64;
+  pair-ret: func() -> tuple<s64, u8>;
+  multi-ret: func() -> (a: s64, b: u8);
 }
 
 world integers-world {
-  import integers
+  import integers;
 }
diff --git a/crates/wit-component/tests/interfaces/lists.wit b/crates/wit-component/tests/interfaces/lists.wit
index c6dfa146..20660c6d 100644
--- a/crates/wit-component/tests/interfaces/lists.wit
+++ b/crates/wit-component/tests/interfaces/lists.wit
@@ -32,65 +32,65 @@ interface lists {
     d(list<other-variant>),
   }
 
-  type load-store-all-sizes = list<tuple<string, u8, s8, u16, s16, u32, s32, u64, s64, float32, float64, char>>
+  type load-store-all-sizes = list<tuple<string, u8, s8, u16, s16, u32, s32, u64, s64, float32, float64, char>>;
 
-  list-u8-param: func(x: list<u8>)
+  list-u8-param: func(x: list<u8>);
 
-  list-u16-param: func(x: list<u16>)
+  list-u16-param: func(x: list<u16>);
 
-  list-u32-param: func(x: list<u32>)
+  list-u32-param: func(x: list<u32>);
 
-  list-u64-param: func(x: list<u64>)
+  list-u64-param: func(x: list<u64>);
 
-  list-s8-param: func(x: list<s8>)
+  list-s8-param: func(x: list<s8>);
 
-  list-s16-param: func(x: list<s16>)
+  list-s16-param: func(x: list<s16>);
 
-  list-s32-param: func(x: list<s32>)
+  list-s32-param: func(x: list<s32>);
 
-  list-s64-param: func(x: list<s64>)
+  list-s64-param: func(x: list<s64>);
 
-  list-float32-param: func(x: list<float32>)
+  list-float32-param: func(x: list<float32>);
 
-  list-float64-param: func(x: list<float64>)
+  list-float64-param: func(x: list<float64>);
 
-  list-u8-ret: func() -> list<u8>
+  list-u8-ret: func() -> list<u8>;
 
-  list-u16-ret: func() -> list<u16>
+  list-u16-ret: func() -> list<u16>;
 
-  list-u32-ret: func() -> list<u32>
+  list-u32-ret: func() -> list<u32>;
 
-  list-u64-ret: func() -> list<u64>
+  list-u64-ret: func() -> list<u64>;
 
-  list-s8-ret: func() -> list<s8>
+  list-s8-ret: func() -> list<s8>;
 
-  list-s16-ret: func() -> list<s16>
+  list-s16-ret: func() -> list<s16>;
 
-  list-s32-ret: func() -> list<s32>
+  list-s32-ret: func() -> list<s32>;
 
-  list-s64-ret: func() -> list<s64>
+  list-s64-ret: func() -> list<s64>;
 
-  list-float32-ret: func() -> list<float32>
+  list-float32-ret: func() -> list<float32>;
 
-  list-float64-ret: func() -> list<float64>
+  list-float64-ret: func() -> list<float64>;
 
-  tuple-list: func(x: list<tuple<u8, s8>>) -> list<tuple<s64, u32>>
+  tuple-list: func(x: list<tuple<u8, s8>>) -> list<tuple<s64, u32>>;
 
-  string-list-arg: func(a: list<string>)
+  string-list-arg: func(a: list<string>);
 
-  string-list-ret: func() -> list<string>
+  string-list-ret: func() -> list<string>;
 
-  tuple-string-list: func(x: list<tuple<u8, string>>) -> list<tuple<string, u8>>
+  tuple-string-list: func(x: list<tuple<u8, string>>) -> list<tuple<string, u8>>;
 
-  string-list: func(x: list<string>) -> list<string>
+  string-list: func(x: list<string>) -> list<string>;
 
-  record-list: func(x: list<some-record>) -> list<other-record>
+  record-list: func(x: list<some-record>) -> list<other-record>;
 
-  variant-list: func(x: list<some-variant>) -> list<other-variant>
+  variant-list: func(x: list<some-variant>) -> list<other-variant>;
 
-  load-store-everything: func(a: load-store-all-sizes) -> load-store-all-sizes
+  load-store-everything: func(a: load-store-all-sizes) -> load-store-all-sizes;
 }
 
 world lists-world {
-  import lists
+  import lists;
 }
diff --git a/crates/wit-component/tests/interfaces/multi-doc/a.wit b/crates/wit-component/tests/interfaces/multi-doc/a.wit
index c0f959e3..1d4b5b2d 100644
--- a/crates/wit-component/tests/interfaces/multi-doc/a.wit
+++ b/crates/wit-component/tests/interfaces/multi-doc/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  use b.{the-type}
+  use b.{the-type};
 }
 
 interface b2 {
-  use b.{the-type}
+  use b.{the-type};
 }
diff --git a/crates/wit-component/tests/interfaces/multi-doc/b.wit b/crates/wit-component/tests/interfaces/multi-doc/b.wit
index 3ff42d54..d6693945 100644
--- a/crates/wit-component/tests/interfaces/multi-doc/b.wit
+++ b/crates/wit-component/tests/interfaces/multi-doc/b.wit
@@ -1,5 +1,5 @@
 interface a2 {
-  use b.{the-type}
+  use b.{the-type};
 }
 
 interface b {
diff --git a/crates/wit-component/tests/interfaces/multiple-use.wit b/crates/wit-component/tests/interfaces/multiple-use.wit
index 33635dc5..2a56377e 100644
--- a/crates/wit-component/tests/interfaces/multiple-use.wit
+++ b/crates/wit-component/tests/interfaces/multiple-use.wit
@@ -1,16 +1,16 @@
 package foo:multiuse
 
 interface foo {
-  type t1 = u8
-  type t2 = u8
+  type t1 = u8;
+  type t2 = u8;
 }
 
 interface bar {
-  type u = u8
+  type u = u8;
 }
 
 interface baz {
-  use foo.{t1}
-  use bar.{u}
-  use foo.{t2}
+  use foo.{t1};
+  use bar.{u};
+  use foo.{t2};
 }
diff --git a/crates/wit-component/tests/interfaces/pkg-use-chain/def.wit b/crates/wit-component/tests/interfaces/pkg-use-chain/def.wit
index f8276c38..2956f774 100644
--- a/crates/wit-component/tests/interfaces/pkg-use-chain/def.wit
+++ b/crates/wit-component/tests/interfaces/pkg-use-chain/def.wit
@@ -1,7 +1,7 @@
 package foo:chain
 
 interface def {
-  use a.{a}
+  use a.{a};
 
   enum name {
     other,
@@ -9,5 +9,5 @@ interface def {
 }
 
 interface a {
-  type a = u8
+  type a = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/pkg-use-chain/the-use.wit b/crates/wit-component/tests/interfaces/pkg-use-chain/the-use.wit
index 9fb7322f..6550771a 100644
--- a/crates/wit-component/tests/interfaces/pkg-use-chain/the-use.wit
+++ b/crates/wit-component/tests/interfaces/pkg-use-chain/the-use.wit
@@ -1,5 +1,5 @@
 package foo:chain
 
 interface foo {
-  use def.{name}
+  use def.{name};
 }
diff --git a/crates/wit-component/tests/interfaces/pkg-use-chain2/bar.wit b/crates/wit-component/tests/interfaces/pkg-use-chain2/bar.wit
index 9eb320a4..c8246fbf 100644
--- a/crates/wit-component/tests/interfaces/pkg-use-chain2/bar.wit
+++ b/crates/wit-component/tests/interfaces/pkg-use-chain2/bar.wit
@@ -1,5 +1,5 @@
 interface bar {
-  use other.{name as the-name}
+  use other.{name as the-name};
 
   enum name {
     a
diff --git a/crates/wit-component/tests/interfaces/pkg-use-chain2/foo.wit b/crates/wit-component/tests/interfaces/pkg-use-chain2/foo.wit
index f4903f12..8022df19 100644
--- a/crates/wit-component/tests/interfaces/pkg-use-chain2/foo.wit
+++ b/crates/wit-component/tests/interfaces/pkg-use-chain2/foo.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  use bar.{the-name}
+  use bar.{the-name};
 }
diff --git a/crates/wit-component/tests/interfaces/preserve-dep-type-order/foo.wit b/crates/wit-component/tests/interfaces/preserve-dep-type-order/foo.wit
index eafc1919..698ebd12 100644
--- a/crates/wit-component/tests/interfaces/preserve-dep-type-order/foo.wit
+++ b/crates/wit-component/tests/interfaces/preserve-dep-type-order/foo.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface foo {
-  use foo:dep/foo.{ty}
+  use foo:dep/foo.{ty};
 }
 
 world bar {
-  import foo:dep/foo
+  import foo:dep/foo;
 }
diff --git a/crates/wit-component/tests/interfaces/preserve-foreign-reexport/deps/my-dep/my-doc.wit b/crates/wit-component/tests/interfaces/preserve-foreign-reexport/deps/my-dep/my-doc.wit
index ecc89484..3c5e8206 100644
--- a/crates/wit-component/tests/interfaces/preserve-foreign-reexport/deps/my-dep/my-doc.wit
+++ b/crates/wit-component/tests/interfaces/preserve-foreign-reexport/deps/my-dep/my-doc.wit
@@ -4,5 +4,5 @@ interface my-interface {
   record foo {
     f: u8,
   }
-  type bar = foo
+  type bar = foo;
 }
diff --git a/crates/wit-component/tests/interfaces/preserve-foreign-reexport/foo.wit b/crates/wit-component/tests/interfaces/preserve-foreign-reexport/foo.wit
index ae83137a..5444ebd5 100644
--- a/crates/wit-component/tests/interfaces/preserve-foreign-reexport/foo.wit
+++ b/crates/wit-component/tests/interfaces/preserve-foreign-reexport/foo.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  export foo:my-dep/my-interface
+  export foo:my-dep/my-interface;
 }
diff --git a/crates/wit-component/tests/interfaces/print-keyword.wit b/crates/wit-component/tests/interfaces/print-keyword.wit
index 7cbe9083..1c93dc6f 100644
--- a/crates/wit-component/tests/interfaces/print-keyword.wit
+++ b/crates/wit-component/tests/interfaces/print-keyword.wit
@@ -1,10 +1,10 @@
 package foo:foo
 
 interface %interface {
-  type %type = u32
-  type %world = %type
+  type %type = u32;
+  type %world = %type;
 
   record %record {
-    %variant: %world
+    %variant: %world,
   }
 }
diff --git a/crates/wit-component/tests/interfaces/records.wit b/crates/wit-component/tests/interfaces/records.wit
index c7d9ef2c..f687aa4c 100644
--- a/crates/wit-component/tests/interfaces/records.wit
+++ b/crates/wit-component/tests/interfaces/records.wit
@@ -30,34 +30,34 @@ interface records {
     e: really-flags,
   }
 
-  type int-typedef = s32
+  type int-typedef = s32;
 
-  type tuple-typedef2 = tuple<int-typedef>
+  type tuple-typedef2 = tuple<int-typedef>;
 
-  tuple-arg: func(x: tuple<char, u32>)
+  tuple-arg: func(x: tuple<char, u32>);
 
-  tuple-result: func() -> tuple<char, u32>
+  tuple-result: func() -> tuple<char, u32>;
 
-  single-arg: func(x: single)
+  single-arg: func(x: single);
 
-  single-result: func() -> single
+  single-result: func() -> single;
 
-  scalar-arg: func(x: scalars)
+  scalar-arg: func(x: scalars);
 
-  scalar-result: func() -> scalars
+  scalar-result: func() -> scalars;
 
-  flags-arg: func(x: really-flags)
+  flags-arg: func(x: really-flags);
 
-  flags-result: func() -> really-flags
+  flags-result: func() -> really-flags;
 
-  aggregate-arg: func(x: aggregates)
+  aggregate-arg: func(x: aggregates);
 
-  aggregate-result: func() -> aggregates
+  aggregate-result: func() -> aggregates;
 
-  typedef-inout: func(e: tuple-typedef2) -> s32
+  typedef-inout: func(e: tuple-typedef2) -> s32;
 }
 
 world records-world {
-  import records
-  export records
+  import records;
+  export records;
 }
diff --git a/crates/wit-component/tests/interfaces/reference-out-of-order.wit b/crates/wit-component/tests/interfaces/reference-out-of-order.wit
index 51f181a7..e9a306fd 100644
--- a/crates/wit-component/tests/interfaces/reference-out-of-order.wit
+++ b/crates/wit-component/tests/interfaces/reference-out-of-order.wit
@@ -1,10 +1,10 @@
 package foo:foo
 
 interface foo {
-  a: func(x: r)
-  b: func(x: v)
-  c: func(x: r-no-string)
-  d: func(x: v-no-string)
+  a: func(x: r);
+  b: func(x: v);
+  c: func(x: r-no-string);
+  d: func(x: v-no-string);
 
   record r {
     s: string,
@@ -24,5 +24,5 @@ interface foo {
 }
 
 world foo-world {
-  import foo
+  import foo;
 }
diff --git a/crates/wit-component/tests/interfaces/resources.wit b/crates/wit-component/tests/interfaces/resources.wit
index 80c7cf67..99c138f8 100644
--- a/crates/wit-component/tests/interfaces/resources.wit
+++ b/crates/wit-component/tests/interfaces/resources.wit
@@ -2,68 +2,68 @@ package foo:bar
 
 interface foo {
   resource bar {
-    constructor()
-    a: static func()
-    b: func()
+    constructor();
+    a: static func();
+    b: func();
   }
 
-  a: func(x: bar) -> bar
-  type t = bar
-  type t2 = own<bar>
+  a: func(x: bar) -> bar;
+  type t = bar;
+  type t2 = own<bar>;
 }
 
 interface baz {
-  use foo.{bar,t}
-  a: func(x: bar) -> bar
+  use foo.{bar,t};
+  a: func(x: bar) -> bar;
 
-  b: func() -> t
+  b: func() -> t;
 }
 
 
 world some-world {
-  use baz.{bar}
+  use baz.{bar};
 
   resource a {
-    constructor()
+    constructor();
   }
 
-  export x: func() -> a
-  export y: func() -> bar
+  export x: func() -> a;
+  export y: func() -> bar;
 
   import anon: interface {
     resource a {
-      constructor()
+      constructor();
 
-      b: static func()
+      b: static func();
 
-      c: func()
+      c: func();
     }
   }
 }
 
 interface implicit-own-handles {
-  resource a
+  resource a;
 
-  b: func(a1: a, a2: a) -> own<a>
-  c: func() -> list<own<a>>
+  b: func(a1: a, a2: a) -> own<a>;
+  c: func() -> list<own<a>>;
 }
 
 interface implicit-own-handles2 {
   // the `own` return and list param should be the same `own`
   resource a {
-    constructor(a: list<a>)
+    constructor(a: list<a>);
   }
 
   // same as above, even when the `list<b>` implicitly-defined `own` comes
   // before an explicitly defined `own`
   resource b {
-    constructor(a: list<b>, b: own<b>)
+    constructor(a: list<b>, b: own<b>);
   }
 
   // same as the above, the `own` argument should have the same type as the
   // return value
   resource c {
-    a: static func(a: own<c>) -> c
+    a: static func(a: own<c>) -> c;
   }
 }
 
@@ -71,6 +71,6 @@ world implicit-own-handles3 {
   // there should only be one `list` type despite there looking like two
   // list types here
   resource a {
-    constructor(a: list<a>, b: list<own<a>>)
+    constructor(a: list<a>, b: list<own<a>>);
   }
 }
diff --git a/crates/wit-component/tests/interfaces/simple-deps/deps/some-dep/types.wit b/crates/wit-component/tests/interfaces/simple-deps/deps/some-dep/types.wit
index 500f811c..6d69f128 100644
--- a/crates/wit-component/tests/interfaces/simple-deps/deps/some-dep/types.wit
+++ b/crates/wit-component/tests/interfaces/simple-deps/deps/some-dep/types.wit
@@ -1,5 +1,5 @@
 package foo:some-dep
 
 interface types {
-  type some-type = u8
+  type some-type = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/simple-deps/foo.wit b/crates/wit-component/tests/interfaces/simple-deps/foo.wit
index 087d0d15..898b316c 100644
--- a/crates/wit-component/tests/interfaces/simple-deps/foo.wit
+++ b/crates/wit-component/tests/interfaces/simple-deps/foo.wit
@@ -1,4 +1,4 @@
 package foo:foo
 interface foo {
-  use foo:some-dep/types.{some-type}
+  use foo:some-dep/types.{some-type};
 }
diff --git a/crates/wit-component/tests/interfaces/simple-use.wit b/crates/wit-component/tests/interfaces/simple-use.wit
index 69069bd9..1d65d1b9 100644
--- a/crates/wit-component/tests/interfaces/simple-use.wit
+++ b/crates/wit-component/tests/interfaces/simple-use.wit
@@ -8,6 +8,6 @@ interface types {
 }
 
 interface console {
-  use types.{level}
-  log: func(level: level, msg: string)
+  use types.{level};
+  log: func(level: level, msg: string);
 }
diff --git a/crates/wit-component/tests/interfaces/simple-world.wit b/crates/wit-component/tests/interfaces/simple-world.wit
index 3dd08016..e703a783 100644
--- a/crates/wit-component/tests/interfaces/simple-world.wit
+++ b/crates/wit-component/tests/interfaces/simple-world.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 world the-world {
-  import console
+  import console;
 }
 
 interface console {
-  log: func(arg: string)
+  log: func(arg: string);
 }
diff --git a/crates/wit-component/tests/interfaces/single-named-result.wit b/crates/wit-component/tests/interfaces/single-named-result.wit
index 8fd946ff..6a0413ef 100644
--- a/crates/wit-component/tests/interfaces/single-named-result.wit
+++ b/crates/wit-component/tests/interfaces/single-named-result.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  a: func() -> (a: u32)
+  a: func() -> (a: u32);
 }
diff --git a/crates/wit-component/tests/interfaces/type-alias.wit b/crates/wit-component/tests/interfaces/type-alias.wit
index ebf40425..b284f8f1 100644
--- a/crates/wit-component/tests/interfaces/type-alias.wit
+++ b/crates/wit-component/tests/interfaces/type-alias.wit
@@ -1,13 +1,13 @@
 package foo:foo
 
 interface foo {
-  type a = u8
-  type b = a
+  type a = u8;
+  type b = a;
 
-  f: func(a: a) -> b
+  f: func(a: a) -> b;
 }
 
 world my-world {
-  import foo
-  export foo
+  import foo;
+  export foo;
 }
diff --git a/crates/wit-component/tests/interfaces/type-alias2.wit b/crates/wit-component/tests/interfaces/type-alias2.wit
index b3a3d3fc..713c8886 100644
--- a/crates/wit-component/tests/interfaces/type-alias2.wit
+++ b/crates/wit-component/tests/interfaces/type-alias2.wit
@@ -5,11 +5,11 @@ interface foo {
     b,
   }
 
-  type b = a
+  type b = a;
 
-  f: func() -> b
+  f: func() -> b;
 }
 
 world my-world {
-  export foo
+  export foo;
 }
diff --git a/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/a/the-name.wit b/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/a/the-name.wit
index dc0d8f01..9ea9033e 100644
--- a/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/a/the-name.wit
+++ b/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/a/the-name.wit
@@ -1,4 +1,4 @@
 package foo:a
 interface the-name {
-  type ty = u8
+  type ty = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/b/the-name.wit b/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/b/the-name.wit
index 92ff659a..f07e23e4 100644
--- a/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/b/the-name.wit
+++ b/crates/wit-component/tests/interfaces/upstream-deps-same-name/deps/b/the-name.wit
@@ -1,4 +1,4 @@
 package foo:b
 interface the-name {
-  type ty = u8
+  type ty = u8;
 }
diff --git a/crates/wit-component/tests/interfaces/upstream-deps-same-name/foo.wit b/crates/wit-component/tests/interfaces/upstream-deps-same-name/foo.wit
index ee38300a..5e723872 100644
--- a/crates/wit-component/tests/interfaces/upstream-deps-same-name/foo.wit
+++ b/crates/wit-component/tests/interfaces/upstream-deps-same-name/foo.wit
@@ -1,6 +1,6 @@
 package foo:foo
 
 interface a {
-  use foo:a/the-name.{ty}
-  use foo:b/the-name.{ty as ty2}
+  use foo:a/the-name.{ty};
+  use foo:b/the-name.{ty as ty2};
 }
diff --git a/crates/wit-component/tests/interfaces/use-chain.wit b/crates/wit-component/tests/interfaces/use-chain.wit
index a8169f83..48950c70 100644
--- a/crates/wit-component/tests/interfaces/use-chain.wit
+++ b/crates/wit-component/tests/interfaces/use-chain.wit
@@ -1,15 +1,15 @@
 package foo:foo
 
 interface foo {
-  type a = u32
-  type b = a
-  type c = b
+  type a = u32;
+  type b = a;
+  type c = b;
 }
 
 interface bar {
-  use foo.{c}
+  use foo.{c};
 }
 
 interface baz {
-  use bar.{c}
+  use bar.{c};
 }
diff --git a/crates/wit-component/tests/interfaces/use-for-type.wit b/crates/wit-component/tests/interfaces/use-for-type.wit
index 36dfac22..eb17aa84 100644
--- a/crates/wit-component/tests/interfaces/use-for-type.wit
+++ b/crates/wit-component/tests/interfaces/use-for-type.wit
@@ -4,11 +4,11 @@ interface foo {
 }
 
 interface bar {
-  type t = u8
+  type t = u8;
 }
 
 interface baz {
-  use bar.{t}
+  use bar.{t};
 
   record bar {
     a: t,
diff --git a/crates/wit-component/tests/interfaces/variants.wit b/crates/wit-component/tests/interfaces/variants.wit
index d03aee2b..2c8794cf 100644
--- a/crates/wit-component/tests/interfaces/variants.wit
+++ b/crates/wit-component/tests/interfaces/variants.wit
@@ -53,26 +53,26 @@ interface variants {
     bad2,
   }
 
-  e1-arg: func(x: e1)
-  e1-result: func() -> e1
-  v1-arg: func(x: v1)
-  v1-result: func() -> v1
-  bool-arg: func(x: bool)
-  bool-result: func() -> bool
-  option-arg: func(a: option<bool>, b: option<tuple<u32>>, c: option<u32>, d: option<e1>, e: option<float32>, g: option<option<bool>>)
-  option-result: func() -> tuple<option<bool>, option<tuple<u32>>, option<u32>, option<e1>, option<float32>, option<option<bool>>>
-  casts: func(a: casts1, b: casts2, c: casts3, d: casts4, e: casts5, f: casts6) -> tuple<casts1, casts2, casts3, casts4, casts5, casts6>
-  expected-arg: func(a: result, b: result<_, e1>, c: result<e1>, d: result<tuple<u32>, tuple<u32>>, e: result<u32, v1>, f: result<string, list<u8>>)
-  expected-result: func() -> tuple<result, result<_, e1>, result<e1>, result<tuple<u32>, tuple<u32>>, result<u32, v1>, result<string, list<u8>>>
-  return-expected-sugar: func() -> result<s32, my-errno>
-  return-expected-sugar2: func() -> result<_, my-errno>
-  return-expected-sugar3: func() -> result<my-errno, my-errno>
-  return-expected-sugar4: func() -> result<tuple<s32, u32>, my-errno>
-  return-option-sugar: func() -> option<s32>
-  return-option-sugar2: func() -> option<my-errno>
-  expected-simple: func() -> result<u32, s32>
+  e1-arg: func(x: e1);
+  e1-result: func() -> e1;
+  v1-arg: func(x: v1);
+  v1-result: func() -> v1;
+  bool-arg: func(x: bool);
+  bool-result: func() -> bool;
+  option-arg: func(a: option<bool>, b: option<tuple<u32>>, c: option<u32>, d: option<e1>, e: option<float32>, g: option<option<bool>>);
+  option-result: func() -> tuple<option<bool>, option<tuple<u32>>, option<u32>, option<e1>, option<float32>, option<option<bool>>>;
+  casts: func(a: casts1, b: casts2, c: casts3, d: casts4, e: casts5, f: casts6) -> tuple<casts1, casts2, casts3, casts4, casts5, casts6>;
+  expected-arg: func(a: result, b: result<_, e1>, c: result<e1>, d: result<tuple<u32>, tuple<u32>>, e: result<u32, v1>, f: result<string, list<u8>>);
+  expected-result: func() -> tuple<result, result<_, e1>, result<e1>, result<tuple<u32>, tuple<u32>>, result<u32, v1>, result<string, list<u8>>>;
+  return-expected-sugar: func() -> result<s32, my-errno>;
+  return-expected-sugar2: func() -> result<_, my-errno>;
+  return-expected-sugar3: func() -> result<my-errno, my-errno>;
+  return-expected-sugar4: func() -> result<tuple<s32, u32>, my-errno>;
+  return-option-sugar: func() -> option<s32>;
+  return-option-sugar2: func() -> option<my-errno>;
+  expected-simple: func() -> result<u32, s32>;
 }
 
 world variants-world {
-  import variants
+  import variants;
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/deps/io/streams.wit b/crates/wit-component/tests/interfaces/wasi-http/deps/io/streams.wit
index f6822141..bad15fc9 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/deps/io/streams.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/deps/io/streams.wit
@@ -6,7 +6,7 @@ package wasi:io
 /// In the future, the component model is expected to add built-in stream types;
 /// when it does, they are expected to subsume this API.
 interface streams {
-    use wasi:poll/poll.{pollable}
+    use wasi:poll/poll.{pollable};
 
     /// An error type returned from a stream operation. Currently this
     /// doesn't provide any additional information.
@@ -31,7 +31,7 @@ interface streams {
     /// the wit-bindgen implementation of handles and resources is ready.
     ///
     /// This [represents a resource](https://github.com/WebAssembly/WASI/blob/main/docs/WitInWasi.md#Resources).
-    type input-stream = u32
+    type input-stream = u32;
 
     /// Read bytes from a stream.
     ///
@@ -55,7 +55,7 @@ interface streams {
         this: input-stream,
         /// The maximum number of bytes to read
         len: u64
-    ) -> result<tuple<list<u8>, bool>, stream-error>
+    ) -> result<tuple<list<u8>, bool>, stream-error>;
 
     /// Read bytes from a stream, with blocking.
     ///
@@ -65,7 +65,7 @@ interface streams {
         this: input-stream,
         /// The maximum number of bytes to read
         len: u64
-    ) -> result<tuple<list<u8>, bool>, stream-error>
+    ) -> result<tuple<list<u8>, bool>, stream-error>;
 
     /// Skip bytes from a stream.
     ///
@@ -83,7 +83,7 @@ interface streams {
         this: input-stream,
         /// The maximum number of bytes to skip.
         len: u64,
-    ) -> result<tuple<u64, bool>, stream-error>
+    ) -> result<tuple<u64, bool>, stream-error>;
 
     /// Skip bytes from a stream, with blocking.
     ///
@@ -93,16 +93,16 @@ interface streams {
         this: input-stream,
         /// The maximum number of bytes to skip.
         len: u64,
-    ) -> result<tuple<u64, bool>, stream-error>
+    ) -> result<tuple<u64, bool>, stream-error>;
 
     /// Create a `pollable` which will resolve once either the specified stream
     /// has bytes available to read or the other end of the stream has been
     /// closed.
-    subscribe-to-input-stream: func(this: input-stream) -> pollable
+    subscribe-to-input-stream: func(this: input-stream) -> pollable;
 
     /// Dispose of the specified `input-stream`, after which it may no longer
     /// be used.
-    drop-input-stream: func(this: input-stream)
+    drop-input-stream: func(this: input-stream);
 
     /// An output bytestream. In the future, this will be replaced by handle
     /// types.
@@ -121,7 +121,7 @@ interface streams {
     /// the wit-bindgen implementation of handles and resources is ready.
     ///
     /// This [represents a resource](https://github.com/WebAssembly/WASI/blob/main/docs/WitInWasi.md#Resources).
-    type output-stream = u32
+    type output-stream = u32;
 
     /// Write bytes to a stream.
     ///
@@ -131,7 +131,7 @@ interface streams {
         this: output-stream,
         /// Data to write
         buf: list<u8>
-    ) -> result<u64, stream-error>
+    ) -> result<u64, stream-error>;
 
     /// Write bytes to a stream, with blocking.
     ///
@@ -141,7 +141,7 @@ interface streams {
         this: output-stream,
         /// Data to write
         buf: list<u8>
-    ) -> result<u64, stream-error>
+    ) -> result<u64, stream-error>;
 
     /// Write multiple zero bytes to a stream.
     ///
@@ -151,7 +151,7 @@ interface streams {
         this: output-stream,
         /// The number of zero bytes to write
         len: u64
-    ) -> result<u64, stream-error>
+    ) -> result<u64, stream-error>;
 
     /// Write multiple zero bytes to a stream, with blocking.
     ///
@@ -161,7 +161,7 @@ interface streams {
         this: output-stream,
         /// The number of zero bytes to write
         len: u64
-    ) -> result<u64, stream-error>
+    ) -> result<u64, stream-error>;
 
     /// Read from one stream and write to another.
     ///
@@ -176,7 +176,7 @@ interface streams {
         src: input-stream,
         /// The number of bytes to splice
         len: u64,
-    ) -> result<tuple<u64, bool>, stream-error>
+    ) -> result<tuple<u64, bool>, stream-error>;
 
     /// Read from one stream and write to another, with blocking.
     ///
@@ -188,7 +188,7 @@ interface streams {
         src: input-stream,
         /// The number of bytes to splice
         len: u64,
-    ) -> result<tuple<u64, bool>, stream-error>
+    ) -> result<tuple<u64, bool>, stream-error>;
 
     /// Forward the entire contents of an input stream to an output stream.
     ///
@@ -205,13 +205,13 @@ interface streams {
         this: output-stream,
         /// The stream to read from
         src: input-stream
-    ) -> result<u64, stream-error>
+    ) -> result<u64, stream-error>;
 
     /// Create a `pollable` which will resolve once either the specified stream
     /// is ready to accept bytes or the other end of the stream has been closed.
-    subscribe-to-output-stream: func(this: output-stream) -> pollable
+    subscribe-to-output-stream: func(this: output-stream) -> pollable;
 
     /// Dispose of the specified `output-stream`, after which it may no longer
     /// be used.
-    drop-output-stream: func(this: output-stream)
+    drop-output-stream: func(this: output-stream);
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/deps/logging/handler.wit b/crates/wit-component/tests/interfaces/wasi-http/deps/logging/handler.wit
index e6b077be..0a7d085e 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/deps/logging/handler.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/deps/logging/handler.wit
@@ -30,5 +30,5 @@ interface handler {
     /// sent, a context, which is an uninterpreted string meant to help
     /// consumers group similar messages, and a string containing the message
     /// text.
-    log: func(level: level, context: string, message: string)
+    log: func(level: level, context: string, message: string);
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/deps/poll/poll.wit b/crates/wit-component/tests/interfaces/wasi-http/deps/poll/poll.wit
index cf5d8779..af64de56 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/deps/poll/poll.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/deps/poll/poll.wit
@@ -17,11 +17,11 @@ interface poll {
     /// that they do not outlive the resource they reference.
     ///
     /// This [represents a resource](https://github.com/WebAssembly/WASI/blob/main/docs/WitInWasi.md#Resources).
-    type pollable = u32
+    type pollable = u32;
 
     /// Dispose of the specified `pollable`, after which it may no longer
     /// be used.
-    drop-pollable: func(this: pollable)
+    drop-pollable: func(this: pollable);
 
     /// Poll for completion on a set of pollables.
     ///
@@ -37,5 +37,5 @@ interface poll {
     /// See <https://github.com/bytecodealliance/preview2-prototyping/pull/11#issuecomment-1329873061>
     /// for details.  For now, we use zero to mean "not ready" and non-zero to
     /// mean "ready".
-    poll-oneoff: func(in: list<pollable>) -> list<u8>
+    poll-oneoff: func(in: list<pollable>) -> list<u8>;
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/deps/random/random.wit b/crates/wit-component/tests/interfaces/wasi-http/deps/random/random.wit
index f956798d..c7fb521b 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/deps/random/random.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/deps/random/random.wit
@@ -15,13 +15,13 @@ interface random {
     /// This function must always return fresh pseudo-random data. Deterministic
     /// environments must omit this function, rather than implementing it with
     /// deterministic data.
-    get-random-bytes: func(len: u64) -> list<u8>
+    get-random-bytes: func(len: u64) -> list<u8>;
 
     /// Return a cryptographically-secure pseudo-random `u64` value.
     ///
     /// This function returns the same type of pseudo-random data as
     /// `get-random-bytes`, represented as a `u64`.
-    get-random-u64: func() -> u64
+    get-random-u64: func() -> u64;
 
     /// Return a 128-bit value that may contain a pseudo-random value.
     ///
@@ -40,5 +40,5 @@ interface random {
     /// This will likely be changed to a value import, to prevent it from being
     /// called multiple times and potentially used for purposes other than DoS
     /// protection.
-    insecure-random: func() -> tuple<u64, u64>
+    insecure-random: func() -> tuple<u64, u64>;
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/incoming-handler.wit b/crates/wit-component/tests/interfaces/wasi-http/incoming-handler.wit
index f98429fe..8667b804 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/incoming-handler.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/incoming-handler.wit
@@ -7,7 +7,7 @@
 //   that takes a `request` parameter and returns a `response` result.
 //
 interface incoming-handler {
-  use types.{incoming-request, response-outparam}
+  use types.{incoming-request, response-outparam};
 
   // The `handle` function takes an outparam instead of returning its response
   // so that the component may stream its response while streaming any other
@@ -22,5 +22,5 @@ interface incoming-handler {
   handle: func(
     request: incoming-request,
     response-out: response-outparam
-  )
+  );
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/outgoing-handler.wit b/crates/wit-component/tests/interfaces/wasi-http/outgoing-handler.wit
index 06c8e469..c2c1932b 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/outgoing-handler.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/outgoing-handler.wit
@@ -6,7 +6,7 @@
 //   that takes a `request` parameter and returns a `response` result.
 //
 interface outgoing-handler {
-  use types.{outgoing-request, request-options, future-incoming-response}
+  use types.{outgoing-request, request-options, future-incoming-response};
 
   // The parameter and result types of the `handle` function allow the caller
   // to concurrently stream the bodies of the outgoing request and the incoming
@@ -14,5 +14,5 @@ interface outgoing-handler {
   handle: func(
     request: outgoing-request,
     options: option<request-options>
-  ) -> future-incoming-response
+  ) -> future-incoming-response;
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/proxy.wit b/crates/wit-component/tests/interfaces/wasi-http/proxy.wit
index a0330490..f5c8248e 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/proxy.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/proxy.wit
@@ -4,21 +4,21 @@
 // outgoing HTTP requests.
 world proxy {
   // HTTP proxies have access to time and randomness.
-  import wasi:random/random
+  import wasi:random/random;
   // TODO: add `import wall-clock: clocks.wall-clock`
   // TODO: add `import monotonic-clock: clocks.monotonic-clock`
 
   // This is the default logging handler to use when user code simply wants to
   // log to a developer-facing console (e.g., via `console.log()`).
-  import wasi:logging/handler
+  import wasi:logging/handler;
 
   // This is the default handler to use when user code simply wants to make an
   // HTTP request (e.g., via `fetch()`).
-  import outgoing-handler
+  import outgoing-handler;
 
   // The host delivers incoming HTTP requests to a component by calling the
   // `handle` function of this exported interface. A host may arbitrarily reuse
   // or not reuse component instance when delivering incoming HTTP requests and
   // thus a component must be able to handle 0..N calls to `handle`.
-  export incoming-handler
+  export incoming-handler;
 }
diff --git a/crates/wit-component/tests/interfaces/wasi-http/types.wit b/crates/wit-component/tests/interfaces/wasi-http/types.wit
index 09cd3742..f303add7 100644
--- a/crates/wit-component/tests/interfaces/wasi-http/types.wit
+++ b/crates/wit-component/tests/interfaces/wasi-http/types.wit
@@ -4,8 +4,8 @@ package wasi:http
 // define the HTTP resource types and operations used by the component's
 // imported and exported interfaces.
 interface types {
-  use wasi:io/streams.{input-stream, output-stream}
-  use wasi:poll/poll.{pollable}
+  use wasi:io/streams.{input-stream, output-stream};
+  use wasi:poll/poll.{pollable};
 
   // This type corresponds to HTTP standard Methods.
   variant method {
@@ -42,18 +42,18 @@ interface types {
   // HTTP standard Fields. Soon, when resource types are added, the `type
   // fields = u32` type alias can be replaced by a proper `resource fields`
   // definition containing all the functions using the method syntactic sugar.
-  type fields = u32
-  drop-fields: func(fields: fields)
-  new-fields: func(entries: list<tuple<string,string>>) -> fields
-  fields-get: func(fields: fields, name: string) -> list<string>
-  fields-set: func(fields: fields, name: string, value: list<string>)
-  fields-delete: func(fields: fields, name: string)
-  fields-append: func(fields: fields, name: string, value: string)
-  fields-entries: func(fields: fields) -> list<tuple<string,string>>
-  fields-clone: func(fields: fields) -> fields
-
-  type headers = fields
-  type trailers = fields
+  type fields = u32;
+  drop-fields: func(fields: fields);
+  new-fields: func(entries: list<tuple<string,string>>) -> fields;
+  fields-get: func(fields: fields, name: string) -> list<string>;
+  fields-set: func(fields: fields, name: string, value: list<string>);
+  fields-delete: func(fields: fields, name: string);
+  fields-append: func(fields: fields, name: string, value: string);
+  fields-entries: func(fields: fields) -> list<tuple<string,string>>;
+  fields-clone: func(fields: fields) -> fields;
+
+  type headers = fields;
+  type trailers = fields;
 
   // The following block defines stream types which corresponds to the HTTP
   // standard Contents and Trailers. With Preview3, all of these fields can be
@@ -62,10 +62,10 @@ interface types {
   // `finish-` functions emulate the stream's result value and MUST be called
   // exactly once after the final read/write from/to the stream before dropping
   // the stream.
-  type incoming-stream = input-stream
-  type outgoing-stream = output-stream
-  finish-incoming-stream: func(s: incoming-stream) -> option<trailers>
-  finish-outgoing-stream: func(s: outgoing-stream, trailers: option<trailers>)
+  type incoming-stream = input-stream;
+  type outgoing-stream = output-stream;
+  finish-incoming-stream: func(s: incoming-stream) -> option<trailers>;
+  finish-outgoing-stream: func(s: outgoing-stream, trailers: option<trailers>);
 
   // The following block defines the `incoming-request` and `outgoing-request`
   // resource types that correspond to HTTP standard Requests. Soon, when
@@ -75,17 +75,17 @@ interface types {
   // a single `request` type (that uses the single `stream` type mentioned
   // above). The `consume` and `write` methods may only be called once (and
   // return failure thereafter).
-  type incoming-request = u32
-  type outgoing-request = u32
-  drop-incoming-request: func(request: incoming-request)
-  drop-outgoing-request: func(request: outgoing-request)
-  incoming-request-method: func(request: incoming-request) -> method
-  incoming-request-path: func(request: incoming-request) -> string
-  incoming-request-query: func(request: incoming-request) -> string
-  incoming-request-scheme: func(request: incoming-request) -> option<scheme>
-  incoming-request-authority: func(request: incoming-request) -> string
-  incoming-request-headers: func(request: incoming-request) -> headers
-  incoming-request-consume: func(request: incoming-request) -> result<incoming-stream>
+  type incoming-request = u32;
+  type outgoing-request = u32;
+  drop-incoming-request: func(request: incoming-request);
+  drop-outgoing-request: func(request: outgoing-request);
+  incoming-request-method: func(request: incoming-request) -> method;
+  incoming-request-path: func(request: incoming-request) -> string;
+  incoming-request-query: func(request: incoming-request) -> string;
+  incoming-request-scheme: func(request: incoming-request) -> option<scheme>;
+  incoming-request-authority: func(request: incoming-request) -> string;
+  incoming-request-headers: func(request: incoming-request) -> headers;
+  incoming-request-consume: func(request: incoming-request) -> result<incoming-stream>;
   new-outgoing-request: func(
     method: method,
     path: string,
@@ -93,8 +93,8 @@ interface types {
     scheme: option<scheme>,
     authority: string,
     headers: headers
-  ) -> outgoing-request
-  outgoing-request-write: func(request: outgoing-request) -> result<outgoing-stream>
+  ) -> outgoing-request;
+  outgoing-request-write: func(request: outgoing-request) -> result<outgoing-stream>;
 
   // Additional optional parameters that can be set when making a request.
   record request-options {
@@ -118,12 +118,12 @@ interface types {
   // definition. Later, with Preview3, the need for an outparam goes away entirely
   // (the `wasi:http/handler` interface used for both incoming and outgoing can
   // simply return a `stream`).
-  type response-outparam = u32
-  drop-response-outparam: func(response: response-outparam)
-  set-response-outparam: func(param: response-outparam, response: result<outgoing-response, error>) -> result
+  type response-outparam = u32;
+  drop-response-outparam: func(response: response-outparam);
+  set-response-outparam: func(param: response-outparam, response: result<outgoing-response, error>) -> result;
 
   // This type corresponds to the HTTP standard Status Code.
-  type status-code = u16
+  type status-code = u16;
 
   // The following block defines the `incoming-response` and `outgoing-response`
   // resource types that correspond to HTTP standard Responses. Soon, when
@@ -132,18 +132,18 @@ interface types {
   // Preview2 will allow both types to be merged together into a single `response`
   // type (that uses the single `stream` type mentioned above). The `consume` and
   // `write` methods may only be called once (and return failure thereafter).
-  type incoming-response = u32
-  type outgoing-response = u32
-  drop-incoming-response: func(response: incoming-response)
-  drop-outgoing-response: func(response: outgoing-response)
-  incoming-response-status: func(response: incoming-response) -> status-code
-  incoming-response-headers: func(response: incoming-response) -> headers
-  incoming-response-consume: func(response: incoming-response) -> result<incoming-stream>
+  type incoming-response = u32;
+  type outgoing-response = u32;
+  drop-incoming-response: func(response: incoming-response);
+  drop-outgoing-response: func(response: outgoing-response);
+  incoming-response-status: func(response: incoming-response) -> status-code;
+  incoming-response-headers: func(response: incoming-response) -> headers;
+  incoming-response-consume: func(response: incoming-response) -> result<incoming-stream>;
   new-outgoing-response: func(
     status-code: status-code,
     headers: headers
-  ) -> outgoing-response
-  outgoing-response-write: func(response: outgoing-response) -> result<outgoing-stream>
+  ) -> outgoing-response;
+  outgoing-response-write: func(response: outgoing-response) -> result<outgoing-stream>;
 
   // The following block defines a special resource type used by the
   // `wasi:http/outgoing-handler` interface to emulate
@@ -152,8 +152,8 @@ interface types {
   // method to get the result if it is available. If the result is not available,
   // the client can call `listen` to get a `pollable` that can be passed to
   // `io.poll.poll-oneoff`.
-  type future-incoming-response = u32
-  drop-future-incoming-response: func(f: future-incoming-response)
-  future-incoming-response-get: func(f: future-incoming-response) -> option<result<incoming-response, error>>
-  listen-to-future-incoming-response: func(f: future-incoming-response) -> pollable
+  type future-incoming-response = u32;
+  drop-future-incoming-response: func(f: future-incoming-response);
+  future-incoming-response-get: func(f: future-incoming-response) -> option<result<incoming-response, error>>;
+  listen-to-future-incoming-response: func(f: future-incoming-response) -> pollable;
 }
diff --git a/crates/wit-component/tests/interfaces/world-pkg-conflict/bar.wit b/crates/wit-component/tests/interfaces/world-pkg-conflict/bar.wit
index 3e09d4d2..80b34280 100644
--- a/crates/wit-component/tests/interfaces/world-pkg-conflict/bar.wit
+++ b/crates/wit-component/tests/interfaces/world-pkg-conflict/bar.wit
@@ -1,3 +1,3 @@
 interface a {
-  type t = u32
+  type t = u32;
 }
diff --git a/crates/wit-component/tests/interfaces/world-pkg-conflict/foo.wit b/crates/wit-component/tests/interfaces/world-pkg-conflict/foo.wit
index c34d99d3..f2b428eb 100644
--- a/crates/wit-component/tests/interfaces/world-pkg-conflict/foo.wit
+++ b/crates/wit-component/tests/interfaces/world-pkg-conflict/foo.wit
@@ -5,5 +5,5 @@ world c {
 }
 
 interface foo {
-  use a.{t}
+  use a.{t};
 }
diff --git a/crates/wit-component/tests/interfaces/world-top-level.wit b/crates/wit-component/tests/interfaces/world-top-level.wit
index c3107da9..47f2ecb3 100644
--- a/crates/wit-component/tests/interfaces/world-top-level.wit
+++ b/crates/wit-component/tests/interfaces/world-top-level.wit
@@ -1,20 +1,20 @@
 package foo:foo
 
 world foo {
-  import foo: func()
-  export foo2: func()
+  import foo: func();
+  export foo2: func();
 
-  import bar: func(arg: u32)
-  export bar2: func() -> u32
+  import bar: func(arg: u32);
+  export bar2: func() -> u32;
 
   import some-interface: interface {}
   export another-interface: interface {}
 }
 
 world just-import {
-  import foo: func()
+  import foo: func();
 }
 
 world just-export {
-  export foo: func()
+  export foo: func();
 }
diff --git a/crates/wit-component/tests/interfaces/worlds-with-types.wit b/crates/wit-component/tests/interfaces/worlds-with-types.wit
index bb3935e6..e5d4316c 100644
--- a/crates/wit-component/tests/interfaces/worlds-with-types.wit
+++ b/crates/wit-component/tests/interfaces/worlds-with-types.wit
@@ -5,19 +5,19 @@ world simple {
     f: u8,
   }
 
-  type bar = foo
+  type bar = foo;
 
-  import a: func(a: foo) -> bar
-  export b: func(a: foo) -> bar
+  import a: func(a: foo) -> bar;
+  export b: func(a: foo) -> bar;
 }
 
 interface import-me {
-  type foo = u32
+  type foo = u32;
 }
 
 world with-imports {
-  use import-me.{foo}
+  use import-me.{foo};
 
-  import a: func(a: foo)
-  export b: func(a: foo)
+  import a: func(a: foo);
+  export b: func(a: foo);
 }
diff --git a/crates/wit-component/tests/linking.rs b/crates/wit-component/tests/linking.rs
index 8d8356fe..2e068a13 100644
--- a/crates/wit-component/tests/linking.rs
+++ b/crates/wit-component/tests/linking.rs
@@ -128,12 +128,12 @@ const WIT: &str = r#"
 package test:test
 
 interface test {
-   bar: func(v: s32) -> s32
+   bar: func(v: s32) -> s32;
 }
 
 world bar {
-    import test
-    export test
+    import test;
+    export test;
 }
 "#;
 
diff --git a/crates/wit-component/tests/merge/bad-interface1/from/a.wit b/crates/wit-component/tests/merge/bad-interface1/from/a.wit
index 9450b432..52d03da0 100644
--- a/crates/wit-component/tests/merge/bad-interface1/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface1/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-interface1/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-interface1/from/deps/foo/a.wit
index 91105570..61a7d22e 100644
--- a/crates/wit-component/tests/merge/bad-interface1/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface1/from/deps/foo/a.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
diff --git a/crates/wit-component/tests/merge/bad-interface1/into/a.wit b/crates/wit-component/tests/merge/bad-interface1/into/a.wit
index d29a31d2..4478d512 100644
--- a/crates/wit-component/tests/merge/bad-interface1/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface1/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{b}
+  use foo:foo/a.{b};
 }
diff --git a/crates/wit-component/tests/merge/bad-interface1/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-interface1/into/deps/foo/a.wit
index b8b88dd7..67f2e8d3 100644
--- a/crates/wit-component/tests/merge/bad-interface1/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface1/into/deps/foo/a.wit
@@ -1,6 +1,5 @@
 package foo:foo
 
 interface a {
-  type b = s32
+  type b = s32;
 }
-
diff --git a/crates/wit-component/tests/merge/bad-interface2/from/a.wit b/crates/wit-component/tests/merge/bad-interface2/from/a.wit
index 470e63ae..87937b84 100644
--- a/crates/wit-component/tests/merge/bad-interface2/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface2/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{t}
+  use foo:foo/a.{t};
 }
diff --git a/crates/wit-component/tests/merge/bad-interface2/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-interface2/from/deps/foo/a.wit
index 2afd16d7..e25cc43a 100644
--- a/crates/wit-component/tests/merge/bad-interface2/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface2/from/deps/foo/a.wit
@@ -1,8 +1,7 @@
 package foo:foo
 
 interface a {
-  type t = u32
+  type t = u32;
 
-  a: func()
+  a: func();
 }
-
diff --git a/crates/wit-component/tests/merge/bad-interface2/into/a.wit b/crates/wit-component/tests/merge/bad-interface2/into/a.wit
index 0e958da9..246efaf5 100644
--- a/crates/wit-component/tests/merge/bad-interface2/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface2/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{t}
+  use foo:foo/a.{t};
 }
diff --git a/crates/wit-component/tests/merge/bad-interface2/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-interface2/into/deps/foo/a.wit
index f9454dd6..319059cd 100644
--- a/crates/wit-component/tests/merge/bad-interface2/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-interface2/into/deps/foo/a.wit
@@ -1,8 +1,7 @@
 package foo:foo
 
 interface a {
-  type t = u32
+  type t = u32;
 
-  b: func()
+  b: func();
 }
-
diff --git a/crates/wit-component/tests/merge/bad-world1/from/a.wit b/crates/wit-component/tests/merge/bad-world1/from/a.wit
index 7c171152..444f52f0 100644
--- a/crates/wit-component/tests/merge/bad-world1/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-world1/from/a.wit
@@ -1,4 +1,4 @@
 package foo:%from
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world1/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world1/from/deps/foo/a.wit
index f5721840..e377ebd2 100644
--- a/crates/wit-component/tests/merge/bad-world1/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world1/from/deps/foo/a.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
   import b: interface {
-    type a = u32
+    type a = u32;
   }
 }
diff --git a/crates/wit-component/tests/merge/bad-world1/into/a.wit b/crates/wit-component/tests/merge/bad-world1/into/a.wit
index 435e17c2..37d4450e 100644
--- a/crates/wit-component/tests/merge/bad-world1/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-world1/into/a.wit
@@ -1,4 +1,4 @@
 package foo:into
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world1/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world1/into/deps/foo/a.wit
index 9b324fb2..e61f0092 100644
--- a/crates/wit-component/tests/merge/bad-world1/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world1/into/deps/foo/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
-  import a
+  import a;
 }
diff --git a/crates/wit-component/tests/merge/bad-world2/from/a.wit b/crates/wit-component/tests/merge/bad-world2/from/a.wit
index 9450b432..52d03da0 100644
--- a/crates/wit-component/tests/merge/bad-world2/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-world2/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world2/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world2/from/deps/foo/a.wit
index 5ab008c8..326984af 100644
--- a/crates/wit-component/tests/merge/bad-world2/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world2/from/deps/foo/a.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
diff --git a/crates/wit-component/tests/merge/bad-world2/into/a.wit b/crates/wit-component/tests/merge/bad-world2/into/a.wit
index ed66a781..ad72655e 100644
--- a/crates/wit-component/tests/merge/bad-world2/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-world2/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world2/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world2/into/deps/foo/a.wit
index 9b324fb2..e61f0092 100644
--- a/crates/wit-component/tests/merge/bad-world2/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world2/into/deps/foo/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
-  import a
+  import a;
 }
diff --git a/crates/wit-component/tests/merge/bad-world3/from/a.wit b/crates/wit-component/tests/merge/bad-world3/from/a.wit
index 9450b432..52d03da0 100644
--- a/crates/wit-component/tests/merge/bad-world3/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-world3/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world3/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world3/from/deps/foo/a.wit
index 5ab008c8..326984af 100644
--- a/crates/wit-component/tests/merge/bad-world3/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world3/from/deps/foo/a.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
diff --git a/crates/wit-component/tests/merge/bad-world3/into/a.wit b/crates/wit-component/tests/merge/bad-world3/into/a.wit
index ed66a781..ad72655e 100644
--- a/crates/wit-component/tests/merge/bad-world3/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-world3/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world3/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world3/into/deps/foo/a.wit
index e287ffb7..1faf26a6 100644
--- a/crates/wit-component/tests/merge/bad-world3/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world3/into/deps/foo/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
-  export a
+  export a;
 }
diff --git a/crates/wit-component/tests/merge/bad-world4/from/a.wit b/crates/wit-component/tests/merge/bad-world4/from/a.wit
index 9450b432..52d03da0 100644
--- a/crates/wit-component/tests/merge/bad-world4/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-world4/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world4/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world4/from/deps/foo/a.wit
index 6164abd1..9986d78a 100644
--- a/crates/wit-component/tests/merge/bad-world4/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world4/from/deps/foo/a.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
   export b: interface {
-    type a = u32
+    type a = u32;
   }
 }
diff --git a/crates/wit-component/tests/merge/bad-world4/into/a.wit b/crates/wit-component/tests/merge/bad-world4/into/a.wit
index ed66a781..ad72655e 100644
--- a/crates/wit-component/tests/merge/bad-world4/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-world4/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world4/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world4/into/deps/foo/a.wit
index e287ffb7..1faf26a6 100644
--- a/crates/wit-component/tests/merge/bad-world4/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world4/into/deps/foo/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
-  export a
+  export a;
 }
diff --git a/crates/wit-component/tests/merge/bad-world5/from/a.wit b/crates/wit-component/tests/merge/bad-world5/from/a.wit
index 9450b432..52d03da0 100644
--- a/crates/wit-component/tests/merge/bad-world5/from/a.wit
+++ b/crates/wit-component/tests/merge/bad-world5/from/a.wit
@@ -1,5 +1,5 @@
 package foo:%from
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world5/from/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world5/from/deps/foo/a.wit
index 67333842..96aa6531 100644
--- a/crates/wit-component/tests/merge/bad-world5/from/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world5/from/deps/foo/a.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
   import a: interface {
-    type a = u32
+    type a = u32;
   }
 }
diff --git a/crates/wit-component/tests/merge/bad-world5/into/a.wit b/crates/wit-component/tests/merge/bad-world5/into/a.wit
index ed66a781..ad72655e 100644
--- a/crates/wit-component/tests/merge/bad-world5/into/a.wit
+++ b/crates/wit-component/tests/merge/bad-world5/into/a.wit
@@ -1,5 +1,5 @@
 package foo:into
 
 interface a {
-  use foo:foo/a.{a}
+  use foo:foo/a.{a};
 }
diff --git a/crates/wit-component/tests/merge/bad-world5/into/deps/foo/a.wit b/crates/wit-component/tests/merge/bad-world5/into/deps/foo/a.wit
index 9b324fb2..e61f0092 100644
--- a/crates/wit-component/tests/merge/bad-world5/into/deps/foo/a.wit
+++ b/crates/wit-component/tests/merge/bad-world5/into/deps/foo/a.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 interface a {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
-  import a
+  import a;
 }
diff --git a/crates/wit-component/tests/merge/success/from/a.wit b/crates/wit-component/tests/merge/success/from/a.wit
index 987aa763..65e96468 100644
--- a/crates/wit-component/tests/merge/success/from/a.wit
+++ b/crates/wit-component/tests/merge/success/from/a.wit
@@ -1,7 +1,7 @@
 package foo:%from
 
 interface a {
-  use foo:foo/only-from.{r}
+  use foo:foo/only-from.{r};
 
-  foo: func()
+  foo: func();
 }
diff --git a/crates/wit-component/tests/merge/success/from/deps/foo/only-from.wit b/crates/wit-component/tests/merge/success/from/deps/foo/only-from.wit
index 5c4c62d7..459cdd4b 100644
--- a/crates/wit-component/tests/merge/success/from/deps/foo/only-from.wit
+++ b/crates/wit-component/tests/merge/success/from/deps/foo/only-from.wit
@@ -1,5 +1,5 @@
 interface only-from {
   record r {}
 
-  foo: func() -> r
+  foo: func() -> r;
 }
diff --git a/crates/wit-component/tests/merge/success/from/deps/foo/shared.wit b/crates/wit-component/tests/merge/success/from/deps/foo/shared.wit
index 566860e9..c91a088c 100644
--- a/crates/wit-component/tests/merge/success/from/deps/foo/shared.wit
+++ b/crates/wit-component/tests/merge/success/from/deps/foo/shared.wit
@@ -5,21 +5,21 @@ interface shared-only-from {
     c1,
   }
 
-  bar: func(x: v)
+  bar: func(x: v);
 
-  use foo:only-from-dep/a.{a}
+  use foo:only-from-dep/a.{a};
 }
 
 interface shared-items {
-  type a = u32
+  type a = u32;
 }
 
 world shared-world {
-  import shared-items
+  import shared-items;
 
-  export shared-items
+  export shared-items;
 
-  type c = u32
+  type c = u32;
 
   import d: interface {}
 }
diff --git a/crates/wit-component/tests/merge/success/from/deps/only-from-dep/a.wit b/crates/wit-component/tests/merge/success/from/deps/only-from-dep/a.wit
index ce3f3599..65380737 100644
--- a/crates/wit-component/tests/merge/success/from/deps/only-from-dep/a.wit
+++ b/crates/wit-component/tests/merge/success/from/deps/only-from-dep/a.wit
@@ -1,5 +1,5 @@
 package foo:only-from-dep
 
 interface a {
-  type a = u32
+  type a = u32;
 }
diff --git a/crates/wit-component/tests/merge/success/into/b.wit b/crates/wit-component/tests/merge/success/into/b.wit
index df1292fe..5a88548e 100644
--- a/crates/wit-component/tests/merge/success/into/b.wit
+++ b/crates/wit-component/tests/merge/success/into/b.wit
@@ -1,7 +1,7 @@
 package foo:into
 
 interface b {
-  use foo:foo/only-into.{r}
+  use foo:foo/only-into.{r};
 
-  foo: func()
+  foo: func();
 }
diff --git a/crates/wit-component/tests/merge/success/into/deps/foo/only-into.wit b/crates/wit-component/tests/merge/success/into/deps/foo/only-into.wit
index 012f2b96..60f96e4b 100644
--- a/crates/wit-component/tests/merge/success/into/deps/foo/only-into.wit
+++ b/crates/wit-component/tests/merge/success/into/deps/foo/only-into.wit
@@ -1,5 +1,5 @@
 interface only-into {
   record r {}
 
-  foo: func() -> r
+  foo: func() -> r;
 }
diff --git a/crates/wit-component/tests/merge/success/into/deps/foo/shared.wit b/crates/wit-component/tests/merge/success/into/deps/foo/shared.wit
index 2518832b..d16665dd 100644
--- a/crates/wit-component/tests/merge/success/into/deps/foo/shared.wit
+++ b/crates/wit-component/tests/merge/success/into/deps/foo/shared.wit
@@ -5,19 +5,19 @@ interface shared-only-into {
     c1,
   }
 
-  bar: func(x: v)
+  bar: func(x: v);
 }
 
 interface shared-items {
-  type a = u32
+  type a = u32;
 }
 
 world shared-world {
-  import shared-items
+  import shared-items;
 
-  export shared-items
+  export shared-items;
 
-  type c = u32
+  type c = u32;
 
   import d: interface {}
 }
diff --git a/crates/wit-component/tests/targets/error-missing-export/test.wit b/crates/wit-component/tests/targets/error-missing-export/test.wit
index 2f5a61b9..d8ef27f9 100644
--- a/crates/wit-component/tests/targets/error-missing-export/test.wit
+++ b/crates/wit-component/tests/targets/error-missing-export/test.wit
@@ -1,18 +1,18 @@
 package test:foo
 
 interface bar {
-    f: func()
+    f: func();
 }
 
 interface foo {
-    f: func()
+    f: func();
 }
 
 world foobar {
-    export bar
-    export foo
+    export bar;
+    export foo;
 }
 
 world foo-only {
-    export foo
-}
\ No newline at end of file
+    export foo;
+}
diff --git a/crates/wit-component/tests/targets/error-missing-import/test.wit b/crates/wit-component/tests/targets/error-missing-import/test.wit
index abf776fc..b5d59d23 100644
--- a/crates/wit-component/tests/targets/error-missing-import/test.wit
+++ b/crates/wit-component/tests/targets/error-missing-import/test.wit
@@ -1,13 +1,13 @@
 package test:foo
 
 interface foo {
-    f: func()
+    f: func();
 }
 
 world foobar {
-    export foo
+    export foo;
 }
 
 world imports {
-    import foo
-}
\ No newline at end of file
+    import foo;
+}
diff --git a/crates/wit-component/tests/targets/success-empty/test.wit b/crates/wit-component/tests/targets/success-empty/test.wit
index 70353fe8..496cde79 100644
--- a/crates/wit-component/tests/targets/success-empty/test.wit
+++ b/crates/wit-component/tests/targets/success-empty/test.wit
@@ -1,9 +1,9 @@
 package test:foo
 
 interface foo {
-    f: func()
+    f: func();
 }
 
 world foobar {
-    import foo
-}
\ No newline at end of file
+    import foo;
+}
diff --git a/crates/wit-component/tests/targets/success/test.wit b/crates/wit-component/tests/targets/success/test.wit
index 6f70f8d1..e01ef415 100644
--- a/crates/wit-component/tests/targets/success/test.wit
+++ b/crates/wit-component/tests/targets/success/test.wit
@@ -1,14 +1,14 @@
 package test:foo
 
 interface bar {
-    f: func()
+    f: func();
 }
 
 interface foo {
-    f: func()
+    f: func();
 }
 
 world foobar {
-    export bar
-    export foo
-}
\ No newline at end of file
+    export bar;
+    export foo;
+}
diff --git a/crates/wit-parser/tests/all.rs b/crates/wit-parser/tests/all.rs
index d2f21ec8..dfd294f6 100644
--- a/crates/wit-parser/tests/all.rs
+++ b/crates/wit-parser/tests/all.rs
@@ -106,7 +106,11 @@ impl Runner<'_> {
         let result = if test.is_dir() {
             resolve.push_dir(test).map(|(id, _)| id)
         } else {
-            UnresolvedPackage::parse_file(test).and_then(|p| resolve.push(p))
+            let mut map = SourceMap::new();
+            map.set_require_semicolons(true);
+            map.push_file(test)
+                .and_then(|()| map.parse())
+                .and_then(|p| resolve.push(p))
         };
 
         let result = if test.iter().any(|s| s == "parse-fail") {
@@ -180,6 +184,7 @@ impl Runner<'_> {
 }
 
 fn normalize(s: &str, extension: &str) -> String {
+    let s = s.trim();
     match extension {
         // .result files have error messages with paths, so normalize Windows \ separators to /
         "result" => s.replace("\\", "/").replace("\r\n", "\n"),
diff --git a/crates/wit-parser/tests/ui/comments.wit b/crates/wit-parser/tests/ui/comments.wit
index bb899d06..a46dd7b0 100644
--- a/crates/wit-parser/tests/ui/comments.wit
+++ b/crates/wit-parser/tests/ui/comments.wit
@@ -8,7 +8,7 @@ package foo:comments
 /* this /* is /* a */ nested */ comment */
 
 interface foo {
-  type x = u32
+  type x = u32;
 
   type /* foo */ bar /* baz */ = //
   stream < //
@@ -20,6 +20,6 @@ interface foo {
 
   x
 
-  >
+  >;
 
 }
diff --git a/crates/wit-parser/tests/ui/complex-include/deps/bar/root.wit b/crates/wit-parser/tests/ui/complex-include/deps/bar/root.wit
index 1fa78730..930dfb19 100644
--- a/crates/wit-parser/tests/ui/complex-include/deps/bar/root.wit
+++ b/crates/wit-parser/tests/ui/complex-include/deps/bar/root.wit
@@ -4,6 +4,6 @@ interface a {}
 interface b {}
 
 world bar-a {
-    import a
-    import b
-}
\ No newline at end of file
+    import a;
+    import b;
+}
diff --git a/crates/wit-parser/tests/ui/complex-include/deps/baz/root.wit b/crates/wit-parser/tests/ui/complex-include/deps/baz/root.wit
index 08662ebb..a6b145ff 100644
--- a/crates/wit-parser/tests/ui/complex-include/deps/baz/root.wit
+++ b/crates/wit-parser/tests/ui/complex-include/deps/baz/root.wit
@@ -4,6 +4,6 @@ interface a {}
 interface b {}
 
 world baz-a {
-    import a
-    import b
-}
\ No newline at end of file
+    import a;
+    import b;
+}
diff --git a/crates/wit-parser/tests/ui/complex-include/root.wit b/crates/wit-parser/tests/ui/complex-include/root.wit
index 4acf1145..4a545b8d 100644
--- a/crates/wit-parser/tests/ui/complex-include/root.wit
+++ b/crates/wit-parser/tests/ui/complex-include/root.wit
@@ -4,23 +4,23 @@ interface ai {}
 interface bi {}
 
 world a {
-    import ai
-    import bi
+    import ai;
+    import bi;
 }
 
 world b {
-    include foo:bar/bar-a
+    include foo:bar/bar-a;
 }
 
 world c {
-    include b
-    include foo:bar/bar-a
+    include b;
+    include foo:bar/bar-a;
 }
 
 world union-world {
-    include a
-    include b
-    include c
-    include foo:bar/bar-a
-    include foo:baz/baz-a
-}
\ No newline at end of file
+    include a;
+    include b;
+    include c;
+    include foo:bar/bar-a;
+    include foo:baz/baz-a;
+}
diff --git a/crates/wit-parser/tests/ui/cross-package-resource/deps/foo/foo.wit b/crates/wit-parser/tests/ui/cross-package-resource/deps/foo/foo.wit
index ff24cb01..61040e12 100644
--- a/crates/wit-parser/tests/ui/cross-package-resource/deps/foo/foo.wit
+++ b/crates/wit-parser/tests/ui/cross-package-resource/deps/foo/foo.wit
@@ -1,5 +1,5 @@
 package some:dep
 
 interface foo {
-  resource r
+  resource r;
 }
diff --git a/crates/wit-parser/tests/ui/cross-package-resource/foo.wit b/crates/wit-parser/tests/ui/cross-package-resource/foo.wit
index bf2e3a89..bb14898e 100644
--- a/crates/wit-parser/tests/ui/cross-package-resource/foo.wit
+++ b/crates/wit-parser/tests/ui/cross-package-resource/foo.wit
@@ -1,7 +1,7 @@
 package foo:bar
 
 interface foo {
-  use some:dep/foo.{r}
+  use some:dep/foo.{r};
 
-  type t = own<r>
+  type t = own<r>;
 }
diff --git a/crates/wit-parser/tests/ui/diamond1/join.wit b/crates/wit-parser/tests/ui/diamond1/join.wit
index a6c4208f..21eb911d 100644
--- a/crates/wit-parser/tests/ui/diamond1/join.wit
+++ b/crates/wit-parser/tests/ui/diamond1/join.wit
@@ -1,6 +1,6 @@
 package foo:foo
 
 world foo {
-  import foo:dep1/types
-  import foo:dep2/types
+  import foo:dep1/types;
+  import foo:dep2/types;
 }
diff --git a/crates/wit-parser/tests/ui/disambiguate-diamond/shared1.wit b/crates/wit-parser/tests/ui/disambiguate-diamond/shared1.wit
index f655d9b0..9cc7bbd9 100644
--- a/crates/wit-parser/tests/ui/disambiguate-diamond/shared1.wit
+++ b/crates/wit-parser/tests/ui/disambiguate-diamond/shared1.wit
@@ -1,3 +1,3 @@
 interface shared1 {
-  type the-type = u32
+  type the-type = u32;
 }
diff --git a/crates/wit-parser/tests/ui/disambiguate-diamond/shared2.wit b/crates/wit-parser/tests/ui/disambiguate-diamond/shared2.wit
index 4e191924..07b75f68 100644
--- a/crates/wit-parser/tests/ui/disambiguate-diamond/shared2.wit
+++ b/crates/wit-parser/tests/ui/disambiguate-diamond/shared2.wit
@@ -1,3 +1,3 @@
 interface shared2 {
-  type the-type = u32
+  type the-type = u32;
 }
diff --git a/crates/wit-parser/tests/ui/disambiguate-diamond/world.wit b/crates/wit-parser/tests/ui/disambiguate-diamond/world.wit
index f9021b73..c7714eb6 100644
--- a/crates/wit-parser/tests/ui/disambiguate-diamond/world.wit
+++ b/crates/wit-parser/tests/ui/disambiguate-diamond/world.wit
@@ -2,12 +2,12 @@ package foo:diamond
 
 world foo {
   import foo: interface {
-    use shared1.{the-type}
+    use shared1.{the-type};
   }
   import bar: interface {
-    use shared2.{the-type}
+    use shared2.{the-type};
   }
 
-  import shared1
-  import shared2
+  import shared1;
+  import shared2;
 }
diff --git a/crates/wit-parser/tests/ui/embedded.wit.md b/crates/wit-parser/tests/ui/embedded.wit.md
index 4bfaa2a3..618dd277 100644
--- a/crates/wit-parser/tests/ui/embedded.wit.md
+++ b/crates/wit-parser/tests/ui/embedded.wit.md
@@ -9,7 +9,7 @@ interface foo {
 ```
 
 ```wit
-x: func()
+x: func();
 ```
 
 Intervening content, including a non-wit codeblock:
@@ -18,7 +18,7 @@ function func() {}
 ```
 
 ```wit
-y: func()
+y: func();
 ```
 
 ## A new section
@@ -26,7 +26,7 @@ y: func()
 In which, another wit code block!
 
 ```wit
-z: func()
+z: func();
 ```
 
 ```wit
diff --git a/crates/wit-parser/tests/ui/foreign-deps-union/deps/foreign-pkg/the-doc.wit b/crates/wit-parser/tests/ui/foreign-deps-union/deps/foreign-pkg/the-doc.wit
index cba7a70e..957215de 100644
--- a/crates/wit-parser/tests/ui/foreign-deps-union/deps/foreign-pkg/the-doc.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps-union/deps/foreign-pkg/the-doc.wit
@@ -1,5 +1,5 @@
 package foo:foreign-pkg
 
 interface the-default {
-  type some-type = u32
+  type some-type = u32;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps-union/deps/some-pkg/some-doc.wit b/crates/wit-parser/tests/ui/foreign-deps-union/deps/some-pkg/some-doc.wit
index 3bad202e..ff7e0c03 100644
--- a/crates/wit-parser/tests/ui/foreign-deps-union/deps/some-pkg/some-doc.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps-union/deps/some-pkg/some-doc.wit
@@ -1,13 +1,13 @@
 package foo:some-pkg
 
 interface the-default {
-  type from-default = string
+  type from-default = string;
 }
 
 interface some-interface {
-  type another-type = u32
+  type another-type = u32;
 }
 
 interface another-interface {
-  type yet-another-type = u8
+  type yet-another-type = u8;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/clocks.wit b/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/clocks.wit
index 0ea67674..abdd2227 100644
--- a/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/clocks.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/clocks.wit
@@ -1,5 +1,5 @@
 package foo:wasi
 
 interface clocks {
-  type timestamp = u64
+  type timestamp = u64;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/wasi.wit b/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/wasi.wit
index 09bcd3ca..18d2d3d4 100644
--- a/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/wasi.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps-union/deps/wasi/wasi.wit
@@ -1,6 +1,6 @@
 package foo:wasi
 
 world wasi {
-    import filesystem
-    import clocks
-}
\ No newline at end of file
+    import filesystem;
+    import clocks;
+}
diff --git a/crates/wit-parser/tests/ui/foreign-deps-union/root.wit b/crates/wit-parser/tests/ui/foreign-deps-union/root.wit
index 787cff09..617f66b5 100644
--- a/crates/wit-parser/tests/ui/foreign-deps-union/root.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps-union/root.wit
@@ -1,50 +1,50 @@
 package foo:root
 
 interface foo {
-  use foo:wasi/clocks.{timestamp}
-  use foo:wasi/filesystem.{stat}
+  use foo:wasi/clocks.{timestamp};
+  use foo:wasi/filesystem.{stat};
 }
 
 world my-world {
-  import foo:wasi/filesystem
-  import foo:wasi/clocks
+  import foo:wasi/filesystem;
+  import foo:wasi/clocks;
 
-  export foo:corp/saas
+  export foo:corp/saas;
 }
 
-use foo:wasi/filesystem as filesystem
-use foo:wasi/clocks as clocks
+use foo:wasi/filesystem as filesystem;
+use foo:wasi/clocks as clocks;
 
 world my-world2 {
-  import filesystem
-  import clocks
-  export foo
-  export foo:corp/saas
+  import filesystem;
+  import clocks;
+  export foo;
+  export foo:corp/saas;
 }
 
 interface bar {
-  use filesystem.{}
-  use foo:some-pkg/the-default.{from-default}
-  use foo:some-pkg/some-interface.{another-type}
-  use foo:some-pkg/some-interface.{}
-  use foo:some-pkg/another-interface.{yet-another-type}
-  use foo:different-pkg/i.{}
+  use filesystem.{};
+  use foo:some-pkg/the-default.{from-default};
+  use foo:some-pkg/some-interface.{another-type};
+  use foo:some-pkg/some-interface.{};
+  use foo:some-pkg/another-interface.{yet-another-type};
+  use foo:different-pkg/i.{};
 }
 
 world bars-world {
-  import foo:some-pkg/the-default
-  import foo:another-pkg/other-interface
+  import foo:some-pkg/the-default;
+  import foo:another-pkg/other-interface;
 }
 
 interface use1 {
-  use foo:foreign-pkg/the-default.{some-type}
+  use foo:foreign-pkg/the-default.{some-type};
 }
 interface use2 {
-  use foo:foreign-pkg/the-default.{some-type}
+  use foo:foreign-pkg/the-default.{some-type};
 }
 
 world unionw-world {
-  include my-world
-  include my-world2
-  include foo:wasi/wasi
+  include my-world;
+  include my-world2;
+  include foo:wasi/wasi;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps/deps/foreign-pkg/the-doc.wit b/crates/wit-parser/tests/ui/foreign-deps/deps/foreign-pkg/the-doc.wit
index cba7a70e..957215de 100644
--- a/crates/wit-parser/tests/ui/foreign-deps/deps/foreign-pkg/the-doc.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps/deps/foreign-pkg/the-doc.wit
@@ -1,5 +1,5 @@
 package foo:foreign-pkg
 
 interface the-default {
-  type some-type = u32
+  type some-type = u32;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps/deps/some-pkg/some-doc.wit b/crates/wit-parser/tests/ui/foreign-deps/deps/some-pkg/some-doc.wit
index 3bad202e..ff7e0c03 100644
--- a/crates/wit-parser/tests/ui/foreign-deps/deps/some-pkg/some-doc.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps/deps/some-pkg/some-doc.wit
@@ -1,13 +1,13 @@
 package foo:some-pkg
 
 interface the-default {
-  type from-default = string
+  type from-default = string;
 }
 
 interface some-interface {
-  type another-type = u32
+  type another-type = u32;
 }
 
 interface another-interface {
-  type yet-another-type = u8
+  type yet-another-type = u8;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps/deps/wasi/clocks.wit b/crates/wit-parser/tests/ui/foreign-deps/deps/wasi/clocks.wit
index 0ea67674..abdd2227 100644
--- a/crates/wit-parser/tests/ui/foreign-deps/deps/wasi/clocks.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps/deps/wasi/clocks.wit
@@ -1,5 +1,5 @@
 package foo:wasi
 
 interface clocks {
-  type timestamp = u64
+  type timestamp = u64;
 }
diff --git a/crates/wit-parser/tests/ui/foreign-deps/root.wit b/crates/wit-parser/tests/ui/foreign-deps/root.wit
index 557cbda2..ff17bd44 100644
--- a/crates/wit-parser/tests/ui/foreign-deps/root.wit
+++ b/crates/wit-parser/tests/ui/foreign-deps/root.wit
@@ -1,44 +1,44 @@
 package foo:root
 
 interface foo {
-  use foo:wasi/clocks.{timestamp}
-  use foo:wasi/filesystem.{stat}
+  use foo:wasi/clocks.{timestamp};
+  use foo:wasi/filesystem.{stat};
 }
 
 world my-world {
-  import foo:wasi/filesystem
-  import foo:wasi/clocks
+  import foo:wasi/filesystem;
+  import foo:wasi/clocks;
 
-  export foo:corp/saas
+  export foo:corp/saas;
 }
 
-use foo:wasi/filesystem as filesystem
-use foo:wasi/clocks as clocks
+use foo:wasi/filesystem as filesystem;
+use foo:wasi/clocks as clocks;
 
 world my-world2 {
-  import filesystem
-  import clocks
-  export foo
-  export foo:corp/saas
+  import filesystem;
+  import clocks;
+  export foo;
+  export foo:corp/saas;
 }
 
 interface bar {
-  use filesystem.{}
-  use foo:some-pkg/the-default.{from-default}
-  use foo:some-pkg/some-interface.{another-type}
-  use foo:some-pkg/some-interface.{}
-  use foo:some-pkg/another-interface.{yet-another-type}
-  use foo:different-pkg/i.{}
+  use filesystem.{};
+  use foo:some-pkg/the-default.{from-default};
+  use foo:some-pkg/some-interface.{another-type};
+  use foo:some-pkg/some-interface.{};
+  use foo:some-pkg/another-interface.{yet-another-type};
+  use foo:different-pkg/i.{};
 }
 
 world bars-world {
-  import foo:some-pkg/the-default
-  import foo:another-pkg/other-interface
+  import foo:some-pkg/the-default;
+  import foo:another-pkg/other-interface;
 }
 
 interface use1 {
-  use foo:foreign-pkg/the-default.{some-type}
+  use foo:foreign-pkg/the-default.{some-type};
 }
 interface use2 {
-  use foo:foreign-pkg/the-default.{some-type}
+  use foo:foreign-pkg/the-default.{some-type};
 }
diff --git a/crates/wit-parser/tests/ui/functions.wit b/crates/wit-parser/tests/ui/functions.wit
index b08183a9..28ed93e0 100644
--- a/crates/wit-parser/tests/ui/functions.wit
+++ b/crates/wit-parser/tests/ui/functions.wit
@@ -1,14 +1,14 @@
 package foo:functions
 
 interface functions {
-  f1: func()
-  f2: func(a: u32)
-  f3: func(a: u32,)
-  f4: func() -> u32
-  f6: func() -> tuple<u32, u32>
-  f7: func(a: float32, b: float32) -> tuple<u32, u32>
-  f8: func(a: option<u32>) -> result<u32, float32>
-  f9: func() -> (u: u32, f: float32)
-  f10: func() -> (u: u32)
-  f11: func() -> ()
+  f1: func();
+  f2: func(a: u32);
+  f3: func(a: u32,);
+  f4: func() -> u32;
+  f6: func() -> tuple<u32, u32>;
+  f7: func(a: float32, b: float32) -> tuple<u32, u32>;
+  f8: func(a: option<u32>) -> result<u32, float32>;
+  f9: func() -> (u: u32, f: float32);
+  f10: func() -> (u: u32);
+  f11: func() -> ();
 }
diff --git a/crates/wit-parser/tests/ui/ignore-files-deps/world.wit b/crates/wit-parser/tests/ui/ignore-files-deps/world.wit
index 8b51988f..e5f7557e 100644
--- a/crates/wit-parser/tests/ui/ignore-files-deps/world.wit
+++ b/crates/wit-parser/tests/ui/ignore-files-deps/world.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  import foo:bar/types
+  import foo:bar/types;
 }
diff --git a/crates/wit-parser/tests/ui/include-reps.wit b/crates/wit-parser/tests/ui/include-reps.wit
index 20717302..2fe7d4a9 100644
--- a/crates/wit-parser/tests/ui/include-reps.wit
+++ b/crates/wit-parser/tests/ui/include-reps.wit
@@ -4,12 +4,12 @@ interface a {}
 interface b {}
 
 world bar {
-    import a
-    export b
+    import a;
+    export b;
 }
 
 world foo {
-  include bar
-  include bar
-  include bar
-}
\ No newline at end of file
+  include bar;
+  include bar;
+  include bar;
+}
diff --git a/crates/wit-parser/tests/ui/kebab-name-include-with.wit b/crates/wit-parser/tests/ui/kebab-name-include-with.wit
index 08a35f02..abfaffcc 100644
--- a/crates/wit-parser/tests/ui/kebab-name-include-with.wit
+++ b/crates/wit-parser/tests/ui/kebab-name-include-with.wit
@@ -1,8 +1,8 @@
 package foo:foo
 
-world foo { import a: func() }
-world bar { import a: func() }
-world baz { 
+world foo { import a: func(); }
+world bar { import a: func(); }
+world baz {
     include foo with { a as b }
-    include bar
-}
\ No newline at end of file
+    include bar;
+}
diff --git a/crates/wit-parser/tests/ui/many-names/a.wit b/crates/wit-parser/tests/ui/many-names/a.wit
index e3f9eab0..6f7ec5a1 100644
--- a/crates/wit-parser/tests/ui/many-names/a.wit
+++ b/crates/wit-parser/tests/ui/many-names/a.wit
@@ -1,2 +1,2 @@
 interface x {}
-use x as name
+use x as name;
diff --git a/crates/wit-parser/tests/ui/multi-file/bar.wit b/crates/wit-parser/tests/ui/multi-file/bar.wit
index 67f33432..f9b7de3a 100644
--- a/crates/wit-parser/tests/ui/multi-file/bar.wit
+++ b/crates/wit-parser/tests/ui/multi-file/bar.wit
@@ -5,16 +5,16 @@ interface irrelevant-name {
 }
 
 interface depends-on-later-item {
-  use depend-on-me.{x}
+  use depend-on-me.{x};
 }
 
 interface depend-on-me {
-  type x = u32
+  type x = u32;
 }
 
 world more-depends-on-later-things {
-  import later-interface
-  export later-interface
+  import later-interface;
+  export later-interface;
 }
 
 interface later-interface {
diff --git a/crates/wit-parser/tests/ui/multi-file/cycle-a.wit b/crates/wit-parser/tests/ui/multi-file/cycle-a.wit
index 559ee392..c66ac96f 100644
--- a/crates/wit-parser/tests/ui/multi-file/cycle-a.wit
+++ b/crates/wit-parser/tests/ui/multi-file/cycle-a.wit
@@ -1,7 +1,7 @@
 interface cycle1 {
-  type t = u32
+  type t = u32;
 }
 
 interface cycle3 {
-  use cycle2.{t}
+  use cycle2.{t};
 }
diff --git a/crates/wit-parser/tests/ui/multi-file/cycle-b.wit b/crates/wit-parser/tests/ui/multi-file/cycle-b.wit
index 85f26129..e5d803f4 100644
--- a/crates/wit-parser/tests/ui/multi-file/cycle-b.wit
+++ b/crates/wit-parser/tests/ui/multi-file/cycle-b.wit
@@ -1,3 +1,3 @@
 interface cycle2 {
-  use cycle1.{t}
+  use cycle1.{t};
 }
diff --git a/crates/wit-parser/tests/ui/multi-file/foo.wit b/crates/wit-parser/tests/ui/multi-file/foo.wit
index 7992d2ef..c2c8bd1e 100644
--- a/crates/wit-parser/tests/ui/multi-file/foo.wit
+++ b/crates/wit-parser/tests/ui/multi-file/foo.wit
@@ -1,31 +1,31 @@
 package foo:multi-file
 
 interface foo {
-  type x = u32
+  type x = u32;
 }
 
-use foo as foo2
+use foo as foo2;
 
 interface something-else {
-  type y = u64
+  type y = u64;
 }
 
-use depend-on-me as a-different-name
+use depend-on-me as a-different-name;
 
 interface bar {
-  use foo.{x}
-  use foo.{x as x2}
-  use foo2.{x as x3}
-  use a-different-name.{x as x4}
-  use something-else.{y}
-  use something-else.{y as y2}
-  use irrelevant-name.{a-name}
+  use foo.{x};
+  use foo.{x as x2};
+  use foo2.{x as x3};
+  use a-different-name.{x as x4};
+  use something-else.{y};
+  use something-else.{y as y2};
+  use irrelevant-name.{a-name};
 }
 
 world the-world {
-  import a-different-name
+  import a-different-name;
 
-  use a-different-name.{x}
+  use a-different-name.{x};
 
-  import foo: func() -> x
+  import foo: func() -> x;
 }
diff --git a/crates/wit-parser/tests/ui/name-both-resource-and-type/deps/dep/foo.wit b/crates/wit-parser/tests/ui/name-both-resource-and-type/deps/dep/foo.wit
index 50e5e97b..290eb87d 100644
--- a/crates/wit-parser/tests/ui/name-both-resource-and-type/deps/dep/foo.wit
+++ b/crates/wit-parser/tests/ui/name-both-resource-and-type/deps/dep/foo.wit
@@ -1,5 +1,5 @@
 package some:dep
 
 interface foo {
-  resource a
+  resource a;
 }
diff --git a/crates/wit-parser/tests/ui/name-both-resource-and-type/foo.wit b/crates/wit-parser/tests/ui/name-both-resource-and-type/foo.wit
index fa617495..ac5c9246 100644
--- a/crates/wit-parser/tests/ui/name-both-resource-and-type/foo.wit
+++ b/crates/wit-parser/tests/ui/name-both-resource-and-type/foo.wit
@@ -1,9 +1,9 @@
 package foo:bar
 
 interface foo {
-  use some:dep/foo.{a}
+  use some:dep/foo.{a};
 
-  type t1 = a
-  type t2 = borrow<a>
-  type t3 = borrow<t1>
+  type t1 = a;
+  type t2 = borrow<a>;
+  type t3 = borrow<t1>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit b/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit
index 8ad4d8ab..ddec43e7 100644
--- a/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit
@@ -1,4 +1,6 @@
 // parse-fail
+package foo:bar
+
 interface foo {
-  type foo = bar
+  type foo = bar;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit.result b/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit.result
index d25b316c..1561247d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/alias-no-type.wit.result
@@ -1,1 +1,5 @@
-no `package` header was found in any WIT file for this package
\ No newline at end of file
+type `bar` does not exist
+     --> tests/ui/parse-fail/alias-no-type.wit:5:14
+      |
+    5 |   type foo = bar;
+      |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-function.wit b/crates/wit-parser/tests/ui/parse-fail/bad-function.wit
index 2c25621b..17cc2765 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-function.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-function.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 interface foo {
-  x: func(param: nonexistent)
+  x: func(param: nonexistent);
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-function.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-function.wit.result
index 79120745..a2c71f17 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-function.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-function.wit.result
@@ -1,5 +1,5 @@
 name `nonexistent` is not defined
      --> tests/ui/parse-fail/bad-function.wit:6:18
       |
-    6 |   x: func(param: nonexistent)
+    6 |   x: func(param: nonexistent);
       |                  ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit b/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit
index ed121e28..8b4d76c1 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 interface foo {
-  x: func() -> nonexistent
+  x: func() -> nonexistent;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit.result
index 910a88f4..5cd18319 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-function2.wit.result
@@ -1,5 +1,5 @@
 name `nonexistent` is not defined
      --> tests/ui/parse-fail/bad-function2.wit:6:16
       |
-    6 |   x: func() -> nonexistent
+    6 |   x: func() -> nonexistent;
       |                ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit b/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit
index 555ee0fd..14a4a642 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  include non-existance
-}
\ No newline at end of file
+  include non-existance;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit.result
index 76aff050..d4c634ea 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-include1.wit.result
@@ -1,5 +1,5 @@
 interface or world `non-existance` not found in package
      --> tests/ui/parse-fail/bad-include1.wit:4:11
       |
-    4 |   include non-existance
+    4 |   include non-existance;
       |           ^------------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-include2.wit b/crates/wit-parser/tests/ui/parse-fail/bad-include2.wit
index 5b5aff80..02883472 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-include2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-include2.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 world bar {
-    include foo
+    include foo;
 }
 
 world foo {
-    include bar
-}
\ No newline at end of file
+    include bar;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-include3.wit b/crates/wit-parser/tests/ui/parse-fail/bad-include3.wit
index 3503ac5f..35710b89 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-include3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-include3.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  include foo
-}
\ No newline at end of file
+  include foo;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg1.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg1.wit.result
index 04611d28..85cc50ed 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg1.wit.result
@@ -4,5 +4,5 @@ Caused by:
     interface or world `nonexistent` not found in package
          --> tests/ui/parse-fail/bad-pkg1/root.wit:4:7
           |
-        4 |   use nonexistent.{}
+        4 |   use nonexistent.{};
           |       ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg1/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg1/root.wit
index b93a1249..7476804a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg1/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg1/root.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  use nonexistent.{}
+  use nonexistent.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg2.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg2.wit.result
index 8b7201ea..57f45a07 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg2.wit.result
@@ -1,5 +1,5 @@
 interface not found in package
      --> tests/ui/parse-fail/bad-pkg2/root.wit:4:15
       |
-    4 |   use foo:bar/nonexistent.{}
+    4 |   use foo:bar/nonexistent.{};
       |               ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg2/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg2/root.wit
index eb653b44..891429ac 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg2/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg2/root.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  use foo:bar/nonexistent.{}
+  use foo:bar/nonexistent.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg3.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg3.wit.result
index f2e6683b..edcb5947 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg3.wit.result
@@ -1,5 +1,5 @@
 interface not found in package
      --> tests/ui/parse-fail/bad-pkg3/root.wit:4:15
       |
-    4 |   use foo:bar/baz.{}
+    4 |   use foo:bar/baz.{};
       |               ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg3/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg3/root.wit
index 7c76fc54..776677cf 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg3/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg3/root.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  use foo:bar/baz.{}
+  use foo:bar/baz.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4.wit.result
index 3657cd14..11c42ac8 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4.wit.result
@@ -1,5 +1,5 @@
 type `a-name` not defined in interface
      --> tests/ui/parse-fail/bad-pkg4/root.wit:3:20
       |
-    3 |   use foo:bar/baz.{a-name}
+    3 |   use foo:bar/baz.{a-name};
       |                    ^-----
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/deps/bar/baz.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/deps/bar/baz.wit
index 239ac3bd..e1eef0ed 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/deps/bar/baz.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/deps/bar/baz.wit
@@ -1,4 +1,4 @@
 package foo:bar
 interface baz {
-  a-name: func()
+  a-name: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/root.wit
index 5de0ff6b..522de479 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg4/root.wit
@@ -1,4 +1,4 @@
 package foo:foo
 interface foo {
-  use foo:bar/baz.{a-name}
+  use foo:bar/baz.{a-name};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg5.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg5.wit.result
index 500d74cf..15a04b26 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg5.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg5.wit.result
@@ -1,5 +1,5 @@
 type `nonexistent` not defined in interface
      --> tests/ui/parse-fail/bad-pkg5/root.wit:3:20
       |
-    3 |   use foo:bar/baz.{nonexistent}
+    3 |   use foo:bar/baz.{nonexistent};
       |                    ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg5/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg5/root.wit
index f4d8ea56..ea8fcf06 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg5/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg5/root.wit
@@ -1,4 +1,4 @@
 package foo:foo
 interface foo {
-  use foo:bar/baz.{nonexistent}
+  use foo:bar/baz.{nonexistent};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg6.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-pkg6.wit.result
index 73c73a9b..40cf6058 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg6.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg6.wit.result
@@ -1,5 +1,5 @@
 failed to find package `foo:bar` in `deps` directory
      --> tests/ui/parse-fail/bad-pkg6/root.wit:3:7
       |
-    3 |   use foo:bar/baz.{}
+    3 |   use foo:bar/baz.{};
       |       ^------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-pkg6/root.wit b/crates/wit-parser/tests/ui/parse-fail/bad-pkg6/root.wit
index 7c3602d6..f7a80474 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-pkg6/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-pkg6/root.wit
@@ -1,4 +1,4 @@
 package foo:foo
 interface foo {
-  use foo:bar/baz.{}
+  use foo:bar/baz.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit
index b7de8fc7..aa47e7ad 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 interface foo {
-  type t = borrow<u32>
+  type t = borrow<u32>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit.result
index de95a19a..2d47c39d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource1.wit.result
@@ -1,5 +1,5 @@
 expected an identifier or string, found keyword `u32`
      --> tests/ui/parse-fail/bad-resource1.wit:4:19
       |
-    4 |   type t = borrow<u32>
+    4 |   type t = borrow<u32>;
       |                   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit
index 9786d149..a6ea5559 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 interface foo {
-  type t = own<u32>
+  type t = own<u32>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit.result
index 46728d7c..88ade63e 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource10.wit.result
@@ -1,5 +1,5 @@
 expected an identifier or string, found keyword `u32`
      --> tests/ui/parse-fail/bad-resource10.wit:4:16
       |
-    4 |   type t = own<u32>
+    4 |   type t = own<u32>;
       |                ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit
index dbe433fb..34314f58 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 interface foo {
-  type t = own<foo>
+  type t = own<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit.result
index df298ce9..0b1eb7ee 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource11.wit.result
@@ -1,5 +1,5 @@
 type `foo` does not exist
      --> tests/ui/parse-fail/bad-resource11.wit:4:16
       |
-    4 |   type t = own<foo>
+    4 |   type t = own<foo>;
       |                ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit
index 6f84b3a5..0357ec39 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit
@@ -1,6 +1,6 @@
 package foo:bar
 
 interface foo {
-  foo: func()
-  type t = own<foo>
+  foo: func();
+  type t = own<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit.result
index 56286c9b..9b8f59b1 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource12.wit.result
@@ -1,5 +1,5 @@
 type `foo` does not exist
      --> tests/ui/parse-fail/bad-resource12.wit:5:16
       |
-    5 |   type t = own<foo>
+    5 |   type t = own<foo>;
       |                ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit
index 3fe73608..a5782585 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit
@@ -1,6 +1,6 @@
 package foo:bar
 
 interface foo {
-  type foo = u32
-  type t = own<foo>
+  type foo = u32;
+  type t = own<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit.result
index 9aa5852e..889697a3 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource13.wit.result
@@ -1,5 +1,5 @@
 type `foo` used in a handle must be a resource
      --> tests/ui/parse-fail/bad-resource13.wit:5:16
       |
-    5 |   type t = own<foo>
+    5 |   type t = own<foo>;
       |                ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit
index 78e97894..6681dff3 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit
@@ -2,6 +2,6 @@ package foo:bar
 
 interface foo {
   resource a {}
-  type t = own<a>
-  type b = own<t>
+  type t = own<a>;
+  type b = own<t>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit.result
index 03ea800b..93fea21a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource14.wit.result
@@ -1,5 +1,5 @@
 type `t` used in a handle must be a resource
      --> tests/ui/parse-fail/bad-resource14.wit:6:16
       |
-    6 |   type b = own<t>
+    6 |   type b = own<t>;
       |                ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource15.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource15.wit.result
index 35ac5e60..5e840e31 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource15.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource15.wit.result
@@ -1,5 +1,5 @@
 type used in a handle must be a resource
      --> tests/ui/parse-fail/bad-resource15/foo.wit:6:16
       |
-    6 |   type t = own<r>
+    6 |   type t = own<r>;
       |                ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource15/deps/foo/foo.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource15/deps/foo/foo.wit
index 5659a277..cf44f979 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource15/deps/foo/foo.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource15/deps/foo/foo.wit
@@ -1,5 +1,5 @@
 package some:dep
 
 interface foo {
-  type r = u32
+  type r = u32;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource15/foo.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource15/foo.wit
index bf2e3a89..bb14898e 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource15/foo.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource15/foo.wit
@@ -1,7 +1,7 @@
 package foo:bar
 
 interface foo {
-  use some:dep/foo.{r}
+  use some:dep/foo.{r};
 
-  type t = own<r>
+  type t = own<r>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit
index c07e5fe7..7443c22f 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit
@@ -1,5 +1,5 @@
 package foo:bar
 
 interface foo {
-  type t = borrow<foo>
+  type t = borrow<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit.result
index 21514a30..21993b59 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource2.wit.result
@@ -1,5 +1,5 @@
 type `foo` does not exist
      --> tests/ui/parse-fail/bad-resource2.wit:4:19
       |
-    4 |   type t = borrow<foo>
+    4 |   type t = borrow<foo>;
       |                   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit
index 419bd6a3..7d7b197d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit
@@ -1,6 +1,6 @@
 package foo:bar
 
 interface foo {
-  foo: func()
-  type t = borrow<foo>
+  foo: func();
+  type t = borrow<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit.result
index 214781d9..747293aa 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource3.wit.result
@@ -1,5 +1,5 @@
 type `foo` does not exist
      --> tests/ui/parse-fail/bad-resource3.wit:5:19
       |
-    5 |   type t = borrow<foo>
+    5 |   type t = borrow<foo>;
       |                   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit
index d7f99d2a..3178ce7e 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit
@@ -1,6 +1,6 @@
 package foo:bar
 
 interface foo {
-  type foo = u32
-  type t = borrow<foo>
+  type foo = u32;
+  type t = borrow<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit.result
index cb0f8162..2a47f48b 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource4.wit.result
@@ -1,5 +1,5 @@
 type `foo` used in a handle must be a resource
      --> tests/ui/parse-fail/bad-resource4.wit:5:19
       |
-    5 |   type t = borrow<foo>
+    5 |   type t = borrow<foo>;
       |                   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit
index 0dd97682..4de9a834 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit
@@ -2,6 +2,6 @@ package foo:bar
 
 interface foo {
   resource a {}
-  type t = borrow<a>
-  type b = borrow<t>
+  type t = borrow<a>;
+  type b = borrow<t>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit.result
index 453dc187..836fd4e2 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource5.wit.result
@@ -1,5 +1,5 @@
 type `t` used in a handle must be a resource
      --> tests/ui/parse-fail/bad-resource5.wit:6:19
       |
-    6 |   type b = borrow<t>
+    6 |   type b = borrow<t>;
       |                   ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit
index 030c31b9..40d0af94 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit
@@ -2,6 +2,6 @@ package foo:bar
 
 interface foo {
   resource a {
-    constructor() -> u32
+    constructor() -> u32;
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit.result
index e28c20eb..bd561a41 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource6.wit.result
@@ -1,5 +1,5 @@
-expected `constructor` or identifier, found `->`
+expected ';', found `->`
      --> tests/ui/parse-fail/bad-resource6.wit:5:19
       |
-    5 |     constructor() -> u32
-      |                   ^-
\ No newline at end of file
+    5 |     constructor() -> u32;
+      |                   ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit
index 40d9eeeb..790f0eb0 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit
@@ -2,7 +2,7 @@ package foo:bar
 
 interface foo {
   resource a {
-    constructor()
-    constructor()
+    constructor();
+    constructor();
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit.result
index 72e9a3ed..b201ca8c 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource7.wit.result
@@ -1,5 +1,5 @@
 duplicate constructors
      --> tests/ui/parse-fail/bad-resource7.wit:6:5
       |
-    6 |     constructor()
+    6 |     constructor();
       |     ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit b/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit
index 73b4d179..316b7207 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit
@@ -2,7 +2,7 @@ package foo:bar
 
 interface foo {
   resource a {
-    a: func()
-    a: static func()
+    a: func();
+    a: static func();
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit.result
index 77b8cc29..85179e79 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-resource8.wit.result
@@ -1,5 +1,5 @@
 duplicate function name `a`
      --> tests/ui/parse-fail/bad-resource8.wit:6:5
       |
-    6 |     a: static func()
+    6 |     a: static func();
       |     ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit b/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit
index 6c5a1537..e0094b78 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit
@@ -1,5 +1,5 @@
 package foo:foo
 world a {
-  type a = u32
-  import a: func()
+  type a = u32;
+  import a: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit.result b/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit.result
index 2b32378d..1c23f517 100644
--- a/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/bad-world-type1.wit.result
@@ -1,5 +1,5 @@
 import `a` conflicts with prior import of same name
      --> tests/ui/parse-fail/bad-world-type1.wit:4:10
       |
-    4 |   import a: func()
+    4 |   import a: func();
       |          ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle.wit b/crates/wit-parser/tests/ui/parse-fail/cycle.wit
index 335595d8..17ac5b31 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle.wit
@@ -2,5 +2,5 @@
 package foo:foo
 
 interface foo {
-  type foo = foo
+  type foo = foo;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle.wit.result b/crates/wit-parser/tests/ui/parse-fail/cycle.wit.result
index 3639b3c2..21132ace 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle.wit.result
@@ -1,5 +1,5 @@
 type `foo` depends on itself
      --> tests/ui/parse-fail/cycle.wit:5:14
       |
-    5 |   type foo = foo
+    5 |   type foo = foo;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle2.wit b/crates/wit-parser/tests/ui/parse-fail/cycle2.wit
index 65aab1a8..485afe9d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle2.wit
@@ -2,6 +2,6 @@
 package foo:foo
 
 interface foo {
-  type foo = bar
-  type bar = foo
+  type foo = bar;
+  type bar = foo;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle2.wit.result b/crates/wit-parser/tests/ui/parse-fail/cycle2.wit.result
index 2e4a5290..c0f10cec 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle2.wit.result
@@ -1,5 +1,5 @@
 type `bar` depends on itself
      --> tests/ui/parse-fail/cycle2.wit:5:14
       |
-    5 |   type foo = bar
+    5 |   type foo = bar;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle3.wit b/crates/wit-parser/tests/ui/parse-fail/cycle3.wit
index 59a42a32..0fbf98a5 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle3.wit
@@ -2,6 +2,6 @@
 package foo:foo
 
 interface foo {
-  type foo = bar
-  type bar = option<foo>
+  type foo = bar;
+  type bar = option<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle3.wit.result b/crates/wit-parser/tests/ui/parse-fail/cycle3.wit.result
index ffdfec0a..76027ea9 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle3.wit.result
@@ -1,5 +1,5 @@
 type `bar` depends on itself
      --> tests/ui/parse-fail/cycle3.wit:5:14
       |
-    5 |   type foo = bar
+    5 |   type foo = bar;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle4.wit b/crates/wit-parser/tests/ui/parse-fail/cycle4.wit
index 716ac832..1e211489 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle4.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle4.wit
@@ -2,6 +2,6 @@
 package foo:foo
 
 interface foo {
-  type foo = bar
+  type foo = bar;
   record bar { x: foo }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle4.wit.result b/crates/wit-parser/tests/ui/parse-fail/cycle4.wit.result
index 67325b77..8fe9ae39 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle4.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle4.wit.result
@@ -1,5 +1,5 @@
 type `bar` depends on itself
      --> tests/ui/parse-fail/cycle4.wit:5:14
       |
-    5 |   type foo = bar
+    5 |   type foo = bar;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle5.wit b/crates/wit-parser/tests/ui/parse-fail/cycle5.wit
index 2aa73441..175938fc 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle5.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle5.wit
@@ -2,6 +2,6 @@
 package foo:foo
 
 interface foo {
-  type foo = bar
-  type bar = list<foo>
+  type foo = bar;
+  type bar = list<foo>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/cycle5.wit.result b/crates/wit-parser/tests/ui/parse-fail/cycle5.wit.result
index 22064dac..cf66c72f 100644
--- a/crates/wit-parser/tests/ui/parse-fail/cycle5.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/cycle5.wit.result
@@ -1,5 +1,5 @@
 type `bar` depends on itself
      --> tests/ui/parse-fail/cycle5.wit:5:14
       |
-    5 |   type foo = bar
+    5 |   type foo = bar;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit b/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit
new file mode 100644
index 00000000..e403758c
--- /dev/null
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit
@@ -0,0 +1,7 @@
+// parse-fail
+
+package foo:foo
+
+interface foo {
+  foo: func(foo: u32, foo: u64)
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit.result b/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit.result
new file mode 100644
index 00000000..32c98b08
--- /dev/null
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-function-params.wit.result
@@ -0,0 +1,5 @@
+param `foo` is defined more than once
+     --> tests/ui/parse-fail/duplicate-function-params.wit:6:23
+      |
+    6 |   foo: func(foo: u32, foo: u64)
+      |                       ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit b/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit
index b581d731..2437d97d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit
@@ -3,6 +3,6 @@
 package foo:foo
 
 interface foo {
-  foo: func()
-  foo: func()
+  foo: func();
+  foo: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit.result b/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit.result
index 30ec5002..7cecd564 100644
--- a/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-functions.wit.result
@@ -1,5 +1,5 @@
 name `foo` is defined more than once
      --> tests/ui/parse-fail/duplicate-functions.wit:7:3
       |
-    7 |   foo: func()
+    7 |   foo: func();
       |   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit b/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit
index 7284164b..e01f2675 100644
--- a/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit
@@ -2,6 +2,6 @@
 package foo:foo
 
 interface foo {
-  type foo = s32
-  type foo = s32
+  type foo = s32;
+  type foo = s32;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit.result b/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit.result
index 09187e9f..45731a17 100644
--- a/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/duplicate-type.wit.result
@@ -1,5 +1,5 @@
 name `foo` is defined more than once
      --> tests/ui/parse-fail/duplicate-type.wit:6:8
       |
-    6 |   type foo = s32
+    6 |   type foo = s32;
       |        ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/export-twice.wit b/crates/wit-parser/tests/ui/parse-fail/export-twice.wit
index eaeb478c..3fd49b1c 100644
--- a/crates/wit-parser/tests/ui/parse-fail/export-twice.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/export-twice.wit
@@ -3,6 +3,6 @@ package foo:foo
 interface foo {}
 
 world bar {
-  export foo
-  export foo
+  export foo;
+  export foo;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/export-twice.wit.result b/crates/wit-parser/tests/ui/parse-fail/export-twice.wit.result
index d796998a..ea6d0ecd 100644
--- a/crates/wit-parser/tests/ui/parse-fail/export-twice.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/export-twice.wit.result
@@ -1,5 +1,5 @@
 interface cannot be exported more than once
      --> tests/ui/parse-fail/export-twice.wit:7:10
       |
-    7 |   export foo
+    7 |   export foo;
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit b/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit
index 1c682641..33cf0ddc 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit
@@ -1,17 +1,17 @@
 package foo:foo
 interface i1 {
-  type t = u32
+  type t = u32;
 }
 interface i2 {
-  use i1.{t}
+  use i1.{t};
 }
 interface i3 {
-  use i2.{t}
+  use i2.{t};
 }
 
 world test {
   import i1: interface {}
 
-  export i1
-  export i3
+  export i1;
+  export i3;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit.result b/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit.result
index 76f51e65..0726c2aa 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export1.wit.result
@@ -1,5 +1,5 @@
 interface transitively depends on an interface in incompatible ways
      --> tests/ui/parse-fail/import-and-export1.wit:16:10
       |
-   16 |   export i3
+   16 |   export i3;
       |          ^-
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export2.wit b/crates/wit-parser/tests/ui/parse-fail/import-and-export2.wit
index 14deb182..c1c05081 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export2.wit
@@ -1,18 +1,18 @@
 package foo:foo
 
 interface foo {
-  type t = u32
+  type t = u32;
 }
 
 interface bar {
-  use foo.{t}
+  use foo.{t};
 }
 
 world baz {
-  export foo
-  import bar
+  export foo;
+  import bar;
   export anon: interface {
-    use foo.{t}
-    use bar.{t as t2}
+    use foo.{t};
+    use bar.{t as t2};
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit b/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit
index aa8014b8..2e228a77 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit
@@ -4,34 +4,34 @@ interface foo {}
 interface bar {}
 
 world the-world {
-  import foo
-  import bar
+  import foo;
+  import bar;
   import baz: interface {
-    foo: func()
+    foo: func();
   }
-  export foo
-  export bar
+  export foo;
+  export bar;
   export baz2: interface {
-    foo: func()
+    foo: func();
   }
 }
 
 world a-different-world {
-  import foo
+  import foo;
 }
 
 interface i1 {
-  type t = u32
+  type t = u32;
 }
 interface i2 {
-  use i1.{t}
+  use i1.{t};
 }
 interface i3 {
-  use i2.{t}
+  use i2.{t};
 }
 
 world test {
-  import i3
-  export i1
-  export i3
+  import i3;
+  export i1;
+  export i3;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit.result b/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit.result
index cd7d94ea..7e20ce59 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export3.wit.result
@@ -1,5 +1,5 @@
 interface transitively depends on an interface in incompatible ways
      --> tests/ui/parse-fail/import-and-export3.wit:36:10
       |
-   36 |   export i3
+   36 |   export i3;
       |          ^-
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit b/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit
index de4594a8..20b51c25 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit
@@ -2,43 +2,43 @@ package foo:foo
 
 
 world union-world {
-  include test
-  include a-different-world
-  include the-world
+  include test;
+  include a-different-world;
+  include the-world;
 }
 
 interface foo {}
 interface bar {}
 
 world the-world {
-  import foo
-  import bar
+  import foo;
+  import bar;
   import baz: interface {
-    foo: func()
+    foo: func();
   }
-  export foo
-  export bar
+  export foo;
+  export bar;
   export baz2: interface {
-    foo: func()
+    foo: func();
   }
 }
 
 world a-different-world {
-  import foo
+  import foo;
 }
 
 interface i1 {
-  type t = u32
+  type t = u32;
 }
 interface i2 {
-  use i1.{t}
+  use i1.{t};
 }
 interface i3 {
-  use i2.{t}
+  use i2.{t};
 }
 
 world test {
-  import i3
-  export i1
-  export i3
+  import i3;
+  export i1;
+  export i3;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit.result b/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit.result
index 69710534..b1590273 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export4.wit.result
@@ -1,5 +1,5 @@
 interface transitively depends on an interface in incompatible ways
      --> tests/ui/parse-fail/import-and-export4.wit:43:10
       |
-   43 |   export i3
+   43 |   export i3;
       |          ^-
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-and-export5.wit b/crates/wit-parser/tests/ui/parse-fail/import-and-export5.wit
index 1a3e2306..7965b98e 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-and-export5.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-and-export5.wit
@@ -6,13 +6,13 @@ interface a {
 }
 
 interface b {
-  use a.{x}
+  use a.{x};
 }
 
 world w {
   export anon: interface {
-    use b.{x as x2}
-    use a.{x}
+    use b.{x as x2};
+    use a.{x};
   }
-  export a
+  export a;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit
index ac0e8e4d..9018cbfe 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit
@@ -1,5 +1,5 @@
 package foo:foo
 world foo {
-  import a: func()
-  export a: func()
+  import a: func();
+  export a: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit.result b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit.result
index 27caf399..16fae361 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap1.wit.result
@@ -1,5 +1,5 @@
 export `a` conflicts with prior import of same name
      --> tests/ui/parse-fail/import-export-overlap1.wit:4:10
       |
-    4 |   export a: func()
+    4 |   export a: func();
       |          ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap2.wit b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap2.wit
index 4622babb..e2d92bd1 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-export-overlap2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-export-overlap2.wit
@@ -1,5 +1,5 @@
 package foo:foo
 world foo {
-  import a: func()
+  import a: func();
   export a: interface {}
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-twice.wit b/crates/wit-parser/tests/ui/parse-fail/import-twice.wit
index 7d9a6d8c..a6951e89 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-twice.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/import-twice.wit
@@ -3,6 +3,6 @@ package foo:foo
 interface foo {}
 
 world bar {
-  import foo
-  import foo
+  import foo;
+  import foo;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/import-twice.wit.result b/crates/wit-parser/tests/ui/parse-fail/import-twice.wit.result
index 7dfe127a..d3691907 100644
--- a/crates/wit-parser/tests/ui/parse-fail/import-twice.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/import-twice.wit.result
@@ -1,5 +1,5 @@
 interface cannot be imported more than once
      --> tests/ui/parse-fail/import-twice.wit:7:10
       |
-    7 |   import foo
+    7 |   import foo;
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/include-cycle.wit b/crates/wit-parser/tests/ui/parse-fail/include-cycle.wit
index b11971b0..b1fd067d 100644
--- a/crates/wit-parser/tests/ui/parse-fail/include-cycle.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/include-cycle.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 world a {
-    include b
+    include b;
 }
 
 world b {
-    include a
-}
\ No newline at end of file
+    include a;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/include-foreign.wit.result b/crates/wit-parser/tests/ui/parse-fail/include-foreign.wit.result
index eac7974f..990f53a8 100644
--- a/crates/wit-parser/tests/ui/parse-fail/include-foreign.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/include-foreign.wit.result
@@ -1,5 +1,5 @@
 world not found in package
      --> tests/ui/parse-fail/include-foreign/root.wit:4:19
       |
-    4 |   include foo:bar/bar
+    4 |   include foo:bar/bar;
       |                   ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/include-foreign/root.wit b/crates/wit-parser/tests/ui/parse-fail/include-foreign/root.wit
index 739532fa..aa578895 100644
--- a/crates/wit-parser/tests/ui/parse-fail/include-foreign/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/include-foreign/root.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  include foo:bar/bar
-}
\ No newline at end of file
+  include foo:bar/bar;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/include-with-id.wit b/crates/wit-parser/tests/ui/parse-fail/include-with-id.wit
index 77016c3b..0d8ba101 100644
--- a/crates/wit-parser/tests/ui/parse-fail/include-with-id.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/include-with-id.wit
@@ -3,9 +3,9 @@ package foo:foo
 interface foo {}
 
 world a {
-    import foo
+    import foo;
 }
 
 world b {
     include a with { foo:foo/foo as foo2 }
-}
\ No newline at end of file
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/include-with-on-id.wit b/crates/wit-parser/tests/ui/parse-fail/include-with-on-id.wit
index 2cb8c570..66a2c624 100644
--- a/crates/wit-parser/tests/ui/parse-fail/include-with-on-id.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/include-with-on-id.wit
@@ -3,9 +3,9 @@ package foo:foo
 interface foo {}
 
 world a {
-    import foo
+    import foo;
 }
 
 world b {
     include a with { foo as foo2 }
-}
\ No newline at end of file
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference.wit b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference.wit
index 512837e6..6f2f8de5 100644
--- a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
 interface foo {
-  x: func()
+  x: func();
 
   record foo {
     // TODO: this should have a better error message referring to `x: func()`
diff --git a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit
index 694ccbc2..e0d12fc1 100644
--- a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit
@@ -1,6 +1,6 @@
 package foo:foo
 
 interface foo {
-  x: func()
-  y: func() -> x
+  x: func();
+  y: func() -> x;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit.result b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit.result
index f3899ab5..9e8c0592 100644
--- a/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/invalid-type-reference2.wit.result
@@ -1,5 +1,5 @@
 cannot use function `x` as a type
      --> tests/ui/parse-fail/invalid-type-reference2.wit:5:16
       |
-    5 |   y: func() -> x
+    5 |   y: func() -> x;
       |                ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include-not-found.wit b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include-not-found.wit
index 506d37be..b463907a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include-not-found.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include-not-found.wit
@@ -1,8 +1,8 @@
 package foo:foo
 
-world foo { import a: func() }
-world bar { import a: func() }
-world baz { 
+world foo { import a: func(); }
+world bar { import a: func(); }
+world baz {
     include foo with { b1 as b2 }
     include bar with { a as b }
-}
\ No newline at end of file
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit
index 59c2fae5..7fe46f48 100644
--- a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit
@@ -1,8 +1,8 @@
 package foo:foo
 
-world foo { import a: func() }
-world bar { import a: func() }
-world baz { 
-    include foo 
-    include bar 
-}
\ No newline at end of file
+world foo { import a: func(); }
+world bar { import a: func(); }
+world baz {
+    include foo;
+    include bar;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit.result b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit.result
index d9f901c7..045c4fad 100644
--- a/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/kebab-name-include.wit.result
@@ -1,5 +1,5 @@
 import of `a` shadows previously imported items
      --> tests/ui/parse-fail/kebab-name-include.wit:7:13
       |
-    7 |     include bar 
+    7 |     include bar;
       |             ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use.wit.result b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use.wit.result
index fa297480..9693caa7 100644
--- a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use.wit.result
@@ -4,5 +4,5 @@ Caused by:
     interface or world `bar-renamed` does not exist
          --> tests/ui/parse-fail/no-access-to-sibling-use/foo.wit:3:5
           |
-        3 | use bar-renamed
+        3 | use bar-renamed;
           |     ^----------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/bar.wit b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/bar.wit
index a08b2305..1b75e6aa 100644
--- a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/bar.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/bar.wit
@@ -1,1 +1,1 @@
-use bar as bar-renamed
+use bar as bar-renamed;
diff --git a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/foo.wit b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/foo.wit
index 01778b73..c634bdb2 100644
--- a/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/foo.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/no-access-to-sibling-use/foo.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
-use bar-renamed
+use bar-renamed;
 
 interface bar {}
diff --git a/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include.wit.result b/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include.wit.result
index 756ac8f4..ed8f228b 100644
--- a/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include.wit.result
@@ -1,5 +1,5 @@
 world not found in package
      --> tests/ui/parse-fail/non-existance-world-include/root.wit:4:19
       |
-    4 |   include foo:baz/non-existance
+    4 |   include foo:baz/non-existance;
       |                   ^------------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include/root.wit b/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include/root.wit
index 6bc8e5f9..7de81f0a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/non-existance-world-include/root.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 world foo {
-  include foo:baz/non-existance
-}
\ No newline at end of file
+  include foo:baz/non-existance;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle.wit.result b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle.wit.result
index fa1777f5..d87b5148 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle.wit.result
@@ -1,5 +1,5 @@
 package depends on itself
      --> tests/ui/parse-fail/pkg-cycle/deps/a1/root.wit:3:7
       |
-    3 |   use foo:a1/foo.{}
+    3 |   use foo:a1/foo.{};
       |       ^-----
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/deps/a1/root.wit b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/deps/a1/root.wit
index fc18ee3a..fe37906c 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/deps/a1/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/deps/a1/root.wit
@@ -1,4 +1,4 @@
 package foo:a1
 interface foo {
-  use foo:a1/foo.{}
+  use foo:a1/foo.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/root.wit b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/root.wit
index 1eae3231..555cda98 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle/root.wit
@@ -1,4 +1,4 @@
 package foo:foo
 interface foo {
-  use foo:a1/foo.{}
+  use foo:a1/foo.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2.wit.result b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2.wit.result
index e5216858..e45eec83 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2.wit.result
@@ -1,5 +1,5 @@
 package depends on itself
      --> tests/ui/parse-fail/pkg-cycle2/deps/a1/root.wit:3:7
       |
-    3 |   use foo:a2/foo.{}
+    3 |   use foo:a2/foo.{};
       |       ^-----
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a1/root.wit b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a1/root.wit
index ff53a7eb..b6a6adb6 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a1/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a1/root.wit
@@ -1,4 +1,4 @@
 package foo:a1
 interface foo {
-  use foo:a2/foo.{}
+  use foo:a2/foo.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a2/root.wit b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a2/root.wit
index b52fe402..a1897204 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a2/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/deps/a2/root.wit
@@ -1,4 +1,4 @@
 package foo:a2
 interface foo {
-  use foo:a1/foo.{}
+  use foo:a1/foo.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/root.wit b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/root.wit
index 45c0d225..22d878d5 100644
--- a/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/pkg-cycle2/root.wit
@@ -1,4 +1,4 @@
 package foo:root
 interface foo {
-  use foo:a1/foo.{}
+  use foo:a1/foo.{};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name.wit.result b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name.wit.result
index 92159eba..355be9b2 100644
--- a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name.wit.result
@@ -1,5 +1,5 @@
 type used in a handle must be a resource
      --> tests/ui/parse-fail/type-and-resource-same-name/foo.wit:7:20
       |
-    7 |   type t2 = borrow<a>
+    7 |   type t2 = borrow<a>;
       |                    ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/deps/dep/foo.wit b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/deps/dep/foo.wit
index dd21d5c8..77ce2462 100644
--- a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/deps/dep/foo.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/deps/dep/foo.wit
@@ -1,5 +1,5 @@
 package some:dep
 
 interface foo {
-  type a = u32
+  type a = u32;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/foo.wit b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/foo.wit
index 767c231e..0e5b5b1a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/foo.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/type-and-resource-same-name/foo.wit
@@ -1,8 +1,8 @@
 package foo:bar
 
 interface foo {
-  use some:dep/foo.{a}
+  use some:dep/foo.{a};
 
-  type t1 = a
-  type t2 = borrow<a>
+  type t1 = a;
+  type t2 = borrow<a>;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit b/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit
index 46eff1d7..3538aa5c 100644
--- a/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit
@@ -2,5 +2,5 @@
 package foo:foo
 
 interface foo {
-  type foo = bar
+  type foo = bar;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit.result b/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit.result
index 162404ae..d070f9e3 100644
--- a/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/undefined-typed.wit.result
@@ -1,5 +1,5 @@
 type `bar` does not exist
      --> tests/ui/parse-fail/undefined-typed.wit:5:14
       |
-    5 |   type foo = bar
+    5 |   type foo = bar;
       |              ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/union-fuzz-2.wit b/crates/wit-parser/tests/ui/parse-fail/union-fuzz-2.wit
index 8e7bf637..946ccf59 100644
--- a/crates/wit-parser/tests/ui/parse-fail/union-fuzz-2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/union-fuzz-2.wit
@@ -1,12 +1,12 @@
 package foo:bar
 
 world foo {
-    export foo: func() -> (%name2: float32)
+    export foo: func() -> (%name2: float32);
 }
-    
+
 
 world bar {
-    include foo
-    
+    include foo;
+
     record foo {}
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit b/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit
index 3f735e53..1478920f 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 world foo {
-  import bar
+  import bar;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit.result b/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit.result
index bb72a5b5..f03a3ed1 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unknown-interface.wit.result
@@ -1,5 +1,5 @@
 interface or world `bar` does not exist
      --> tests/ui/parse-fail/unknown-interface.wit:6:10
       |
-    6 |   import bar
+    6 |   import bar;
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit
index 12167a22..93965876 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 world foo {
-  import foo
+  import foo;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit.result
index 13bfe932..ab2c851f 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface1.wit.result
@@ -1,5 +1,5 @@
 name `foo` is defined as a world, not an interface
      --> tests/ui/parse-fail/unresolved-interface1.wit:6:10
       |
-    6 |   import foo
+    6 |   import foo;
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit
index 5aa93b23..d5162377 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit
@@ -3,6 +3,6 @@
 package foo:foo
 
 world foo {
-  import bar
+  import bar;
 }
 
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit.result
index 448a9775..aceeeaa7 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface2.wit.result
@@ -1,5 +1,5 @@
 interface or world `bar` does not exist
      --> tests/ui/parse-fail/unresolved-interface2.wit:6:10
       |
-    6 |   import bar
+    6 |   import bar;
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit
index f799bfb7..f64797b6 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit
@@ -2,4 +2,4 @@
 
 package foo:foo
 
-use bar as foo
+use bar as foo;
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit.result
index 828f9c20..b8515dd2 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface3.wit.result
@@ -1,5 +1,5 @@
 interface or world `bar` does not exist
      --> tests/ui/parse-fail/unresolved-interface3.wit:5:5
       |
-    5 | use bar as foo
+    5 | use bar as foo;
       |     ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit
index 63ea8b92..17912419 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 world foo {
-  import some:dependency/iface
+  import some:dependency/iface;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit.result
index 3e772ae6..c93df981 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-interface4.wit.result
@@ -1,5 +1,5 @@
 package not found
      --> tests/ui/parse-fail/unresolved-interface4.wit:6:10
       |
-    6 |   import some:dependency/iface
+    6 |   import some:dependency/iface;
       |          ^--------------
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit
index 745b44b9..619ce5ff 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 interface foo {
-  use bar.{x}
+  use bar.{x};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit.result
index adfee891..d61301e4 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use1.wit.result
@@ -1,5 +1,5 @@
 interface or world `bar` not found in package
      --> tests/ui/parse-fail/unresolved-use1.wit:6:7
       |
-    6 |   use bar.{x}
+    6 |   use bar.{x};
       |       ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use10.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use10.wit.result
index df68a387..1ad83de2 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use10.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use10.wit.result
@@ -4,5 +4,5 @@ Caused by:
     name `thing` is not defined
          --> tests/ui/parse-fail/unresolved-use10/bar.wit:4:12
           |
-        4 |   use foo.{thing}
+        4 |   use foo.{thing};
           |            ^----
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use10/bar.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use10/bar.wit
index e6c479bc..7694d1d6 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use10/bar.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use10/bar.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface bar {
-  use foo.{thing}
+  use foo.{thing};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit
index 69ae75f0..ca14f7ea 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit
@@ -3,7 +3,7 @@
 package foo:foo
 
 interface foo {
-  use bar.{x}
+  use bar.{x};
 }
 
 interface bar {
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit.result
index f44ca7cf..51349921 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use2.wit.result
@@ -1,5 +1,5 @@
 name `x` is not defined
      --> tests/ui/parse-fail/unresolved-use2.wit:6:12
       |
-    6 |   use bar.{x}
+    6 |   use bar.{x};
       |            ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit
index 9064ef83..fb302a54 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit
@@ -3,9 +3,9 @@
 package foo:foo
 
 interface foo {
-  use bar.{x}
+  use bar.{x};
 }
 
 interface bar {
-  x: func()
+  x: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit.result
index 9f29adbd..baa8660a 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use3.wit.result
@@ -1,5 +1,5 @@
 cannot import function `x`
      --> tests/ui/parse-fail/unresolved-use3.wit:6:12
       |
-    6 |   use bar.{x}
+    6 |   use bar.{x};
       |            ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit
index 69ae75f0..ca14f7ea 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit
@@ -3,7 +3,7 @@
 package foo:foo
 
 interface foo {
-  use bar.{x}
+  use bar.{x};
 }
 
 interface bar {
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit.result
index acb4720e..917215b7 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use7.wit.result
@@ -1,5 +1,5 @@
 name `x` is not defined
      --> tests/ui/parse-fail/unresolved-use7.wit:6:12
       |
-    6 |   use bar.{x}
+    6 |   use bar.{x};
       |            ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit
index b0c9db91..e223fde6 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit
@@ -4,6 +4,6 @@ package foo:foo
 
 world foo {
   import foo: interface {
-    use foo.{i32}
+    use foo.{i32};
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit.result
index 5ebb30c8..a2f98faf 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use8.wit.result
@@ -1,5 +1,5 @@
 name `foo` is defined as a world, not an interface
      --> tests/ui/parse-fail/unresolved-use8.wit:7:9
       |
-    7 |     use foo.{i32}
+    7 |     use foo.{i32};
       |         ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit b/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit
index 5fc2b384..9b34649b 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit
@@ -4,6 +4,6 @@ package foo:foo
 
 world foo {
   import foo: interface {
-    use bar.{i32}
+    use bar.{i32};
   }
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit.result b/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit.result
index f72d33d8..30629add 100644
--- a/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/unresolved-use9.wit.result
@@ -1,5 +1,5 @@
 interface or world `bar` does not exist
      --> tests/ui/parse-fail/unresolved-use9.wit:7:9
       |
-    7 |     use bar.{i32}
+    7 |     use bar.{i32};
       |         ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-and-include-world.wit.result b/crates/wit-parser/tests/ui/parse-fail/use-and-include-world.wit.result
index b1de64f6..f278affe 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-and-include-world.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/use-and-include-world.wit.result
@@ -4,5 +4,5 @@ Caused by:
     name `bar` is defined as an interface, not a world
          --> tests/ui/parse-fail/use-and-include-world/root.wit:6:21
           |
-        6 |     include foo:baz/bar
+        6 |     include foo:baz/bar;
           |                     ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-and-include-world/root.wit b/crates/wit-parser/tests/ui/parse-fail/use-and-include-world/root.wit
index 19c318be..f40002f0 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-and-include-world/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-and-include-world/root.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
-use foo:baz/bar
+use foo:baz/bar;
 
 world foo {
-    include foo:baz/bar
-}
\ No newline at end of file
+    include foo:baz/bar;
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit b/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit
index 266723ef..e891e2a7 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit
@@ -3,9 +3,9 @@
 package foo:foo
 
 interface foo {
-  type x = u32
+  type x = u32;
 }
 
 interface bar {
-  use foo.{x, x}
+  use foo.{x, x};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit.result b/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit.result
index aab7474e..a98efef9 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict.wit.result
@@ -1,5 +1,5 @@
 name `x` is defined more than once
      --> tests/ui/parse-fail/use-conflict.wit:10:15
       |
-   10 |   use foo.{x, x}
+   10 |   use foo.{x, x};
       |               ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit b/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit
index 94116902..9e7d6599 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit
@@ -3,11 +3,11 @@
 package foo:foo
 
 interface foo {
-  type x = u32
+  type x = u32;
 }
 
 interface bar {
-  use foo.{x}
+  use foo.{x};
 
-  type x = s64
+  type x = s64;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit.result b/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit.result
index 623febee..1ad6fd34 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict2.wit.result
@@ -1,5 +1,5 @@
 name `x` is defined more than once
      --> tests/ui/parse-fail/use-conflict2.wit:12:8
       |
-   12 |   type x = s64
+   12 |   type x = s64;
       |        ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit b/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit
index 5f2d418f..46fa78a4 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit
@@ -3,11 +3,11 @@
 package foo:foo
 
 interface foo {
-  type x = u32
+  type x = u32;
 }
 
 interface bar {
-  use foo.{x}
+  use foo.{x};
 
-  x: func()
+  x: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit.result b/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit.result
index 2928d26a..6f3b28bd 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/use-conflict3.wit.result
@@ -1,5 +1,5 @@
 name `x` is defined more than once
      --> tests/ui/parse-fail/use-conflict3.wit:12:3
       |
-   12 |   x: func()
+   12 |   x: func();
       |   ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-cycle1.wit b/crates/wit-parser/tests/ui/parse-fail/use-cycle1.wit
index b961b8db..d71542bb 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-cycle1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-cycle1.wit
@@ -3,5 +3,5 @@
 package foo:foo
 
 interface foo {
-  use foo.{bar}
+  use foo.{bar};
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-cycle4.wit b/crates/wit-parser/tests/ui/parse-fail/use-cycle4.wit
index f8bef245..f07f3001 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-cycle4.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-cycle4.wit
@@ -2,13 +2,13 @@
 package foo:foo
 
 interface foo {
-  use bar.{y}
+  use bar.{y};
 
-  type x = u32
+  type x = u32;
 }
 
 interface bar {
-  use foo.{x}
+  use foo.{x};
 
-  type y = u32
+  type y = u32;
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-shadow1.wit b/crates/wit-parser/tests/ui/parse-fail/use-shadow1.wit
index 29b3cf63..261abaf8 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-shadow1.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-shadow1.wit
@@ -1,6 +1,6 @@
 package foo:foo
 
-use foo as bar
+use foo as bar;
 
 interface foo {}
 
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-world.wit.result b/crates/wit-parser/tests/ui/parse-fail/use-world.wit.result
index a3a57d46..d21d7062 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-world.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/use-world.wit.result
@@ -1,5 +1,5 @@
 interface not found in package
      --> tests/ui/parse-fail/use-world/root.wit:3:13
       |
-    3 | use foo:baz/bar
+    3 | use foo:baz/bar;
       |             ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/use-world/root.wit b/crates/wit-parser/tests/ui/parse-fail/use-world/root.wit
index e11dcae5..ddbd7661 100644
--- a/crates/wit-parser/tests/ui/parse-fail/use-world/root.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/use-world/root.wit
@@ -1,7 +1,7 @@
 package foo:foo
 
-use foo:baz/bar
+use foo:baz/bar;
 
 world foo {
-  
-}
\ No newline at end of file
+
+}
diff --git a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit
index 813bb957..c9a73bba 100644
--- a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit
@@ -1,5 +1,5 @@
 package foo:foo
 world foo {
-  import foo: func()
-  import foo: func()
+  import foo: func();
+  import foo: func();
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit.result b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit.result
index 8eb1cc53..94624903 100644
--- a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func.wit.result
@@ -1,5 +1,5 @@
 import `foo` conflicts with prior import of same name
      --> tests/ui/parse-fail/world-top-level-func.wit:4:10
       |
-    4 |   import foo: func()
+    4 |   import foo: func();
       |          ^--
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit
index f2c06efa..e2871c47 100644
--- a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit
+++ b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit
@@ -1,4 +1,4 @@
 package foo:foo
 world foo {
-  import foo: func(a: b)
+  import foo: func(a: b);
 }
diff --git a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit.result b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit.result
index 1fe06a93..9ebb6629 100644
--- a/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit.result
+++ b/crates/wit-parser/tests/ui/parse-fail/world-top-level-func2.wit.result
@@ -1,5 +1,5 @@
 name `b` is not defined
      --> tests/ui/parse-fail/world-top-level-func2.wit:3:23
       |
-    3 |   import foo: func(a: b)
+    3 |   import foo: func(a: b);
       |                       ^
\ No newline at end of file
diff --git a/crates/wit-parser/tests/ui/random.wit b/crates/wit-parser/tests/ui/random.wit
index d0386186..324d32af 100644
--- a/crates/wit-parser/tests/ui/random.wit
+++ b/crates/wit-parser/tests/ui/random.wit
@@ -17,11 +17,11 @@ interface random {
     /// This function must always return fresh data. Deterministic environments
     /// must omit this function, rather than implementing it with deterministic
     /// data.
-    get-random-bytes: func(len: u64) -> list<u8>
+    get-random-bytes: func(len: u64) -> list<u8>;
 
     /// Return a cryptographically-secure random or pseudo-random `u64` value.
     ///
     /// This function returns the same type of data as `get-random-bytes`,
     /// represented as a `u64`.
-    get-random-u64: func() -> u64
+    get-random-u64: func() -> u64;
 }
diff --git a/crates/wit-parser/tests/ui/resources-empty.wit b/crates/wit-parser/tests/ui/resources-empty.wit
index bb559f2d..1d6ca6bf 100644
--- a/crates/wit-parser/tests/ui/resources-empty.wit
+++ b/crates/wit-parser/tests/ui/resources-empty.wit
@@ -1,8 +1,8 @@
 package foo:resources-empty
 
 interface resources-empty {
-  t1: func(a: own<r1>) -> ()
-  t2: func(a: borrow<r1>) -> ()
+  t1: func(a: own<r1>) -> ();
+  t2: func(a: borrow<r1>) -> ();
 
   resource r1 {
   }
diff --git a/crates/wit-parser/tests/ui/resources-multiple-returns-borrow.wit b/crates/wit-parser/tests/ui/resources-multiple-returns-borrow.wit
index 39887ed0..a292ad00 100644
--- a/crates/wit-parser/tests/ui/resources-multiple-returns-borrow.wit
+++ b/crates/wit-parser/tests/ui/resources-multiple-returns-borrow.wit
@@ -1,10 +1,10 @@
 package foo:resources1
 
 interface resources1 {
-  t1: func(a: borrow<r1>) -> ()
+  t1: func(a: borrow<r1>) -> ();
 
   resource r1 {
-    f1: func() -> (a: s32, handle: borrow<r1>)
+    f1: func() -> (a: s32, handle: borrow<r1>);
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/resources-multiple-returns-own.wit b/crates/wit-parser/tests/ui/resources-multiple-returns-own.wit
index 751c0fdb..726c850f 100644
--- a/crates/wit-parser/tests/ui/resources-multiple-returns-own.wit
+++ b/crates/wit-parser/tests/ui/resources-multiple-returns-own.wit
@@ -1,10 +1,10 @@
 package foo:resources1
 
 interface resources1 {
-  t1: func(a: own<r1>) -> ()
+  t1: func(a: own<r1>) -> ();
 
   resource r1 {
-    f1: func() -> (a: s32, handle: own<r1>)
+    f1: func() -> (a: s32, handle: own<r1>);
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/resources-multiple.wit b/crates/wit-parser/tests/ui/resources-multiple.wit
index 67370f38..a04eff6f 100644
--- a/crates/wit-parser/tests/ui/resources-multiple.wit
+++ b/crates/wit-parser/tests/ui/resources-multiple.wit
@@ -1,20 +1,20 @@
 package foo:resources-multiple
 
 interface resources-multiple {
-  t1: func(a: borrow<r1>) -> ()
-  t2: func(a: own<r1>) -> ()
+  t1: func(a: borrow<r1>) -> ();
+  t2: func(a: own<r1>) -> ();
 
   resource r1 {
-    f1: func()
-    f2: func(a: u32)
-    f3: func(a: u32,)
-    f4: func() -> u32
-    f6: func() -> tuple<u32, u32>
-    f7: func(a: float32, b: float32) -> tuple<u32, u32>
-    f8: func(a: option<u32>) -> result<u32, float32>
-    f9: func() -> (u: u32, f: float32)
-    f10: func() -> (u: u32)
-    f11: func() -> ()
+    f1: func();
+    f2: func(a: u32);
+    f3: func(a: u32,);
+    f4: func() -> u32;
+    f6: func() -> tuple<u32, u32>;
+    f7: func(a: float32, b: float32) -> tuple<u32, u32>;
+    f8: func(a: option<u32>) -> result<u32, float32>;
+    f9: func() -> (u: u32, f: float32);
+    f10: func() -> (u: u32);
+    f11: func() -> ();
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/resources-return-borrow.wit b/crates/wit-parser/tests/ui/resources-return-borrow.wit
index ac08282c..a3c8f33f 100644
--- a/crates/wit-parser/tests/ui/resources-return-borrow.wit
+++ b/crates/wit-parser/tests/ui/resources-return-borrow.wit
@@ -1,10 +1,10 @@
 package foo:resources1
 
 interface resources1 {
-  t1: func(a: borrow<r1>) -> ()
+  t1: func(a: borrow<r1>) -> ();
 
   resource r1 {
-    f1: func() -> borrow<r1>
+    f1: func() -> borrow<r1>;
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/resources-return-own.wit b/crates/wit-parser/tests/ui/resources-return-own.wit
index 830c70df..6f5d22ab 100644
--- a/crates/wit-parser/tests/ui/resources-return-own.wit
+++ b/crates/wit-parser/tests/ui/resources-return-own.wit
@@ -1,10 +1,10 @@
 package foo:resources1
 
 interface resources1 {
-  t1: func(a: own<r1>) -> ()
+  t1: func(a: own<r1>) -> ();
 
   resource r1 {
-    f1: func() -> own<r1>
+    f1: func() -> own<r1>;
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/resources.wit b/crates/wit-parser/tests/ui/resources.wit
index cdda5909..26277581 100644
--- a/crates/wit-parser/tests/ui/resources.wit
+++ b/crates/wit-parser/tests/ui/resources.wit
@@ -5,43 +5,43 @@ interface foo {
   }
 
   resource b {
-    constructor()
+    constructor();
   }
 
   resource c {
-    constructor(x: u32)
+    constructor(x: u32);
   }
 
   resource d {
-    constructor(x: u32)
+    constructor(x: u32);
 
-    a: func()
+    a: func();
 
-    b: static func()
+    b: static func();
   }
 
   resource e {
-    constructor(other: own<e>, other2: borrow<e>)
+    constructor(other: own<e>, other2: borrow<e>);
 
-    method: func(thing: own<e>, thing2: borrow<e>)
+    method: func(thing: own<e>, thing2: borrow<e>);
   }
 }
 
 world w {
-  resource a
+  resource a;
 
   resource b {
   }
 
   resource c {
-    constructor()
+    constructor();
   }
 }
 
 interface i {
-  resource a
+  resource a;
 
-  type t1 = a
-  type t2 = borrow<a>
-  type t3 = borrow<t1>
+  type t1 = a;
+  type t2 = borrow<a>;
+  type t3 = borrow<t1>;
 }
diff --git a/crates/wit-parser/tests/ui/resources1.wit b/crates/wit-parser/tests/ui/resources1.wit
index 9b8b6712..a5b7fd7c 100644
--- a/crates/wit-parser/tests/ui/resources1.wit
+++ b/crates/wit-parser/tests/ui/resources1.wit
@@ -1,12 +1,12 @@
 package foo:resources1
 
 interface resources1 {
-  t1: func(a: borrow<r1>) -> ()
-  t2: func(a: own<r1>) -> ()
-  t3: func(a: r1) -> ()
+  t1: func(a: borrow<r1>) -> ();
+  t2: func(a: own<r1>) -> ();
+  t3: func(a: r1) -> ();
 
   resource r1 {
-    f1: func()
+    f1: func();
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/shared-types.wit b/crates/wit-parser/tests/ui/shared-types.wit
index e839c919..4e22179d 100644
--- a/crates/wit-parser/tests/ui/shared-types.wit
+++ b/crates/wit-parser/tests/ui/shared-types.wit
@@ -2,9 +2,9 @@ package foo:shared-items
 
 world foo {
   import foo: interface {
-    a: func() -> list<u8>
+    a: func() -> list<u8>;
   }
   export bar: interface {
-    a: func() -> tuple<list<u8>>
+    a: func() -> tuple<list<u8>>;
   }
 }
diff --git a/crates/wit-parser/tests/ui/stress-export-elaborate.wit b/crates/wit-parser/tests/ui/stress-export-elaborate.wit
index b731452c..02a5997d 100644
--- a/crates/wit-parser/tests/ui/stress-export-elaborate.wit
+++ b/crates/wit-parser/tests/ui/stress-export-elaborate.wit
@@ -1,54 +1,54 @@
 package foo:bar
 
 interface i1 {
-  type t1 = u32
-  type t2 = u32
-  type t3 = u32
-  type t4 = u32
-  type t5 = u32
-  type t6 = u32
-  type t7 = u32
-  type t8 = u32
-  type t9 = u32
-  type t10 = u32
+  type t1 = u32;
+  type t2 = u32;
+  type t3 = u32;
+  type t4 = u32;
+  type t5 = u32;
+  type t6 = u32;
+  type t7 = u32;
+  type t8 = u32;
+  type t9 = u32;
+  type t10 = u32;
 }
 
 interface i2 {
-  use i1.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i1.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i3 {
-  use i2.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i2.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i4 {
-  use i3.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i3.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i5 {
-  use i4.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i4.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i6 {
-  use i5.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i5.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i7 {
-  use i6.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i6.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i8 {
-  use i7.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i7.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i9 {
-  use i8.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i8.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 interface i10 {
-  use i9.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10}
+  use i9.{t1, t2, t3, t4, t5, t6, t7, t8, t9, t10};
 }
 
 world foo {
-  export i10
+  export i10;
 }
diff --git a/crates/wit-parser/tests/ui/type-then-eof.wit b/crates/wit-parser/tests/ui/type-then-eof.wit
index a15f263a..1172ef4c 100644
--- a/crates/wit-parser/tests/ui/type-then-eof.wit
+++ b/crates/wit-parser/tests/ui/type-then-eof.wit
@@ -1,5 +1,5 @@
 package foo:foo
 
 interface foo {
-  foo: func() -> string
+  foo: func() -> string;
 }
diff --git a/crates/wit-parser/tests/ui/types.wit b/crates/wit-parser/tests/ui/types.wit
index 6b258f0c..7371af62 100644
--- a/crates/wit-parser/tests/ui/types.wit
+++ b/crates/wit-parser/tests/ui/types.wit
@@ -1,24 +1,24 @@
 package foo:types
 
 interface types {
-  type t1 = u8
-  type t2 = u16
-  type t3 = u32
-  type t4 = u64
-  type t5 = s8
-  type t6 = s16
-  type t7 = s32
-  type t8 = s64
-  type t9 = float32
-  type t10 = float64
-  type t11 = char
-  type t12 = list<char>
-  type t13 = string
-  type t14 = option<u32>
-  type t15 = result<u32, u32>
-  type t16 = result<_, u32>
-  type t17 = result<u32>
-  type t18 = result
+  type t1 = u8;
+  type t2 = u16;
+  type t3 = u32;
+  type t4 = u64;
+  type t5 = s8;
+  type t6 = s16;
+  type t7 = s32;
+  type t8 = s64;
+  type t9 = float32;
+  type t10 = float64;
+  type t11 = char;
+  type t12 = list<char>;
+  type t13 = string;
+  type t14 = option<u32>;
+  type t15 = result<u32, u32>;
+  type t16 = result<_, u32>;
+  type t17 = result<u32>;
+  type t18 = result;
   record t20 {}
   record t21 { a: u32 }
   record t22 { a: u32, }
@@ -26,10 +26,10 @@ interface types {
   record t24 { a: u32, b: u64, }
   record t25 { x: u32 }
   record %record {}
-  type t26 = tuple<>
-  type t27 = tuple<u32>
-  type t28 = tuple<u32,>
-  type t29 = tuple<u32, u64>
+  type t26 = tuple<>;
+  type t27 = tuple<u32>;
+  type t28 = tuple<u32,>;
+  type t29 = tuple<u32, u64>;
   flags t30 {}
   flags t31 { a, b, c }
   flags t32 { a, b, c, }
@@ -40,19 +40,19 @@ interface types {
   variant t37 { a, b(option<u32>), }
   enum t41 { a, b, c }
   enum t42 { a, b, c, }
-  type t43 = bool
-  type t44 = string
-  type t45 = list<list<list<t32>>>
-  type t46 = t44
-  type t47 = %t44
-  type t48 = stream<u32, u32>
-  type t49 = stream<_, u32>
-  type t50 = stream<u32>
-  type t51 = stream
-  type t52 = future<u32>
-  type t53 = future
+  type t43 = bool;
+  type t44 = string;
+  type t45 = list<list<list<t32>>>;
+  type t46 = t44;
+  type t47 = %t44;
+  type t48 = stream<u32, u32>;
+  type t49 = stream<_, u32>;
+  type t50 = stream<u32>;
+  type t51 = stream;
+  type t52 = future<u32>;
+  type t53 = future;
 
   // type order doesn't matter
-  type foo = bar
-  type bar = u32
+  type foo = bar;
+  type bar = u32;
 }
diff --git a/crates/wit-parser/tests/ui/union-fuzz-1.wit b/crates/wit-parser/tests/ui/union-fuzz-1.wit
index efa86251..927a7b03 100644
--- a/crates/wit-parser/tests/ui/union-fuzz-1.wit
+++ b/crates/wit-parser/tests/ui/union-fuzz-1.wit
@@ -5,5 +5,5 @@ world xo {}
 world name {}
 
 world x {
-    include name
-}
\ No newline at end of file
+    include name;
+}
diff --git a/crates/wit-parser/tests/ui/use-chain.wit b/crates/wit-parser/tests/ui/use-chain.wit
index 6191ebb0..847d69d0 100644
--- a/crates/wit-parser/tests/ui/use-chain.wit
+++ b/crates/wit-parser/tests/ui/use-chain.wit
@@ -4,8 +4,8 @@ interface foo {
   record foo {}
 }
 
-use foo as bar
+use foo as bar;
 
 interface name {
-  use bar.{foo}
+  use bar.{foo};
 }
diff --git a/crates/wit-parser/tests/ui/use.wit b/crates/wit-parser/tests/ui/use.wit
index 24856692..ba4d899f 100644
--- a/crates/wit-parser/tests/ui/use.wit
+++ b/crates/wit-parser/tests/ui/use.wit
@@ -1,34 +1,34 @@
 package foo:foo
 
 interface foo {
-  use bar.{the-type}
+  use bar.{the-type};
 }
 
 interface bar {
-  type the-type = u32
+  type the-type = u32;
 }
 
 interface baz {
-  use foo.{the-type}
-  use bar.{the-type as test}
+  use foo.{the-type};
+  use bar.{the-type as test};
 }
 
 interface empty {
 }
 
 interface use-from-empty {
-  use empty.{}
-  use empty.{}
+  use empty.{};
+  use empty.{};
 }
 
 interface use-multiple {
-  use baz.{the-type, test}
+  use baz.{the-type, test};
 
-  some-function: func(x: the-type) -> test
+  some-function: func(x: the-type) -> test;
 }
 
 interface trailing-comma {
-  use foo.{the-type,}
+  use foo.{the-type,};
 
   record the-foo { a: the-type }
 }
diff --git a/crates/wit-parser/tests/ui/versions/deps/a1/foo.wit b/crates/wit-parser/tests/ui/versions/deps/a1/foo.wit
index dbf54149..ec241f65 100644
--- a/crates/wit-parser/tests/ui/versions/deps/a1/foo.wit
+++ b/crates/wit-parser/tests/ui/versions/deps/a1/foo.wit
@@ -1,5 +1,5 @@
 package a:a@1.0.0
 
 interface foo {
-  type t = u32
+  type t = u32;
 }
diff --git a/crates/wit-parser/tests/ui/versions/deps/a2/foo.wit b/crates/wit-parser/tests/ui/versions/deps/a2/foo.wit
index dfd6625f..fc8b79e1 100644
--- a/crates/wit-parser/tests/ui/versions/deps/a2/foo.wit
+++ b/crates/wit-parser/tests/ui/versions/deps/a2/foo.wit
@@ -1,5 +1,5 @@
 package a:a@2.0.0
 
 interface foo {
-  type t = u32
+  type t = u32;
 }
diff --git a/crates/wit-parser/tests/ui/versions/foo.wit b/crates/wit-parser/tests/ui/versions/foo.wit
index 5dfab680..4e6b13e4 100644
--- a/crates/wit-parser/tests/ui/versions/foo.wit
+++ b/crates/wit-parser/tests/ui/versions/foo.wit
@@ -1,7 +1,7 @@
 package foo:versions
 
 interface foo {
-  use a:a/foo@1.0.0.{t}
-  use a:a/foo@2.0.0.{t as t2}
+  use a:a/foo@1.0.0.{t};
+  use a:a/foo@2.0.0.{t as t2};
 }
 
diff --git a/crates/wit-parser/tests/ui/wasi.wit b/crates/wit-parser/tests/ui/wasi.wit
index df2bf0f4..3071a83b 100644
--- a/crates/wit-parser/tests/ui/wasi.wit
+++ b/crates/wit-parser/tests/ui/wasi.wit
@@ -13,7 +13,7 @@ interface wasi {
   }
 
   // Timestamp in nanoseconds.
-  type timestamp = u64
+  type timestamp = u64;
 
   // Error codes returned by functions.
   // Not all of these error codes are returned by the functions provided by this
diff --git a/crates/wit-parser/tests/ui/world-diamond.wit b/crates/wit-parser/tests/ui/world-diamond.wit
index c858ed36..28f89cfa 100644
--- a/crates/wit-parser/tests/ui/world-diamond.wit
+++ b/crates/wit-parser/tests/ui/world-diamond.wit
@@ -1,23 +1,23 @@
 package foo:foo
 
 interface shared-items {
-  type foo = u32
+  type foo = u32;
 }
 
 interface i1 {
-  use shared-items.{foo}
+  use shared-items.{foo};
 
-  a: func() -> foo
+  a: func() -> foo;
 }
 
 interface i2 {
-  use shared-items.{foo}
+  use shared-items.{foo};
 
-  a: func() -> foo
+  a: func() -> foo;
 }
 
 world the-world {
-  import i1
-  import i2
-  import a: func()
+  import i1;
+  import i2;
+  import a: func();
 }
diff --git a/crates/wit-parser/tests/ui/world-iface-no-collide.wit b/crates/wit-parser/tests/ui/world-iface-no-collide.wit
index 62d17852..46b08cf8 100644
--- a/crates/wit-parser/tests/ui/world-iface-no-collide.wit
+++ b/crates/wit-parser/tests/ui/world-iface-no-collide.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface foo {
-  type t = u32
+  type t = u32;
 }
 
 world bar {
-  use foo.{t}
+  use foo.{t};
 
-  import foo: func()
+  import foo: func();
 }
diff --git a/crates/wit-parser/tests/ui/world-implicit-import1.wit b/crates/wit-parser/tests/ui/world-implicit-import1.wit
index ea679ccc..790fb99d 100644
--- a/crates/wit-parser/tests/ui/world-implicit-import1.wit
+++ b/crates/wit-parser/tests/ui/world-implicit-import1.wit
@@ -1,12 +1,12 @@
 package foo:foo
 
 interface foo {
-  type a = u32
+  type a = u32;
 }
 
 world the-world {
   import bar: interface {
-    use foo.{a}
+    use foo.{a};
   }
   import foo: interface {}
 }
diff --git a/crates/wit-parser/tests/ui/world-implicit-import2.wit b/crates/wit-parser/tests/ui/world-implicit-import2.wit
index 4079ace9..6fd4ebdc 100644
--- a/crates/wit-parser/tests/ui/world-implicit-import2.wit
+++ b/crates/wit-parser/tests/ui/world-implicit-import2.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface foo {
-  type g = char
+  type g = char;
 }
 
 world w {
-  use foo.{g}
+  use foo.{g};
 
-  import foo: func() -> g
+  import foo: func() -> g;
 }
diff --git a/crates/wit-parser/tests/ui/world-implicit-import3.wit b/crates/wit-parser/tests/ui/world-implicit-import3.wit
index 29f4e780..9ba850b0 100644
--- a/crates/wit-parser/tests/ui/world-implicit-import3.wit
+++ b/crates/wit-parser/tests/ui/world-implicit-import3.wit
@@ -1,11 +1,11 @@
 package foo:foo
 
 interface foo {
-  type g = char
+  type g = char;
 }
 
 world w {
-  use foo.{g}
+  use foo.{g};
 
-  export foo: func() -> g
+  export foo: func() -> g;
 }
diff --git a/crates/wit-parser/tests/ui/world-same-fields4.wit b/crates/wit-parser/tests/ui/world-same-fields4.wit
index 4ee79817..d9bb97e6 100644
--- a/crates/wit-parser/tests/ui/world-same-fields4.wit
+++ b/crates/wit-parser/tests/ui/world-same-fields4.wit
@@ -1,13 +1,13 @@
 package foo:foo
 
 interface shared-items {
-  type a = u32
+  type a = u32;
 }
 
 world foo {
   import shared-items: interface {}
   export a-name: interface {
-    use shared-items.{a}
+    use shared-items.{a};
   }
 }
 
diff --git a/crates/wit-parser/tests/ui/world-top-level-funcs.wit b/crates/wit-parser/tests/ui/world-top-level-funcs.wit
index f54f4388..b784ae72 100644
--- a/crates/wit-parser/tests/ui/world-top-level-funcs.wit
+++ b/crates/wit-parser/tests/ui/world-top-level-funcs.wit
@@ -1,9 +1,9 @@
 package foo:foo
 
 world foo {
-  import foo: func()
-  export foo2: func()
+  import foo: func();
+  export foo2: func();
 
-  import bar: func(arg: list<u32>)
-  export some-name: func() -> list<option<u32>>
+  import bar: func(arg: list<u32>);
+  export some-name: func() -> list<option<u32>>;
 }
diff --git a/crates/wit-parser/tests/ui/world-top-level-resources.wit b/crates/wit-parser/tests/ui/world-top-level-resources.wit
index ddc2d582..a82ced37 100644
--- a/crates/wit-parser/tests/ui/world-top-level-resources.wit
+++ b/crates/wit-parser/tests/ui/world-top-level-resources.wit
@@ -2,23 +2,23 @@ package foo:foo
 
 interface types {
   resource request {
-    foo: func()
-    bar: func(arg: list<u32>)
+    foo: func();
+    bar: func(arg: list<u32>);
   }
 
   resource response {
-    foo: func()
-    bar: func(arg: list<u32>)
+    foo: func();
+    bar: func(arg: list<u32>);
   }
 }
 
 interface handler {
-  use types.{request, response}
-  handle: func(some: borrow<request>) -> borrow<response>
-  handle-owned: func(some: own<request>) -> own<response>
+  use types.{request, response};
+  handle: func(some: borrow<request>) -> borrow<response>;
+  handle-owned: func(some: own<request>) -> own<response>;
 }
 
 world proxy {
-  import handler
-  export handler
+  import handler;
+  export handler;
 }
diff --git a/crates/wit-parser/tests/ui/worlds-union-dedup.wit b/crates/wit-parser/tests/ui/worlds-union-dedup.wit
index 88e2d0e3..de5f6a4d 100644
--- a/crates/wit-parser/tests/ui/worlds-union-dedup.wit
+++ b/crates/wit-parser/tests/ui/worlds-union-dedup.wit
@@ -8,16 +8,16 @@ interface c { }
 interface d { }
 
 world my-world-a {
-    import a1
-    import b1
+    import a1;
+    import b1;
 }
 
 world my-world-b {
-    import a1
-    import b1
+    import a1;
+    import b1;
 }
 
 world union-my-world {
-    include my-world-a
-    include my-world-b
+    include my-world-a;
+    include my-world-b;
 }
diff --git a/crates/wit-parser/tests/ui/worlds-with-types.wit b/crates/wit-parser/tests/ui/worlds-with-types.wit
index 30f96aa9..81e20f89 100644
--- a/crates/wit-parser/tests/ui/worlds-with-types.wit
+++ b/crates/wit-parser/tests/ui/worlds-with-types.wit
@@ -1,23 +1,23 @@
 package foo:foo
 
 world foo {
-  type a = u32
-  type b = a
+  type a = u32;
+  type b = a;
 
-  export c: func(a: a) -> b
+  export c: func(a: a) -> b;
 }
 
 
 interface disambiguate {
-  type t = u32
+  type t = u32;
 }
 
 world bar {
-  import disambiguate
+  import disambiguate;
 
-  use disambiguate.{t}
+  use disambiguate.{t};
 
-  export foo: func() -> t
+  export foo: func() -> t;
 }
 
 world the-test {
@@ -29,6 +29,6 @@ world the-test {
     c(a),
   }
 
-  import foo: func(a: a) -> b
-  export bar: func(a: a) -> b
+  import foo: func(a: a) -> b;
+  export bar: func(a: a) -> b;
 }
diff --git a/tests/cli/print-core-wasm-wit.wit b/tests/cli/print-core-wasm-wit.wit
index bad24b4b..8ac40130 100644
--- a/tests/cli/print-core-wasm-wit.wit
+++ b/tests/cli/print-core-wasm-wit.wit
@@ -3,9 +3,9 @@
 package foo:foo
 
 interface my-interface {
-  foo: func()
+  foo: func();
 }
 
 world my-world {
-  import my-interface
+  import my-interface;
 }
diff --git a/tests/local/fuzz1.wat b/tests/local/fuzz1.wat
index 576763f1..a15ba7ec 100644
--- a/tests/local/fuzz1.wat
+++ b/tests/local/fuzz1.wat
@@ -260,9 +260,9 @@
     (i32.eqz
      (global.get $hangLimit)
     )
-    (return
+    (then (return
      (i64.const 4293531749)
-    )
+    ))
    )
    (global.set $hangLimit
     (i32.sub
@@ -279,8 +279,8 @@
       (local.tee $0
        (if (result i32)
         (i32.const -2147483647)
-        (local.get $0)
-        (block $label$4 (result i32)
+        (then (local.get $0))
+        (else (block $label$4 (result i32)
          (br_if $label$4
           (if (result i32)
            (block $label$5 (result i32)
@@ -293,9 +293,9 @@
                   (i32.eqz
                    (global.get $hangLimit)
                   )
-                  (return
+                  (then (return
                    (i64.const -32766)
-                  )
+                  ))
                  )
                  (global.set $hangLimit
                   (i32.sub
@@ -315,22 +315,22 @@
                 )
                )
               )
-              (block $label$7 (result f32)
+              (then (block $label$7 (result f32)
                (f32.const -nan:0x7fffda)
-              )
-              (f32.const 4294967296)
+              ))
+              (else (f32.const 4294967296))
              )
             )
             (i32.const -2147483648)
            )
-           (i32.const -1073741824)
-           (local.get $0)
+           (then (i32.const -1073741824))
+           (else (local.get $0))
           )
           (i32.eqz
            (global.get $global$0)
           )
          )
-        )
+        ))
        )
       )
      )
diff --git a/tests/local/if-else-parsing.wast b/tests/local/if-else-parsing.wast
new file mode 100644
index 00000000..98a8bb60
--- /dev/null
+++ b/tests/local/if-else-parsing.wast
@@ -0,0 +1,42 @@
+(module
+  (func $a1
+    i32.const 0
+    (if (then) (else))
+  )
+  (func $a2
+    (if (i32.const 1) (i32.eqz) (then) (else))
+  )
+  (func $a3
+    (if (i32.const 1) (i32.eqz) (then))
+  )
+  (func $a4
+    (if (i32.const 1) (i32.eqz) (then nop))
+  )
+)
+(assert_invalid
+  (module quote
+    "(func (if))"
+  )
+  "no `then`")
+
+(assert_invalid
+  (module quote
+    "(func (if (else)))"
+  )
+  "no `then`")
+
+(assert_invalid
+  (module quote
+    "(func (if nop (else)))"
+  )
+  "expected `(`")
+(assert_invalid
+  (module quote
+    "(func (if (nop) (else)))"
+  )
+  "no `then`")
+(assert_invalid
+  (module quote
+    "(func (if (nop) nop (then)))"
+  )
+  "expected `(`")
diff --git a/tests/snapshots/local/if-else-parsing.wast/0.print b/tests/snapshots/local/if-else-parsing.wast/0.print
new file mode 100644
index 00000000..56cbd495
--- /dev/null
+++ b/tests/snapshots/local/if-else-parsing.wast/0.print
@@ -0,0 +1,29 @@
+(module
+  (type (;0;) (func))
+  (func $a1 (;0;) (type 0)
+    i32.const 0
+    if ;; label = @1
+    else
+    end
+  )
+  (func $a2 (;1;) (type 0)
+    i32.const 1
+    i32.eqz
+    if ;; label = @1
+    else
+    end
+  )
+  (func $a3 (;2;) (type 0)
+    i32.const 1
+    i32.eqz
+    if ;; label = @1
+    end
+  )
+  (func $a4 (;3;) (type 0)
+    i32.const 1
+    i32.eqz
+    if ;; label = @1
+      nop
+    end
+  )
+)
\ No newline at end of file
diff --git a/tests/snapshots/testsuite/if.wast/0.print b/tests/snapshots/testsuite/if.wast/0.print
index 8e72869e..148a4b82 100644
--- a/tests/snapshots/testsuite/if.wast/0.print
+++ b/tests/snapshots/testsuite/if.wast/0.print
@@ -22,12 +22,14 @@
     end
     local.get 0
     if ;; label = @1
+    else
     end
     local.get 0
     if $l ;; label = @1
     end
     local.get 0
     if $l ;; label = @1
+    else
     end
   )
   (func (;2;) (type 5) (param i32) (result i32)
diff --git a/tests/snapshots/testsuite/proposals/function-references/if.wast/0.print b/tests/snapshots/testsuite/proposals/function-references/if.wast/0.print
index 8e72869e..148a4b82 100644
--- a/tests/snapshots/testsuite/proposals/function-references/if.wast/0.print
+++ b/tests/snapshots/testsuite/proposals/function-references/if.wast/0.print
@@ -22,12 +22,14 @@
     end
     local.get 0
     if ;; label = @1
+    else
     end
     local.get 0
     if $l ;; label = @1
     end
     local.get 0
     if $l ;; label = @1
+    else
     end
   )
   (func (;2;) (type 5) (param i32) (result i32)
diff --git a/tests/snapshots/testsuite/proposals/gc/if.wast/0.print b/tests/snapshots/testsuite/proposals/gc/if.wast/0.print
index 8e72869e..148a4b82 100644
--- a/tests/snapshots/testsuite/proposals/gc/if.wast/0.print
+++ b/tests/snapshots/testsuite/proposals/gc/if.wast/0.print
@@ -22,12 +22,14 @@
     end
     local.get 0
     if ;; label = @1
+    else
     end
     local.get 0
     if $l ;; label = @1
     end
     local.get 0
     if $l ;; label = @1
+    else
     end
   )
   (func (;2;) (type 5) (param i32) (result i32)