2 | import Core.Name.Namespace
5 | import Libraries.Text.Bounded
6 | import Libraries.Text.PrettyPrint.Prettyprinter
15 | FilePos = (Int, Int)
17 | showPos : FilePos -> String
18 | showPos (l, c) = show (l + 1) ++ ":" ++ show (c + 1)
25 | data VirtualIdent : Type where
26 | Interactive : VirtualIdent
29 | Eq VirtualIdent where
30 | Interactive == Interactive = True
33 | Show VirtualIdent where
34 | show Interactive = "(Interactive)"
37 | data OriginDesc : Type where
41 | PhysicalIdrSrc : (ident : ModuleIdent) -> OriginDesc
44 | PhysicalPkgSrc : (fname : FileName) -> OriginDesc
45 | Virtual : (ident : VirtualIdent) -> OriginDesc
49 | PhysicalIdrSrc ident == PhysicalIdrSrc ident' = ident == ident'
50 | PhysicalPkgSrc fname == PhysicalPkgSrc fname' = fname == fname'
51 | Virtual ident == Virtual ident' = ident == ident'
55 | Show OriginDesc where
56 | show (PhysicalIdrSrc ident) = show ident
57 | show (PhysicalPkgSrc fname) = show fname
58 | show (Virtual ident) = show ident
65 | data FC = MkFC OriginDesc FilePos FilePos
68 | MkVirtualFC OriginDesc FilePos FilePos
76 | NonEmptyFC = (OriginDesc, FilePos, FilePos)
83 | justFC : NonEmptyFC -> FC
84 | justFC (fname, start, end) = MkFC fname start end
88 | isNonEmptyFC : FC -> Maybe NonEmptyFC
89 | isNonEmptyFC (MkFC fn start end) = Just (fn, start, end)
90 | isNonEmptyFC (MkVirtualFC fn start end) = Just (fn, start, end)
91 | isNonEmptyFC EmptyFC = Nothing
95 | isConcreteFC : FC -> Maybe NonEmptyFC
96 | isConcreteFC (MkFC fn start end) = Just (fn, start, end)
97 | isConcreteFC _ = Nothing
101 | virtualiseFC : FC -> FC
102 | virtualiseFC (MkFC fn start end) = MkVirtualFC fn start end
103 | virtualiseFC fc = fc
106 | defaultFC : NonEmptyFC
107 | defaultFC = (Virtual Interactive, (0, 0), (0, 0))
111 | replFC = justFC defaultFC
114 | toNonEmptyFC : FC -> NonEmptyFC
115 | toNonEmptyFC = fromMaybe defaultFC . isNonEmptyFC
121 | origin : NonEmptyFC -> OriginDesc
122 | origin (fn, _, _) = fn
125 | startPos : NonEmptyFC -> FilePos
126 | startPos (_, s, _) = s
129 | startLine : NonEmptyFC -> Int
130 | startLine = fst . startPos
133 | startCol : NonEmptyFC -> Int
134 | startCol = snd . startPos
137 | endPos : NonEmptyFC -> FilePos
138 | endPos (_, _, e) = e
141 | endLine : NonEmptyFC -> Int
142 | endLine = fst . endPos
145 | endCol : NonEmptyFC -> Int
146 | endCol = snd . endPos
152 | boundToFC : OriginDesc -> WithBounds t -> FC
153 | boundToFC mbModIdent b = MkFC mbModIdent (start b) (end b)
156 | (.toFC) : (o : OriginDesc) => WithBounds t -> FC
157 | x.toFC = boundToFC o x
160 | boundToFC' : OriginDesc -> Bounds -> FC
161 | boundToFC' mbModIdent b = MkFC mbModIdent (startBounds b) (endBounds b)
169 | within : FilePos -> NonEmptyFC -> Bool
170 | within (x, y) (_, start, end)
171 | = (x, y) >= start && (x, y) <= end
176 | onLine : Int -> NonEmptyFC -> Bool
177 | onLine x (_, start, end)
178 | = x >= fst start && x <= fst end
190 | mergeFC : FC -> FC -> Maybe FC
191 | mergeFC (MkFC fname1 start1 end1) (MkFC fname2 start2 end2) =
192 | if fname1 == fname2
193 | then Just $
MkFC fname1 (min start1 start2) (max end1 end2)
195 | mergeFC _ _ = Nothing
205 | (==) (MkFC n s e) (MkFC n' s' e') = n == n' && s == s' && e == e'
206 | (==) (MkVirtualFC n s e) (MkVirtualFC n' s' e') = n == n' && s == s' && e == e'
207 | (==) EmptyFC EmptyFC = True
212 | show EmptyFC = "EmptyFC"
213 | show (MkFC ident startPos endPos) = show ident ++ ":" ++
214 | showPos startPos ++ "--" ++
216 | show (MkVirtualFC ident startPos endPos) = show ident ++ ":" ++
217 | showPos startPos ++ "--" ++
220 | prettyPos : FilePos -> Doc Void
221 | prettyPos = pretty . showPos
224 | Pretty Void FC where
225 | pretty EmptyFC = pretty "EmptyFC"
226 | pretty (MkFC ident startPos endPos) = byShow ident <+> colon
227 | <+> prettyPos startPos <+> pretty "--"
228 | <+> prettyPos endPos
229 | pretty (MkVirtualFC ident startPos endPos) = byShow ident <+> colon
230 | <+> prettyPos startPos <+> pretty "--"
231 | <+> prettyPos endPos