@@ -45,6 +45,11 @@ import Stan.Severity (Severity (Error))
4545import Stan.Toml (configCodec , getTomlConfig , usedTomlFiles )
4646
4747import qualified Toml
48+ import qualified Slist as Slist
49+ import qualified Data.Set as Set
50+ import qualified Data.Text as T
51+ import Language.Haskell.Exts
52+ import Stan.FileInfo (FileInfo (.. ))
4853
4954
5055run :: IO ()
@@ -83,13 +88,56 @@ getAnalysis StanArgs{..} notJson config hieFiles = do
8388 -- show what observations are ignored
8489 pure analysis
8590
91+ isPlutusObservations :: Observation -> Bool
92+ isPlutusObservations Observation {.. } =
93+ -- observationInspectionId includes PLU-STAN
94+ " PLU-STAN" `T.isInfixOf` unId observationInspectionId
95+
96+ isOnchainObservations :: Set FilePath -> Observation -> Bool
97+ isOnchainObservations files obs = Set. member (observationFile obs) files
98+
99+ isFileOnchainContract :: FilePath -> IO Bool
100+ isFileOnchainContract file = do
101+ result <- parseFile file
102+ pure $ case result of
103+ ParseOk (Module _ _ _ _ decls) -> any isOnchainModuleAnn decls
104+ _otherwise -> False
105+
106+ isOnchainModuleAnn :: Decl SrcSpanInfo -> Bool
107+ isOnchainModuleAnn (AnnPragma _ (ModuleAnn _ (Lit _ (String _ " onchain-contract" _)))) = True
108+ isOnchainModuleAnn (AnnPragma _ (ModuleAnn _ (Paren _ (ExpTypeSig _ (Lit _ (String _ " onchain-contract" _)) _)))) = True
109+ isOnchainModuleAnn _ = False
110+
111+ onchainFiles :: [HieFile ] -> IO (Set FilePath )
112+ onchainFiles hieFiles = do
113+ let files = map hie_hs_file hieFiles
114+ fromList <$> filterM isFileOnchainContract files
115+
116+ onchainCondition :: Set FilePath -> Observation -> Bool
117+ onchainCondition contracts obs = not (isPlutusObservations obs) || isOnchainObservations contracts obs
118+
119+ filterForOnchain :: Set FilePath -> FileInfo -> FileInfo
120+ filterForOnchain contracts info@ FileInfo {.. }= info {
121+ fileInfoObservations = Slist. filter (onchainCondition contracts) fileInfoObservations }
122+
123+ removeOffchain :: [HieFile ] -> Analysis -> IO Analysis
124+ removeOffchain hieFiles analysis = do
125+ contracts <- onchainFiles hieFiles
126+ pure analysis {
127+ analysisObservations = Slist. filter (onchainCondition contracts) (analysisObservations analysis)
128+ , analysisFileMap = fmap (filterForOnchain contracts) (analysisFileMap analysis)
129+ -- TODO: we might want to add those filtered observations to the ignored list
130+ -- but i'm not sure if it's a good idea
131+ }
132+
86133runStan :: StanArgs -> IO ()
87134runStan stanArgs@ StanArgs {.. } = do
88135 let notJson = not stanArgsJsonOut
89136 (configTrial, useDefConfig, env) <- getStanConfig stanArgs notJson
90137 whenResult_ configTrial $ \ warnings config -> do
91138 hieFiles <- readHieFiles stanArgsHiedir
92- analysis <- getAnalysis stanArgs notJson config hieFiles
139+ -- NOTE: this filter is applied only for CLI, hls will still show all observations
140+ analysis <- getAnalysis stanArgs notJson config hieFiles >>= removeOffchain hieFiles
93141 -- show what observations are ignored
94142 when notJson $ putText $ indent $ prettyShowIgnoredObservations
95143 (configIgnored config)
0 commit comments