Turbopack: Remove the IntoTraitRef trait, make it an inherent method on Vc (#91223)

This is basically one-shot from Opus 4.6, with a minor tweak to the doc comment by hand.

Discussed this with @lukesandberg, and we realized that there's only one implementation of this trait, so it doesn't make a ton of sense as a trait.
This commit is contained in:
Benjamin Woodruff
2026-03-13 10:43:28 -07:00
committed by GitHub
parent 75038781a8
commit d7de6f105c
24 changed files with 45 additions and 69 deletions
+2 -2
View File
@@ -33,8 +33,8 @@ use serde::{Deserialize, Serialize};
use tracing::{Instrument, field::Empty};
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{
Completion, Completions, FxIndexMap, IntoTraitRef, NonLocalValue, OperationValue, OperationVc,
ReadRef, ResolvedVc, State, TaskInput, TransientInstance, TryFlatJoinIterExt, Vc,
Completion, Completions, FxIndexMap, NonLocalValue, OperationValue, OperationVc, ReadRef,
ResolvedVc, State, TaskInput, TransientInstance, TryFlatJoinIterExt, Vc,
debug::ValueDebugFormat, fxindexmap, trace::TraceRawVcs,
};
use turbo_tasks_env::{EnvMap, ProcessEnv};
@@ -3,7 +3,7 @@ use std::{io::Write, iter::once};
use anyhow::{Context, Result, bail};
use indoc::writedoc;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{IntoTraitRef, ResolvedVc, ValueToString, Vc};
use turbo_tasks::{ResolvedVc, ValueToString, Vc};
use turbo_tasks_fs::{File, FileContent};
use turbopack_core::{
asset::AssetContent,
@@ -6,7 +6,7 @@ use std::{collections::HashSet, mem::take, sync::Mutex};
use anyhow::Result;
use turbo_tasks::{
IntoTraitRef, Invalidator, TraitRef, Vc, get_invalidator,
Invalidator, TraitRef, Vc, get_invalidator,
unmark_top_level_task_may_leak_eventually_consistent_state, with_turbo_tasks,
};
use turbo_tasks_testing::{Registration, register, run_once};
@@ -3,8 +3,7 @@
use anyhow::Result;
use turbo_tasks::{
IntoTraitRef, State, TraitRef, Upcast, Vc,
unmark_top_level_task_may_leak_eventually_consistent_state,
State, TraitRef, Upcast, Vc, unmark_top_level_task_may_leak_eventually_consistent_state,
};
use turbo_tasks_testing::{Registration, register, run_once};
+1 -1
View File
@@ -108,7 +108,7 @@ pub use crate::{
task_input::{EitherTaskInput, TaskInput},
},
task_execution_reason::TaskExecutionReason,
trait_ref::{IntoTraitRef, TraitRef},
trait_ref::TraitRef,
value::{TransientInstance, TransientValue},
value_type::{TraitMethod, TraitType, ValueType},
vc::{
+2 -35
View File
@@ -1,12 +1,7 @@
use std::{fmt::Debug, future::Future, marker::PhantomData};
use anyhow::Result;
use std::{fmt::Debug, marker::PhantomData};
use crate::{
Vc, VcValueTrait,
registry::get_value_type,
task::shared_reference::TypedSharedReference,
vc::{ReadVcFuture, VcValueTraitCast, cast::VcCast},
Vc, VcValueTrait, registry::get_value_type, task::shared_reference::TypedSharedReference,
};
/// Similar to a [`ReadRef<T>`][crate::ReadRef], but contains a value trait object instead.
@@ -117,31 +112,3 @@ where
(value_type.raw_cell)(shared_reference).into()
}
}
/// A trait that allows a value trait vc to be converted into a trait reference.
///
/// The signature is similar to `IntoFuture`, but we don't want trait vcs to
/// have the same future-like semantics as value vcs when it comes to producing
/// refs. This behavior is rarely needed, so in most cases, `.await`ing a trait
/// vc is a mistake.
pub trait IntoTraitRef {
type ValueTrait: VcValueTrait + ?Sized;
type Future: Future<Output = Result<<VcValueTraitCast<Self::ValueTrait> as VcCast>::Output>>;
fn into_trait_ref(self) -> Self::Future;
}
impl<T> IntoTraitRef for Vc<T>
where
T: VcValueTrait + ?Sized,
{
type ValueTrait = T;
type Future = ReadVcFuture<T, VcValueTraitCast<T>>;
fn into_trait_ref(self) -> Self::Future {
self.node
.into_read_with_unknown_is_serializable_cell_content()
.into()
}
}
@@ -514,6 +514,22 @@ where
impl<T> Unpin for Vc<T> where T: ?Sized {}
impl<T> Vc<T>
where
T: VcValueTrait + ?Sized,
{
/// Converts this trait vc into a trait reference.
///
/// The signature is similar to [`IntoFuture::into_future`], but we don't want trait vcs to
/// have the same future-like semantics as value vcs when it comes to producing refs. This
/// behavior is rarely needed, so in most cases, `.await`ing a trait vc is a mistake.
pub fn into_trait_ref(self) -> ReadVcFuture<T, VcValueTraitCast<T>> {
self.node
.into_read_with_unknown_is_serializable_cell_content()
.into()
}
}
impl<T> Default for Vc<T>
where
T: ValueDefault,
@@ -7,9 +7,8 @@ use serde::{Deserialize, Serialize};
pub use turbo_tasks_macros::OperationValue;
use crate::{
CollectiblesSource, IntoTraitRef, RawVc, ReadVcFuture, ResolvedVc, TaskInput, UpcastStrict, Vc,
VcValueTrait, VcValueTraitCast, VcValueType, marker_trait::impl_auto_marker_trait,
trace::TraceRawVcs,
CollectiblesSource, RawVc, ReadVcFuture, ResolvedVc, TaskInput, UpcastStrict, Vc, VcValueTrait,
VcValueTraitCast, VcValueType, marker_trait::impl_auto_marker_trait, trace::TraceRawVcs,
};
/// A "subtype" (can be converted via [`.connect()`]) of [`Vc`] that
@@ -114,8 +114,6 @@ pub unsafe trait VcValueType: ShrinkToFit + Sized + Send + Sync + 'static {
/// functions defined on the trait to be called.
///
/// ```ignore
/// use turbo_tasks::IntoTraitRef;
///
/// let trait_vc: Vc<Box<dyn MyTrait>> = ...;
/// let trait_ref: TraitRef<Box<dyn MyTrait>> = trait_vc.into_trait_ref().await?;
///
@@ -6,9 +6,7 @@ use either::Either;
use indoc::writedoc;
use serde::{Deserialize, Serialize};
use turbo_rcstr::RcStr;
use turbo_tasks::{
FxIndexMap, IntoTraitRef, NonLocalValue, ResolvedVc, TryJoinIterExt, Vc, trace::TraceRawVcs,
};
use turbo_tasks::{FxIndexMap, NonLocalValue, ResolvedVc, TryJoinIterExt, Vc, trace::TraceRawVcs};
use turbo_tasks_fs::{File, FileContent};
use turbopack_core::{
asset::{Asset, AssetContent},
@@ -2,7 +2,7 @@ use std::sync::Arc;
use anyhow::Result;
use serde::Serialize;
use turbo_tasks::{FxIndexMap, IntoTraitRef, ResolvedVc, TraitRef, Vc};
use turbo_tasks::{FxIndexMap, ResolvedVc, TraitRef, Vc};
use turbopack_core::version::{
MergeableVersionedContent, PartialUpdate, TotalUpdate, Update, Version, VersionedContent,
VersionedContentMerger,
@@ -2,7 +2,7 @@ use std::sync::Arc;
use anyhow::Result;
use serde::Serialize;
use turbo_tasks::{FxIndexMap, FxIndexSet, IntoTraitRef, ReadRef, ResolvedVc, TryJoinIterExt, Vc};
use turbo_tasks::{FxIndexMap, FxIndexSet, ReadRef, ResolvedVc, TryJoinIterExt, Vc};
use turbo_tasks_fs::rope::Rope;
use turbopack_core::{
chunk::{ChunkingContext, ModuleId},
@@ -15,9 +15,9 @@ use serde::{Deserialize, Serialize};
use turbo_esregex::EsRegex;
use turbo_rcstr::RcStr;
use turbo_tasks::{
CollectiblesSource, IntoTraitRef, NonLocalValue, OperationVc, RawVc, ReadRef, ResolvedVc,
TaskInput, TransientValue, TryFlatJoinIterExt, TryJoinIterExt, Upcast, ValueDefault,
ValueToString, Vc, emit, trace::TraceRawVcs,
CollectiblesSource, NonLocalValue, OperationVc, RawVc, ReadRef, ResolvedVc, TaskInput,
TransientValue, TryFlatJoinIterExt, TryJoinIterExt, Upcast, ValueDefault, ValueToString, Vc,
emit, trace::TraceRawVcs,
};
use turbo_tasks_fs::{
FileContent, FileLine, FileLinesContent, FileSystem, FileSystemPath, glob::Glob,
@@ -1,6 +1,6 @@
use anyhow::Result;
use turbo_rcstr::RcStr;
use turbo_tasks::{IntoTraitRef, PrettyPrintError, ResolvedVc, Vc};
use turbo_tasks::{PrettyPrintError, ResolvedVc, Vc};
use turbo_tasks_fs::FileSystemPath;
use crate::{
@@ -3,7 +3,7 @@ use std::sync::Arc;
use anyhow::{Context, Result, bail};
use turbo_rcstr::RcStr;
use turbo_tasks::{
IntoTraitRef, NonLocalValue, OperationValue, ReadRef, ResolvedVc, State, TraitRef, Vc,
NonLocalValue, OperationValue, ReadRef, ResolvedVc, State, TraitRef, Vc,
debug::ValueDebugFormat, trace::TraceRawVcs,
};
use turbo_tasks_hash::HashAlgorithm;
+1 -1
View File
@@ -1,6 +1,6 @@
use anyhow::Result;
use turbo_rcstr::rcstr;
use turbo_tasks::{IntoTraitRef, ResolvedVc, TryJoinIterExt, Vc, turbofmt};
use turbo_tasks::{ResolvedVc, TryJoinIterExt, Vc, turbofmt};
use turbo_tasks_fs::{FileContent, FileSystemPath};
use turbopack_core::{
chunk::{ChunkItem, ChunkType, ChunkableModule, ChunkingContext, MinifyType},
@@ -4,7 +4,7 @@ use anyhow::{Context, Result};
use lightningcss::css_modules::CssModuleReference;
use swc_core::common::{BytePos, FileName, LineCol, SourceMap};
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{FxIndexMap, IntoTraitRef, ResolvedVc, Vc, turbofmt};
use turbo_tasks::{FxIndexMap, ResolvedVc, Vc, turbofmt};
use turbo_tasks_fs::{FileSystemPath, rope::Rope};
use turbopack_core::{
chunk::{AsyncModuleInfo, ChunkableModule, ChunkingContext, ModuleChunkItemIdExt},
@@ -7,8 +7,7 @@ use tokio_stream::wrappers::ReceiverStream;
use tracing::Instrument;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{
IntoTraitRef, NonLocalValue, OperationVc, PrettyPrintError, ReadRef, ResolvedVc,
TransientInstance, Vc,
NonLocalValue, OperationVc, PrettyPrintError, ReadRef, ResolvedVc, TransientInstance, Vc,
trace::{TraceRawVcs, TraceRawVcsContext},
};
use turbo_tasks_fs::{FileSystem, FileSystemPath};
@@ -78,8 +78,8 @@ use swc_core::{
use tracing::{Instrument, Level, instrument};
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{
FxDashMap, FxIndexMap, IntoTraitRef, NonLocalValue, ReadRef, ResolvedVc, TaskInput,
TryJoinIterExt, Upcast, ValueToString, Vc, trace::TraceRawVcs, turbofmt,
FxDashMap, FxIndexMap, NonLocalValue, ReadRef, ResolvedVc, TaskInput, TryJoinIterExt, Upcast,
ValueToString, Vc, trace::TraceRawVcs, turbofmt,
};
use turbo_tasks_fs::{FileJsonContent, FileSystemPath, glob::Glob, rope::Rope};
use turbopack_core::{
@@ -10,8 +10,8 @@ use serde::{Deserialize, Serialize, de::DeserializeOwned};
use serde_json::Value as JsonValue;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{
Completion, Effects, FxIndexMap, IntoTraitRef, NonLocalValue, OperationVc, PrettyPrintError,
ReadRef, ResolvedVc, TaskInput, TryJoinIterExt, Vc, duration_span, fxindexmap, get_effects,
Completion, Effects, FxIndexMap, NonLocalValue, OperationVc, PrettyPrintError, ReadRef,
ResolvedVc, TaskInput, TryJoinIterExt, Vc, duration_span, fxindexmap, get_effects,
trace::TraceRawVcs,
};
use turbo_tasks_env::{EnvMap, ProcessEnv};
@@ -2,7 +2,7 @@ use std::sync::Arc;
use anyhow::Result;
use serde::Serialize;
use turbo_tasks::{FxIndexMap, FxIndexSet, IntoTraitRef, ReadRef, ResolvedVc, Vc};
use turbo_tasks::{FxIndexMap, FxIndexSet, ReadRef, ResolvedVc, Vc};
use turbo_tasks_fs::rope::Rope;
use turbopack_core::{
chunk::ModuleId,
@@ -1,6 +1,6 @@
use anyhow::{Result, bail};
use turbo_rcstr::rcstr;
use turbo_tasks::{IntoTraitRef, ResolvedVc, Vc, fxindexmap};
use turbo_tasks::{ResolvedVc, Vc, fxindexmap};
use turbo_tasks_fs::FileSystemPath;
use turbopack_core::{
chunk::{
+1 -1
View File
@@ -1,6 +1,6 @@
use anyhow::{Result, bail};
use turbo_rcstr::rcstr;
use turbo_tasks::{IntoTraitRef, ResolvedVc, Vc};
use turbo_tasks::{ResolvedVc, Vc};
use turbopack_core::{
chunk::{AsyncModuleInfo, ChunkableModule, ChunkingContext},
context::AssetContext,
@@ -11,7 +11,7 @@ pub use module_options_context::*;
pub use module_rule::*;
pub use rule_condition::*;
use turbo_rcstr::{RcStr, rcstr};
use turbo_tasks::{IntoTraitRef, ResolvedVc, TryJoinIterExt, Vc};
use turbo_tasks::{ResolvedVc, TryJoinIterExt, Vc};
use turbo_tasks_fs::{
FileSystemPath,
glob::{Glob, GlobOptions},