aboutsummaryrefslogtreecommitdiff
path: root/macros/src
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src')
-rw-r--r--macros/src/check.rs277
1 files changed, 17 insertions, 260 deletions
diff --git a/macros/src/check.rs b/macros/src/check.rs
index 4471e96a..8ad13f3c 100644
--- a/macros/src/check.rs
+++ b/macros/src/check.rs
@@ -1,7 +1,7 @@
use std::{collections::HashSet, iter};
use proc_macro2::Span;
-use syn::{parse, spanned::Spanned, Block, Expr, Stmt};
+use syn::parse;
use crate::syntax::App;
@@ -35,12 +35,22 @@ pub fn app(app: &App) -> parse::Result<()> {
}
}
- // Check that `init` returns `LateResources` if there's any declared late resource
- if !app.init.returns_late_resources && app.resources.iter().any(|(_, res)| res.expr.is_none()) {
- return Err(parse::Error::new(
- app.init.span,
- "late resources have been specified so `init` must return `init::LateResources`",
- ));
+ if app.resources.iter().any(|(_, res)| res.expr.is_none()) {
+ // Check that `init` returns `LateResources` if there's any declared late resource
+ if !app.init.returns_late_resources {
+ return Err(parse::Error::new(
+ app.init.span,
+ "late resources have been specified so `init` must return `init::LateResources`",
+ ));
+ }
+ } else if app.init.returns_late_resources {
+ // If there are no late resources the signature should be `fn(init::Context)`
+ if app.init.returns_late_resources {
+ return Err(parse::Error::new(
+ app.init.span,
+ "`init` signature must be `fn(init::Context)` if there are no late resources",
+ ));
+ }
}
// Check that all referenced tasks have been declared
@@ -108,258 +118,5 @@ pub fn app(app: &App) -> parse::Result<()> {
}
}
- // Check that `init` contains no early returns *if* late resources exist and `init` signature is
- // `fn()`
- if app.resources.values().any(|res| res.expr.is_none()) {
- if !app.init.returns_late_resources {
- for stmt in &app.init.stmts {
- noreturn_stmt(stmt)?;
- }
- }
- } else if app.init.returns_late_resources {
- return Err(parse::Error::new(
- Span::call_site(),
- "`init` signature must be `fn(init::Context)` if there are no late resources",
- ));
- }
-
- Ok(())
-}
-
-// checks that the given block contains no instance of `return`
-fn noreturn_block(block: &Block) -> Result<(), parse::Error> {
- for stmt in &block.stmts {
- noreturn_stmt(stmt)?;
- }
-
- Ok(())
-}
-
-// checks that the given statement contains no instance of `return`
-fn noreturn_stmt(stmt: &Stmt) -> Result<(), parse::Error> {
- match stmt {
- // `let x = ..` -- this may contain a return in the RHS
- Stmt::Local(local) => {
- if let Some(ref init) = local.init {
- noreturn_expr(&init.1)?
- }
- }
-
- // items have no effect on control flow
- Stmt::Item(..) => {}
-
- Stmt::Expr(expr) => noreturn_expr(expr)?,
-
- Stmt::Semi(expr, ..) => noreturn_expr(expr)?,
- }
-
- Ok(())
-}
-
-// checks that the given expression contains no `return`
-fn noreturn_expr(expr: &Expr) -> Result<(), parse::Error> {
- match expr {
- Expr::Box(b) => noreturn_expr(&b.expr)?,
-
- Expr::InPlace(ip) => {
- noreturn_expr(&ip.place)?;
- noreturn_expr(&ip.value)?;
- }
-
- Expr::Array(a) => {
- for elem in &a.elems {
- noreturn_expr(elem)?;
- }
- }
-
- Expr::Call(c) => {
- noreturn_expr(&c.func)?;
-
- for arg in &c.args {
- noreturn_expr(arg)?;
- }
- }
-
- Expr::MethodCall(mc) => {
- noreturn_expr(&mc.receiver)?;
-
- for arg in &mc.args {
- noreturn_expr(arg)?;
- }
- }
-
- Expr::Tuple(t) => {
- for elem in &t.elems {
- noreturn_expr(elem)?;
- }
- }
-
- Expr::Binary(b) => {
- noreturn_expr(&b.left)?;
- noreturn_expr(&b.right)?;
- }
-
- Expr::Unary(u) => {
- noreturn_expr(&u.expr)?;
- }
-
- Expr::Lit(..) => {}
-
- Expr::Cast(c) => {
- noreturn_expr(&c.expr)?;
- }
-
- Expr::Type(t) => {
- noreturn_expr(&t.expr)?;
- }
-
- Expr::Let(l) => {
- noreturn_expr(&l.expr)?;
- }
-
- Expr::If(i) => {
- noreturn_expr(&i.cond)?;
-
- noreturn_block(&i.then_branch)?;
-
- if let Some(ref e) = i.else_branch {
- noreturn_expr(&e.1)?;
- }
- }
-
- Expr::While(w) => {
- noreturn_expr(&w.cond)?;
- noreturn_block(&w.body)?;
- }
-
- Expr::ForLoop(fl) => {
- noreturn_expr(&fl.expr)?;
- noreturn_block(&fl.body)?;
- }
-
- Expr::Loop(l) => {
- noreturn_block(&l.body)?;
- }
-
- Expr::Match(m) => {
- noreturn_expr(&m.expr)?;
-
- for arm in &m.arms {
- if let Some(g) = &arm.guard {
- noreturn_expr(&g.1)?;
- }
-
- noreturn_expr(&arm.body)?;
- }
- }
-
- // we don't care about `return`s inside closures
- Expr::Closure(..) => {}
-
- Expr::Unsafe(u) => {
- noreturn_block(&u.block)?;
- }
-
- Expr::Block(b) => {
- noreturn_block(&b.block)?;
- }
-
- Expr::Assign(a) => {
- noreturn_expr(&a.left)?;
- noreturn_expr(&a.right)?;
- }
-
- Expr::AssignOp(ao) => {
- noreturn_expr(&ao.left)?;
- noreturn_expr(&ao.right)?;
- }
-
- Expr::Field(f) => {
- noreturn_expr(&f.base)?;
- }
-
- Expr::Index(i) => {
- noreturn_expr(&i.expr)?;
- noreturn_expr(&i.index)?;
- }
-
- Expr::Range(r) => {
- if let Some(ref f) = r.from {
- noreturn_expr(f)?;
- }
-
- if let Some(ref t) = r.to {
- noreturn_expr(t)?;
- }
- }
-
- Expr::Path(..) => {}
-
- Expr::Reference(r) => {
- noreturn_expr(&r.expr)?;
- }
-
- Expr::Break(b) => {
- if let Some(ref e) = b.expr {
- noreturn_expr(e)?;
- }
- }
-
- Expr::Continue(..) => {}
-
- Expr::Return(r) => {
- return Err(parse::Error::new(
- r.span(),
- "`init` is *not* allowed to early return",
- ));
- }
-
- // we can not analyze this
- Expr::Macro(..) => {}
-
- Expr::Struct(s) => {
- for field in &s.fields {
- noreturn_expr(&field.expr)?;
- }
-
- if let Some(ref rest) = s.rest {
- noreturn_expr(rest)?;
- }
- }
-
- Expr::Repeat(r) => {
- noreturn_expr(&r.expr)?;
- noreturn_expr(&r.len)?;
- }
-
- Expr::Paren(p) => {
- noreturn_expr(&p.expr)?;
- }
-
- Expr::Group(g) => {
- noreturn_expr(&g.expr)?;
- }
-
- Expr::Try(t) => {
- noreturn_expr(&t.expr)?;
- }
-
- // we don't care about `return`s inside async blocks
- Expr::Async(..) => {}
-
- Expr::TryBlock(tb) => {
- noreturn_block(&tb.block)?;
- }
-
- Expr::Yield(y) => {
- if let Some(expr) = &y.expr {
- noreturn_expr(expr)?;
- }
- }
-
- // we can not analyze this
- Expr::Verbatim(..) => {}
- }
-
Ok(())
}
d class='logsubject'>Update ZigGeneratedClasses.cppGravatar Dylan Conway 1-2/+0 2023-10-17use npm alias in dependencies (#6545)Gravatar Dylan Conway 7-29/+271 * aliased package in dependencies * other buf * make sure version works * make sure overrides don't override alias * tests * update * comments 2023-10-17fix(node:http): fix `server.address()` (#6442)Gravatar Ai Hoshino 12-12/+453 Closes #6413, #5850 2023-10-17docs: fix ws.publish (#6558)Gravatar Aral Roca Gomez 1-1/+1 In this example there is no server variable in the context, and here it makes more sense to use ws.publish. It is explained below that once the serve is done, the server.publish can be used. 2023-10-17perf(bun-types): remove needless some call (#6550)Gravatar Mikhail 1-1/+1 2023-10-16fix(runtime): make some things more stable (partial jsc debug build) (#5881)Gravatar dave caruso 116-1446/+1830 * make our debug assertions work * install bun-webkit-debug * more progress * ok * progress... * more debug build stuff * ok * a * asdfghjkl * fix(runtime): fix bad assertion failure in JSBufferList * ok * stuff * upgrade webkit * Update src/bun.js/bindings/JSDOMWrapperCache.h Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> * fix message for colin's changes * okay * fix cjs prototype * implement mainModule * i think this fixes it all --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> 2023-10-16fix(runtime): improve IPC reliability + organization pass on that code (#6475)Gravatar dave caruso 15-98/+266 * dfghj * Handle messages that did not finish * tidy * ok * a * Merge remote-tracking branch 'origin/main' into dave/ipc-fixes * test failures --------- Co-authored-by: Jarred Sumner <jarred@jarredsumner.com> 2023-10-16Simplify getting Set of extentions (#4975)Gravatar Mikhail 1-3/+3 2023-10-16Fix formattingGravatar Ashcon Partovi 1-3/+1 2023-10-16fix(test): when tests run with --only the nested describe blocks `.on… (#5616)Gravatar Igor Shapiro 2-13/+45 2023-10-16perf(node:events): optimize `emit(...)` function (#5485)Gravatar Yannik Schröder 3-11/+132 2023-10-16fix: don't remove content-encoding header from header table (#5743)Gravatar Liz 2-2/+25 Closes #5668 2023-10-16fix(sqlite) Insert .all() does not return an array #5872 (#5946)Gravatar Hugo Galan 2-7/+11 * fixing #5872 * removing useless comment 2023-10-16Fix formattingGravatar Ashcon Partovi 2-5/+4 2023-10-16Fix `Response.statusText` (#6151)Gravatar Chris Toshok 10-238/+269 2023-10-16fix-subprocess-argument-missing (#6407)Gravatar Nicolae-Rares Ailincai 4-2/+40 * fix-subprocess-argument-missing * fix-tests * nitpick, these should === not just be undefined --------- Co-authored-by: dave caruso <me@paperdave.net> 2023-10-16Add type parameter to `expect` (#6128)Gravatar Voldemat 1-3/+3 2023-10-16fix(node:worker_threads): ensure threadId property is exposed on ↵Gravatar Jérôme Benoit 6-15/+75 worker_threads instance (#6521) * fix: ensure threadId property is exposed on worker_threads instance Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * fix: rename lazy worker_threads module properties Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * fix: add getter for threadId Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: improve worker_threads UTs Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: fix lazy loading Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: fix worker_threads test Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org> * fix: return the worker threadId Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> * test: refine worker_threads expectation on threadId Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org> --------- Signed-off-by: Jérôme Benoit <jerome.benoit@sap.com> Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org> 2023-10-16Fix use before define bug in sqliteGravatar Ashcon Partovi 2-5/+5 Fixes #6481 2023-10-16fix(jest): fix toStrictEqual on same URLs (#6528)Gravatar João Alisson 2-13/+16 Fixes #6492 2023-10-16Fix `toHaveBeenCalled` having wrong error signatureGravatar Ashcon Partovi 1-2/+2 Fixes #6527 2023-10-16Fix formattingGravatar Ashcon Partovi 1-2/+1 2023-10-16Add `reusePort` to `Bun.serve` typesGravatar Ashcon Partovi 1-0/+9 2023-10-16Fix `request.url` having incorrect portGravatar Ashcon Partovi 4-1/+92 Fixes #6443 2023-10-16Remove uWebSockets header from Bun.serve responsesGravatar Ashcon Partovi 1-6/+6 2023-10-16Rename some testsGravatar Ashcon Partovi 3-0/+0 2023-10-16Fix #6467Gravatar Ashcon Partovi 2-3/+10 2023-10-16Update InternalModuleRegistryConstants.hGravatar Dylan Conway 1-3/+3 2023-10-16Development -> Contributing (#6538)Gravatar Colin McDonnell 2-1/+1 Co-authored-by: Colin McDonnell <colin@KennyM1.local> 2023-10-14fix(net/tls) fix pg hang on end + hanging on query (#6487)Gravatar Ciro Spaciari 3-8/+36 * fix pg hang on end + hanging on query * remove dummy function * fix node-stream * add test * fix test * return error in test * fix test use once instead of on * fix OOM * generated * 💅 * 💅 2023-10-13fix installing dependencies that match workspace versions (#6494)Gravatar Dylan Conway 4-2/+64 * check if dependency matches workspace version * test * Update lockfile.zig * set resolution to workspace package id 2023-10-13fix lockfile struct padding (#6495)Gravatar Dylan Conway 3-3/+18 * integrity padding * error message for bytes at end of struct