on master help sign in
Extract region from source code with line numbers
9b2fc65Evan Czaplicki
src/Reporting/Region.hs+58
@@ -5,6 +5,8 @@ import Data.Aeson ((.=))
5import qualified Data.Aeson as Json
5import qualified Data.Aeson as Json
6import qualified Text.Parsec.Pos as Parsec
6import qualified Text.Parsec.Pos as Parsec
7
7
8+import Elm.Utils ((|>))
9+
8
10
9data Region = Region
11data Region = Region
10 { start :: Position
12 { start :: Position
@@ -55,6 +57,62 @@ toPrettyString (Region start end) =
55 ++ show (column start) ++ " to " ++ show (column end)
57 ++ show (column start) ++ " to " ++ show (column end)
56
58
57
59
60+-- EXTRACT REGION from SOURCE with LINE NUMBERS
61+
62+select :: Region -> String -> String
63+select (Region start end) source =
64+ let
65+ relevantLines =
66+ lines source
67+ |> drop (line start)
68+ |> take (line end - line start)
69+ in
70+ case relevantLines of
71+ [] ->
72+ error "something has gone badly wrong with reporting source locations"
73+
74+ [theLine] ->
75+ let
76+ lineNumber = show (line start) ++ "|"
77+ in
78+ lineNumber
79+ ++ theLine
80+ ++ "\n"
81+ ++ replicate (column start + length lineNumber) ' '
82+ ++ replicate (column end - column start) '^'
83+ ++ "\n"
84+
85+ firstLine : rest ->
86+ let
87+ filteredFirstLine =
88+ replicate (column start) ' ' ++ drop (column start) firstLine
89+
90+ filteredLastLine =
91+ take (column end) (last rest)
92+
93+ focusedRelevantLines =
94+ filteredFirstLine : init rest ++ [filteredLastLine]
95+
96+ lineNumbersWidth =
97+ length (show (line end))
98+
99+ numberedLines =
100+ zipWith
101+ (addLineNumber lineNumbersWidth)
102+ [line start .. line end]
103+ focusedRelevantLines
104+ in
105+ unlines numberedLines
106+
107+
108+addLineNumber :: Int -> Int -> String -> String
109+addLineNumber width n line =
110+ let
111+ number = show n
112+ in
113+ replicate (width - length number) ' ' ++ number ++ "|" ++ line
114+
115+
58-- JSON
116-- JSON
59
117
60instance Json.ToJSON Region where
118instance Json.ToJSON Region where