turbopack_core/issue/
analyze.rs1use anyhow::Result;
2use turbo_rcstr::{RcStr, rcstr};
3use turbo_tasks::{ResolvedVc, Vc};
4use turbo_tasks_fs::FileSystemPath;
5
6use super::{
7 AdditionalIssueSources, Issue, IssueSeverity, IssueSource, IssueStage, OptionStyledString,
8 StyledString,
9};
10use crate::{ident::AssetIdent, issue::OptionIssueSource};
11
12#[turbo_tasks::value(shared)]
13pub struct AnalyzeIssue {
14 pub severity: 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,
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 fn severity(&self) -> IssueSeverity {
48 self.severity
49 }
50
51 #[turbo_tasks::function]
52 async fn title(&self) -> Result<Vc<StyledString>> {
53 let title = &*self.title.await?;
54 Ok(if let Some(code) = self.code.as_ref() {
55 StyledString::Line(vec![
56 StyledString::Strong(code.clone()),
57 StyledString::Text(rcstr!(" ")),
58 StyledString::Text(title.clone()),
59 ])
60 } else {
61 StyledString::Text(title.clone())
62 }
63 .cell())
64 }
65
66 #[turbo_tasks::function]
67 fn stage(&self) -> Vc<IssueStage> {
68 IssueStage::Analysis.cell()
69 }
70
71 #[turbo_tasks::function]
72 fn file_path(&self) -> Vc<FileSystemPath> {
73 self.source_ident.path()
74 }
75
76 #[turbo_tasks::function]
77 fn description(&self) -> Vc<OptionStyledString> {
78 Vc::cell(Some(self.message))
79 }
80
81 #[turbo_tasks::function]
82 async fn source(&self) -> Vc<OptionIssueSource> {
83 Vc::cell(self.source)
84 }
85
86 #[turbo_tasks::function]
87 async fn additional_sources(&self) -> Result<Vc<AdditionalIssueSources>> {
88 if let Some(issue_source) = &self.source
89 && let Some(source) = issue_source.to_generated_code_source().await?
90 {
91 return Ok(Vc::cell(vec![source]));
92 }
93 Ok(AdditionalIssueSources::empty())
94 }
95}