Add json1 format that ignores tabs

The new json1 format works just like json except that it treats tabs as
single characters instead of 8-character tabstops.

The main use case is to allow editors to pass -fjson1 so that they can
consume the json output in a character-oriented way without breaking
backwards compatibility.

Also addresses #1048.
This commit is contained in:
Benjamin Gordon 2019-05-07 15:49:34 -06:00
parent 5fb1da6814
commit 50af8aba29
5 changed files with 33 additions and 7 deletions

View file

@ -22,6 +22,7 @@ module ShellCheck.Formatter.Format where
import ShellCheck.Data
import ShellCheck.Interface
import ShellCheck.Fixer
import Control.Monad
import Data.Array
-- A formatter that carries along an arbitrary piece of data
@ -54,5 +55,10 @@ makeNonVirtual comments contents =
where
list = lines contents
arr = listArray (1, length list) list
fix c = removeTabStops c arr
untabbedFix f = newFix {
fixReplacements = map (\r -> removeTabStops r arr) (fixReplacements f)
}
fix c = (removeTabStops c arr) {
pcFix = liftM untabbedFix (pcFix c)
}

View file

@ -30,11 +30,12 @@ import GHC.Exts
import System.IO
import qualified Data.ByteString.Lazy.Char8 as BL
format = do
format :: Bool -> IO Formatter
format removeTabs = do
ref <- newIORef []
return Formatter {
header = return (),
onResult = collectResult ref,
onResult = collectResult removeTabs ref,
onFailure = outputError,
footer = finish ref
}
@ -96,8 +97,20 @@ instance ToJSON Fix where
]
outputError file msg = hPutStrLn stderr $ file ++ ": " ++ msg
collectResult ref result _ =
modifyIORef ref (\x -> crComments result ++ x)
collectResult removeTabs ref cr sys = mapM_ f groups
where
comments = crComments cr
groups = groupWith sourceFile comments
f :: [PositionedComment] -> IO ()
f group = do
let filename = sourceFile (head group)
result <- siReadFile sys filename
let contents = either (const "") id result
let comments' = if removeTabs
then makeNonVirtual comments contents
else comments
modifyIORef ref (\x -> comments' ++ x)
finish ref = do
list <- readIORef ref