headroom-0.4.1.0: src/Headroom/FileSupport/Java.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-|
Module : Headroom.FileSupport.Java
Description : Support for /Java/ source code files
Copyright : (c) 2019-2021 Vaclav Svejcar
License : BSD-3-Clause
Maintainer : vaclav.svejcar@gmail.com
Stability : experimental
Portability : POSIX
Support for /Java/ source code files. This implementation extracts /Java/
package name as variable.
= Extracted Variables for Templates
This implementation extracts following variables from source code file:
* @___java_package_name__@ - name of the /Java/ package
= Extracted Custom Data
This implementation does not extract any custom data from template file.
-}
module Headroom.FileSupport.Java
( fileSupport
)
where
import Headroom.Data.Regex ( isMatch
, match
, re
)
import Headroom.FileSupport.TemplateData ( TemplateData(..) )
import Headroom.FileSupport.Types ( FileSupport(..)
, SyntaxAnalysis(..)
)
import Headroom.FileType.Types ( FileType(Java) )
import Headroom.Header.Types ( HeaderTemplate )
import Headroom.SourceCode ( LineType(..)
, SourceCode(..)
, firstMatching
)
import Headroom.Variables ( mkVariables )
import Headroom.Variables.Types ( Variables(..) )
import RIO
import RIO.Lens ( ix )
------------------------------ PUBLIC FUNCTIONS ------------------------------
-- | Implementation of 'FileSupport' for /Java/.
fileSupport :: FileSupport
fileSupport = FileSupport
{ fsSyntaxAnalysis = syntaxAnalysis
, fsExtractTemplateData = const . const $ NoTemplateData
, fsExtractVariables = extractVariables
, fsFileType = Java
}
------------------------------ PRIVATE FUNCTIONS -----------------------------
syntaxAnalysis :: SyntaxAnalysis
syntaxAnalysis = SyntaxAnalysis { saIsCommentStart = isMatch [re|^\/\*|^\/\/|]
, saIsCommentEnd = isMatch [re|\*\/$|^\/\/|]
}
extractVariables :: HeaderTemplate
-> Maybe (Int, Int)
-> SourceCode
-> Variables
extractVariables _ _ source = (mkVariables . catMaybes)
[("_java_package_name", ) <$> extractPackageName source]
extractPackageName :: SourceCode -> Maybe Text
extractPackageName = fmap snd . firstMatching f
where
f (lt, l) | lt == Code = match [re|^package (.*);$|] l >>= (^? ix 1)
| otherwise = Nothing