Skip to main content

turbopack_core/issue/
analyze.rs

1use 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}