turbopack_core/issue/
analyze.rs1use anyhow::Result;
2use turbo_rcstr::RcStr;
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::FileSystemPath;
5
6use super::{
7 Issue, IssueSeverity, IssueSource, IssueStage, OptionIssueSource, OptionStyledString,
8 StyledString,
9};
10use crate::ident::AssetIdent;
11
12#[turbo_tasks::value(shared)]
13pub struct AnalyzeIssue {
14 pub severity: ResolvedVc<IssueSeverity>,
15 pub source_ident: ResolvedVc<AssetIdent>,
16 pub title: ResolvedVc<RcStr>,
17 pub message: ResolvedVc<StyledString>,
18 pub code: Option<RcStr>,
19 pub source: Option<IssueSource>,
20}
21
22#[turbo_tasks::value_impl]
23impl AnalyzeIssue {
24 #[turbo_tasks::function]
25 pub fn new(
26 severity: IssueSeverity,
27 source_ident: ResolvedVc<AssetIdent>,
28 title: ResolvedVc<RcStr>,
29 message: ResolvedVc<StyledString>,
30 code: Option<RcStr>,
31 source: Option<IssueSource>,
32 ) -> Vc<Self> {
33 Self {
34 severity: severity.resolved_cell(),
35 source_ident,
36 title,
37 message,
38 code,
39 source,
40 }
41 .cell()
42 }
43}
44
45#[turbo_tasks::value_impl]
46impl Issue for AnalyzeIssue {
47 #[turbo_tasks::function]
48 fn severity(&self) -> Vc<IssueSeverity> {
49 *self.severity
50 }
51
52 #[turbo_tasks::function]
53 async fn title(&self) -> Result<Vc<StyledString>> {
54 let title = &**self.title.await?;
55 Ok(if let Some(code) = self.code.as_ref() {
56 StyledString::Line(vec![
57 StyledString::Strong(code.clone()),
58 StyledString::Text(" ".into()),
59 StyledString::Text(title.into()),
60 ])
61 } else {
62 StyledString::Text(title.into())
63 }
64 .cell())
65 }
66
67 #[turbo_tasks::function]
68 fn stage(&self) -> Vc<IssueStage> {
69 IssueStage::Analysis.cell()
70 }
71
72 #[turbo_tasks::function]
73 fn file_path(&self) -> Vc<FileSystemPath> {
74 self.source_ident.path()
75 }
76
77 #[turbo_tasks::function]
78 fn description(&self) -> Vc<OptionStyledString> {
79 Vc::cell(Some(self.message))
80 }
81
82 #[turbo_tasks::function]
83 async fn source(&self) -> Result<Vc<OptionIssueSource>> {
84 Ok(Vc::cell(match &self.source {
85 Some(source) => Some(source.resolve_source_map().await?.into_owned()),
86 None => None,
87 }))
88 }
89}