glualint-1.27.0: src/GLuaFixer/Interface.hs
module GLuaFixer.Interface where
import GLua.AG.AST (AST)
import GLua.AG.PrettyPrint (prettyprintConf)
import GLua.AG.Token (MToken)
import qualified GLua.Lexer as Lexer
import GLua.LineLimitParser (LineLimit (..), execParseLineLimits)
import qualified GLua.Parser as Parser
import GLuaFixer.AG.ASTLint (astWarnings)
import GLuaFixer.AG.LexLint (fixedLexPositions, lintWarnings)
import GLuaFixer.BadSequenceFinder (sequenceWarnings)
import GLuaFixer.LintMessage (Issue (..), LintMessage (..), Severity (..))
import GLuaFixer.LintSettings (LintSettings (..), lint2ppSetting)
import Text.Parsec.Error (errorPos)
-- | Run the linters that apply to the source code of a file
sourceLint :: LintSettings -> FilePath -> String -> [LintMessage]
sourceLint lintSettings filepath contents =
execParseLineLimits filepath (LineLimit $ lint_maxLineLength lintSettings) contents
-- | Generate the lexicon of a source file, used as input for the parser
lex :: LintSettings -> FilePath -> String -> Either [LintMessage] [MToken]
lex lintSettings filepath contents =
case Lexer.execParseTokens contents of
Left lexErr ->
Left [LintMessage LintError (Lexer.sp2Rg $ errorPos lexErr) (IssueParseError lexErr) filepath | lint_syntaxErrors lintSettings]
Right tokens -> Right $ fixedLexPositions tokens
-- | Run the linting functions that inspect the lexicon
lexiconLint :: FilePath -> LintSettings -> [MToken] -> [LintMessage]
lexiconLint filepath lintSettings tokens =
map ($ filepath) $
lintWarnings lintSettings tokens ++ sequenceWarnings lintSettings tokens
-- | Parse a lexicon into an Abstract Syntax Tree
parse :: LintSettings -> FilePath -> [MToken] -> Either [LintMessage] AST
parse lintSettings filepath tokens =
case Parser.parseGLua tokens of
Left err ->
-- Return syntax errors
Left [LintMessage LintError (Lexer.sp2Rg $ errorPos err) (IssueParseError err) filepath | lint_syntaxErrors lintSettings]
Right ast -> Right ast
-- | Run the linters that inspect the AST
astLint :: FilePath -> LintSettings -> AST -> [LintMessage]
astLint filepath lintSettings ast =
map ($ filepath) $ astWarnings lintSettings ast
-- | Pretty print code to a string
prettyprint :: LintSettings -> AST -> String
prettyprint lintSettings ast =
prettyprintConf (lint2ppSetting lintSettings) ast