mulang-3.5.2: src/Language/Mulang/Analyzer.hs
module Language.Mulang.Analyzer (
noSmells,
allSmells,
emptyDomainLanguage,
emptyAnalysisSpec,
emptyAnalysis,
domainLanguageAnalysis,
expectationsAnalysis,
smellsAnalysis,
signaturesAnalysis,
analyse,
module Language.Mulang.Analyzer.Analysis) where
import Language.Mulang
import Language.Mulang.Analyzer.Analysis
import Language.Mulang.Analyzer.SampleParser (parseSample)
import Language.Mulang.Analyzer.SignaturesAnalyzer (analyseSignatures)
import Language.Mulang.Analyzer.ExpectationsAnalyzer (analyseExpectations)
import Language.Mulang.Analyzer.SmellsAnalyzer (analyseSmells)
import Language.Mulang.Analyzer.DomainLanguageCompiler (emptyDomainLanguage, compileDomainLanguage)
import Data.Maybe (fromMaybe)
--
-- Builder functions
--
noSmells :: SmellsSet
noSmells = NoSmells Nothing
allSmells :: SmellsSet
allSmells = AllSmells Nothing
emptyAnalysisSpec :: AnalysisSpec
emptyAnalysisSpec = AnalysisSpec [] noSmells Nothing Nothing Nothing
emptyAnalysis :: Sample -> Analysis
emptyAnalysis code = Analysis code emptyAnalysisSpec
domainLanguageAnalysis :: Sample -> DomainLanguage -> Analysis
domainLanguageAnalysis code domainLanguage = Analysis code (emptyAnalysisSpec { domainLanguage = Just domainLanguage, smellsSet = allSmells })
expectationsAnalysis :: Sample -> [Expectation] -> Analysis
expectationsAnalysis code es = Analysis code (emptyAnalysisSpec { expectations = es })
smellsAnalysis :: Sample -> SmellsSet -> Analysis
smellsAnalysis code set = Analysis code (emptyAnalysisSpec { smellsSet = set })
signaturesAnalysis :: Sample -> SignatureStyle -> Analysis
signaturesAnalysis code style = Analysis code (emptyAnalysisSpec { signatureAnalysisType = Just (StyledSignatures style) })
--
-- Analysis running
--
analyse :: Analysis -> IO AnalysisResult
analyse (Analysis sample spec) = analyseSample (parseSample sample)
where analyseSample (Right ast) = analyseAst ast spec
analyseSample (Left message) = return $ AnalysisFailed message
analyseAst :: Expression -> AnalysisSpec -> IO AnalysisResult
analyseAst ast spec = do
language <- compileDomainLanguage (domainLanguage spec)
return $ AnalysisCompleted (analyseExpectations ast (expectations spec))
(analyseSmells ast language (smellsSet spec))
(analyseSignatures ast (signatureAnalysisType spec))
(analyzeIntermediateLanguage ast spec)
analyzeIntermediateLanguage :: Expression -> AnalysisSpec -> Maybe Expression
analyzeIntermediateLanguage ast spec
| fromMaybe False (includeIntermediateLanguage spec) = Just ast
| otherwise = Nothing