packages feed

aihc-parser-1.0.0.2: src/Aihc/Parser/Lex/Header.hs

module Aihc.Parser.Lex.Header
  ( readModuleHeaderExtensionsFromTokens,
    separateEditionAndExtensions,
  )
where

import Aihc.Parser.Lex.Types
import Aihc.Parser.Syntax
import Data.List qualified as List

readModuleHeaderExtensionsFromTokens :: [LexToken] -> [ExtensionSetting]
readModuleHeaderExtensionsFromTokens = go
  where
    go toks =
      case toks of
        LexToken {lexTokenKind = TkPragma Pragma {pragmaType = PragmaLanguage settings}} : rest -> settings <> go rest
        LexToken {lexTokenKind = TkPragma Pragma {pragmaType = PragmaWarning _}} : rest -> go rest
        LexToken {lexTokenKind = TkPragma Pragma {pragmaType = PragmaDeprecated _}} : rest -> go rest
        LexToken {lexTokenKind = TkPragma Pragma {pragmaType = PragmaUnknown _}} : rest -> go rest
        LexToken {lexTokenKind = TkLineComment} : rest -> go rest
        LexToken {lexTokenKind = TkBlockComment} : rest -> go rest
        LexToken {lexTokenKind = TkError _} : _ -> []
        _ -> []

separateEditionAndExtensions :: [ExtensionSetting] -> ModuleHeaderPragmas
separateEditionAndExtensions settings =
  let (editions, extensions) = List.partition isEditionSetting settings
      lastEdition = case reverse editions of
        EnableExtension ext : _ -> extensionToEdition ext
        _ -> Nothing
   in ModuleHeaderPragmas
        { headerLanguageEdition = lastEdition,
          headerExtensionSettings = extensions
        }

isEditionSetting :: ExtensionSetting -> Bool
isEditionSetting setting =
  case setting of
    EnableExtension ext -> isEditionExtension ext
    DisableExtension ext -> isEditionExtension ext

isEditionExtension :: Extension -> Bool
isEditionExtension ext =
  ext `elem` [Haskell98, Haskell2010, GHC2021, GHC2024]

extensionToEdition :: Extension -> Maybe LanguageEdition
extensionToEdition ext =
  case ext of
    Haskell98 -> Just Haskell98Edition
    Haskell2010 -> Just Haskell2010Edition
    GHC2021 -> Just GHC2021Edition
    GHC2024 -> Just GHC2024Edition
    _ -> Nothing