packages feed

glualint-1.27.0: src/GLuaFixer/LintSettings.hs

{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}

module GLuaFixer.LintSettings where

import Control.Applicative ((<|>))
import Control.Monad (MonadPlus (mzero))
import Data.Aeson (
  FromJSON (parseJSON),
  KeyValue ((.=)),
  ToJSON (toJSON),
  Value (Object),
  object,
  (.!=),
  (.:?),
 )
import Data.String (IsString)
import GLua.AG.PrettyPrint (PrettyPrintConfig (..))
import GLuaFixer.LintMessage (
  LogFormatChoice (AutoLogFormatChoice),
 )

-- | Indentation used for pretty printing code
newtype Indentation = Indentation {unIndentation :: String}
  deriving (IsString)
  deriving newtype (Show)

-- | Whether a file is read from stdin or from files
data StdInOrFiles
  = UseStdIn
  | UseFiles [FilePath]
  deriving (Show)

-- | Convert a string to StdInOrFiles
parseStdInOrFiles :: String -> StdInOrFiles
parseStdInOrFiles "stdin" = UseStdIn
parseStdInOrFiles other = UseFiles [other]

data LintSettings = LintSettings
  { lint_maxScopeDepth :: !Int
  , lint_syntaxErrors :: !Bool
  , lint_syntaxInconsistencies :: !Bool
  , lint_deprecated :: !Bool
  , lint_trailingWhitespace :: !Bool
  , lint_whitespaceStyle :: !Bool
  , lint_beginnerMistakes :: !Bool
  , lint_emptyBlocks :: !Bool
  , lint_shadowing :: !Bool
  , lint_gotos :: !Bool
  , lint_goto_identifier :: !Bool
  , lint_doubleNegations :: !Bool
  , lint_redundantIfStatements :: !Bool
  , lint_redundantParentheses :: !Bool
  , lint_duplicateTableKeys :: !Bool
  , lint_profanity :: !Bool
  , lint_unusedVars :: !Bool
  , lint_unusedParameters :: !Bool
  , lint_unusedLoopVars :: !Bool
  , lint_inconsistentVariableStyle :: !Bool
  , lint_spaceBetweenParens :: !Bool
  , lint_spaceBetweenBrackets :: !Bool
  , lint_spaceBetweenBraces :: !Bool
  , lint_spaceBeforeComma :: !Bool
  , lint_spaceAfterComma :: !Bool
  , lint_maxLineLength :: !Int
  , lint_ignoreFiles :: ![String]
  , prettyprint_spaceBetweenParens :: !Bool
  , prettyprint_spaceBetweenBrackets :: !Bool
  , prettyprint_spaceBetweenBraces :: !Bool
  , prettyprint_spaceEmptyParens :: !Bool
  , prettyprint_spaceEmptyBraces :: !Bool
  , prettyprint_spaceAfterLabel :: !Bool
  , prettyprint_spaceBeforeComma :: !Bool
  , prettyprint_spaceAfterComma :: !Bool
  , prettyprint_semicolons :: !Bool
  , prettyprint_cStyle :: !Bool
  , prettyprint_removeRedundantParens :: !Bool
  , prettyprint_minimizeParens :: !Bool
  , prettyprint_assumeOperatorAssociativity :: !Bool
  , prettyprint_indentation :: !String
  , log_format :: !LogFormatChoice
  }
  deriving (Show)

defaultLintSettings :: LintSettings
defaultLintSettings =
  LintSettings
    { lint_maxScopeDepth = 7
    , lint_syntaxErrors = True
    , lint_syntaxInconsistencies = True
    , lint_deprecated = True
    , lint_trailingWhitespace = True
    , lint_whitespaceStyle = True
    , lint_beginnerMistakes = True
    , lint_emptyBlocks = True
    , lint_shadowing = True
    , lint_gotos = True
    , lint_goto_identifier = True
    , lint_doubleNegations = True
    , lint_redundantIfStatements = True
    , lint_redundantParentheses = True
    , lint_duplicateTableKeys = True
    , lint_profanity = True
    , lint_unusedVars = True
    , lint_unusedParameters = False
    , lint_unusedLoopVars = False
    , lint_inconsistentVariableStyle = False
    , lint_spaceBetweenParens = False
    , lint_spaceBetweenBrackets = False
    , lint_spaceBetweenBraces = False
    , lint_spaceBeforeComma = False
    , lint_spaceAfterComma = False
    , lint_maxLineLength = 0
    , lint_ignoreFiles = []
    , prettyprint_spaceBetweenParens = False
    , prettyprint_spaceBetweenBrackets = False
    , prettyprint_spaceBetweenBraces = False
    , prettyprint_spaceEmptyParens = True
    , prettyprint_spaceEmptyBraces = True
    , prettyprint_spaceAfterLabel = False
    , prettyprint_spaceBeforeComma = False
    , prettyprint_spaceAfterComma = True
    , prettyprint_semicolons = False
    , prettyprint_cStyle = False
    , prettyprint_removeRedundantParens = True
    , prettyprint_minimizeParens = False
    , prettyprint_assumeOperatorAssociativity = True
    , prettyprint_indentation = "    "
    , log_format = AutoLogFormatChoice
    }

instance FromJSON LintSettings where
  parseJSON (Object v) =
    LintSettings
      <$> v .:? "lint_maxScopeDepth" .!= lint_maxScopeDepth defaultLintSettings
      <*> v .:? "lint_syntaxErrors" .!= lint_syntaxErrors defaultLintSettings
      <*> v .:? "lint_syntaxInconsistencies" .!= lint_syntaxInconsistencies defaultLintSettings
      <*> v .:? "lint_deprecated" .!= lint_deprecated defaultLintSettings
      <*> v .:? "lint_trailingWhitespace" .!= lint_trailingWhitespace defaultLintSettings
      <*> v .:? "lint_whitespaceStyle" .!= lint_whitespaceStyle defaultLintSettings
      <*> v .:? "lint_beginnerMistakes" .!= lint_beginnerMistakes defaultLintSettings
      <*> v .:? "lint_emptyBlocks" .!= lint_emptyBlocks defaultLintSettings
      <*> v .:? "lint_shadowing" .!= lint_shadowing defaultLintSettings
      <*> v .:? "lint_gotos" .!= lint_gotos defaultLintSettings
      <*> v .:? "lint_goto_identifier" .!= lint_goto_identifier defaultLintSettings
      <*> v .:? "lint_doubleNegations" .!= lint_doubleNegations defaultLintSettings
      <*> v .:? "lint_redundantIfStatements" .!= lint_redundantIfStatements defaultLintSettings
      <*> v .:? "lint_redundantParentheses" .!= lint_redundantParentheses defaultLintSettings
      <*> v .:? "lint_duplicateTableKeys" .!= lint_duplicateTableKeys defaultLintSettings
      <*> v .:? "lint_profanity" .!= lint_profanity defaultLintSettings
      <*> v .:? "lint_unusedVars" .!= lint_unusedVars defaultLintSettings
      <*> v .:? "lint_unusedParameters" .!= lint_unusedParameters defaultLintSettings
      <*> v .:? "lint_unusedLoopVars" .!= lint_unusedLoopVars defaultLintSettings
      <*> v .:? "lint_inconsistentVariableStyle" .!= lint_inconsistentVariableStyle defaultLintSettings
      <*>
      -- Backwards compatible change: accept both the newer spaceBetween and the older
      -- spaceAfter
      ( v .:? "lint_spaceBetweenParens" .!= lint_spaceBetweenParens defaultLintSettings
          <|> v .:? "lint_spaceAfterParens" .!= lint_spaceBetweenParens defaultLintSettings
      )
      <*> ( v .:? "lint_spaceBetweenBrackets" .!= lint_spaceBetweenBrackets defaultLintSettings
              <|> v .:? "lint_spaceAfterBrackets" .!= lint_spaceBetweenBrackets defaultLintSettings
          )
      <*> ( v .:? "lint_spaceBetweenBraces" .!= lint_spaceBetweenBraces defaultLintSettings
              <|> v .:? "lint_spaceAfterBraces" .!= lint_spaceBetweenBraces defaultLintSettings
          )
      <*> v .:? "lint_spaceBeforeComma" .!= lint_spaceBeforeComma defaultLintSettings
      <*> v .:? "lint_spaceAfterComma" .!= lint_spaceAfterComma defaultLintSettings
      <*> v .:? "lint_maxLineLength" .!= lint_maxLineLength defaultLintSettings
      <*> v .:? "lint_ignoreFiles" .!= lint_ignoreFiles defaultLintSettings
      <*> ( v .:? "prettyprint_spaceBetweenParens" .!= prettyprint_spaceBetweenParens defaultLintSettings
              <|> v .:? "prettyprint_spaceAfterParens" .!= prettyprint_spaceBetweenParens defaultLintSettings
          )
      <*> ( v .:? "prettyprint_spaceBetweenBrackets" .!= prettyprint_spaceBetweenBrackets defaultLintSettings
              <|> v .:? "prettyprint_spaceAfterBrackets" .!= prettyprint_spaceBetweenBrackets defaultLintSettings
          )
      <*> ( v .:? "prettyprint_spaceBetweenBraces" .!= prettyprint_spaceBetweenBraces defaultLintSettings
              <|> v .:? "prettyprint_spaceAfterBraces" .!= prettyprint_spaceBetweenBraces defaultLintSettings
          )
      <*> v .:? "prettyprint_spaceEmptyParens" .!= prettyprint_spaceEmptyParens defaultLintSettings
      <*> v .:? "prettyprint_spaceEmptyBraces" .!= prettyprint_spaceEmptyBraces defaultLintSettings
      <*> v .:? "prettyprint_spaceAfterLabel" .!= prettyprint_spaceAfterLabel defaultLintSettings
      <*> v .:? "prettyprint_spaceBeforeComma" .!= prettyprint_spaceBeforeComma defaultLintSettings
      <*> v .:? "prettyprint_spaceAfterComma" .!= prettyprint_spaceAfterComma defaultLintSettings
      <*> v .:? "prettyprint_semicolons" .!= prettyprint_semicolons defaultLintSettings
      <*> v .:? "prettyprint_cStyle" .!= prettyprint_cStyle defaultLintSettings
      <*> v .:? "prettyprint_removeRedundantParens" .!= prettyprint_removeRedundantParens defaultLintSettings
      <*> v .:? "prettyprint_minimizeParens" .!= prettyprint_minimizeParens defaultLintSettings
      <*> v .:? "prettyprint_assumeOperatorAssociativity" .!= prettyprint_assumeOperatorAssociativity defaultLintSettings
      <*> v .:? "prettyprint_indentation" .!= prettyprint_indentation defaultLintSettings
      <*> v .:? "log_format" .!= log_format defaultLintSettings
  parseJSON _ = mzero

lint2ppSetting :: LintSettings -> PrettyPrintConfig
lint2ppSetting ls =
  PPConfig
    { spaceAfterParens = prettyprint_spaceBetweenParens ls
    , spaceAfterBrackets = prettyprint_spaceBetweenBrackets ls
    , spaceAfterBraces = prettyprint_spaceBetweenBraces ls
    , spaceEmptyParens = prettyprint_spaceEmptyParens ls
    , spaceEmptyBraces = prettyprint_spaceEmptyBraces ls
    , spaceAfterLabel = prettyprint_spaceAfterLabel ls
    , spaceBeforeComma = prettyprint_spaceBeforeComma ls
    , spaceAfterComma = prettyprint_spaceAfterComma ls
    , semicolons = prettyprint_semicolons ls
    , cStyle = prettyprint_cStyle ls
    , removeRedundantParens = prettyprint_removeRedundantParens ls
    , minimizeParens = prettyprint_minimizeParens ls
    , assumeOperatorAssociativity = prettyprint_assumeOperatorAssociativity ls
    , indentation = prettyprint_indentation ls
    }

instance ToJSON LintSettings where
  toJSON ls =
    object
      [ "lint_maxScopeDepth" .= lint_maxScopeDepth ls
      , "lint_syntaxErrors" .= lint_syntaxErrors ls
      , "lint_syntaxInconsistencies" .= lint_syntaxInconsistencies ls
      , "lint_deprecated" .= lint_deprecated ls
      , "lint_trailingWhitespace" .= lint_trailingWhitespace ls
      , "lint_whitespaceStyle" .= lint_whitespaceStyle ls
      , "lint_beginnerMistakes" .= lint_beginnerMistakes ls
      , "lint_emptyBlocks" .= lint_emptyBlocks ls
      , "lint_shadowing" .= lint_shadowing ls
      , "lint_gotos" .= lint_gotos ls
      , "lint_goto_identifier" .= lint_goto_identifier ls
      , "lint_doubleNegations" .= lint_doubleNegations ls
      , "lint_redundantIfStatements" .= lint_redundantIfStatements ls
      , "lint_redundantParentheses" .= lint_redundantParentheses ls
      , "lint_duplicateTableKeys" .= lint_duplicateTableKeys ls
      , "lint_profanity" .= lint_profanity ls
      , "lint_unusedVars" .= lint_unusedVars ls
      , "lint_unusedParameters" .= lint_unusedParameters ls
      , "lint_unusedLoopVars" .= lint_unusedLoopVars ls
      , "lint_inconsistentVariableStyle" .= lint_inconsistentVariableStyle ls
      , "lint_spaceBetweenParens" .= lint_spaceBetweenParens ls
      , "lint_spaceBetweenBrackets" .= lint_spaceBetweenBrackets ls
      , "lint_spaceBetweenBraces" .= lint_spaceBetweenBraces ls
      , "lint_maxLineLength" .= lint_maxLineLength ls
      , "lint_ignoreFiles" .= lint_ignoreFiles ls
      , "prettyprint_spaceBetweenParens" .= prettyprint_spaceBetweenParens ls
      , "prettyprint_spaceBetweenBrackets" .= prettyprint_spaceBetweenBrackets ls
      , "prettyprint_spaceBetweenBraces" .= prettyprint_spaceBetweenBraces ls
      , "prettyprint_spaceEmptyParens" .= prettyprint_spaceEmptyParens ls
      , "prettyprint_spaceEmptyBraces" .= prettyprint_spaceEmptyBraces ls
      , "prettyprint_spaceAfterLabel" .= prettyprint_spaceAfterLabel ls
      , "prettyprint_spaceBeforeComma" .= prettyprint_spaceBeforeComma ls
      , "prettyprint_spaceAfterComma" .= prettyprint_spaceAfterComma ls
      , "prettyprint_semicolons" .= prettyprint_semicolons ls
      , "prettyprint_cStyle" .= prettyprint_cStyle ls
      , "prettyprint_removeRedundantParens" .= prettyprint_removeRedundantParens ls
      , "prettyprint_minimizeParens" .= prettyprint_minimizeParens ls
      , "prettyprint_assumeOperatorAssociativity" .= prettyprint_assumeOperatorAssociativity ls
      , "prettyprint_indentation" .= prettyprint_indentation ls
      , "log_format" .= log_format ls
      ]