From 9356f35f2d013489ecfcc308baa20ae5c4eb7ec4 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Wed, 14 May 2025 09:07:38 -0700 Subject: [PATCH 1/9] Make attributes optional... still need tests --- Cargo.toml | 3 + crates/napi/src/lib.rs | 1 + crates/next-api/src/lib.rs | 1 + crates/next-api/src/project.rs | 9 ++- crates/next-build-test/src/lib.rs | 1 + crates/next-build/src/lib.rs | 1 + crates/next-core/src/app_segment_config.rs | 23 ++++---- crates/next-core/src/app_structure.rs | 9 ++- crates/next-core/src/lib.rs | 1 + crates/next-core/src/next_config.rs | 5 +- .../src/next_font/google/font_fallback.rs | 2 +- crates/next-core/src/next_font/google/mod.rs | 14 ++--- crates/next-core/src/next_font/issue.rs | 7 +-- crates/next-core/src/next_font/local/mod.rs | 5 +- crates/next-core/src/next_font/util.rs | 2 +- crates/next-core/src/next_image/module.rs | 3 +- crates/next-core/src/next_server/resolve.rs | 5 +- crates/next-core/src/next_shared/resolve.rs | 9 ++- .../transforms/next_page_static_info.rs | 8 +-- .../src/next_shared/webpack_rules/babel.rs | 26 ++++----- crates/next-core/src/util.rs | 5 +- crates/next-custom-transforms/src/lib.rs | 1 + turbopack/crates/turbo-esregex/src/lib.rs | 1 + .../crates/turbo-tasks-backend/benches/mod.rs | 1 + .../turbo-tasks-backend/src/backend/mod.rs | 4 +- .../crates/turbo-tasks-backend/src/data.rs | 2 +- .../crates/turbo-tasks-backend/src/lib.rs | 1 + .../tests/trace_transient.rs | 1 + .../tests/transient_collectible.rs | 1 + turbopack/crates/turbo-tasks-build/src/lib.rs | 12 ++-- turbopack/crates/turbo-tasks-bytes/src/lib.rs | 1 + turbopack/crates/turbo-tasks-env/src/lib.rs | 1 + turbopack/crates/turbo-tasks-fetch/src/lib.rs | 12 ++-- .../crates/turbo-tasks-fetch/tests/fetch.rs | 8 +-- turbopack/crates/turbo-tasks-fs/src/lib.rs | 1 + .../function/fail_attribute_invalid_args.rs | 1 + .../fail_attribute_invalid_args.stderr | 8 +-- ...il_attribute_invalid_args_inherent_impl.rs | 1 + ...ttribute_invalid_args_inherent_impl.stderr | 18 +----- .../fail_operation_method_self_ref.rs | 1 + .../fail_operation_method_self_ref.stderr | 4 +- .../fail_operation_method_self_type.rs | 1 + .../fail_operation_method_self_type.stderr | 12 ++-- ...fail_operation_method_self_type_base_vc.rs | 1 + ..._operation_method_self_type_base_vc.stderr | 4 +- .../tests/function/pass_non_local_vc_input.rs | 1 + .../tests/value/fail_non_local.rs | 1 + .../tests/value/fail_non_local.stderr | 8 +-- .../tests/value/pass_non_local.rs | 1 + .../fail_missing_function_annotation.rs | 1 + .../fail_missing_function_annotation.stderr | 18 +----- .../tests/value_trait/pass_non_local.rs | 1 + .../tests/value_trait/pass_trait_items.rs | 9 ++- .../crates/turbo-tasks-macros/src/func.rs | 14 ++--- .../src/value_impl_macro.rs | 51 ++++++++++++----- .../src/value_trait_macro.rs | 50 +++++++++++++++-- .../turbo-tasks-testing/tests/all_in_one.rs | 1 + .../crates/turbo-tasks-testing/tests/basic.rs | 1 + .../turbo-tasks-testing/tests/call_types.rs | 1 + .../turbo-tasks-testing/tests/collectibles.rs | 1 + .../crates/turbo-tasks-testing/tests/debug.rs | 1 + .../turbo-tasks-testing/tests/detached.rs | 1 + .../tests/dirty_in_progress.rs | 1 + .../tests/emptied_cells.rs | 1 + .../tests/filter_unused_args.rs | 1 + .../turbo-tasks-testing/tests/local_tasks.rs | 1 + .../turbo-tasks-testing/tests/performance.rs | 1 + .../tests/random_change.rs | 1 + .../tests/read_ref_cell.rs | 1 + .../turbo-tasks-testing/tests/recompute.rs | 1 + .../tests/recompute_collectibles.rs | 1 + .../turbo-tasks-testing/tests/resolved_vc.rs | 1 + .../tests/shrink_to_fit.rs | 1 + .../tests/task_statistics.rs | 1 + .../tests/trait_ref_cell.rs | 19 +++++-- turbopack/crates/turbo-tasks/src/backend.rs | 6 +- turbopack/crates/turbo-tasks/src/lib.rs | 1 + .../turbo-tasks/src/task/shared_reference.rs | 30 +++++++--- turbopack/crates/turbo-tasks/src/trait_ref.rs | 44 ++++++++++++++- .../crates/turbo-tasks/src/value_type.rs | 55 ++++++++++++++----- .../crates/turbo-tasks/src/vc/cell_mode.rs | 10 ++-- turbopack/crates/turbo-tasks/src/vc/traits.rs | 1 + turbopack/crates/turbopack-browser/src/lib.rs | 1 + .../turbopack-browser/src/react_refresh.rs | 5 +- .../crates/turbopack-cli-utils/src/issue.rs | 4 +- .../crates/turbopack-cli-utils/src/lib.rs | 1 + .../crates/turbopack-cli/src/build/mod.rs | 2 +- turbopack/crates/turbopack-cli/src/lib.rs | 1 + .../turbopack-core/src/issue/analyze.rs | 9 ++- .../turbopack-core/src/issue/code_gen.rs | 7 +-- .../crates/turbopack-core/src/issue/mod.rs | 20 ++++--- .../turbopack-core/src/issue/resolve.rs | 7 +-- turbopack/crates/turbopack-core/src/lib.rs | 1 + .../crates/turbopack-core/src/resolve/mod.rs | 14 ++--- turbopack/crates/turbopack-css/src/lib.rs | 1 + .../crates/turbopack-css/src/module_asset.rs | 11 ++-- .../crates/turbopack-dev-server/src/http.rs | 2 +- .../crates/turbopack-dev-server/src/lib.rs | 3 +- .../turbopack-dev-server/src/update/stream.rs | 9 ++- .../turbopack-ecmascript-plugins/src/lib.rs | 1 + .../transform/swc_ecma_transform_plugins.rs | 10 ++-- .../turbopack-ecmascript-runtime/src/lib.rs | 1 + .../turbopack-ecmascript/src/chunk/item.rs | 2 +- .../src/chunk/placeable.rs | 5 +- .../crates/turbopack-ecmascript/src/lib.rs | 1 + .../crates/turbopack-ecmascript/src/parse.rs | 5 +- .../src/references/esm/base.rs | 5 +- .../src/references/pattern_mapping.rs | 4 +- .../src/references/type_issue.rs | 9 ++- .../src/references/worker.rs | 2 +- .../turbopack-ecmascript/src/transform/mod.rs | 5 +- turbopack/crates/turbopack-env/src/lib.rs | 1 + turbopack/crates/turbopack-image/src/lib.rs | 1 + .../crates/turbopack-image/src/process/mod.rs | 13 ++--- turbopack/crates/turbopack-json/src/lib.rs | 1 + turbopack/crates/turbopack-mdx/src/lib.rs | 1 + turbopack/crates/turbopack-node/src/lib.rs | 1 + .../turbopack-node/src/transforms/postcss.rs | 7 +-- .../turbopack-node/src/transforms/webpack.rs | 25 ++++----- turbopack/crates/turbopack-nodejs/src/lib.rs | 1 + turbopack/crates/turbopack-resolve/src/lib.rs | 1 + .../turbopack-resolve/src/typescript.rs | 15 +++-- turbopack/crates/turbopack-static/src/lib.rs | 1 + .../crates/turbopack-test-utils/src/lib.rs | 1 + .../crates/turbopack-tests/tests/execution.rs | 1 + .../crates/turbopack-trace-utils/src/lib.rs | 1 + turbopack/crates/turbopack-wasm/src/lib.rs | 1 + turbopack/crates/turbopack/src/lib.rs | 1 + .../crates/turbopack/src/unsupported_sass.rs | 14 +++-- .../crates/turbopack/tests/node-file-trace.rs | 1 + 130 files changed, 493 insertions(+), 320 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2ac2ded4b5cf..e203f8b4abc8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,9 @@ exclude = ["crates/next-error-code-swc-plugin"] [workspace.lints.clippy] too_many_arguments = "allow" +[workspace.lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(rust_analyzer)'] } + # This crate is particularly sensitive to compiler optimizations [profile.dev.package.turbo-persistence] opt-level = 1 diff --git a/crates/napi/src/lib.rs b/crates/napi/src/lib.rs index 8544f3804564..8ea8a3cea0ca 100644 --- a/crates/napi/src/lib.rs +++ b/crates/napi/src/lib.rs @@ -30,6 +30,7 @@ DEALINGS IN THE SOFTWARE. //#![deny(clippy::all)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #[macro_use] extern crate napi_derive; diff --git a/crates/next-api/src/lib.rs b/crates/next-api/src/lib.rs index 17360fdb01d2..49a985694baf 100644 --- a/crates/next-api/src/lib.rs +++ b/crates/next-api/src/lib.rs @@ -1,6 +1,7 @@ #![feature(future_join)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![feature(impl_trait_in_assoc_type)] mod app; diff --git a/crates/next-api/src/project.rs b/crates/next-api/src/project.rs index 5630e075bb7c..0fdeefc827c1 100644 --- a/crates/next-api/src/project.rs +++ b/crates/next-api/src/project.rs @@ -598,7 +598,7 @@ struct ConflictIssue { path: ResolvedVc, title: ResolvedVc, description: ResolvedVc, - severity: ResolvedVc, + severity: IssueSeverity, } #[turbo_tasks::value_impl] @@ -608,9 +608,8 @@ impl Issue for ConflictIssue { IssueStage::AppStructure.cell() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] @@ -1209,7 +1208,7 @@ impl Project { .into(), ) .resolved_cell(), - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, } .resolved_cell() .emit(); diff --git a/crates/next-build-test/src/lib.rs b/crates/next-build-test/src/lib.rs index 1efa99f2bfed..071a34c604b3 100644 --- a/crates/next-build-test/src/lib.rs +++ b/crates/next-build-test/src/lib.rs @@ -2,6 +2,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use std::{str::FromStr, time::Instant}; diff --git a/crates/next-build/src/lib.rs b/crates/next-build/src/lib.rs index e796f4322c79..78317c4ece22 100644 --- a/crates/next-build/src/lib.rs +++ b/crates/next-build/src/lib.rs @@ -1,6 +1,7 @@ #![feature(type_alias_impl_trait)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod build_options; diff --git a/crates/next-core/src/app_segment_config.rs b/crates/next-core/src/app_segment_config.rs index dc2442aeb148..3df7fc7d215a 100644 --- a/crates/next-core/src/app_segment_config.rs +++ b/crates/next-core/src/app_segment_config.rs @@ -7,7 +7,7 @@ use swc_core::{ common::{GLOBALS, Span, Spanned, source_map::SmallPos}, ecma::ast::{Decl, Expr, FnExpr, Ident, Program}, }; -use turbo_rcstr::RcStr; +use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{ NonLocalValue, ResolvedVc, TryJoinIterExt, ValueDefault, Vc, trace::TraceRawVcs, util::WrapFuture, @@ -199,15 +199,16 @@ impl NextSegmentConfigParsingIssue { #[turbo_tasks::value_impl] impl Issue for NextSegmentConfigParsingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Next.js can't recognize the exported `config` field in route".into()) - .cell() + StyledString::Text(rcstr!( + "Next.js can't recognize the exported `config` field in route" + )) + .cell() } #[turbo_tasks::function] @@ -223,11 +224,10 @@ impl Issue for NextSegmentConfigParsingIssue { #[turbo_tasks::function] fn description(&self) -> Vc { Vc::cell(Some( - StyledString::Text( + StyledString::Text(rcstr!( "The exported configuration object in a source file needs to have a very specific \ format from which some properties can be statically parsed at compiled-time." - .into(), - ) + )) .resolved_cell(), )) } @@ -239,10 +239,9 @@ impl Issue for NextSegmentConfigParsingIssue { #[turbo_tasks::function] fn documentation_link(&self) -> Vc { - Vc::cell( + Vc::cell(rcstr!( "https://nextjs.org/docs/app/api-reference/file-conventions/route-segment-config" - .into(), - ) + )) } #[turbo_tasks::function] diff --git a/crates/next-core/src/app_structure.rs b/crates/next-core/src/app_structure.rs index 4af16d79d56f..7ecb39a6c8a5 100644 --- a/crates/next-core/src/app_structure.rs +++ b/crates/next-core/src/app_structure.rs @@ -590,7 +590,7 @@ fn conflict_issue( .into(), ) .resolved_cell(), - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, } .resolved_cell() .emit(); @@ -1529,16 +1529,15 @@ pub async fn get_global_metadata( #[turbo_tasks::value(shared)] struct DirectoryTreeIssue { - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub app_dir: ResolvedVc, pub message: ResolvedVc, } #[turbo_tasks::value_impl] impl Issue for DirectoryTreeIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/crates/next-core/src/lib.rs b/crates/next-core/src/lib.rs index f8bdaa223077..2998d34b88ed 100644 --- a/crates/next-core/src/lib.rs +++ b/crates/next-core/src/lib.rs @@ -2,6 +2,7 @@ #![feature(impl_trait_in_assoc_type)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![feature(iter_intersperse)] mod app_page_loader_tree; diff --git a/crates/next-core/src/next_config.rs b/crates/next-core/src/next_config.rs index ba551cd53ef4..e36d0b53328a 100644 --- a/crates/next-core/src/next_config.rs +++ b/crates/next-core/src/next_config.rs @@ -1653,9 +1653,8 @@ struct OutdatedConfigIssue { #[turbo_tasks::value_impl] impl Issue for OutdatedConfigIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_font/google/font_fallback.rs b/crates/next-core/src/next_font/google/font_fallback.rs index f89d3a6ae008..478d6e68f3da 100644 --- a/crates/next-core/src/next_font/google/font_fallback.rs +++ b/crates/next-core/src/next_font/google/font_fallback.rs @@ -87,7 +87,7 @@ pub(super) async fn get_font_fallback( "Skipping generating a fallback font." )) .resolved_cell(), - severity: IssueSeverity::Warning.resolved_cell(), + severity: IssueSeverity::Warning, } .resolved_cell() .emit(); diff --git a/crates/next-core/src/next_font/google/mod.rs b/crates/next-core/src/next_font/google/mod.rs index 6873a69121ec..fb22c1185858 100644 --- a/crates/next-core/src/next_font/google/mod.rs +++ b/crates/next-core/src/next_font/google/mod.rs @@ -248,8 +248,8 @@ impl NextFontGoogleCssModuleReplacer { NextFontIssue { path: css_virtual_path.to_resolved().await?, title: StyledString::Line(vec![ - StyledString::Code("next/font:".into()), - StyledString::Text(" error:".into()), + StyledString::Code(rcstr!("next/font:")), + StyledString::Text(rcstr!(" error:")), ]) .resolved_cell(), description: StyledString::Text( @@ -260,7 +260,7 @@ impl NextFontGoogleCssModuleReplacer { .into(), ) .resolved_cell(), - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, } .resolved_cell() .emit(); @@ -272,8 +272,8 @@ impl NextFontGoogleCssModuleReplacer { NextFontIssue { path: css_virtual_path.to_resolved().await?, title: StyledString::Line(vec![ - StyledString::Code("next/font:".into()), - StyledString::Text(" warning:".into()), + StyledString::Code(rcstr!("next/font:")), + StyledString::Text(rcstr!(" warning:")), ]) .resolved_cell(), description: StyledString::Text( @@ -285,7 +285,7 @@ impl NextFontGoogleCssModuleReplacer { .into(), ) .resolved_cell(), - severity: IssueSeverity::Warning.resolved_cell(), + severity: IssueSeverity::Warning, } .resolved_cell() .emit(); @@ -663,7 +663,7 @@ async fn fetch_from_google_fonts( Ok(match *result { Ok(r) => Some(*r.await?.body), Err(err) => { - err.to_issue(IssueSeverity::Warning.into(), virtual_path) + err.to_issue(IssueSeverity::Warning, virtual_path) .to_resolved() .await? .emit(); diff --git a/crates/next-core/src/next_font/issue.rs b/crates/next-core/src/next_font/issue.rs index a07db2f353e6..f8822296597e 100644 --- a/crates/next-core/src/next_font/issue.rs +++ b/crates/next-core/src/next_font/issue.rs @@ -7,7 +7,7 @@ pub(crate) struct NextFontIssue { pub(crate) path: ResolvedVc, pub(crate) title: ResolvedVc, pub(crate) description: ResolvedVc, - pub(crate) severity: ResolvedVc, + pub(crate) severity: IssueSeverity, } #[turbo_tasks::value_impl] @@ -17,9 +17,8 @@ impl Issue for NextFontIssue { IssueStage::CodeGen.into() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_font/local/mod.rs b/crates/next-core/src/next_font/local/mod.rs index 2391cfdb2767..3f6065e6c939 100644 --- a/crates/next-core/src/next_font/local/mod.rs +++ b/crates/next-core/src/next_font/local/mod.rs @@ -328,9 +328,8 @@ struct FontResolvingIssue { #[turbo_tasks::value_impl] impl Issue for FontResolvingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.cell() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_font/util.rs b/crates/next-core/src/next_font/util.rs index 9e95f5f5b198..99baa0015193 100644 --- a/crates/next-core/src/next_font/util.rs +++ b/crates/next-core/src/next_font/util.rs @@ -97,7 +97,7 @@ pub(crate) async fn can_use_next_font( StyledString::Code(request.path), ]) .resolved_cell(), - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, } .resolved_cell() .emit(); diff --git a/crates/next-core/src/next_image/module.rs b/crates/next-core/src/next_image/module.rs index 1146e07807b0..9c58747d4c04 100644 --- a/crates/next-core/src/next_image/module.rs +++ b/crates/next-core/src/next_image/module.rs @@ -1,5 +1,6 @@ use anyhow::Result; use serde::{Deserialize, Serialize}; +use turbo_rcstr::rcstr; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Vc, fxindexmap, trace::TraceRawVcs}; use turbopack::{ModuleAssetContext, module_options::CustomModuleType}; use turbopack_core::{ @@ -65,7 +66,7 @@ impl StructuredImageModuleType { .cell(), ), ReferenceType::Internal(ResolvedVc::cell(fxindexmap!( - "IMAGE".into() => ResolvedVc::upcast(static_asset) + rcstr!("IMAGE") => ResolvedVc::upcast(static_asset) ))), ) .module()) diff --git a/crates/next-core/src/next_server/resolve.rs b/crates/next-core/src/next_server/resolve.rs index 61dbda1c2d81..033b1a305e1f 100644 --- a/crates/next-core/src/next_server/resolve.rs +++ b/crates/next-core/src/next_server/resolve.rs @@ -459,9 +459,8 @@ struct ExternalizeIssue { #[turbo_tasks::value_impl] impl Issue for ExternalizeIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.cell() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_shared/resolve.rs b/crates/next-core/src/next_shared/resolve.rs index 5bcd80cbdd9a..4803b11c4210 100644 --- a/crates/next-core/src/next_shared/resolve.rs +++ b/crates/next-core/src/next_shared/resolve.rs @@ -2,7 +2,7 @@ use std::sync::LazyLock; use anyhow::Result; use rustc_hash::FxHashMap; -use turbo_rcstr::RcStr; +use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{FileSystemPath, glob::Glob}; use turbopack_core::{ @@ -52,9 +52,8 @@ pub struct InvalidImportModuleIssue { #[turbo_tasks::value_impl] impl Issue for InvalidImportModuleIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] @@ -64,7 +63,7 @@ impl Issue for InvalidImportModuleIssue { #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Invalid import".into()).cell() + StyledString::Text(rcstr!("Invalid import")).cell() } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_shared/transforms/next_page_static_info.rs b/crates/next-core/src/next_shared/transforms/next_page_static_info.rs index ff2b82188fad..d88a4743d6ca 100644 --- a/crates/next-core/src/next_shared/transforms/next_page_static_info.rs +++ b/crates/next-core/src/next_shared/transforms/next_page_static_info.rs @@ -8,6 +8,7 @@ use swc_core::{ atoms::{Atom, atom}, ecma::ast::Program, }; +use turbo_rcstr::rcstr; use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::FileSystemPath; use turbopack::module_options::{ModuleRule, ModuleRuleEffect}; @@ -151,9 +152,8 @@ pub struct PageStaticInfoIssue { #[turbo_tasks::value_impl] impl Issue for PageStaticInfoIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - self.severity.into() + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] @@ -163,7 +163,7 @@ impl Issue for PageStaticInfoIssue { #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Invalid page configuration".into()).cell() + StyledString::Text(rcstr!("Invalid page configuration")).cell() } #[turbo_tasks::function] diff --git a/crates/next-core/src/next_shared/webpack_rules/babel.rs b/crates/next-core/src/next_shared/webpack_rules/babel.rs index 9838cad3e5ec..dcb785455308 100644 --- a/crates/next-core/src/next_shared/webpack_rules/babel.rs +++ b/crates/next-core/src/next_shared/webpack_rules/babel.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use turbo_rcstr::rcstr; use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{self, FileSystemEntryType, FileSystemPath}; use turbopack::module_options::{LoaderRuleItem, OptionWebpackRules, WebpackRules}; @@ -66,15 +67,15 @@ pub async fn maybe_add_babel_loader( { BabelIssue { path: project_root.to_resolved().await?, - title: StyledString::Text( - "Unable to resolve babel-loader, but a babel config is present".into(), - ) + title: StyledString::Text(rcstr!( + "Unable to resolve babel-loader, but a babel config is present" + )) .resolved_cell(), - description: StyledString::Text( - "Make sure babel-loader is installed via your package manager.".into(), - ) + description: StyledString::Text(rcstr!( + "Make sure babel-loader is installed via your package manager." + )) .resolved_cell(), - severity: IssueSeverity::Fatal.resolved_cell(), + severity: IssueSeverity::Fatal, } .resolved_cell() .emit(); @@ -83,7 +84,7 @@ pub async fn maybe_add_babel_loader( } let loader = WebpackLoaderItem { - loader: "babel-loader".into(), + loader: rcstr!("babel-loader"), options: Default::default(), }; if let Some(rule) = rule { @@ -95,7 +96,7 @@ pub async fn maybe_add_babel_loader( pattern.into(), LoaderRuleItem { loaders: ResolvedVc::cell(vec![loader]), - rename_as: Some("*".into()), + rename_as: Some(rcstr!("*")), }, ); } @@ -127,7 +128,7 @@ struct BabelIssue { path: ResolvedVc, title: ResolvedVc, description: ResolvedVc, - severity: ResolvedVc, + severity: IssueSeverity, } #[turbo_tasks::value_impl] @@ -137,9 +138,8 @@ impl Issue for BabelIssue { IssueStage::Transform.into() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/crates/next-core/src/util.rs b/crates/next-core/src/util.rs index c1d776bdb543..253809e0d0cf 100644 --- a/crates/next-core/src/util.rs +++ b/crates/next-core/src/util.rs @@ -243,9 +243,8 @@ impl NextSourceConfigParsingIssue { #[turbo_tasks::value_impl] impl Issue for NextSourceConfigParsingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] diff --git a/crates/next-custom-transforms/src/lib.rs b/crates/next-custom-transforms/src/lib.rs index 258658e40c2d..207c688695fb 100644 --- a/crates/next-custom-transforms/src/lib.rs +++ b/crates/next-custom-transforms/src/lib.rs @@ -31,6 +31,7 @@ DEALINGS IN THE SOFTWARE. #![feature(box_patterns)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use std::hash::BuildHasherDefault; diff --git a/turbopack/crates/turbo-esregex/src/lib.rs b/turbopack/crates/turbo-esregex/src/lib.rs index f4399ac84549..b0115f02b34f 100644 --- a/turbopack/crates/turbo-esregex/src/lib.rs +++ b/turbopack/crates/turbo-esregex/src/lib.rs @@ -1,4 +1,5 @@ #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-backend/benches/mod.rs b/turbopack/crates/turbo-tasks-backend/benches/mod.rs index ea83c350544e..de0e2aecf6a8 100644 --- a/turbopack/crates/turbo-tasks-backend/benches/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/benches/mod.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use criterion::{Criterion, criterion_group, criterion_main}; diff --git a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs index e270b6b3a707..321dbaf6b656 100644 --- a/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/src/backend/mod.rs @@ -688,7 +688,7 @@ impl TurboTasksBackendInner { add_cell_dependency(self, task, reader, cell, task_id, &mut ctx); return Ok(Ok(TypedCellContent( cell.type_id, - CellContent(Some(content.1)), + CellContent(Some(content.reference)), ))); } @@ -2012,7 +2012,7 @@ impl TurboTasksBackendInner { let mut ctx = self.execute_context(turbo_tasks); let task = ctx.task(task_id, TaskDataCategory::Data); if let Some(content) = get!(task, CellData { cell }) { - Ok(CellContent(Some(content.1.clone())).into_typed(cell.type_id)) + Ok(CellContent(Some(content.reference.clone())).into_typed(cell.type_id)) } else { Ok(CellContent(None).into_typed(cell.type_id)) } diff --git a/turbopack/crates/turbo-tasks-backend/src/data.rs b/turbopack/crates/turbo-tasks-backend/src/data.rs index ceb368f03ff9..2a2b852d79c6 100644 --- a/turbopack/crates/turbo-tasks-backend/src/data.rs +++ b/turbopack/crates/turbo-tasks-backend/src/data.rs @@ -702,7 +702,7 @@ impl CachedDataItemValueRef<'_> { match self { CachedDataItemValueRef::Output { value } => !value.is_transient(), CachedDataItemValueRef::CellData { value } => { - registry::get_value_type(value.0).is_serializable() + registry::get_value_type(value.type_id).is_serializable() } _ => true, } diff --git a/turbopack/crates/turbo-tasks-backend/src/lib.rs b/turbopack/crates/turbo-tasks-backend/src/lib.rs index fc266b2a0dff..f86fa19b38fe 100644 --- a/turbopack/crates/turbo-tasks-backend/src/lib.rs +++ b/turbopack/crates/turbo-tasks-backend/src/lib.rs @@ -2,6 +2,7 @@ #![feature(associated_type_defaults)] #![feature(iter_collect_into)] #![feature(box_patterns)] +#![feature(ptr_metadata)] mod backend; mod backing_storage; diff --git a/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs b/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs index 74c21fcaebb6..8f9d0c411b1c 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::Result; use serde::{Deserialize, Serialize}; diff --git a/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs b/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs index eabd55410650..0241ec3d7928 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, trace::TraceRawVcs}; diff --git a/turbopack/crates/turbo-tasks-build/src/lib.rs b/turbopack/crates/turbo-tasks-build/src/lib.rs index 4468264b1d5d..26ebb210b51f 100644 --- a/turbopack/crates/turbo-tasks-build/src/lib.rs +++ b/turbopack/crates/turbo-tasks-build/src/lib.rs @@ -286,10 +286,12 @@ impl RegisterContext<'_> { } for item in &impl_item.items { - if let syn::ImplItem::Fn(method_item) = item { - // TODO: if method_item.attrs.iter().any(|a| - // is_attribute(a, - // "function")) { + if let syn::ImplItem::Fn(method_item) = item + && method_item + .attrs + .iter() + .any(|a| is_turbo_attribute(a, "function")) + { let method_ident = &method_item.sig.ident; let function_type_ident = if let Some(trait_ident) = &trait_ident { get_trait_impl_function_ident(&struct_ident, trait_ident, method_ident) @@ -374,8 +376,10 @@ impl RegisterContext<'_> { if let TraitItem::Fn(TraitItemFn { default: Some(_), sig, + attrs, .. }) = item + && attrs.iter().any(|a| is_turbo_attribute(a, "function")) { let method_ident = &sig.ident; let function_type_ident = diff --git a/turbopack/crates/turbo-tasks-bytes/src/lib.rs b/turbopack/crates/turbo-tasks-bytes/src/lib.rs index 2d0818847e7a..3affec13d416 100644 --- a/turbopack/crates/turbo-tasks-bytes/src/lib.rs +++ b/turbopack/crates/turbo-tasks-bytes/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod bytes; pub mod stream; diff --git a/turbopack/crates/turbo-tasks-env/src/lib.rs b/turbopack/crates/turbo-tasks-env/src/lib.rs index 224f02fc75f8..6f2328e0c6b8 100644 --- a/turbopack/crates/turbo-tasks-env/src/lib.rs +++ b/turbopack/crates/turbo-tasks-env/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] mod command_line; mod custom; diff --git a/turbopack/crates/turbo-tasks-fetch/src/lib.rs b/turbopack/crates/turbo-tasks-fetch/src/lib.rs index c8d9484fecad..ae55632c1b47 100644 --- a/turbopack/crates/turbo-tasks-fetch/src/lib.rs +++ b/turbopack/crates/turbo-tasks-fetch/src/lib.rs @@ -1,6 +1,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::Result; use turbo_rcstr::{RcStr, rcstr}; @@ -141,7 +142,7 @@ impl FetchError { #[turbo_tasks::function] pub async fn to_issue( self: Vc, - severity: ResolvedVc, + severity: IssueSeverity, issue_context: ResolvedVc, ) -> Result> { let this = &*self.await?; @@ -152,14 +153,14 @@ impl FetchError { kind: this.kind, detail: this.detail, } - .into()) + .cell()) } } #[turbo_tasks::value(shared)] pub struct FetchIssue { pub issue_context: ResolvedVc, - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub url: ResolvedVc, pub kind: ResolvedVc, pub detail: ResolvedVc, @@ -172,9 +173,8 @@ impl Issue for FetchIssue { *self.issue_context } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbo-tasks-fetch/tests/fetch.rs b/turbopack/crates/turbo-tasks-fetch/tests/fetch.rs index db639a6a3519..6a25f623197e 100644 --- a/turbopack/crates/turbo-tasks-fetch/tests/fetch.rs +++ b/turbopack/crates/turbo-tasks-fetch/tests/fetch.rs @@ -125,8 +125,8 @@ async fn errors_on_failed_connection() { assert_eq!(*err.kind.await?, FetchErrorKind::Connect); assert_eq!(*err.url.await?, url); - let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); - assert_eq!(*issue.severity().await?, IssueSeverity::Error); + let issue = err_vc.to_issue(IssueSeverity::Error, get_issue_context()); + assert_eq!(issue.await?.severity(), IssueSeverity::Error); assert_eq!( *issue.description().await?.unwrap().await?, StyledString::Text(rcstr!( @@ -159,8 +159,8 @@ async fn errors_on_404() { assert!(matches!(*err.kind.await?, FetchErrorKind::Status(404))); assert_eq!(*err.url.await?, url); - let issue = err_vc.to_issue(IssueSeverity::Error.into(), get_issue_context()); - assert_eq!(*issue.severity().await?, IssueSeverity::Error); + let issue = err_vc.to_issue(IssueSeverity::Error, get_issue_context()); + assert_eq!(issue.await?.severity(), IssueSeverity::Error); assert_eq!( *issue.description().await?.unwrap().await?, StyledString::Text(RcStr::from(format!( diff --git a/turbopack/crates/turbo-tasks-fs/src/lib.rs b/turbopack/crates/turbo-tasks-fs/src/lib.rs index f08a9e2e09fc..cd02556b725a 100644 --- a/turbopack/crates/turbo-tasks-fs/src/lib.rs +++ b/turbopack/crates/turbo-tasks-fs/src/lib.rs @@ -6,6 +6,7 @@ #![feature(round_char_boundary)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::mutable_key_type)] pub mod attach; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs index a5e07466b2cd..ae4d667756e1 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::{ResolvedVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr index 04266ef3404c..516b1da6bae6 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr @@ -1,5 +1,5 @@ error: unexpected token, expected one of: "fs", "network", "operation", "local" - --> tests/function/fail_attribute_invalid_args.rs:9:25 - | -9 | #[turbo_tasks::function(invalid_argument)] - | ^^^^^^^^^^^^^^^^ + --> tests/function/fail_attribute_invalid_args.rs:10:25 + | +10 | #[turbo_tasks::function(invalid_argument)] + | ^^^^^^^^^^^^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs index 3b6e923d73fc..36085c8ba4a2 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::{ResolvedVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr index 1522fe8676a2..e00ea44dedac 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr @@ -1,19 +1,5 @@ error: unexpected token, expected one of: "fs", "network", "operation", "local" - --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:14:29 + --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:15:29 | -14 | #[turbo_tasks::function(invalid_argument)] +15 | #[turbo_tasks::function(invalid_argument)] | ^^^^^^^^^^^^^^^^ - -warning: unused import: `Vc` - --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:4:31 - | -4 | use turbo_tasks::{ResolvedVc, Vc}; - | ^^ - | - = note: `#[warn(unused_imports)]` on by default - -error[E0599]: no method named `return_contains_resolved_vc` found for struct `Vc` in the current scope - --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:23:34 - | -23 | let _ = ExampleStruct.cell().return_contains_resolved_vc(); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ method not found in `Vc` diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs index 0468a282a641..38dfe3dfcb16 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs @@ -1,6 +1,7 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr index 9fb7a9cf2014..cc80e16c2a3b 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr @@ -1,5 +1,5 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_ref.rs:13:17 + --> tests/function/fail_operation_method_self_ref.rs:14:17 | -13 | fn self_ref(&self) -> Vc<()> { +14 | fn self_ref(&self) -> Vc<()> { | ^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs index b1ca57b83d0f..2bba34dd3028 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs @@ -1,6 +1,7 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::{OperationVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr index 7abfa9badd4f..5d84321148cf 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr @@ -1,22 +1,22 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_type.rs:13:28 + --> tests/function/fail_operation_method_self_type.rs:14:28 | -13 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { +14 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0307]: invalid `self` parameter type: `OperationVc` - --> tests/function/fail_operation_method_self_type.rs:13:34 + --> tests/function/fail_operation_method_self_type.rs:14:34 | -13 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { +14 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { | ^^^^^^^^^^^^^^^^^ | = note: type of `self` must be `Self` or some type implementing `Receiver` = help: consider changing to `self`, `&self`, `&mut self`, or a type implementing `Receiver` such as `self: Box`, `self: Rc`, or `self: Arc` error[E0277]: the trait bound `fn(OperationVc) -> Vc<()> {Foobar::arbitrary_self_type_turbo_tasks_function_inline}: turbo_tasks::task::function::IntoTaskFnWithThis<_, _, _>` is not satisfied - --> tests/function/fail_operation_method_self_type.rs:10:1 + --> tests/function/fail_operation_method_self_type.rs:11:1 | -10 | #[turbo_tasks::value_impl] +11 | #[turbo_tasks::value_impl] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ unsatisfied trait bound | = help: the trait `turbo_tasks::task::function::TaskFnInputFunctionWithThis<_, _, _>` is not implemented for fn item `fn(OperationVc) -> Vc<()> {Foobar::arbitrary_self_type_turbo_tasks_function_inline}` diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs index aff8c2ec0522..2aa09ed59777 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs @@ -1,6 +1,7 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr index 09588ee77e2d..ba057a256709 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr @@ -1,5 +1,5 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_type_base_vc.rs:13:36 + --> tests/function/fail_operation_method_self_type_base_vc.rs:14:36 | -13 | fn arbitrary_self_type_base_vc(self: Vc) -> Vc<()> { +14 | fn arbitrary_self_type_base_vc(self: Vc) -> Vc<()> { | ^^^^^^^^^^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs index 1b5e01c49ff6..ce928e3f4846 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(dead_code)] use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs index 68589607348c..0ff2f584cc94 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr index 6891b24fb74f..2e159cd8c8ba 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr @@ -1,7 +1,7 @@ error[E0277]: the trait bound `Vc: NonLocalValue` is not satisfied - --> tests/value/fail_non_local.rs:8:12 + --> tests/value/fail_non_local.rs:9:12 | -8 | value: Vc, +9 | value: Vc, | ^^^^^^^ the trait `NonLocalValue` is not implemented for `Vc` | = help: the following other types implement trait `NonLocalValue`: @@ -15,8 +15,8 @@ error[E0277]: the trait bound `Vc: NonLocalValue` is not satisfied (E, D, C, B, A, Z, Y, X, W, V, U, T) and $N others note: required by a bound in `DeriveNonLocalValueAssertion::assert_impl_NonLocalValue` - --> tests/value/fail_non_local.rs:6:1 + --> tests/value/fail_non_local.rs:7:1 | -6 | #[turbo_tasks::value] +7 | #[turbo_tasks::value] | ^^^^^^^^^^^^^^^^^^^^^ required by this bound in `DeriveNonLocalValueAssertion::assert_impl_NonLocalValue` = note: this error originates in the derive macro `turbo_tasks::NonLocalValue` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs index 9dd96316d5b4..3c4a3c2af2d7 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #[turbo_tasks::value] struct MyValue { diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs index 17f2aaef980c..bfd859828de5 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr index e4c1f682bdf0..6a0e4536488a 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr @@ -1,19 +1,5 @@ error: trait items cannot be operations - --> tests/value_trait/fail_missing_function_annotation.rs:13:29 + --> tests/value_trait/fail_missing_function_annotation.rs:14:29 | -13 | #[turbo_tasks::function(operation)] +14 | #[turbo_tasks::function(operation)] | ^^^^^^^^^ - -error: #[turbo_tasks::function] attribute missing - --> tests/value_trait/fail_missing_function_annotation.rs:8:5 - | -8 | fn item(&self) -> bool; - | ^^^^^^^^^^^^^^^^^^^^^^^ - -error: #[turbo_tasks::function] attribute missing - --> tests/value_trait/fail_missing_function_annotation.rs:22:5 - | -22 | / fn item(&self) -> bool { -23 | | true -24 | | } - | |_____^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs index 632af51564bd..7a74cd7e6859 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #[turbo_tasks::value_trait] trait MyTrait {} diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs index 8278cca48506..06a0ff27c3da 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs @@ -1,12 +1,12 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use turbo_tasks::Vc; #[turbo_tasks::value_trait] trait MyTrait { - #[turbo_tasks::function] - fn item(&self) -> Vc; + fn item(&self) -> bool; #[turbo_tasks::function] fn item2(&self) -> Vc; @@ -20,9 +20,8 @@ struct MyStruct; #[turbo_tasks::value_impl] impl MyTrait for MyStruct { - #[turbo_tasks::function] - fn item(&self) -> Vc { - Vc::cell(true) + fn item(&self) -> bool { + true } #[turbo_tasks::function] diff --git a/turbopack/crates/turbo-tasks-macros/src/func.rs b/turbopack/crates/turbo-tasks-macros/src/func.rs index e6e5edb68aca..212ede00c853 100644 --- a/turbopack/crates/turbo-tasks-macros/src/func.rs +++ b/turbopack/crates/turbo-tasks-macros/src/func.rs @@ -1214,17 +1214,16 @@ fn is_attribute(attr: &Attribute, name: &str) -> bool { /// Parses a `turbo_tasks::function` attribute out of the given attributes and then returns the /// remaining attributes. -pub fn split_function_attributes<'a>( - item: &'a impl Spanned, - attrs: &'a [Attribute], -) -> (syn::Result, Vec<&'a Attribute>) { +pub fn split_function_attributes( + attrs: &[Attribute], +) -> (syn::Result>, Vec<&Attribute>) { let (func_attrs_vec, attrs): (Vec<_>, Vec<_>) = attrs .iter() // TODO(alexkirsz) Replace this with function .partition(|attr| is_attribute(attr, "function")); let func_args = if let Some(func_attr) = func_attrs_vec.first() { if func_attrs_vec.len() == 1 { - parse_with_optional_parens::(func_attr) + parse_with_optional_parens::(func_attr).map(Some) } else { Err(syn::Error::new( // Report the error on the second annotation. @@ -1233,10 +1232,7 @@ pub fn split_function_attributes<'a>( )) } } else { - Err(syn::Error::new( - item.span(), - "#[turbo_tasks::function] attribute missing", - )) + Ok(None) }; (func_args, attrs) } diff --git a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs index a4742ca42db2..b8efb0bd18f3 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -6,6 +6,7 @@ use syn::{ MetaNameValue, Path, Token, Type, parse::{Parse, ParseStream}, parse_macro_input, parse_quote, + spanned::Spanned, }; use turbo_tasks_macros_shared::{ get_inherent_impl_function_id_ident, get_inherent_impl_function_ident, get_path_ident, @@ -14,7 +15,8 @@ use turbo_tasks_macros_shared::{ }; use crate::func::{ - DefinitionContext, NativeFn, TurboFn, filter_inline_attributes, split_function_attributes, + DefinitionContext, FunctionArguments, NativeFn, TurboFn, filter_inline_attributes, + split_function_attributes, }; struct ValueImplArguments { @@ -77,11 +79,20 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { }) = item { let ident = &sig.ident; - let (func_args, attrs) = split_function_attributes(item, attrs); - let Ok(func_args) = - func_args.inspect_err(|err| errors.push(err.to_compile_error())) - else { - continue; + let (func_args, attrs) = split_function_attributes(attrs); + let func_args = match func_args { + Ok(None) => { + item.span() + .unwrap() + .error("#[turbo_tasks::function] attribute missing") + .emit(); + FunctionArguments::default() + } + Ok(Some(func_args)) => func_args, + Err(error) => { + errors.push(error.to_compile_error()); + FunctionArguments::default() + } }; let local = func_args.local.is_some(); let is_self_used = func_args.operation.is_some() || is_self_used(block); @@ -173,6 +184,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { let mut trait_registers = Vec::new(); let mut trait_functions = Vec::with_capacity(items.len()); + let mut trait_items = Vec::new(); let mut all_definitions = Vec::with_capacity(items.len()); let mut errors = Vec::new(); @@ -183,13 +195,20 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { { let ident = &sig.ident; - let (func_args, attrs) = split_function_attributes(item, attrs); - let Ok(func_args) = - func_args.inspect_err(|err| errors.push(err.to_compile_error())) - else { - continue; + let (func_args, attrs) = split_function_attributes(attrs); + let func_args = match func_args { + Ok(None) => { + // Missing annotations are allowed if a turbo tasks trait has a trait item + // that is not a turbo tasks function. + trait_items.push(item); + continue; + } + Ok(Some(func_args)) => func_args, + Err(error) => { + errors.push(error.to_compile_error()); + continue; + } }; - let local = func_args.local.is_some(); let is_self_used = func_args.operation.is_some() || is_self_used(block); @@ -281,7 +300,12 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { #[doc(hidden)] #[allow(non_snake_case)] pub(crate) fn #register(value: &mut turbo_tasks::ValueType) { - value.register_trait( as turbo_tasks::VcValueTrait>::get_trait_type_id()); + let fat_pointer: *const dyn #trait_path = std::ptr::null::<#ty>() as *const dyn #trait_path; + let metadata = std::ptr::metadata(fat_pointer); + value.register_trait( + as turbo_tasks::VcValueTrait>::get_trait_type_id(), + metadata + ); #(#trait_registers)* } @@ -291,6 +315,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { unsafe impl #impl_generics turbo_tasks::Upcast> for #ty #where_clause {} impl #impl_generics #trait_path for #ty #where_clause { + #(#trait_items)* #(#trait_functions)* } diff --git a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs index 589800b4ef1c..2aac2dc7d475 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -1,7 +1,9 @@ use proc_macro::TokenStream; use proc_macro2::{Ident, TokenStream as TokenStream2}; use quote::{quote, quote_spanned}; -use syn::{ItemTrait, TraitItem, TraitItemFn, parse_macro_input, parse_quote, spanned::Spanned}; +use syn::{ + FnArg, ItemTrait, Pat, TraitItem, TraitItemFn, parse_macro_input, parse_quote, spanned::Spanned, +}; use turbo_tasks_macros_shared::{ ValueTraitArguments, get_trait_default_impl_function_id_ident, get_trait_default_impl_function_ident, get_trait_type_id_ident, get_trait_type_ident, @@ -89,10 +91,50 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { let ident = &sig.ident; // This effectively parses and removes the function annotation ensuring that that macro // doesn't run after us. - let (func_args, attrs) = split_function_attributes(item, attrs); - let Ok(func_args) = func_args.inspect_err(|err| errors.push(err.to_compile_error())) else { - continue; + let (func_args, attrs) = split_function_attributes(attrs); + let func_args = match func_args { + Ok(None) => { + // There is no turbo_tasks::function annotation, preserve this item + items.push(item.clone()); + // But we still need to add a forwarding implementation to the + // impl for `turbo_tasks::Dynamic>` + // This will have the same signature, but simply forward the call + let mut args = Vec::new(); + for arg in &sig.inputs { + let ident = match arg { + FnArg::Receiver(_) => { + continue; + } + FnArg::Typed(pat) => match &*pat.pat { + Pat::Ident(pat_ident) => &pat_ident.ident, + _ => { + pat.span() + .unwrap() + .error("can only support simple patterns") + .emit(); + continue; + } + }, + }; + args.push(ident); + } + // Add a dummy implementation that dereferneces the box and delegates to the + // actual implementation. + dynamic_trait_fns.push(quote! { + #sig { + let reference: &dyn #trait_ident = &*self; + reference.#ident(#(#args),*) + } + }); + continue; + } + Ok(Some(func_args)) => func_args, + Err(err) => { + errors.push(err.to_compile_error()); + continue; + } }; + if let Some(span) = func_args.operation { span.unwrap() .error("trait items cannot be operations") diff --git a/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs b/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs index 4ed212e1a51a..642717bc4ea5 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs @@ -1,6 +1,7 @@ #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::{Result, bail}; use turbo_rcstr::{RcStr, rcstr}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/basic.rs b/turbopack/crates/turbo-tasks-testing/tests/basic.rs index c6bf73d28a5e..fbee18293af5 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/basic.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/basic.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/call_types.rs b/turbopack/crates/turbo-tasks-testing/tests/call_types.rs index ab3b0577c715..4ca71b3cfdc4 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/call_types.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/call_types.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs b/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs index ccf2e871461b..88b22e1ff9f3 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::time::Duration; diff --git a/turbopack/crates/turbo-tasks-testing/tests/debug.rs b/turbopack/crates/turbo-tasks-testing/tests/debug.rs index 854d57b23439..8207049272bd 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/debug.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/debug.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::sync::Mutex; diff --git a/turbopack/crates/turbo-tasks-testing/tests/detached.rs b/turbopack/crates/turbo-tasks-testing/tests/detached.rs index c76c23590f8a..3fc6618f4db8 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/detached.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/detached.rs @@ -1,6 +1,7 @@ #![allow(clippy::needless_return)] // clippy bug causes false positive #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use tokio::{ sync::{Notify, watch}, diff --git a/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs b/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs index 8171cead7dd4..72c4362126b4 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::time::Duration; diff --git a/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs b/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs index 4a3ddce3bfa7..8ae3ccd20153 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs b/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs index b7081174940c..212e12e76441 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs b/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs index e2a6a7abdfa7..11d3dbce72b5 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/performance.rs b/turbopack/crates/turbo-tasks-testing/tests/performance.rs index 61a2dcac385b..d5470b4aa78b 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/performance.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/performance.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::{future::Future, time::Duration}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/random_change.rs b/turbopack/crates/turbo-tasks-testing/tests/random_change.rs index 841c4564af44..e9943da3c177 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/random_change.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/random_change.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs b/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs index 7949c493f526..7abbd022868b 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // clippy bug causes false positive use std::sync::Mutex; diff --git a/turbopack/crates/turbo-tasks-testing/tests/recompute.rs b/turbopack/crates/turbo-tasks-testing/tests/recompute.rs index f6d9f3210ac6..ccb07d2d5c7a 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/recompute.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/recompute.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs b/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs index 54074af628ad..02a019e7db8d 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // clippy bug causes false positive use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs b/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs index ad4692bf6f6e..4da09cfd6f6c 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs b/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs index 524a78950acf..af6e27533e97 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs b/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs index 948f99dd36ff..4e2c59ce25b4 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::future::IntoFuture; diff --git a/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs b/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs index d06727332a80..164c5ed27100 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::sync::Mutex; @@ -28,11 +29,10 @@ async fn trait_ref() { assert_eq!(*counter_value.strongly_consistent().await?, 1); // `ref_counter` will still point to the same `counter` instance as `counter`. - let ref_counter = TraitRef::cell( - Vc::upcast::>(counter) - .into_trait_ref() - .await?, - ); + let trait_ref_counter = Vc::upcast::>(counter) + .into_trait_ref() + .await?; + let ref_counter = TraitRef::cell(trait_ref_counter.clone()); let ref_counter_value = ref_counter.get_value(); // However, `local_counter_value` will point to the value of `counter_value` @@ -46,7 +46,7 @@ async fn trait_ref() { .get_value(); counter.await?.incr(); - + assert_eq!(trait_ref_counter.get_value_sync().0, 2); assert_eq!(*counter.get_value().strongly_consistent().await?, 2); assert_eq!(*counter_value.strongly_consistent().await?, 2); assert_eq!(*ref_counter_value.strongly_consistent().await?, 2); @@ -59,6 +59,7 @@ async fn trait_ref() { } #[turbo_tasks::value(transparent)] +#[derive(Copy, Clone)] struct CounterValue(usize); #[turbo_tasks::value(serialization = "none", cell = "new", eq = "manual")] @@ -81,6 +82,8 @@ impl Counter { trait CounterTrait { #[turbo_tasks::function] fn get_value(&self) -> Vc; + + fn get_value_sync(&self) -> CounterValue; } #[turbo_tasks::value_impl] @@ -91,6 +94,10 @@ impl CounterTrait for Counter { lock.1 = Some(get_invalidator()); Ok(Vc::cell(lock.0)) } + + fn get_value_sync(&self) -> CounterValue { + CounterValue(self.value.lock().unwrap().0) + } } #[turbo_tasks::value_trait] diff --git a/turbopack/crates/turbo-tasks/src/backend.rs b/turbopack/crates/turbo-tasks/src/backend.rs index 4d570ba4fccc..4c48f6b9676d 100644 --- a/turbopack/crates/turbo-tasks/src/backend.rs +++ b/turbopack/crates/turbo-tasks/src/backend.rs @@ -354,7 +354,7 @@ impl TypedCellContent { impl From for TypedCellContent { fn from(value: TypedSharedReference) -> Self { - TypedCellContent(value.0, CellContent(Some(value.1))) + TypedCellContent(value.type_id, CellContent(Some(value.reference))) } } @@ -362,8 +362,8 @@ impl TryFrom for TypedSharedReference { type Error = TypedCellContent; fn try_from(content: TypedCellContent) -> Result { - if let TypedCellContent(type_id, CellContent(Some(shared_reference))) = content { - Ok(TypedSharedReference(type_id, shared_reference)) + if let TypedCellContent(type_id, CellContent(Some(reference))) = content { + Ok(TypedSharedReference { type_id, reference }) } else { Err(content) } diff --git a/turbopack/crates/turbo-tasks/src/lib.rs b/turbopack/crates/turbo-tasks/src/lib.rs index c3bfddc18812..e7e2490c8253 100644 --- a/turbopack/crates/turbo-tasks/src/lib.rs +++ b/turbopack/crates/turbo-tasks/src/lib.rs @@ -36,6 +36,7 @@ #![feature(new_zeroed_alloc)] #![feature(never_type)] #![feature(downcast_unchecked)] +#![feature(ptr_metadata)] pub mod backend; mod capture_future; diff --git a/turbopack/crates/turbo-tasks/src/task/shared_reference.rs b/turbopack/crates/turbo-tasks/src/task/shared_reference.rs index c6bea735c02c..cd63e25a9fea 100644 --- a/turbopack/crates/turbo-tasks/src/task/shared_reference.rs +++ b/turbopack/crates/turbo-tasks/src/task/shared_reference.rs @@ -26,7 +26,10 @@ impl SharedReference { /// A reference to a piece of data with type information #[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] -pub struct TypedSharedReference(pub ValueTypeId, pub SharedReference); +pub struct TypedSharedReference { + pub type_id: ValueTypeId, + pub reference: SharedReference, +} impl SharedReference { pub fn downcast(self) -> Result, Self> { @@ -41,13 +44,16 @@ impl SharedReference { } pub fn into_typed(self, type_id: ValueTypeId) -> TypedSharedReference { - TypedSharedReference(type_id, self) + TypedSharedReference { + type_id, + reference: self, + } } } impl TypedSharedReference { pub fn into_untyped(self) -> SharedReference { - self.1 + self.reference } } @@ -55,7 +61,7 @@ impl Deref for TypedSharedReference { type Target = SharedReference; fn deref(&self) -> &Self::Target { - &self.1 + &self.reference } } @@ -97,7 +103,10 @@ impl Serialize for TypedSharedReference { where S: serde::Serializer, { - let TypedSharedReference(ty, SharedReference(arc)) = self; + let TypedSharedReference { + type_id: ty, + reference: SharedReference(arc), + } = self; let value_type = registry::get_value_type(*ty); if let Some(serializable) = value_type.any_as_serializable(arc) { let mut t = serializer.serialize_tuple(2)?; @@ -121,7 +130,11 @@ impl Display for SharedReference { impl Display for TypedSharedReference { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "value of type {}", registry::get_value_type(self.0).name) + write!( + f, + "value of type {}", + registry::get_value_type(self.type_id).name + ) } } @@ -149,7 +162,10 @@ impl<'de> Deserialize<'de> for TypedSharedReference { { if let Some(value) = seq.next_element_seed(seed)? { let arc = triomphe::Arc::::from(value); - Ok(TypedSharedReference(ty, SharedReference(arc))) + Ok(TypedSharedReference { + type_id: ty, + reference: SharedReference(arc), + }) } else { Err(serde::de::Error::invalid_length( 1, diff --git a/turbopack/crates/turbo-tasks/src/trait_ref.rs b/turbopack/crates/turbo-tasks/src/trait_ref.rs index 52ebfc534eeb..63298e5eaf77 100644 --- a/turbopack/crates/turbo-tasks/src/trait_ref.rs +++ b/turbopack/crates/turbo-tasks/src/trait_ref.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use crate::{ Vc, VcValueTrait, - registry::get_value_type, + registry::{self, get_value_type}, task::shared_reference::TypedSharedReference, vc::{ReadVcFuture, VcValueTraitCast, cast::VcCast}, }; @@ -72,6 +72,41 @@ impl<'de, T> Deserialize<'de> for TraitRef { } } +// This is a workaround for https://github.com/rust-lang/rust-analyzer/issues/19971 +// that ensures type inference keeps working with ptr_metadata. + +#[cfg(rust_analyzer)] +impl std::ops::Deref for TraitRef> +where + U: ?Sized, + Box: VcValueTrait, +{ + type Target = U; + + fn deref(&self) -> &Self::Target { + unimplemented!("only exists for rust-analyzer type inference") + } +} + +#[cfg(not(rust_analyzer))] +impl std::ops::Deref for TraitRef> +where + Box: VcValueTrait, + U: std::ptr::Pointee> + ?Sized, +{ + type Target = U; + + fn deref(&self) -> &Self::Target { + let trait_id = as VcValueTrait>::get_trait_type_id(); + let downcast_ptr = registry::get_value_type(self.shared_reference.type_id) + .as_trait_ptr::(trait_id, self.shared_reference.reference.0.as_ptr()); + // SAFETY: the shared reference is guaranteed to outlive &self, and the returned reference + // is guaranteed to have a lifetime shorter than or equal to `&self` so this reference will + // not outlive the pointee + unsafe { &*downcast_ptr } + } +} + // Otherwise, TraitRef> would not be Sync. // SAFETY: TraitRef doesn't actually contain a T. unsafe impl Sync for TraitRef where T: ?Sized {} @@ -94,7 +129,10 @@ where } pub fn ptr_eq(this: &Self, other: &Self) -> bool { - triomphe::Arc::ptr_eq(&this.shared_reference.1.0, &other.shared_reference.1.0) + triomphe::Arc::ptr_eq( + &this.shared_reference.reference.0, + &other.shared_reference.reference.0, + ) } } @@ -108,7 +146,7 @@ where let TraitRef { shared_reference, .. } = trait_ref; - let value_type = get_value_type(shared_reference.0); + let value_type = get_value_type(shared_reference.type_id); (value_type.raw_cell)(shared_reference).into() } } diff --git a/turbopack/crates/turbo-tasks/src/value_type.rs b/turbopack/crates/turbo-tasks/src/value_type.rs index d0f922a22f1a..f188169fffb0 100644 --- a/turbopack/crates/turbo-tasks/src/value_type.rs +++ b/turbopack/crates/turbo-tasks/src/value_type.rs @@ -1,19 +1,18 @@ use std::{ any::{Any, type_name}, borrow::Cow, - fmt::{ - Debug, Display, Formatter, {self}, - }, + fmt::{self, Debug, Display, Formatter}, hash::Hash, + ptr::DynMetadata, sync::Arc, }; -use auto_hash_map::{AutoMap, AutoSet}; +use auto_hash_map::AutoMap; use serde::{Deserialize, Serialize}; use tracing::Span; use crate::{ - RawVc, VcValueType, + RawVc, VcValueTrait, VcValueType, id::{FunctionId, TraitTypeId}, magic_any::{AnyDeserializeSeed, MagicAny, MagicAnyDeserializeSeed, MagicAnySerializeSeed}, registry::{register_trait_type, register_value_type}, @@ -38,8 +37,8 @@ type RawCellFactoryFn = fn(TypedSharedReference) -> RawVc; pub struct ValueType { /// A readable name of the type pub name: String, - /// List of traits available - pub traits: AutoSet, + /// Set of traits available along with their vtabls. + pub traits: AutoMap>, /// List of trait methods available pub trait_methods: AutoMap<(TraitTypeId, Cow<'static, str>), FunctionId>, @@ -107,7 +106,7 @@ impl ValueType { pub fn new() -> Self { Self { name: std::any::type_name::().to_string(), - traits: AutoSet::new(), + traits: AutoMap::new(), trait_methods: AutoMap::new(), magic_serialization: None, any_serialization: None, @@ -121,7 +120,7 @@ impl ValueType { >() -> Self { Self { name: std::any::type_name::().to_string(), - traits: AutoSet::new(), + traits: AutoMap::new(), trait_methods: AutoMap::new(), magic_serialization: None, any_serialization: Some((any_as_serialize::, AnyDeserializeSeed::new::())), @@ -182,16 +181,46 @@ impl ValueType { } /// This is internally used by `#[turbo_tasks::value_impl]` - pub fn register_trait(&mut self, trait_type: TraitTypeId) { - self.traits.insert(trait_type); + pub fn register_trait( + &mut self, + trait_type: TraitTypeId, + meta: std::ptr::DynMetadata, + ) where + Box: VcValueTrait, + { + let meta = unsafe { + // Safety: DynMetadata does not store T. (And it can't, because T of DynMetadata is + // not Sized) + std::mem::transmute::, DynMetadata>(meta) + }; + + self.traits.insert(trait_type, meta); + } + + /// Composes a fat pointer from a `dyn Any` for the given trait_id + pub(crate) fn as_trait_ptr( + &self, + trait_type: TraitTypeId, + ptr: *const (dyn Any + Send + Sync), + ) -> *const T + where + T: std::ptr::Pointee> + ?Sized, + { + let vtable = *self.traits.get(&trait_type).unwrap(); + let vtable = unsafe { + // Safety: DynMetadata does not store T. (And it can't, because T of DynMetadata is + // not Sized) + std::mem::transmute::, DynMetadata>(vtable) + }; + std::ptr::from_raw_parts::(ptr as *const (), vtable) } pub fn has_trait(&self, trait_type: &TraitTypeId) -> bool { - self.traits.contains(trait_type) + self.traits.contains_key(trait_type) } pub fn traits_iter(&self) -> impl Iterator + '_ { - self.traits.iter().copied() + self.traits.iter().map(|v| *v.0) } pub fn register(&'static self, global_name: &'static str) { diff --git a/turbopack/crates/turbo-tasks/src/vc/cell_mode.rs b/turbopack/crates/turbo-tasks/src/vc/cell_mode.rs index 0615001a072e..4e1e602dd106 100644 --- a/turbopack/crates/turbo-tasks/src/vc/cell_mode.rs +++ b/turbopack/crates/turbo-tasks/src/vc/cell_mode.rs @@ -46,8 +46,8 @@ where fn raw_cell(content: TypedSharedReference) -> RawVc { debug_assert_repr::(&content); - let cell = find_cell_by_type(content.0); - cell.update_with_shared_reference(content.1); + let cell = find_cell_by_type(content.type_id); + cell.update_with_shared_reference(content.reference); cell.into() } } @@ -73,15 +73,15 @@ where fn raw_cell(content: TypedSharedReference) -> RawVc { debug_assert_repr::(&content); - let cell = find_cell_by_type(content.0); - cell.compare_and_update_with_shared_reference::(content.1); + let cell = find_cell_by_type(content.type_id); + cell.compare_and_update_with_shared_reference::(content.reference); cell.into() } } fn debug_assert_repr(content: &TypedSharedReference) { debug_assert!( - (*content.1.0).is::>(), + (*content.reference.0).is::>(), "SharedReference for type {} must use representation type {}", type_name::(), type_name::>(), diff --git a/turbopack/crates/turbo-tasks/src/vc/traits.rs b/turbopack/crates/turbo-tasks/src/vc/traits.rs index a05b0c371960..7b0fad738af7 100644 --- a/turbopack/crates/turbo-tasks/src/vc/traits.rs +++ b/turbopack/crates/turbo-tasks/src/vc/traits.rs @@ -26,6 +26,7 @@ pub unsafe trait VcValueType: ShrinkToFit + Sized + Send + Sync + 'static { /// A trait implemented on all values trait object references that can be put /// into a Value Cell ([`Vc>`][crate::Vc]). pub trait VcValueTrait: NonLocalValue + Send + Sync + 'static { + /// Returns the type id of the trait object. fn get_trait_type_id() -> TraitTypeId; } diff --git a/turbopack/crates/turbopack-browser/src/lib.rs b/turbopack/crates/turbopack-browser/src/lib.rs index ffc9c554362e..0f6f62de3fc5 100644 --- a/turbopack/crates/turbopack-browser/src/lib.rs +++ b/turbopack/crates/turbopack-browser/src/lib.rs @@ -2,6 +2,7 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub(crate) mod chunking_context; pub mod ecmascript; diff --git a/turbopack/crates/turbopack-browser/src/react_refresh.rs b/turbopack/crates/turbopack-browser/src/react_refresh.rs index ba60d0e60b67..7d49baa9e030 100644 --- a/turbopack/crates/turbopack-browser/src/react_refresh.rs +++ b/turbopack/crates/turbopack-browser/src/react_refresh.rs @@ -80,9 +80,8 @@ pub struct ReactRefreshResolvingIssue { #[turbo_tasks::value_impl] impl Issue for ReactRefreshResolvingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-cli-utils/src/issue.rs b/turbopack/crates/turbopack-cli-utils/src/issue.rs index c063278284e9..14511be30130 100644 --- a/turbopack/crates/turbopack-cli-utils/src/issue.rs +++ b/turbopack/crates/turbopack-cli-utils/src/issue.rs @@ -430,7 +430,7 @@ impl IssueReporter for ConsoleUi { &self, issues: TransientInstance, source: TransientValue, - min_failing_severity: Vc, + min_failing_severity: IssueSeverity, ) -> Result> { let issues = &*issues; let LogOptions { @@ -466,7 +466,7 @@ impl IssueReporter for ConsoleUi { } let severity = plain_issue.severity; - if severity <= *min_failing_severity.await? { + if severity <= min_failing_severity { has_fatal = true; } diff --git a/turbopack/crates/turbopack-cli-utils/src/lib.rs b/turbopack/crates/turbopack-cli-utils/src/lib.rs index ff761d3d07cc..9af6cfc47e9a 100644 --- a/turbopack/crates/turbopack-cli-utils/src/lib.rs +++ b/turbopack/crates/turbopack-cli-utils/src/lib.rs @@ -3,6 +3,7 @@ #![feature(thread_id_value)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod issue; pub mod runtime_entry; diff --git a/turbopack/crates/turbopack-cli/src/build/mod.rs b/turbopack/crates/turbopack-cli/src/build/mod.rs index b6edc8051067..6ecf86c8dd74 100644 --- a/turbopack/crates/turbopack-cli/src/build/mod.rs +++ b/turbopack/crates/turbopack-cli/src/build/mod.rs @@ -170,7 +170,7 @@ impl TurbopackBuildBuilder { handle_issues( build_result_op, issue_reporter, - IssueSeverity::Error.into(), + IssueSeverity::Error, None, None, ) diff --git a/turbopack/crates/turbopack-cli/src/lib.rs b/turbopack/crates/turbopack-cli/src/lib.rs index 76c66cbde1a5..a8098be02302 100644 --- a/turbopack/crates/turbopack-cli/src/lib.rs +++ b/turbopack/crates/turbopack-cli/src/lib.rs @@ -2,6 +2,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod arguments; pub mod build; diff --git a/turbopack/crates/turbopack-core/src/issue/analyze.rs b/turbopack/crates/turbopack-core/src/issue/analyze.rs index 3ef11fc21b7c..49844eebf8a9 100644 --- a/turbopack/crates/turbopack-core/src/issue/analyze.rs +++ b/turbopack/crates/turbopack-core/src/issue/analyze.rs @@ -11,7 +11,7 @@ use crate::ident::AssetIdent; #[turbo_tasks::value(shared)] pub struct AnalyzeIssue { - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub source_ident: ResolvedVc, pub title: ResolvedVc, pub message: ResolvedVc, @@ -31,7 +31,7 @@ impl AnalyzeIssue { source: Option, ) -> Vc { Self { - severity: severity.resolved_cell(), + severity, source_ident, title, message, @@ -44,9 +44,8 @@ impl AnalyzeIssue { #[turbo_tasks::value_impl] impl Issue for AnalyzeIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-core/src/issue/code_gen.rs b/turbopack/crates/turbopack-core/src/issue/code_gen.rs index 7fc062c61e61..e16de9dd1886 100644 --- a/turbopack/crates/turbopack-core/src/issue/code_gen.rs +++ b/turbopack/crates/turbopack-core/src/issue/code_gen.rs @@ -5,7 +5,7 @@ use super::{Issue, IssueSeverity, IssueStage, OptionStyledString, StyledString}; #[turbo_tasks::value(shared)] pub struct CodeGenerationIssue { - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub path: ResolvedVc, pub title: ResolvedVc, pub message: ResolvedVc, @@ -13,9 +13,8 @@ pub struct CodeGenerationIssue { #[turbo_tasks::value_impl] impl Issue for CodeGenerationIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-core/src/issue/mod.rs b/turbopack/crates/turbopack-core/src/issue/mod.rs index 172145b372ff..518119ed9400 100644 --- a/turbopack/crates/turbopack-core/src/issue/mod.rs +++ b/turbopack/crates/turbopack-core/src/issue/mod.rs @@ -15,9 +15,9 @@ use auto_hash_map::AutoSet; use serde::{Deserialize, Serialize}; use turbo_rcstr::RcStr; use turbo_tasks::{ - CollectiblesSource, NonLocalValue, OperationVc, RawVc, ReadRef, ResolvedVc, TaskInput, - TransientInstance, TransientValue, TryJoinIterExt, Upcast, ValueDefault, ValueToString, Vc, - emit, trace::TraceRawVcs, + CollectiblesSource, IntoTraitRef, NonLocalValue, OperationVc, RawVc, ReadRef, ResolvedVc, + TaskInput, TransientInstance, TransientValue, TryJoinIterExt, Upcast, ValueDefault, + ValueToString, Vc, emit, trace::TraceRawVcs, }; use turbo_tasks_fs::{FileContent, FileLine, FileLinesContent, FileSystem, FileSystemPath}; use turbo_tasks_hash::{DeterministicHash, Xxh3Hash64Hasher}; @@ -104,9 +104,8 @@ pub enum StyledString { pub trait Issue { /// Severity allows the user to filter out unimportant issues, with Bug /// being the highest priority and Info being the lowest. - #[turbo_tasks::function] - fn severity(self: Vc) -> Vc { - IssueSeverity::Error.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } /// The file path that generated the issue, displayed to the user as message @@ -860,9 +859,12 @@ impl PlainIssue { Some(detail) => Some((*detail.await?).clone()), None => None, }; + let trait_ref = issue.into_trait_ref().await?; + + let severity = trait_ref.severity(); Ok(Self::cell(Self { - severity: *issue.severity().await?, + severity, file_path: issue.file_path().to_string().owned().await?, stage: issue.stage().owned().await?, title: issue.title().owned().await?, @@ -974,7 +976,7 @@ pub trait IssueReporter { self: Vc, issues: TransientInstance, source: TransientValue, - min_failing_severity: Vc, + min_failing_severity: IssueSeverity, ) -> Vc; } @@ -1118,7 +1120,7 @@ where pub async fn handle_issues( source_op: OperationVc, issue_reporter: Vc>, - min_failing_severity: Vc, + min_failing_severity: IssueSeverity, path: Option<&str>, operation: Option<&str>, ) -> Result<()> { diff --git a/turbopack/crates/turbopack-core/src/issue/resolve.rs b/turbopack/crates/turbopack-core/src/issue/resolve.rs index 7089a215e341..3bd76e644dfc 100644 --- a/turbopack/crates/turbopack-core/src/issue/resolve.rs +++ b/turbopack/crates/turbopack-core/src/issue/resolve.rs @@ -17,7 +17,7 @@ use crate::{ #[turbo_tasks::value(shared)] pub struct ResolvingIssue { - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub request_type: String, pub request: ResolvedVc, pub file_path: ResolvedVc, @@ -28,9 +28,8 @@ pub struct ResolvingIssue { #[turbo_tasks::value_impl] impl Issue for ResolvingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-core/src/lib.rs b/turbopack/crates/turbopack-core/src/lib.rs index 6ca7d597eae3..b4ca328271c8 100644 --- a/turbopack/crates/turbopack-core/src/lib.rs +++ b/turbopack/crates/turbopack-core/src/lib.rs @@ -7,6 +7,7 @@ #![feature(iter_intersperse)] #![feature(map_try_insert)] #![feature(hash_set_entry)] +#![feature(ptr_metadata)] pub mod asset; pub mod changed; diff --git a/turbopack/crates/turbopack-core/src/resolve/mod.rs b/turbopack/crates/turbopack-core/src/resolve/mod.rs index 48e68a9a6068..af664d486c5e 100644 --- a/turbopack/crates/turbopack-core/src/resolve/mod.rs +++ b/turbopack/crates/turbopack-core/src/resolve/mod.rs @@ -3105,9 +3105,9 @@ async fn emit_resolve_error_issue( source: Option, ) -> Result<()> { let severity = if is_optional || resolve_options.await?.loose_errors { - IssueSeverity::Warning.resolved_cell() + IssueSeverity::Warning } else { - IssueSeverity::Error.resolved_cell() + IssueSeverity::Error }; ResolvingIssue { severity, @@ -3132,9 +3132,9 @@ async fn emit_unresolvable_issue( source: Option, ) -> Result<()> { let severity = if is_optional || resolve_options.await?.loose_errors { - IssueSeverity::Warning.resolved_cell() + IssueSeverity::Warning } else { - IssueSeverity::Error.resolved_cell() + IssueSeverity::Error }; ResolvingIssue { severity, @@ -3150,11 +3150,11 @@ async fn emit_unresolvable_issue( Ok(()) } -async fn error_severity(resolve_options: Vc) -> Result> { +async fn error_severity(resolve_options: Vc) -> Result { Ok(if resolve_options.await?.loose_errors { - IssueSeverity::Warning.resolved_cell() + IssueSeverity::Warning } else { - IssueSeverity::Error.resolved_cell() + IssueSeverity::Error }) } diff --git a/turbopack/crates/turbopack-css/src/lib.rs b/turbopack/crates/turbopack-css/src/lib.rs index 28f775560daa..195e711626dd 100644 --- a/turbopack/crates/turbopack-css/src/lib.rs +++ b/turbopack/crates/turbopack-css/src/lib.rs @@ -4,6 +4,7 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] mod asset; pub mod chunk; diff --git a/turbopack/crates/turbopack-css/src/module_asset.rs b/turbopack/crates/turbopack-css/src/module_asset.rs index 13e59e1758c5..c7fb868c84b8 100644 --- a/turbopack/crates/turbopack-css/src/module_asset.rs +++ b/turbopack/crates/turbopack-css/src/module_asset.rs @@ -328,7 +328,7 @@ impl EcmascriptChunkItem for ModuleChunkItem { let Some(resolved_module) = &*resolved_module else { CssModuleComposesIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, source: self.module.ident().to_resolved().await?, message: formatdoc! { r#" @@ -344,7 +344,7 @@ impl EcmascriptChunkItem for ModuleChunkItem { ResolvedVc::try_downcast_type::(*resolved_module) else { CssModuleComposesIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, source: self.module.ident().to_resolved().await?, message: formatdoc! { r#" @@ -429,16 +429,15 @@ fn generate_minimal_source_map(filename: String, source: String) -> Result #[turbo_tasks::value(shared)] struct CssModuleComposesIssue { - severity: ResolvedVc, + severity: IssueSeverity, source: ResolvedVc, message: RcStr, } #[turbo_tasks::value_impl] impl Issue for CssModuleComposesIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-dev-server/src/http.rs b/turbopack/crates/turbopack-dev-server/src/http.rs index 5a76680edf3e..ba0215a4465a 100644 --- a/turbopack/crates/turbopack-dev-server/src/http.rs +++ b/turbopack/crates/turbopack-dev-server/src/http.rs @@ -89,7 +89,7 @@ pub async fn process_request_with_content_source( handle_issues( result_op, issue_reporter, - IssueSeverity::Fatal.cell(), + IssueSeverity::Fatal, Some(&original_path), Some("get_from_source_operation"), ) diff --git a/turbopack/crates/turbopack-dev-server/src/lib.rs b/turbopack/crates/turbopack-dev-server/src/lib.rs index e2347cd30479..7f0afb923287 100644 --- a/turbopack/crates/turbopack-dev-server/src/lib.rs +++ b/turbopack/crates/turbopack-dev-server/src/lib.rs @@ -5,6 +5,7 @@ #![feature(str_split_remainder)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod html; mod http; @@ -219,7 +220,7 @@ impl DevServerBuilder { handle_issues( source_op, issue_reporter, - IssueSeverity::Fatal.cell(), + IssueSeverity::Fatal, Some(&path), Some("get source"), ) diff --git a/turbopack/crates/turbopack-dev-server/src/update/stream.rs b/turbopack/crates/turbopack-dev-server/src/update/stream.rs index fc72c58d5bb4..da7d7feb99d0 100644 --- a/turbopack/crates/turbopack-dev-server/src/update/stream.rs +++ b/turbopack/crates/turbopack-dev-server/src/update/stream.rs @@ -5,7 +5,7 @@ use futures::prelude::*; use tokio::sync::mpsc::Sender; use tokio_stream::wrappers::ReceiverStream; use tracing::Instrument; -use turbo_rcstr::RcStr; +use turbo_rcstr::{RcStr, rcstr}; use turbo_tasks::{ IntoTraitRef, NonLocalValue, OperationVc, ReadRef, ResolvedVc, TransientInstance, Vc, trace::{TraceRawVcs, TraceRawVcsContext}, @@ -379,9 +379,8 @@ struct FatalStreamIssue { #[turbo_tasks::value_impl] impl Issue for FatalStreamIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Fatal.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Fatal } #[turbo_tasks::function] @@ -396,7 +395,7 @@ impl Issue for FatalStreamIssue { #[turbo_tasks::function] fn title(&self) -> Vc { - StyledString::Text("Fatal error while getting content to stream".into()).cell() + StyledString::Text(rcstr!("Fatal error while getting content to stream")).cell() } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs b/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs index 25eb90d8f147..975f516675f1 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod transform; diff --git a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/swc_ecma_transform_plugins.rs b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/swc_ecma_transform_plugins.rs index 0cf861036c19..044e49c87654 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/src/transform/swc_ecma_transform_plugins.rs +++ b/turbopack/crates/turbopack-ecmascript-plugins/src/transform/swc_ecma_transform_plugins.rs @@ -55,9 +55,8 @@ struct UnsupportedSwcEcmaTransformPluginsIssue { #[turbo_tasks::value_impl] impl Issue for UnsupportedSwcEcmaTransformPluginsIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] @@ -81,11 +80,10 @@ impl Issue for UnsupportedSwcEcmaTransformPluginsIssue { #[turbo_tasks::function] fn description(&self) -> Vc { Vc::cell(Some( - StyledString::Text( + StyledString::Text(rcstr!( "Turbopack does not yet support running SWC EcmaScript transform plugins on this \ platform." - .into(), - ) + )) .resolved_cell(), )) } diff --git a/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs b/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs index 61a6892afe24..299f045923bd 100644 --- a/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub(crate) mod asset_context; pub(crate) mod browser_runtime; diff --git a/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs b/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs index ae45e2055924..7a42f5acb913 100644 --- a/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs +++ b/turbopack/crates/turbopack-ecmascript/src/chunk/item.rs @@ -273,7 +273,7 @@ async fn module_factory_with_code_generation_issue( let error_message = format!("{}", PrettyPrintError(&error)).into(); let js_error_message = serde_json::to_string(&error_message)?; CodeGenerationIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, path: chunk_item.asset_ident().path().to_resolved().await?, title: StyledString::Text(rcstr!("Code generation for chunk item errored")) .resolved_cell(), diff --git a/turbopack/crates/turbopack-ecmascript/src/chunk/placeable.rs b/turbopack/crates/turbopack-ecmascript/src/chunk/placeable.rs index f7dbe303817c..7752edf22420 100644 --- a/turbopack/crates/turbopack-ecmascript/src/chunk/placeable.rs +++ b/turbopack/crates/turbopack-ecmascript/src/chunk/placeable.rs @@ -141,9 +141,8 @@ impl Issue for SideEffectsInPackageJsonIssue { IssueStage::Parse.into() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.cell() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-ecmascript/src/lib.rs b/turbopack/crates/turbopack-ecmascript/src/lib.rs index e5bd446694e3..bc4b0d28a76a 100644 --- a/turbopack/crates/turbopack-ecmascript/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript/src/lib.rs @@ -6,6 +6,7 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![recursion_limit = "256"] pub mod analyzer; diff --git a/turbopack/crates/turbopack-ecmascript/src/parse.rs b/turbopack/crates/turbopack-ecmascript/src/parse.rs index b6ea157b027f..f7545147470a 100644 --- a/turbopack/crates/turbopack-ecmascript/src/parse.rs +++ b/turbopack/crates/turbopack-ecmascript/src/parse.rs @@ -536,9 +536,8 @@ impl Issue for ReadSourceIssue { )) } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.cell() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs b/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs index 009417349f64..977b88a609fe 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs @@ -455,9 +455,8 @@ pub struct InvalidExport { #[turbo_tasks::value_impl] impl Issue for InvalidExport { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs b/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs index 0036a507d392..669158e87bf2 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/pattern_mapping.rs @@ -341,7 +341,7 @@ async fn to_single_pattern_mapping( | ModuleResolveResultItem::Custom(_) => { // TODO implement mapping CodeGenerationIssue { - severity: IssueSeverity::Bug.resolved_cell(), + severity: IssueSeverity::Bug, title: StyledString::Text( "pattern mapping is not implemented for this result".into(), ) @@ -374,7 +374,7 @@ async fn to_single_pattern_mapping( } } CodeGenerationIssue { - severity: IssueSeverity::Bug.resolved_cell(), + severity: IssueSeverity::Bug, title: StyledString::Text("non-ecmascript placeable asset".into()).resolved_cell(), message: StyledString::Text( "asset is not placeable in ESM chunks, so it doesn't have a module id".into(), diff --git a/turbopack/crates/turbopack-ecmascript/src/references/type_issue.rs b/turbopack/crates/turbopack-ecmascript/src/references/type_issue.rs index 804af6927ec6..b418d71d7ce4 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/type_issue.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/type_issue.rs @@ -70,12 +70,11 @@ impl Issue for SpecifiedModuleTypeIssue { )) } - #[turbo_tasks::function] - fn severity(&self) -> Vc { + fn severity(&self) -> IssueSeverity { match self.specified_type { - SpecifiedModuleType::CommonJs => IssueSeverity::Error.cell(), - SpecifiedModuleType::EcmaScript => IssueSeverity::Warning.cell(), - SpecifiedModuleType::Automatic => IssueSeverity::Hint.cell(), + SpecifiedModuleType::CommonJs => IssueSeverity::Error, + SpecifiedModuleType::EcmaScript => IssueSeverity::Warning, + SpecifiedModuleType::Automatic => IssueSeverity::Hint, } } diff --git a/turbopack/crates/turbopack-ecmascript/src/references/worker.rs b/turbopack/crates/turbopack-ecmascript/src/references/worker.rs index 64adf11523a3..4e5838a85c3f 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/worker.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/worker.rs @@ -70,7 +70,7 @@ impl WorkerAssetReference { }; let Some(chunkable) = ResolvedVc::try_downcast::>(module) else { CodeGenerationIssue { - severity: IssueSeverity::Bug.resolved_cell(), + severity: IssueSeverity::Bug, title: StyledString::Text(rcstr!("non-ecmascript placeable asset")).resolved_cell(), message: StyledString::Text(rcstr!("asset is not placeable in ESM chunks")) .resolved_cell(), diff --git a/turbopack/crates/turbopack-ecmascript/src/transform/mod.rs b/turbopack/crates/turbopack-ecmascript/src/transform/mod.rs index 16827b44858d..56730db35220 100644 --- a/turbopack/crates/turbopack-ecmascript/src/transform/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/transform/mod.rs @@ -298,9 +298,8 @@ pub struct UnsupportedServerActionIssue { #[turbo_tasks::value_impl] impl Issue for UnsupportedServerActionIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Error.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Error } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-env/src/lib.rs b/turbopack/crates/turbopack-env/src/lib.rs index e655b816645d..83005d942fac 100644 --- a/turbopack/crates/turbopack-env/src/lib.rs +++ b/turbopack/crates/turbopack-env/src/lib.rs @@ -12,6 +12,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] mod asset; pub mod dotenv; diff --git a/turbopack/crates/turbopack-image/src/lib.rs b/turbopack/crates/turbopack-image/src/lib.rs index 28d157780cfc..5336450b1fa5 100644 --- a/turbopack/crates/turbopack-image/src/lib.rs +++ b/turbopack/crates/turbopack-image/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod process; diff --git a/turbopack/crates/turbopack-image/src/process/mod.rs b/turbopack/crates/turbopack-image/src/process/mod.rs index 850921bf7631..a0ab69b13da2 100644 --- a/turbopack/crates/turbopack-image/src/process/mod.rs +++ b/turbopack/crates/turbopack-image/src/process/mod.rs @@ -172,7 +172,7 @@ fn load_image_internal( ) .resolved_cell(), title: Some(StyledString::Text(rcstr!("AVIF image not supported")).resolved_cell()), - issue_severity: Some(IssueSeverity::Warning.resolved_cell()), + issue_severity: Some(IssueSeverity::Warning), } .resolved_cell() .emit(); @@ -190,7 +190,7 @@ fn load_image_internal( ) .resolved_cell(), title: Some(StyledString::Text(rcstr!("WEBP image not supported")).resolved_cell()), - issue_severity: Some(IssueSeverity::Warning.resolved_cell()), + issue_severity: Some(IssueSeverity::Warning), } .resolved_cell() .emit(); @@ -489,16 +489,13 @@ struct ImageProcessingIssue { path: ResolvedVc, message: ResolvedVc, title: Option>, - issue_severity: Option>, + issue_severity: Option, } #[turbo_tasks::value_impl] impl Issue for ImageProcessingIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - self.issue_severity - .map(|s| *s) - .unwrap_or(IssueSeverity::Error.into()) + fn severity(&self) -> IssueSeverity { + self.issue_severity.unwrap_or(IssueSeverity::Error) } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-json/src/lib.rs b/turbopack/crates/turbopack-json/src/lib.rs index 612394acd933..e2a9233d15a3 100644 --- a/turbopack/crates/turbopack-json/src/lib.rs +++ b/turbopack/crates/turbopack-json/src/lib.rs @@ -8,6 +8,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use std::fmt::Write; diff --git a/turbopack/crates/turbopack-mdx/src/lib.rs b/turbopack/crates/turbopack-mdx/src/lib.rs index f8c1f80937e2..bd0957c4757e 100644 --- a/turbopack/crates/turbopack-mdx/src/lib.rs +++ b/turbopack/crates/turbopack-mdx/src/lib.rs @@ -1,6 +1,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::Result; use mdxjs::{MdxParseOptions, Options, compile}; diff --git a/turbopack/crates/turbopack-node/src/lib.rs b/turbopack/crates/turbopack-node/src/lib.rs index 2e55c80e2eb6..d78ed502993f 100644 --- a/turbopack/crates/turbopack-node/src/lib.rs +++ b/turbopack/crates/turbopack-node/src/lib.rs @@ -1,6 +1,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use std::{iter::once, thread::available_parallelism}; diff --git a/turbopack/crates/turbopack-node/src/transforms/postcss.rs b/turbopack/crates/turbopack-node/src/transforms/postcss.rs index efa82d790c82..584bd2979038 100644 --- a/turbopack/crates/turbopack-node/src/transforms/postcss.rs +++ b/turbopack/crates/turbopack-node/src/transforms/postcss.rs @@ -563,7 +563,7 @@ impl PostCssTransformedAsset { struct PostCssTransformIssue { source: ResolvedVc, description: RcStr, - severity: ResolvedVc, + severity: IssueSeverity, title: RcStr, } @@ -586,9 +586,8 @@ impl Issue for PostCssTransformIssue { )) } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-node/src/transforms/webpack.rs b/turbopack/crates/turbopack-node/src/transforms/webpack.rs index b08527e828cc..4a79c54f71df 100644 --- a/turbopack/crates/turbopack-node/src/transforms/webpack.rs +++ b/turbopack/crates/turbopack-node/src/transforms/webpack.rs @@ -538,7 +538,7 @@ impl EvaluateContext for WebpackLoaderContext { EvaluateEmittedErrorIssue { file_path: self.context_ident_for_issue.path().to_resolved().await?, error, - severity: severity.resolved_cell(), + severity, assets_for_source_mapping: pool.assets_for_source_mapping, assets_root: pool.assets_root, project_dir: self.chunking_context.root_path().to_resolved().await?, @@ -621,9 +621,9 @@ impl EvaluateContext for WebpackLoaderContext { file_path: self.context_ident_for_issue.path().to_resolved().await?, logging: logs, severity: if has_errors { - IssueSeverity::Error.resolved_cell() + IssueSeverity::Error } else { - IssueSeverity::Warning.resolved_cell() + IssueSeverity::Warning }, assets_for_source_mapping: pool.assets_for_source_mapping, assets_root: pool.assets_root, @@ -728,9 +728,8 @@ pub struct BuildDependencyIssue { #[turbo_tasks::value_impl] impl Issue for BuildDependencyIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] @@ -769,7 +768,7 @@ impl Issue for BuildDependencyIssue { #[turbo_tasks::value(shared)] pub struct EvaluateEmittedErrorIssue { pub file_path: ResolvedVc, - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub error: StructuredError, pub assets_for_source_mapping: ResolvedVc, pub assets_root: ResolvedVc, @@ -788,9 +787,8 @@ impl Issue for EvaluateEmittedErrorIssue { IssueStage::Transform.cell() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] @@ -820,7 +818,7 @@ impl Issue for EvaluateEmittedErrorIssue { #[turbo_tasks::value(shared)] pub struct EvaluateErrorLoggingIssue { pub file_path: ResolvedVc, - pub severity: ResolvedVc, + pub severity: IssueSeverity, #[turbo_tasks(trace_ignore)] pub logging: Vec, pub assets_for_source_mapping: ResolvedVc, @@ -840,9 +838,8 @@ impl Issue for EvaluateErrorLoggingIssue { IssueStage::Transform.cell() } - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-nodejs/src/lib.rs b/turbopack/crates/turbopack-nodejs/src/lib.rs index 5b6808a1e852..31bc9fc5654b 100644 --- a/turbopack/crates/turbopack-nodejs/src/lib.rs +++ b/turbopack/crates/turbopack-nodejs/src/lib.rs @@ -1,6 +1,7 @@ #![feature(iter_intersperse)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub(crate) mod chunking_context; pub(crate) mod ecmascript; diff --git a/turbopack/crates/turbopack-resolve/src/lib.rs b/turbopack/crates/turbopack-resolve/src/lib.rs index 0ce13576fa4b..165905f66a9c 100644 --- a/turbopack/crates/turbopack-resolve/src/lib.rs +++ b/turbopack/crates/turbopack-resolve/src/lib.rs @@ -1,5 +1,6 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod ecmascript; pub mod node_native_binding; diff --git a/turbopack/crates/turbopack-resolve/src/typescript.rs b/turbopack/crates/turbopack-resolve/src/typescript.rs index 5a3323305af1..72b68ea8cfc6 100644 --- a/turbopack/crates/turbopack-resolve/src/typescript.rs +++ b/turbopack/crates/turbopack-resolve/src/typescript.rs @@ -31,7 +31,7 @@ use crate::ecmascript::get_condition_maps; #[turbo_tasks::value(shared)] pub struct TsConfigIssue { - pub severity: ResolvedVc, + pub severity: IssueSeverity, pub source_ident: ResolvedVc, pub message: RcStr, } @@ -72,7 +72,7 @@ pub async fn read_tsconfigs( write!(message, "{e}")?; } TsConfigIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, source_ident: tsconfig.ident().to_resolved().await?, message: message.into(), } @@ -81,7 +81,7 @@ pub async fn read_tsconfigs( } FileJsonContent::NotFound => { TsConfigIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, source_ident: tsconfig.ident().to_resolved().await?, message: rcstr!("tsconfig not found"), } @@ -98,7 +98,7 @@ pub async fn read_tsconfigs( continue; } else { TsConfigIssue { - severity: IssueSeverity::Error.resolved_cell(), + severity: IssueSeverity::Error, source_ident: tsconfig.ident().to_resolved().await?, message: format!("extends: \"{extends}\" doesn't resolve correctly") .into(), @@ -295,7 +295,7 @@ pub async fn tsconfig_resolve_options( ); } else { TsConfigIssue { - severity: IssueSeverity::Warning.resolved_cell(), + severity: IssueSeverity::Warning, source_ident: source.ident().to_resolved().await?, message: format!( "compilerOptions.paths[{key}] doesn't contains an array as \ @@ -501,9 +501,8 @@ async fn apply_typescript_types_options( #[turbo_tasks::value_impl] impl Issue for TsConfigIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - *self.severity + fn severity(&self) -> IssueSeverity { + self.severity } #[turbo_tasks::function] diff --git a/turbopack/crates/turbopack-static/src/lib.rs b/turbopack/crates/turbopack-static/src/lib.rs index 083cac30c2d1..8bb6a7820ac7 100644 --- a/turbopack/crates/turbopack-static/src/lib.rs +++ b/turbopack/crates/turbopack-static/src/lib.rs @@ -11,6 +11,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod css; pub mod ecma; diff --git a/turbopack/crates/turbopack-test-utils/src/lib.rs b/turbopack/crates/turbopack-test-utils/src/lib.rs index 15173f283b6e..bfe6eae5e4f5 100644 --- a/turbopack/crates/turbopack-test-utils/src/lib.rs +++ b/turbopack/crates/turbopack-test-utils/src/lib.rs @@ -1,6 +1,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod jest; pub mod snapshot; diff --git a/turbopack/crates/turbopack-tests/tests/execution.rs b/turbopack/crates/turbopack-tests/tests/execution.rs index 8025a491168f..5bc24b132477 100644 --- a/turbopack/crates/turbopack-tests/tests/execution.rs +++ b/turbopack/crates/turbopack-tests/tests/execution.rs @@ -1,6 +1,7 @@ #![cfg(test)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this mod util; diff --git a/turbopack/crates/turbopack-trace-utils/src/lib.rs b/turbopack/crates/turbopack-trace-utils/src/lib.rs index bdd5df320344..59f9c4665e19 100644 --- a/turbopack/crates/turbopack-trace-utils/src/lib.rs +++ b/turbopack/crates/turbopack-trace-utils/src/lib.rs @@ -3,6 +3,7 @@ #![feature(thread_id_value)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod exit; pub mod filter_layer; diff --git a/turbopack/crates/turbopack-wasm/src/lib.rs b/turbopack/crates/turbopack-wasm/src/lib.rs index e485aaab749c..dcd0658fb333 100644 --- a/turbopack/crates/turbopack-wasm/src/lib.rs +++ b/turbopack/crates/turbopack-wasm/src/lib.rs @@ -8,6 +8,7 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] use anyhow::Result; use turbo_rcstr::RcStr; diff --git a/turbopack/crates/turbopack/src/lib.rs b/turbopack/crates/turbopack/src/lib.rs index 7ebf4cfe3910..d95e068f622f 100644 --- a/turbopack/crates/turbopack/src/lib.rs +++ b/turbopack/crates/turbopack/src/lib.rs @@ -6,6 +6,7 @@ #![recursion_limit = "256"] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] pub mod evaluate_context; pub mod global_module_ids; diff --git a/turbopack/crates/turbopack/src/unsupported_sass.rs b/turbopack/crates/turbopack/src/unsupported_sass.rs index 949133ed3059..fd6dd69230fc 100644 --- a/turbopack/crates/turbopack/src/unsupported_sass.rs +++ b/turbopack/crates/turbopack/src/unsupported_sass.rs @@ -1,6 +1,7 @@ //! TODO(WEB-741) Remove this file once Sass is supported. use anyhow::Result; +use turbo_rcstr::rcstr; use turbo_tasks::{ResolvedVc, Vc}; use turbo_tasks_fs::{FileSystemPath, glob::Glob}; use turbopack_core::{ @@ -64,9 +65,8 @@ struct UnsupportedSassModuleIssue { #[turbo_tasks::value_impl] impl Issue for UnsupportedSassModuleIssue { - #[turbo_tasks::function] - fn severity(&self) -> Vc { - IssueSeverity::Warning.into() + fn severity(&self) -> IssueSeverity { + IssueSeverity::Warning } #[turbo_tasks::function] @@ -74,7 +74,7 @@ impl Issue for UnsupportedSassModuleIssue { Ok(StyledString::Text( format!( "Unsupported Sass request: {}", - self.request.await?.request().as_deref().unwrap_or("N/A") + self.request.await?.request().unwrap_or(rcstr!("N/A")) ) .into(), ) @@ -89,8 +89,10 @@ impl Issue for UnsupportedSassModuleIssue { #[turbo_tasks::function] fn description(&self) -> Vc { Vc::cell(Some( - StyledString::Text("Turbopack does not yet support importing Sass modules.".into()) - .resolved_cell(), + StyledString::Text(rcstr!( + "Turbopack does not yet support importing Sass modules." + )) + .resolved_cell(), )) } diff --git a/turbopack/crates/turbopack/tests/node-file-trace.rs b/turbopack/crates/turbopack/tests/node-file-trace.rs index 5323805b8208..bb0b36c63226 100644 --- a/turbopack/crates/turbopack/tests/node-file-trace.rs +++ b/turbopack/crates/turbopack/tests/node-file-trace.rs @@ -1,6 +1,7 @@ #![allow(clippy::items_after_test_module)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] +#![feature(ptr_metadata)] mod helpers; use std::{ From 8598a1b5f188859ebdc1930b992763690d7e5123 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Wed, 11 Jun 2025 18:14:59 -0700 Subject: [PATCH 2/9] Re-export the `std::ptr::metadata` function so not every crate needs to enable the feature --- crates/napi/src/lib.rs | 1 - crates/next-api/src/lib.rs | 1 - crates/next-build-test/src/lib.rs | 1 - crates/next-build/src/lib.rs | 1 - crates/next-core/src/lib.rs | 1 - crates/next-custom-transforms/src/lib.rs | 1 - turbopack/crates/turbo-esregex/src/lib.rs | 1 - turbopack/crates/turbo-tasks-backend/benches/mod.rs | 1 - turbopack/crates/turbo-tasks-backend/src/lib.rs | 1 - .../crates/turbo-tasks-backend/tests/trace_transient.rs | 1 - .../turbo-tasks-backend/tests/transient_collectible.rs | 1 - turbopack/crates/turbo-tasks-bytes/src/lib.rs | 1 - turbopack/crates/turbo-tasks-env/src/lib.rs | 1 - turbopack/crates/turbo-tasks-fetch/src/lib.rs | 1 - turbopack/crates/turbo-tasks-fs/src/lib.rs | 1 - .../tests/function/fail_attribute_invalid_args.rs | 1 - .../function/fail_attribute_invalid_args_inherent_impl.rs | 1 - .../tests/function/fail_operation_method_self_ref.rs | 1 - .../tests/function/fail_operation_method_self_type.rs | 1 - .../function/fail_operation_method_self_type_base_vc.rs | 1 - .../tests/function/pass_non_local_vc_input.rs | 1 - .../tests/value/fail_non_local.rs | 1 - .../tests/value/pass_non_local.rs | 1 - .../tests/value_trait/fail_missing_function_annotation.rs | 1 - .../tests/value_trait/pass_non_local.rs | 1 - .../tests/value_trait/pass_trait_items.rs | 1 - .../crates/turbo-tasks-macros/src/value_impl_macro.rs | 2 +- turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/basic.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/call_types.rs | 1 - .../crates/turbo-tasks-testing/tests/collectibles.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/debug.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/detached.rs | 1 - .../crates/turbo-tasks-testing/tests/dirty_in_progress.rs | 1 - .../crates/turbo-tasks-testing/tests/emptied_cells.rs | 1 - .../turbo-tasks-testing/tests/filter_unused_args.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/performance.rs | 1 - .../crates/turbo-tasks-testing/tests/random_change.rs | 1 - .../crates/turbo-tasks-testing/tests/read_ref_cell.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/recompute.rs | 1 - .../turbo-tasks-testing/tests/recompute_collectibles.rs | 1 - turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs | 1 - .../crates/turbo-tasks-testing/tests/shrink_to_fit.rs | 1 - .../crates/turbo-tasks-testing/tests/task_statistics.rs | 1 - .../crates/turbo-tasks-testing/tests/trait_ref_cell.rs | 1 - turbopack/crates/turbo-tasks/src/macro_helpers.rs | 8 ++++++++ turbopack/crates/turbopack-browser/src/lib.rs | 1 - turbopack/crates/turbopack-cli-utils/src/lib.rs | 1 - turbopack/crates/turbopack-cli/src/lib.rs | 1 - turbopack/crates/turbopack-core/src/lib.rs | 1 - turbopack/crates/turbopack-css/src/lib.rs | 1 - turbopack/crates/turbopack-dev-server/src/lib.rs | 1 - turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs | 1 - turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs | 1 - turbopack/crates/turbopack-ecmascript/src/lib.rs | 1 - turbopack/crates/turbopack-env/src/lib.rs | 1 - turbopack/crates/turbopack-image/src/lib.rs | 1 - turbopack/crates/turbopack-json/src/lib.rs | 1 - turbopack/crates/turbopack-mdx/src/lib.rs | 1 - turbopack/crates/turbopack-node/src/lib.rs | 1 - turbopack/crates/turbopack-nodejs/src/lib.rs | 1 - turbopack/crates/turbopack-resolve/src/lib.rs | 1 - turbopack/crates/turbopack-static/src/lib.rs | 1 - turbopack/crates/turbopack-test-utils/src/lib.rs | 1 - turbopack/crates/turbopack-tests/tests/execution.rs | 1 - turbopack/crates/turbopack-trace-utils/src/lib.rs | 1 - turbopack/crates/turbopack-wasm/src/lib.rs | 1 - turbopack/crates/turbopack/src/lib.rs | 1 - turbopack/crates/turbopack/tests/node-file-trace.rs | 1 - 70 files changed, 9 insertions(+), 69 deletions(-) diff --git a/crates/napi/src/lib.rs b/crates/napi/src/lib.rs index 8ea8a3cea0ca..8544f3804564 100644 --- a/crates/napi/src/lib.rs +++ b/crates/napi/src/lib.rs @@ -30,7 +30,6 @@ DEALINGS IN THE SOFTWARE. //#![deny(clippy::all)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #[macro_use] extern crate napi_derive; diff --git a/crates/next-api/src/lib.rs b/crates/next-api/src/lib.rs index 49a985694baf..17360fdb01d2 100644 --- a/crates/next-api/src/lib.rs +++ b/crates/next-api/src/lib.rs @@ -1,7 +1,6 @@ #![feature(future_join)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![feature(impl_trait_in_assoc_type)] mod app; diff --git a/crates/next-build-test/src/lib.rs b/crates/next-build-test/src/lib.rs index 071a34c604b3..1efa99f2bfed 100644 --- a/crates/next-build-test/src/lib.rs +++ b/crates/next-build-test/src/lib.rs @@ -2,7 +2,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use std::{str::FromStr, time::Instant}; diff --git a/crates/next-build/src/lib.rs b/crates/next-build/src/lib.rs index 78317c4ece22..e796f4322c79 100644 --- a/crates/next-build/src/lib.rs +++ b/crates/next-build/src/lib.rs @@ -1,7 +1,6 @@ #![feature(type_alias_impl_trait)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod build_options; diff --git a/crates/next-core/src/lib.rs b/crates/next-core/src/lib.rs index 2998d34b88ed..f8bdaa223077 100644 --- a/crates/next-core/src/lib.rs +++ b/crates/next-core/src/lib.rs @@ -2,7 +2,6 @@ #![feature(impl_trait_in_assoc_type)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![feature(iter_intersperse)] mod app_page_loader_tree; diff --git a/crates/next-custom-transforms/src/lib.rs b/crates/next-custom-transforms/src/lib.rs index 207c688695fb..258658e40c2d 100644 --- a/crates/next-custom-transforms/src/lib.rs +++ b/crates/next-custom-transforms/src/lib.rs @@ -31,7 +31,6 @@ DEALINGS IN THE SOFTWARE. #![feature(box_patterns)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use std::hash::BuildHasherDefault; diff --git a/turbopack/crates/turbo-esregex/src/lib.rs b/turbopack/crates/turbo-esregex/src/lib.rs index b0115f02b34f..f4399ac84549 100644 --- a/turbopack/crates/turbo-esregex/src/lib.rs +++ b/turbopack/crates/turbo-esregex/src/lib.rs @@ -1,5 +1,4 @@ #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-backend/benches/mod.rs b/turbopack/crates/turbo-tasks-backend/benches/mod.rs index de0e2aecf6a8..ea83c350544e 100644 --- a/turbopack/crates/turbo-tasks-backend/benches/mod.rs +++ b/turbopack/crates/turbo-tasks-backend/benches/mod.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use criterion::{Criterion, criterion_group, criterion_main}; diff --git a/turbopack/crates/turbo-tasks-backend/src/lib.rs b/turbopack/crates/turbo-tasks-backend/src/lib.rs index f86fa19b38fe..fc266b2a0dff 100644 --- a/turbopack/crates/turbo-tasks-backend/src/lib.rs +++ b/turbopack/crates/turbo-tasks-backend/src/lib.rs @@ -2,7 +2,6 @@ #![feature(associated_type_defaults)] #![feature(iter_collect_into)] #![feature(box_patterns)] -#![feature(ptr_metadata)] mod backend; mod backing_storage; diff --git a/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs b/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs index 8f9d0c411b1c..74c21fcaebb6 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/trace_transient.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::Result; use serde::{Deserialize, Serialize}; diff --git a/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs b/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs index 0241ec3d7928..eabd55410650 100644 --- a/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs +++ b/turbopack/crates/turbo-tasks-backend/tests/transient_collectible.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use serde::{Deserialize, Serialize}; use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, trace::TraceRawVcs}; diff --git a/turbopack/crates/turbo-tasks-bytes/src/lib.rs b/turbopack/crates/turbo-tasks-bytes/src/lib.rs index 3affec13d416..2d0818847e7a 100644 --- a/turbopack/crates/turbo-tasks-bytes/src/lib.rs +++ b/turbopack/crates/turbo-tasks-bytes/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod bytes; pub mod stream; diff --git a/turbopack/crates/turbo-tasks-env/src/lib.rs b/turbopack/crates/turbo-tasks-env/src/lib.rs index 6f2328e0c6b8..224f02fc75f8 100644 --- a/turbopack/crates/turbo-tasks-env/src/lib.rs +++ b/turbopack/crates/turbo-tasks-env/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] mod command_line; mod custom; diff --git a/turbopack/crates/turbo-tasks-fetch/src/lib.rs b/turbopack/crates/turbo-tasks-fetch/src/lib.rs index ae55632c1b47..82f5e97d0f95 100644 --- a/turbopack/crates/turbo-tasks-fetch/src/lib.rs +++ b/turbopack/crates/turbo-tasks-fetch/src/lib.rs @@ -1,7 +1,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::Result; use turbo_rcstr::{RcStr, rcstr}; diff --git a/turbopack/crates/turbo-tasks-fs/src/lib.rs b/turbopack/crates/turbo-tasks-fs/src/lib.rs index cd02556b725a..f08a9e2e09fc 100644 --- a/turbopack/crates/turbo-tasks-fs/src/lib.rs +++ b/turbopack/crates/turbo-tasks-fs/src/lib.rs @@ -6,7 +6,6 @@ #![feature(round_char_boundary)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::mutable_key_type)] pub mod attach; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs index ae4d667756e1..a5e07466b2cd 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::{ResolvedVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs index 36085c8ba4a2..3b6e923d73fc 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::{ResolvedVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs index 38dfe3dfcb16..0468a282a641 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs index 2bba34dd3028..b1ca57b83d0f 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::{OperationVc, Vc}; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs index 2aa09ed59777..aff8c2ec0522 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.rs @@ -1,7 +1,6 @@ #![allow(dead_code)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs index ce928e3f4846..1b5e01c49ff6 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/pass_non_local_vc_input.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(dead_code)] use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs index 0ff2f584cc94..68589607348c 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs index 3c4a3c2af2d7..9dd96316d5b4 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/pass_non_local.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #[turbo_tasks::value] struct MyValue { diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs index bfd859828de5..17f2aaef980c 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs index 7a74cd7e6859..632af51564bd 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_non_local.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #[turbo_tasks::value_trait] trait MyTrait {} diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs index 06a0ff27c3da..a2a35297591d 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/pass_trait_items.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use turbo_tasks::Vc; diff --git a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs index b8efb0bd18f3..e6dac5ce5e9b 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -301,7 +301,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { #[allow(non_snake_case)] pub(crate) fn #register(value: &mut turbo_tasks::ValueType) { let fat_pointer: *const dyn #trait_path = std::ptr::null::<#ty>() as *const dyn #trait_path; - let metadata = std::ptr::metadata(fat_pointer); + let metadata = turbo_tasks::macro_helpers::metadata(fat_pointer); value.register_trait( as turbo_tasks::VcValueTrait>::get_trait_type_id(), metadata diff --git a/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs b/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs index 642717bc4ea5..4ed212e1a51a 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/all_in_one.rs @@ -1,7 +1,6 @@ #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::{Result, bail}; use turbo_rcstr::{RcStr, rcstr}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/basic.rs b/turbopack/crates/turbo-tasks-testing/tests/basic.rs index fbee18293af5..c6bf73d28a5e 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/basic.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/basic.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/call_types.rs b/turbopack/crates/turbo-tasks-testing/tests/call_types.rs index 4ca71b3cfdc4..ab3b0577c715 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/call_types.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/call_types.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs b/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs index 88b22e1ff9f3..ccf2e871461b 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/collectibles.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::time::Duration; diff --git a/turbopack/crates/turbo-tasks-testing/tests/debug.rs b/turbopack/crates/turbo-tasks-testing/tests/debug.rs index 8207049272bd..854d57b23439 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/debug.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/debug.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::sync::Mutex; diff --git a/turbopack/crates/turbo-tasks-testing/tests/detached.rs b/turbopack/crates/turbo-tasks-testing/tests/detached.rs index 3fc6618f4db8..c76c23590f8a 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/detached.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/detached.rs @@ -1,7 +1,6 @@ #![allow(clippy::needless_return)] // clippy bug causes false positive #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use tokio::{ sync::{Notify, watch}, diff --git a/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs b/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs index 72c4362126b4..8171cead7dd4 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/dirty_in_progress.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::time::Duration; diff --git a/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs b/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs index 8ae3ccd20153..4a3ddce3bfa7 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/emptied_cells.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs b/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs index 212e12e76441..b7081174940c 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/filter_unused_args.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs b/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs index 11d3dbce72b5..e2a6a7abdfa7 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/local_tasks.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/performance.rs b/turbopack/crates/turbo-tasks-testing/tests/performance.rs index d5470b4aa78b..61a2dcac385b 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/performance.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/performance.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::{future::Future, time::Duration}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/random_change.rs b/turbopack/crates/turbo-tasks-testing/tests/random_change.rs index e9943da3c177..841c4564af44 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/random_change.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/random_change.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs b/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs index 7abbd022868b..7949c493f526 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/read_ref_cell.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // clippy bug causes false positive use std::sync::Mutex; diff --git a/turbopack/crates/turbo-tasks-testing/tests/recompute.rs b/turbopack/crates/turbo-tasks-testing/tests/recompute.rs index ccb07d2d5c7a..f6d9f3210ac6 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/recompute.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/recompute.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs b/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs index 02a019e7db8d..54074af628ad 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/recompute_collectibles.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // clippy bug causes false positive use anyhow::{Result, bail}; diff --git a/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs b/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs index 4da09cfd6f6c..ad4692bf6f6e 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/resolved_vc.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs b/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs index af6e27533e97..524a78950acf 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/shrink_to_fit.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use anyhow::Result; diff --git a/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs b/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs index 4e2c59ce25b4..948f99dd36ff 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/task_statistics.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::future::IntoFuture; diff --git a/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs b/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs index 164c5ed27100..60ac70b8b5a9 100644 --- a/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs +++ b/turbopack/crates/turbo-tasks-testing/tests/trait_ref_cell.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this use std::sync::Mutex; diff --git a/turbopack/crates/turbo-tasks/src/macro_helpers.rs b/turbopack/crates/turbo-tasks/src/macro_helpers.rs index 34e37c4c65b2..45ad911e50a9 100644 --- a/turbopack/crates/turbo-tasks/src/macro_helpers.rs +++ b/turbopack/crates/turbo-tasks/src/macro_helpers.rs @@ -61,3 +61,11 @@ macro_rules! stringify_path { stringify!($path) }; } + +/// Rexport std::ptr::metadata so not every crate needs to enable the feature when they use our +/// macros. +#[inline(always)] +pub fn metadata(ptr: *const T) -> ::Metadata { + // Ideally we would just `pub use std::ptr::metadata;` but this doesn't seem to work. + std::ptr::metadata(ptr) +} diff --git a/turbopack/crates/turbopack-browser/src/lib.rs b/turbopack/crates/turbopack-browser/src/lib.rs index 0f6f62de3fc5..ffc9c554362e 100644 --- a/turbopack/crates/turbopack-browser/src/lib.rs +++ b/turbopack/crates/turbopack-browser/src/lib.rs @@ -2,7 +2,6 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub(crate) mod chunking_context; pub mod ecmascript; diff --git a/turbopack/crates/turbopack-cli-utils/src/lib.rs b/turbopack/crates/turbopack-cli-utils/src/lib.rs index 9af6cfc47e9a..ff761d3d07cc 100644 --- a/turbopack/crates/turbopack-cli-utils/src/lib.rs +++ b/turbopack/crates/turbopack-cli-utils/src/lib.rs @@ -3,7 +3,6 @@ #![feature(thread_id_value)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod issue; pub mod runtime_entry; diff --git a/turbopack/crates/turbopack-cli/src/lib.rs b/turbopack/crates/turbopack-cli/src/lib.rs index a8098be02302..76c66cbde1a5 100644 --- a/turbopack/crates/turbopack-cli/src/lib.rs +++ b/turbopack/crates/turbopack-cli/src/lib.rs @@ -2,7 +2,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod arguments; pub mod build; diff --git a/turbopack/crates/turbopack-core/src/lib.rs b/turbopack/crates/turbopack-core/src/lib.rs index b4ca328271c8..6ca7d597eae3 100644 --- a/turbopack/crates/turbopack-core/src/lib.rs +++ b/turbopack/crates/turbopack-core/src/lib.rs @@ -7,7 +7,6 @@ #![feature(iter_intersperse)] #![feature(map_try_insert)] #![feature(hash_set_entry)] -#![feature(ptr_metadata)] pub mod asset; pub mod changed; diff --git a/turbopack/crates/turbopack-css/src/lib.rs b/turbopack/crates/turbopack-css/src/lib.rs index 195e711626dd..28f775560daa 100644 --- a/turbopack/crates/turbopack-css/src/lib.rs +++ b/turbopack/crates/turbopack-css/src/lib.rs @@ -4,7 +4,6 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] mod asset; pub mod chunk; diff --git a/turbopack/crates/turbopack-dev-server/src/lib.rs b/turbopack/crates/turbopack-dev-server/src/lib.rs index 7f0afb923287..1f37c63b89d0 100644 --- a/turbopack/crates/turbopack-dev-server/src/lib.rs +++ b/turbopack/crates/turbopack-dev-server/src/lib.rs @@ -5,7 +5,6 @@ #![feature(str_split_remainder)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod html; mod http; diff --git a/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs b/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs index 975f516675f1..25eb90d8f147 100644 --- a/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript-plugins/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod transform; diff --git a/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs b/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs index 299f045923bd..61a6892afe24 100644 --- a/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript-runtime/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub(crate) mod asset_context; pub(crate) mod browser_runtime; diff --git a/turbopack/crates/turbopack-ecmascript/src/lib.rs b/turbopack/crates/turbopack-ecmascript/src/lib.rs index bc4b0d28a76a..e5bd446694e3 100644 --- a/turbopack/crates/turbopack-ecmascript/src/lib.rs +++ b/turbopack/crates/turbopack-ecmascript/src/lib.rs @@ -6,7 +6,6 @@ #![feature(int_roundings)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![recursion_limit = "256"] pub mod analyzer; diff --git a/turbopack/crates/turbopack-env/src/lib.rs b/turbopack/crates/turbopack-env/src/lib.rs index 83005d942fac..e655b816645d 100644 --- a/turbopack/crates/turbopack-env/src/lib.rs +++ b/turbopack/crates/turbopack-env/src/lib.rs @@ -12,7 +12,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] mod asset; pub mod dotenv; diff --git a/turbopack/crates/turbopack-image/src/lib.rs b/turbopack/crates/turbopack-image/src/lib.rs index 5336450b1fa5..28d157780cfc 100644 --- a/turbopack/crates/turbopack-image/src/lib.rs +++ b/turbopack/crates/turbopack-image/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod process; diff --git a/turbopack/crates/turbopack-json/src/lib.rs b/turbopack/crates/turbopack-json/src/lib.rs index e2a9233d15a3..612394acd933 100644 --- a/turbopack/crates/turbopack-json/src/lib.rs +++ b/turbopack/crates/turbopack-json/src/lib.rs @@ -8,7 +8,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use std::fmt::Write; diff --git a/turbopack/crates/turbopack-mdx/src/lib.rs b/turbopack/crates/turbopack-mdx/src/lib.rs index bd0957c4757e..f8c1f80937e2 100644 --- a/turbopack/crates/turbopack-mdx/src/lib.rs +++ b/turbopack/crates/turbopack-mdx/src/lib.rs @@ -1,7 +1,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::Result; use mdxjs::{MdxParseOptions, Options, compile}; diff --git a/turbopack/crates/turbopack-node/src/lib.rs b/turbopack/crates/turbopack-node/src/lib.rs index d78ed502993f..2e55c80e2eb6 100644 --- a/turbopack/crates/turbopack-node/src/lib.rs +++ b/turbopack/crates/turbopack-node/src/lib.rs @@ -1,7 +1,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use std::{iter::once, thread::available_parallelism}; diff --git a/turbopack/crates/turbopack-nodejs/src/lib.rs b/turbopack/crates/turbopack-nodejs/src/lib.rs index 31bc9fc5654b..5b6808a1e852 100644 --- a/turbopack/crates/turbopack-nodejs/src/lib.rs +++ b/turbopack/crates/turbopack-nodejs/src/lib.rs @@ -1,7 +1,6 @@ #![feature(iter_intersperse)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub(crate) mod chunking_context; pub(crate) mod ecmascript; diff --git a/turbopack/crates/turbopack-resolve/src/lib.rs b/turbopack/crates/turbopack-resolve/src/lib.rs index 165905f66a9c..0ce13576fa4b 100644 --- a/turbopack/crates/turbopack-resolve/src/lib.rs +++ b/turbopack/crates/turbopack-resolve/src/lib.rs @@ -1,6 +1,5 @@ #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod ecmascript; pub mod node_native_binding; diff --git a/turbopack/crates/turbopack-static/src/lib.rs b/turbopack/crates/turbopack-static/src/lib.rs index 8bb6a7820ac7..083cac30c2d1 100644 --- a/turbopack/crates/turbopack-static/src/lib.rs +++ b/turbopack/crates/turbopack-static/src/lib.rs @@ -11,7 +11,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod css; pub mod ecma; diff --git a/turbopack/crates/turbopack-test-utils/src/lib.rs b/turbopack/crates/turbopack-test-utils/src/lib.rs index bfe6eae5e4f5..15173f283b6e 100644 --- a/turbopack/crates/turbopack-test-utils/src/lib.rs +++ b/turbopack/crates/turbopack-test-utils/src/lib.rs @@ -1,7 +1,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod jest; pub mod snapshot; diff --git a/turbopack/crates/turbopack-tests/tests/execution.rs b/turbopack/crates/turbopack-tests/tests/execution.rs index 5bc24b132477..8025a491168f 100644 --- a/turbopack/crates/turbopack-tests/tests/execution.rs +++ b/turbopack/crates/turbopack-tests/tests/execution.rs @@ -1,7 +1,6 @@ #![cfg(test)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] #![allow(clippy::needless_return)] // tokio macro-generated code doesn't respect this mod util; diff --git a/turbopack/crates/turbopack-trace-utils/src/lib.rs b/turbopack/crates/turbopack-trace-utils/src/lib.rs index 59f9c4665e19..bdd5df320344 100644 --- a/turbopack/crates/turbopack-trace-utils/src/lib.rs +++ b/turbopack/crates/turbopack-trace-utils/src/lib.rs @@ -3,7 +3,6 @@ #![feature(thread_id_value)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod exit; pub mod filter_layer; diff --git a/turbopack/crates/turbopack-wasm/src/lib.rs b/turbopack/crates/turbopack-wasm/src/lib.rs index dcd0658fb333..e485aaab749c 100644 --- a/turbopack/crates/turbopack-wasm/src/lib.rs +++ b/turbopack/crates/turbopack-wasm/src/lib.rs @@ -8,7 +8,6 @@ #![feature(min_specialization)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] use anyhow::Result; use turbo_rcstr::RcStr; diff --git a/turbopack/crates/turbopack/src/lib.rs b/turbopack/crates/turbopack/src/lib.rs index d95e068f622f..7ebf4cfe3910 100644 --- a/turbopack/crates/turbopack/src/lib.rs +++ b/turbopack/crates/turbopack/src/lib.rs @@ -6,7 +6,6 @@ #![recursion_limit = "256"] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] pub mod evaluate_context; pub mod global_module_ids; diff --git a/turbopack/crates/turbopack/tests/node-file-trace.rs b/turbopack/crates/turbopack/tests/node-file-trace.rs index bb0b36c63226..5323805b8208 100644 --- a/turbopack/crates/turbopack/tests/node-file-trace.rs +++ b/turbopack/crates/turbopack/tests/node-file-trace.rs @@ -1,7 +1,6 @@ #![allow(clippy::items_after_test_module)] #![feature(arbitrary_self_types)] #![feature(arbitrary_self_types_pointers)] -#![feature(ptr_metadata)] mod helpers; use std::{ From 14e92908c90f63781aa2aff2d2eb78a59daf3021 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 10:29:32 -0700 Subject: [PATCH 3/9] Resolve safety issues in the trait downcasting logic 1. change the signature of `as_trait_ptr` to drop the trait id and instead move the lookup into the method. This clarifies the relationship between the trait_id and the type parameter 2. remove the `transmute` calls. These are safe in practice but there is no particular guarantee from the definition from `DynMetadata`. Instead store them in a `Box` then we can use checked downcasts to access them at runtime. - this adds a small amount of indirection but if it turns out to be a lot callers can easily batch the 'deref' by storing in a local `let trait_ref = &*trait_ref;` --- .../src/value_impl_macro.rs | 10 ++--- .../src/value_trait_macro.rs | 2 + turbopack/crates/turbo-tasks/src/trait_ref.rs | 3 +- .../crates/turbo-tasks/src/value_type.rs | 40 +++++++------------ 4 files changed, 23 insertions(+), 32 deletions(-) diff --git a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs index e6dac5ce5e9b..daad26464fff 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -300,12 +300,12 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { #[doc(hidden)] #[allow(non_snake_case)] pub(crate) fn #register(value: &mut turbo_tasks::ValueType) { - let fat_pointer: *const dyn #trait_path = std::ptr::null::<#ty>() as *const dyn #trait_path; + // NOTE(lukesandberg): This relies on the nightly ptr_metadata feature. Alternatively + // we could generate a function that does the downcasting and pass that up to register_trait. + // This would avoid the nightly feature. + let fat_pointer: *const dyn #trait_path = ::std::ptr::null::<#ty>() as *const dyn #trait_path; let metadata = turbo_tasks::macro_helpers::metadata(fat_pointer); - value.register_trait( - as turbo_tasks::VcValueTrait>::get_trait_type_id(), - metadata - ); + value.register_trait(metadata); #(#trait_registers)* } diff --git a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs index 2aac2dc7d475..6528319bbc27 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -107,6 +107,8 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { } FnArg::Typed(pat) => match &*pat.pat { Pat::Ident(pat_ident) => &pat_ident.ident, + // We could support more complex patterns without too much effort just + // as we do for normal functions. For now we just disallow them. _ => { pat.span() .unwrap() diff --git a/turbopack/crates/turbo-tasks/src/trait_ref.rs b/turbopack/crates/turbo-tasks/src/trait_ref.rs index 63298e5eaf77..ca0c413bce54 100644 --- a/turbopack/crates/turbo-tasks/src/trait_ref.rs +++ b/turbopack/crates/turbo-tasks/src/trait_ref.rs @@ -97,9 +97,8 @@ where type Target = U; fn deref(&self) -> &Self::Target { - let trait_id = as VcValueTrait>::get_trait_type_id(); let downcast_ptr = registry::get_value_type(self.shared_reference.type_id) - .as_trait_ptr::(trait_id, self.shared_reference.reference.0.as_ptr()); + .as_trait_ptr::(self.shared_reference.reference.0.as_ptr()); // SAFETY: the shared reference is guaranteed to outlive &self, and the returned reference // is guaranteed to have a lifetime shorter than or equal to `&self` so this reference will // not outlive the pointee diff --git a/turbopack/crates/turbo-tasks/src/value_type.rs b/turbopack/crates/turbo-tasks/src/value_type.rs index f188169fffb0..54961bee0293 100644 --- a/turbopack/crates/turbo-tasks/src/value_type.rs +++ b/turbopack/crates/turbo-tasks/src/value_type.rs @@ -38,7 +38,7 @@ pub struct ValueType { /// A readable name of the type pub name: String, /// Set of traits available along with their vtabls. - pub traits: AutoMap>, + pub traits: AutoMap>, /// List of trait methods available pub trait_methods: AutoMap<(TraitTypeId, Cow<'static, str>), FunctionId>, @@ -181,38 +181,28 @@ impl ValueType { } /// This is internally used by `#[turbo_tasks::value_impl]` - pub fn register_trait( - &mut self, - trait_type: TraitTypeId, - meta: std::ptr::DynMetadata, - ) where + pub fn register_trait(&mut self, meta: std::ptr::DynMetadata) + where Box: VcValueTrait, { - let meta = unsafe { - // Safety: DynMetadata does not store T. (And it can't, because T of DynMetadata is - // not Sized) - std::mem::transmute::, DynMetadata>(meta) - }; - - self.traits.insert(trait_type, meta); + self.traits.insert( + as VcValueTrait>::get_trait_type_id(), + Box::new(meta), + ); } /// Composes a fat pointer from a `dyn Any` for the given trait_id - pub(crate) fn as_trait_ptr( - &self, - trait_type: TraitTypeId, - ptr: *const (dyn Any + Send + Sync), - ) -> *const T + pub(crate) fn as_trait_ptr(&self, ptr: *const (dyn Any + Send + Sync)) -> *const T where T: std::ptr::Pointee> + ?Sized, + Box: VcValueTrait, { - let vtable = *self.traits.get(&trait_type).unwrap(); - let vtable = unsafe { - // Safety: DynMetadata does not store T. (And it can't, because T of DynMetadata is - // not Sized) - std::mem::transmute::, DynMetadata>(vtable) - }; - std::ptr::from_raw_parts::(ptr as *const (), vtable) + let trait_type = as VcValueTrait>::get_trait_type_id(); + // It is a bug in the caller if they pass a + let vtable = self.traits.get(&trait_type).unwrap(); + let typed_vtable = vtable.downcast_ref::>().unwrap(); + + std::ptr::from_raw_parts::(ptr as *const (), *typed_vtable) } pub fn has_trait(&self, trait_type: &TraitTypeId) -> bool { From 1b17e008321f84e5fa3dd647afca68fa24584866 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 13:25:39 -0700 Subject: [PATCH 4/9] Move the vtables from `value_type` to a new registry that is allocated for each value_trait this resolves various safety issues and removes some indirections. Now to deref we just need to find the static vtabletregistry for the trait (static dispatch) lookup the vtable based on the value type (map lookup), then all we need to do is compose the fat pointer. Compared to the previous approach we are saving an allocation per trait impl and 2 memory references (due to the ValueType lookup and the Box derefence), we are also saving the various comparisions required for the downcasts. --- turbopack/crates/turbo-tasks-build/src/lib.rs | 20 +++++-- .../turbo-tasks-macros-shared/src/ident.rs | 16 ++++++ .../src/value_impl_macro.rs | 19 ++++--- .../turbo-tasks-macros/src/value_macro.rs | 7 +-- .../src/value_trait_macro.rs | 14 ++++- .../crates/turbo-tasks/src/macro_helpers.rs | 37 ++++++++++++- turbopack/crates/turbo-tasks/src/registry.rs | 15 ++++-- turbopack/crates/turbo-tasks/src/trait_ref.rs | 20 ++++--- .../crates/turbo-tasks/src/value_type.rs | 52 +++++++------------ turbopack/crates/turbo-tasks/src/vc/traits.rs | 10 +++- 10 files changed, 146 insertions(+), 64 deletions(-) diff --git a/turbopack/crates/turbo-tasks-build/src/lib.rs b/turbopack/crates/turbo-tasks-build/src/lib.rs index 26ebb210b51f..23e89d7d5825 100644 --- a/turbopack/crates/turbo-tasks-build/src/lib.rs +++ b/turbopack/crates/turbo-tasks-build/src/lib.rs @@ -16,9 +16,9 @@ use syn::{ }; use turbo_tasks_macros_shared::{ GenericTypeInput, PrimitiveInput, get_impl_function_ident, get_native_function_ident, - get_path_ident, get_register_trait_methods_ident, get_register_value_type_ident, - get_trait_default_impl_function_ident, get_trait_impl_function_ident, get_trait_type_ident, - get_type_ident, + get_path_ident, get_register_trait_impls_ident, get_register_trait_methods_ident, + get_register_value_type_ident, get_trait_default_impl_function_ident, + get_trait_impl_function_ident, get_trait_type_ident, get_type_ident, }; pub fn generate_register() { @@ -154,12 +154,22 @@ pub fn generate_register() { entry.global_name, ) .unwrap(); - for trait_ident in entry.trait_idents { + for trait_ident in &entry.trait_idents { writeln!( values_code, " crate{}::{}(value);", mod_path, - get_register_trait_methods_ident(&trait_ident, &ident), + get_register_trait_methods_ident(trait_ident, &ident), + ) + .unwrap(); + } + writeln!(values_code, "}}, #[allow(unused_variables)] |value_id| {{").unwrap(); + for trait_ident in &entry.trait_idents { + writeln!( + values_code, + " crate{}::{}(value_id);", + mod_path, + get_register_trait_impls_ident(trait_ident, &ident), ) .unwrap(); } diff --git a/turbopack/crates/turbo-tasks-macros-shared/src/ident.rs b/turbopack/crates/turbo-tasks-macros-shared/src/ident.rs index 2bc9d89fed21..f3f4dd749ec4 100644 --- a/turbopack/crates/turbo-tasks-macros-shared/src/ident.rs +++ b/turbopack/crates/turbo-tasks-macros-shared/src/ident.rs @@ -15,6 +15,13 @@ pub fn get_register_trait_methods_ident(trait_ident: &Ident, struct_ident: &Iden ) } +pub fn get_register_trait_impls_ident(trait_ident: &Ident, struct_ident: &Ident) -> Ident { + Ident::new( + &format!("__register_{struct_ident}_{trait_ident}_trait_impls"), + trait_ident.span(), + ) +} + pub fn get_native_function_ident(ident: &Ident) -> Ident { Ident::new( &format!("{}_FUNCTION", ident.to_string().to_uppercase()), @@ -212,6 +219,15 @@ pub fn get_trait_type_id_ident(ident: &Ident) -> Ident { ident.span(), ) } +pub fn get_trait_type_vtable_registry(ident: &Ident) -> Ident { + Ident::new( + &format!( + "{}_TRAIT_TYPE_VTABLE_REGISTRY", + ident.to_string().to_uppercase() + ), + ident.span(), + ) +} pub fn get_trait_default_impl_function_id_ident(trait_ident: &Ident, ident: &Ident) -> Ident { Ident::new( diff --git a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs index daad26464fff..5e89905e9ff9 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -10,8 +10,8 @@ use syn::{ }; use turbo_tasks_macros_shared::{ get_inherent_impl_function_id_ident, get_inherent_impl_function_ident, get_path_ident, - get_register_trait_methods_ident, get_trait_impl_function_id_ident, - get_trait_impl_function_ident, get_type_ident, is_self_used, + get_register_trait_impls_ident, get_register_trait_methods_ident, + get_trait_impl_function_id_ident, get_trait_impl_function_ident, get_type_ident, is_self_used, }; use crate::func::{ @@ -180,7 +180,9 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { let (impl_generics, _, where_clause) = generics.split_for_impl(); - let register = get_register_trait_methods_ident(&trait_ident, ty_ident); + let register_trait_methods: Ident = + get_register_trait_methods_ident(&trait_ident, ty_ident); + let register_trait_impls: Ident = get_register_trait_impls_ident(&trait_ident, ty_ident); let mut trait_registers = Vec::new(); let mut trait_functions = Vec::with_capacity(items.len()); @@ -299,14 +301,19 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { quote! { #[doc(hidden)] #[allow(non_snake_case)] - pub(crate) fn #register(value: &mut turbo_tasks::ValueType) { + pub(crate) fn #register_trait_methods(value: &mut turbo_tasks::ValueType) { + // value.register_trait( as turbo_tasks::VcValueTrait>::get_trait_type_id()); + #(#trait_registers)* + } + #[doc(hidden)] + #[allow(non_snake_case)] + pub(crate) fn #register_trait_impls(value_id: turbo_tasks::ValueTypeId) { // NOTE(lukesandberg): This relies on the nightly ptr_metadata feature. Alternatively // we could generate a function that does the downcasting and pass that up to register_trait. // This would avoid the nightly feature. let fat_pointer: *const dyn #trait_path = ::std::ptr::null::<#ty>() as *const dyn #trait_path; let metadata = turbo_tasks::macro_helpers::metadata(fat_pointer); - value.register_trait(metadata); - #(#trait_registers)* + turbo_tasks::macro_helpers::register_trait_impl::>(value_id, metadata); } // NOTE(alexkirsz) We can't have a general `turbo_tasks::Upcast> for T where T: Trait` because diff --git a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs index 17db43f3135c..03089f2b9915 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs @@ -496,13 +496,14 @@ pub fn value_type_and_register( #[allow(non_snake_case)] pub(crate) fn #register_value_type_ident( global_name: &'static str, - f: impl FnOnce(&mut turbo_tasks::ValueType), + init: impl FnOnce(&mut turbo_tasks::ValueType), + register_traits: impl FnOnce(turbo_tasks::ValueTypeId), ) { #value_type_init_ident.get_or_init(|| { let mut value = #new_value_type; - f(&mut value); + init(&mut value); value - }).register(global_name); + }).register(global_name, register_traits); } unsafe impl #impl_generics turbo_tasks::VcValueType for #ty #where_clause { diff --git a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs index 6528319bbc27..7343a002febf 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -7,7 +7,7 @@ use syn::{ use turbo_tasks_macros_shared::{ ValueTraitArguments, get_trait_default_impl_function_id_ident, get_trait_default_impl_function_ident, get_trait_type_id_ident, get_trait_type_ident, - is_self_used, + get_trait_type_vtable_registry, is_self_used, }; use crate::func::{ @@ -67,6 +67,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { let trait_type_ident = get_trait_type_ident(trait_ident); let trait_type_id_ident = get_trait_type_id_ident(trait_ident); + let trait_type_vtable_registry = get_trait_type_vtable_registry(trait_ident); let mut dynamic_trait_fns = Vec::new(); let mut trait_methods: Vec = Vec::new(); let mut native_functions = Vec::new(); @@ -120,7 +121,7 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { }; args.push(ident); } - // Add a dummy implementation that dereferneces the box and delegates to the + // Add a dummy implementation that derefences the box and delegates to the // actual implementation. dynamic_trait_fns.push(quote! { #sig { @@ -287,11 +288,20 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { turbo_tasks::macro_helpers::Lazy::new(|| { turbo_tasks::registry::get_trait_type_id(&#trait_type_ident) }); + #[doc(hidden)] + static #trait_type_vtable_registry: turbo_tasks::macro_helpers::Lazy> = + turbo_tasks::macro_helpers::Lazy::new(turbo_tasks::macro_helpers::VTableRegistry::new); impl turbo_tasks::VcValueTrait for Box { + type ValueTrait = dyn #trait_ident; + fn get_trait_type_id() -> turbo_tasks::TraitTypeId { *#trait_type_id_ident } + + fn get_impl_vtables() -> &'static turbo_tasks::macro_helpers::VTableRegistry { + &*#trait_type_vtable_registry + } } unsafe impl turbo_tasks::Dynamic> for Box {} diff --git a/turbopack/crates/turbo-tasks/src/macro_helpers.rs b/turbopack/crates/turbo-tasks/src/macro_helpers.rs index 45ad911e50a9..1eac51679281 100644 --- a/turbopack/crates/turbo-tasks/src/macro_helpers.rs +++ b/turbopack/crates/turbo-tasks/src/macro_helpers.rs @@ -1,5 +1,7 @@ //! Runtime helpers for [turbo-tasks-macro]. +use std::ptr::DynMetadata; + pub use async_trait::async_trait; pub use once_cell::sync::{Lazy, OnceCell}; pub use serde; @@ -7,8 +9,8 @@ pub use shrink_to_fit; pub use tracing; use crate::{ - NonLocalValue, RawVc, TaskInput, TaskPersistence, Vc, debug::ValueDebugFormatString, - task::TaskOutput, + FxDashMap, NonLocalValue, RawVc, TaskInput, TaskPersistence, ValueTypeId, Vc, VcValueTrait, + debug::ValueDebugFormatString, task::TaskOutput, }; pub use crate::{ magic_any::MagicAny, @@ -69,3 +71,34 @@ pub fn metadata(ptr: *const T) -> ::Metadata // Ideally we would just `pub use std::ptr::metadata;` but this doesn't seem to work. std::ptr::metadata(ptr) } + +/// A registry of all the impl vtables for a given VcValue trait +/// This is constructed in the macro gencode and populated by the registry. +#[derive(Default)] +pub struct VTableRegistry { + map: FxDashMap>, +} + +impl VTableRegistry { + pub fn new() -> Self { + Self { + map: FxDashMap::default(), + } + } + + pub(crate) fn register(&self, id: ValueTypeId, vtable: std::ptr::DynMetadata) { + let prev = self.map.insert(id, vtable); + debug_assert!(prev.is_none(), "{id} was already registered"); + } + + pub(crate) fn get(&self, id: &ValueTypeId) -> Option> { + self.map.get(id).map(|r| *r.value()) + } +} + +pub fn register_trait_impl>( + id: ValueTypeId, + metadata: std::ptr::DynMetadata, +) { + ::get_impl_vtables().register(id, metadata); +} diff --git a/turbopack/crates/turbo-tasks/src/registry.rs b/turbopack/crates/turbo-tasks/src/registry.rs index e374a933d666..29a2b030554a 100644 --- a/turbopack/crates/turbo-tasks/src/registry.rs +++ b/turbopack/crates/turbo-tasks/src/registry.rs @@ -41,6 +41,7 @@ static TRAIT_TYPES_BY_VALUE: Lazy> = Lazy::new(FxDashMap::default); static TRAIT_TYPES: Lazy> = Lazy::new(NoMoveVec::new); +/// Registers the value and returns its id if this is the initial fn register_thing< K: Copy + Deref + TryFrom, V: Copy + Hash + Eq, @@ -52,7 +53,7 @@ fn register_thing< store: &NoMoveVec<(V, &'static str), INITIAL_CAPACITY_BITS>, map_by_name: &FxDashMap<&'static str, K>, map_by_value: &FxDashMap, -) { +) -> Option { if let Entry::Vacant(e) = map_by_value.entry(value) { let new_id = id_factory.get(); // SAFETY: this is a fresh id @@ -61,6 +62,9 @@ fn register_thing< } map_by_name.insert(global_name, new_id); e.insert(new_id); + Some(new_id) + } else { + None } } @@ -84,7 +88,7 @@ pub fn register_function(global_name: &'static str, func: &'static NativeFunctio &FUNCTIONS, &FUNCTIONS_BY_NAME, &FUNCTIONS_BY_VALUE, - ) + ); } pub fn get_function_id(func: &'static NativeFunction) -> FunctionId { @@ -103,7 +107,10 @@ pub fn get_function_global_name(id: FunctionId) -> &'static str { FUNCTIONS.get(*id as usize).unwrap().1 } -pub fn register_value_type(global_name: &'static str, ty: &'static ValueType) { +pub fn register_value_type( + global_name: &'static str, + ty: &'static ValueType, +) -> Option { register_thing( global_name, ty, @@ -138,7 +145,7 @@ pub fn register_trait_type(global_name: &'static str, ty: &'static TraitType) { &TRAIT_TYPES, &TRAIT_TYPES_BY_NAME, &TRAIT_TYPES_BY_VALUE, - ) + ); } pub fn get_trait_type_id(func: &'static TraitType) -> TraitTypeId { diff --git a/turbopack/crates/turbo-tasks/src/trait_ref.rs b/turbopack/crates/turbo-tasks/src/trait_ref.rs index ca0c413bce54..e8cfc6b3dc5f 100644 --- a/turbopack/crates/turbo-tasks/src/trait_ref.rs +++ b/turbopack/crates/turbo-tasks/src/trait_ref.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use crate::{ Vc, VcValueTrait, - registry::{self, get_value_type}, + registry::get_value_type, task::shared_reference::TypedSharedReference, vc::{ReadVcFuture, VcValueTraitCast, cast::VcCast}, }; @@ -88,20 +88,24 @@ where } } -#[cfg(not(rust_analyzer))] +// #[cfg(not(rust_analyzer))] impl std::ops::Deref for TraitRef> where - Box: VcValueTrait, + Box: VcValueTrait, U: std::ptr::Pointee> + ?Sized, { type Target = U; fn deref(&self) -> &Self::Target { - let downcast_ptr = registry::get_value_type(self.shared_reference.type_id) - .as_trait_ptr::(self.shared_reference.reference.0.as_ptr()); - // SAFETY: the shared reference is guaranteed to outlive &self, and the returned reference - // is guaranteed to have a lifetime shorter than or equal to `&self` so this reference will - // not outlive the pointee + // This lookup will fail if the valuye type stored does not actually implement the trait, + // which implies a bug in either the registry code or the macro code. + let metadata = as VcValueTrait>::get_impl_vtables() + .get(&self.shared_reference.type_id) + .unwrap(); + let downcast_ptr = std::ptr::from_raw_parts( + self.shared_reference.reference.0.as_ptr() as *const (), + metadata, + ); unsafe { &*downcast_ptr } } } diff --git a/turbopack/crates/turbo-tasks/src/value_type.rs b/turbopack/crates/turbo-tasks/src/value_type.rs index 54961bee0293..997e1b99d8c4 100644 --- a/turbopack/crates/turbo-tasks/src/value_type.rs +++ b/turbopack/crates/turbo-tasks/src/value_type.rs @@ -3,16 +3,15 @@ use std::{ borrow::Cow, fmt::{self, Debug, Display, Formatter}, hash::Hash, - ptr::DynMetadata, sync::Arc, }; -use auto_hash_map::AutoMap; +use auto_hash_map::{AutoMap, AutoSet}; use serde::{Deserialize, Serialize}; use tracing::Span; use crate::{ - RawVc, VcValueTrait, VcValueType, + RawVc, VcValueType, id::{FunctionId, TraitTypeId}, magic_any::{AnyDeserializeSeed, MagicAny, MagicAnyDeserializeSeed, MagicAnySerializeSeed}, registry::{register_trait_type, register_value_type}, @@ -37,8 +36,8 @@ type RawCellFactoryFn = fn(TypedSharedReference) -> RawVc; pub struct ValueType { /// A readable name of the type pub name: String, - /// Set of traits available along with their vtabls. - pub traits: AutoMap>, + /// Set of traits available + pub traits: AutoSet, /// List of trait methods available pub trait_methods: AutoMap<(TraitTypeId, Cow<'static, str>), FunctionId>, @@ -106,7 +105,7 @@ impl ValueType { pub fn new() -> Self { Self { name: std::any::type_name::().to_string(), - traits: AutoMap::new(), + traits: AutoSet::new(), trait_methods: AutoMap::new(), magic_serialization: None, any_serialization: None, @@ -120,7 +119,7 @@ impl ValueType { >() -> Self { Self { name: std::any::type_name::().to_string(), - traits: AutoMap::new(), + traits: AutoSet::new(), trait_methods: AutoMap::new(), magic_serialization: None, any_serialization: Some((any_as_serialize::, AnyDeserializeSeed::new::())), @@ -181,40 +180,27 @@ impl ValueType { } /// This is internally used by `#[turbo_tasks::value_impl]` - pub fn register_trait(&mut self, meta: std::ptr::DynMetadata) - where - Box: VcValueTrait, - { - self.traits.insert( - as VcValueTrait>::get_trait_type_id(), - Box::new(meta), - ); - } - - /// Composes a fat pointer from a `dyn Any` for the given trait_id - pub(crate) fn as_trait_ptr(&self, ptr: *const (dyn Any + Send + Sync)) -> *const T - where - T: std::ptr::Pointee> + ?Sized, - Box: VcValueTrait, - { - let trait_type = as VcValueTrait>::get_trait_type_id(); - // It is a bug in the caller if they pass a - let vtable = self.traits.get(&trait_type).unwrap(); - let typed_vtable = vtable.downcast_ref::>().unwrap(); - - std::ptr::from_raw_parts::(ptr as *const (), *typed_vtable) + pub fn register_trait(&mut self, trait_type: TraitTypeId) { + self.traits.insert(trait_type); } pub fn has_trait(&self, trait_type: &TraitTypeId) -> bool { - self.traits.contains_key(trait_type) + self.traits.contains(trait_type) } pub fn traits_iter(&self) -> impl Iterator + '_ { - self.traits.iter().map(|v| *v.0) + self.traits.iter().cloned() } - pub fn register(&'static self, global_name: &'static str) { - register_value_type(global_name, self) + pub fn register( + &'static self, + global_name: &'static str, + register_traits: impl FnOnce(crate::ValueTypeId), + ) { + let id = register_value_type(global_name, self); + if let Some(id) = id { + register_traits(id); + } } } diff --git a/turbopack/crates/turbo-tasks/src/vc/traits.rs b/turbopack/crates/turbo-tasks/src/vc/traits.rs index 7b0fad738af7..41d9274c8ac2 100644 --- a/turbopack/crates/turbo-tasks/src/vc/traits.rs +++ b/turbopack/crates/turbo-tasks/src/vc/traits.rs @@ -1,5 +1,6 @@ use crate::{ - NonLocalValue, ShrinkToFit, TraitTypeId, ValueTypeId, VcRead, vc::cell_mode::VcCellMode, + NonLocalValue, ShrinkToFit, TraitTypeId, ValueTypeId, VcRead, macro_helpers::VTableRegistry, + vc::cell_mode::VcCellMode, }; /// A trait implemented on all values types that can be put into a Value Cell @@ -26,8 +27,15 @@ pub unsafe trait VcValueType: ShrinkToFit + Sized + Send + Sync + 'static { /// A trait implemented on all values trait object references that can be put /// into a Value Cell ([`Vc>`][crate::Vc]). pub trait VcValueTrait: NonLocalValue + Send + Sync + 'static { + // The conrete type of the value_trait implementing VcValueTrait + type ValueTrait: ?Sized; + /// Returns the type id of the trait object. fn get_trait_type_id() -> TraitTypeId; + + /// Returns the vtable for an implementation of this trait. + /// Panics if ValueTypeId does not implement the trait. + fn get_impl_vtables() -> &'static VTableRegistry; } /// Marker trait that indicates that a [`Vc`][crate::Vc] can be upcasted From 801992ebae1cdccde47adc1cd86579aaf8e64cfa Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 13:37:16 -0700 Subject: [PATCH 5/9] comments and simplifications --- turbopack/crates/turbo-tasks-build/src/lib.rs | 3 +++ turbopack/crates/turbo-tasks/src/macro_helpers.rs | 4 ++-- turbopack/crates/turbo-tasks/src/trait_ref.rs | 7 +++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/turbopack/crates/turbo-tasks-build/src/lib.rs b/turbopack/crates/turbo-tasks-build/src/lib.rs index 23e89d7d5825..9961161c178c 100644 --- a/turbopack/crates/turbo-tasks-build/src/lib.rs +++ b/turbopack/crates/turbo-tasks-build/src/lib.rs @@ -154,6 +154,7 @@ pub fn generate_register() { entry.global_name, ) .unwrap(); + // Register all the trait items for each impl so we can dispatch to them as turbotasks for trait_ident in &entry.trait_idents { writeln!( values_code, @@ -164,6 +165,8 @@ pub fn generate_register() { .unwrap(); } writeln!(values_code, "}}, #[allow(unused_variables)] |value_id| {{").unwrap(); + // Register all the vtables for the impls so we can dispatch to them as normal indirect + // trait calls. for trait_ident in &entry.trait_idents { writeln!( values_code, diff --git a/turbopack/crates/turbo-tasks/src/macro_helpers.rs b/turbopack/crates/turbo-tasks/src/macro_helpers.rs index 1eac51679281..7c0766689c7b 100644 --- a/turbopack/crates/turbo-tasks/src/macro_helpers.rs +++ b/turbopack/crates/turbo-tasks/src/macro_helpers.rs @@ -91,8 +91,8 @@ impl VTableRegistry { debug_assert!(prev.is_none(), "{id} was already registered"); } - pub(crate) fn get(&self, id: &ValueTypeId) -> Option> { - self.map.get(id).map(|r| *r.value()) + pub(crate) fn get(&self, id: ValueTypeId) -> DynMetadata { + *self.map.get(&id).unwrap().value() } } diff --git a/turbopack/crates/turbo-tasks/src/trait_ref.rs b/turbopack/crates/turbo-tasks/src/trait_ref.rs index e8cfc6b3dc5f..c73f0c576434 100644 --- a/turbopack/crates/turbo-tasks/src/trait_ref.rs +++ b/turbopack/crates/turbo-tasks/src/trait_ref.rs @@ -97,11 +97,10 @@ where type Target = U; fn deref(&self) -> &Self::Target { - // This lookup will fail if the valuye type stored does not actually implement the trait, + // This lookup will fail if the value type stored does not actually implement the trait, // which implies a bug in either the registry code or the macro code. - let metadata = as VcValueTrait>::get_impl_vtables() - .get(&self.shared_reference.type_id) - .unwrap(); + let metadata = + as VcValueTrait>::get_impl_vtables().get(self.shared_reference.type_id); let downcast_ptr = std::ptr::from_raw_parts( self.shared_reference.reference.0.as_ptr() as *const (), metadata, From c3a4bebbce9736426ac8f531b19eefdc52114e99 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 13:57:44 -0700 Subject: [PATCH 6/9] fix debugging leftovers --- turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs | 2 +- turbopack/crates/turbo-tasks/src/value_type.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs index 5e89905e9ff9..6c0f25b3b032 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_impl_macro.rs @@ -302,7 +302,7 @@ pub fn value_impl(args: TokenStream, input: TokenStream) -> TokenStream { #[doc(hidden)] #[allow(non_snake_case)] pub(crate) fn #register_trait_methods(value: &mut turbo_tasks::ValueType) { - // value.register_trait( as turbo_tasks::VcValueTrait>::get_trait_type_id()); + value.register_trait( as turbo_tasks::VcValueTrait>::get_trait_type_id()); #(#trait_registers)* } #[doc(hidden)] diff --git a/turbopack/crates/turbo-tasks/src/value_type.rs b/turbopack/crates/turbo-tasks/src/value_type.rs index 997e1b99d8c4..c88c31f96543 100644 --- a/turbopack/crates/turbo-tasks/src/value_type.rs +++ b/turbopack/crates/turbo-tasks/src/value_type.rs @@ -180,7 +180,7 @@ impl ValueType { } /// This is internally used by `#[turbo_tasks::value_impl]` - pub fn register_trait(&mut self, trait_type: TraitTypeId) { + pub fn register_trait(&mut self, trait_type: TraitTypeId) { self.traits.insert(trait_type); } From 507e54052577a84d3a234717c76eb0d7f200ff6c Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 14:01:48 -0700 Subject: [PATCH 7/9] gah more debugging --- turbopack/crates/turbo-tasks/src/trait_ref.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/turbopack/crates/turbo-tasks/src/trait_ref.rs b/turbopack/crates/turbo-tasks/src/trait_ref.rs index c73f0c576434..00b4a973262b 100644 --- a/turbopack/crates/turbo-tasks/src/trait_ref.rs +++ b/turbopack/crates/turbo-tasks/src/trait_ref.rs @@ -88,7 +88,7 @@ where } } -// #[cfg(not(rust_analyzer))] +#[cfg(not(rust_analyzer))] impl std::ops::Deref for TraitRef> where Box: VcValueTrait, From 5cab31cd70038fcb8f7594bb9edfa3d91059bb3e Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 20:13:22 -0700 Subject: [PATCH 8/9] More goldens updates after dropping the feature flags --- .../function/fail_attribute_invalid_args.stderr | 8 ++++---- .../fail_attribute_invalid_args_inherent_impl.stderr | 4 ++-- .../function/fail_operation_method_self_ref.stderr | 4 ++-- .../function/fail_operation_method_self_type.stderr | 12 ++++++------ .../fail_operation_method_self_type_base_vc.stderr | 4 ++-- .../tests/value/fail_non_local.stderr | 8 ++++---- .../fail_missing_function_annotation.stderr | 4 ++-- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr index 516b1da6bae6..04266ef3404c 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args.stderr @@ -1,5 +1,5 @@ error: unexpected token, expected one of: "fs", "network", "operation", "local" - --> tests/function/fail_attribute_invalid_args.rs:10:25 - | -10 | #[turbo_tasks::function(invalid_argument)] - | ^^^^^^^^^^^^^^^^ + --> tests/function/fail_attribute_invalid_args.rs:9:25 + | +9 | #[turbo_tasks::function(invalid_argument)] + | ^^^^^^^^^^^^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr index e00ea44dedac..54e38531e026 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_attribute_invalid_args_inherent_impl.stderr @@ -1,5 +1,5 @@ error: unexpected token, expected one of: "fs", "network", "operation", "local" - --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:15:29 + --> tests/function/fail_attribute_invalid_args_inherent_impl.rs:14:29 | -15 | #[turbo_tasks::function(invalid_argument)] +14 | #[turbo_tasks::function(invalid_argument)] | ^^^^^^^^^^^^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr index cc80e16c2a3b..9fb7a9cf2014 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_ref.stderr @@ -1,5 +1,5 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_ref.rs:14:17 + --> tests/function/fail_operation_method_self_ref.rs:13:17 | -14 | fn self_ref(&self) -> Vc<()> { +13 | fn self_ref(&self) -> Vc<()> { | ^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr index 5d84321148cf..7abfa9badd4f 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type.stderr @@ -1,22 +1,22 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_type.rs:14:28 + --> tests/function/fail_operation_method_self_type.rs:13:28 | -14 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { +13 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { | ^^^^^^^^^^^^^^^^^^^^^^^ error[E0307]: invalid `self` parameter type: `OperationVc` - --> tests/function/fail_operation_method_self_type.rs:14:34 + --> tests/function/fail_operation_method_self_type.rs:13:34 | -14 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { +13 | fn arbitrary_self_type(self: OperationVc) -> Vc<()> { | ^^^^^^^^^^^^^^^^^ | = note: type of `self` must be `Self` or some type implementing `Receiver` = help: consider changing to `self`, `&self`, `&mut self`, or a type implementing `Receiver` such as `self: Box`, `self: Rc`, or `self: Arc` error[E0277]: the trait bound `fn(OperationVc) -> Vc<()> {Foobar::arbitrary_self_type_turbo_tasks_function_inline}: turbo_tasks::task::function::IntoTaskFnWithThis<_, _, _>` is not satisfied - --> tests/function/fail_operation_method_self_type.rs:11:1 + --> tests/function/fail_operation_method_self_type.rs:10:1 | -11 | #[turbo_tasks::value_impl] +10 | #[turbo_tasks::value_impl] | ^^^^^^^^^^^^^^^^^^^^^^^^^^ unsatisfied trait bound | = help: the trait `turbo_tasks::task::function::TaskFnInputFunctionWithThis<_, _, _>` is not implemented for fn item `fn(OperationVc) -> Vc<()> {Foobar::arbitrary_self_type_turbo_tasks_function_inline}` diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr index ba057a256709..09588ee77e2d 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/function/fail_operation_method_self_type_base_vc.stderr @@ -1,5 +1,5 @@ error: methods taking `self` are not supported with `operation` - --> tests/function/fail_operation_method_self_type_base_vc.rs:14:36 + --> tests/function/fail_operation_method_self_type_base_vc.rs:13:36 | -14 | fn arbitrary_self_type_base_vc(self: Vc) -> Vc<()> { +13 | fn arbitrary_self_type_base_vc(self: Vc) -> Vc<()> { | ^^^^^^^^^^^^^^ diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr index 2e159cd8c8ba..6891b24fb74f 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value/fail_non_local.stderr @@ -1,7 +1,7 @@ error[E0277]: the trait bound `Vc: NonLocalValue` is not satisfied - --> tests/value/fail_non_local.rs:9:12 + --> tests/value/fail_non_local.rs:8:12 | -9 | value: Vc, +8 | value: Vc, | ^^^^^^^ the trait `NonLocalValue` is not implemented for `Vc` | = help: the following other types implement trait `NonLocalValue`: @@ -15,8 +15,8 @@ error[E0277]: the trait bound `Vc: NonLocalValue` is not satisfied (E, D, C, B, A, Z, Y, X, W, V, U, T) and $N others note: required by a bound in `DeriveNonLocalValueAssertion::assert_impl_NonLocalValue` - --> tests/value/fail_non_local.rs:7:1 + --> tests/value/fail_non_local.rs:6:1 | -7 | #[turbo_tasks::value] +6 | #[turbo_tasks::value] | ^^^^^^^^^^^^^^^^^^^^^ required by this bound in `DeriveNonLocalValueAssertion::assert_impl_NonLocalValue` = note: this error originates in the derive macro `turbo_tasks::NonLocalValue` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr index 6a0e4536488a..a3e6fe2559e7 100644 --- a/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr +++ b/turbopack/crates/turbo-tasks-macros-tests/tests/value_trait/fail_missing_function_annotation.stderr @@ -1,5 +1,5 @@ error: trait items cannot be operations - --> tests/value_trait/fail_missing_function_annotation.rs:14:29 + --> tests/value_trait/fail_missing_function_annotation.rs:13:29 | -14 | #[turbo_tasks::function(operation)] +13 | #[turbo_tasks::function(operation)] | ^^^^^^^^^ From 254cdbe0efb5f053faee649074e5219e22e565d8 Mon Sep 17 00:00:00 2001 From: Luke Sandberg Date: Thu, 12 Jun 2025 20:47:30 -0700 Subject: [PATCH 9/9] support async trait functions dyn compatibility is a current issue but the macro might as well support it --- .../turbo-tasks-macros/src/value_trait_macro.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs index 7343a002febf..cfdd4306166c 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_trait_macro.rs @@ -123,10 +123,19 @@ pub fn value_trait(args: TokenStream, input: TokenStream) -> TokenStream { } // Add a dummy implementation that derefences the box and delegates to the // actual implementation. - dynamic_trait_fns.push(quote! { - #sig { - let reference: &dyn #trait_ident = &*self; - reference.#ident(#(#args),*) + dynamic_trait_fns.push(if sig.asyncness.is_some() { + quote! { + #sig { + let reference: &dyn #trait_ident = &*self; + reference.#ident(#(#args),*).await + } + } + } else { + quote! { + #sig { + let reference: &dyn #trait_ident = &*self; + reference.#ident(#(#args),*) + } } }); continue;