2 | import Core.Name.Namespace
5 | import Libraries.Text.Bounded
6 | import Libraries.Text.PrettyPrint.Prettyprinter
15 | FilePos = (Int, Int)
18 | showPos : FilePos -> String
19 | showPos (l, c) = show (l + 1) ++ ":" ++ show (c + 1)
26 | data VirtualIdent : Type where
27 | Interactive : VirtualIdent
30 | Eq VirtualIdent where
31 | Interactive == Interactive = True
34 | Show VirtualIdent where
35 | show Interactive = "(Interactive)"
38 | data OriginDesc : Type where
42 | PhysicalIdrSrc : (ident : ModuleIdent) -> OriginDesc
45 | PhysicalPkgSrc : (fname : FileName) -> OriginDesc
46 | Virtual : (ident : VirtualIdent) -> OriginDesc
50 | PhysicalIdrSrc ident == PhysicalIdrSrc ident' = ident == ident'
51 | PhysicalPkgSrc fname == PhysicalPkgSrc fname' = fname == fname'
52 | Virtual ident == Virtual ident' = ident == ident'
56 | Show OriginDesc where
57 | show (PhysicalIdrSrc ident) = show ident
58 | show (PhysicalPkgSrc fname) = show fname
59 | show (Virtual ident) = show ident
66 | data FC = MkFC OriginDesc FilePos FilePos
69 | MkVirtualFC OriginDesc FilePos FilePos
77 | NonEmptyFC = (OriginDesc, FilePos, FilePos)
84 | justFC : NonEmptyFC -> FC
85 | justFC (fname, start, end) = MkFC fname start end
89 | isNonEmptyFC : FC -> Maybe NonEmptyFC
90 | isNonEmptyFC (MkFC fn start end) = Just (fn, start, end)
91 | isNonEmptyFC (MkVirtualFC fn start end) = Just (fn, start, end)
92 | isNonEmptyFC EmptyFC = Nothing
96 | isConcreteFC : FC -> Maybe NonEmptyFC
97 | isConcreteFC (MkFC fn start end) = Just (fn, start, end)
98 | isConcreteFC _ = Nothing
102 | virtualiseFC : FC -> FC
103 | virtualiseFC (MkFC fn start end) = MkVirtualFC fn start end
104 | virtualiseFC fc = fc
107 | defaultFC : NonEmptyFC
108 | defaultFC = (Virtual Interactive, (0, 0), (0, 0))
112 | replFC = justFC defaultFC
115 | toNonEmptyFC : FC -> NonEmptyFC
116 | toNonEmptyFC = fromMaybe defaultFC . isNonEmptyFC
122 | origin : NonEmptyFC -> OriginDesc
123 | origin (fn, _, _) = fn
126 | startPos : NonEmptyFC -> FilePos
127 | startPos (_, s, _) = s
130 | startLine : NonEmptyFC -> Int
131 | startLine = fst . startPos
134 | startCol : NonEmptyFC -> Int
135 | startCol = snd . startPos
138 | endPos : NonEmptyFC -> FilePos
139 | endPos (_, _, e) = e
142 | endLine : NonEmptyFC -> Int
143 | endLine = fst . endPos
146 | endCol : NonEmptyFC -> Int
147 | endCol = snd . endPos
153 | boundToFC : OriginDesc -> WithBounds t -> FC
154 | boundToFC mbModIdent b = MkFC mbModIdent (start b) (end b)
157 | (.toFC) : (o : OriginDesc) => WithBounds t -> FC
158 | x.toFC = boundToFC o x
161 | boundToFC' : OriginDesc -> Bounds -> FC
162 | boundToFC' mbModIdent b = MkFC mbModIdent (startBounds b) (endBounds b)
170 | within : FilePos -> NonEmptyFC -> Bool
171 | within (x, y) (_, start, end)
172 | = (x, y) >= start && (x, y) <= end
177 | onLine : Int -> NonEmptyFC -> Bool
178 | onLine x (_, start, end)
179 | = x >= fst start && x <= fst end
191 | mergeFC : FC -> FC -> Maybe FC
192 | mergeFC (MkFC fname1 start1 end1) (MkFC fname2 start2 end2) =
193 | if fname1 == fname2
194 | then Just $
MkFC fname1 (min start1 start2) (max end1 end2)
196 | mergeFC _ _ = Nothing
206 | (==) (MkFC n s e) (MkFC n' s' e') = n == n' && s == s' && e == e'
207 | (==) (MkVirtualFC n s e) (MkVirtualFC n' s' e') = n == n' && s == s' && e == e'
208 | (==) EmptyFC EmptyFC = True
213 | show EmptyFC = "EmptyFC"
214 | show (MkFC ident startPos endPos) = show ident ++ ":" ++
215 | showPos startPos ++ "--" ++
217 | show (MkVirtualFC ident startPos endPos) = show ident ++ ":" ++
218 | showPos startPos ++ "--" ++
221 | prettyPos : FilePos -> Doc Void
222 | prettyPos = pretty . showPos
225 | Pretty Void FC where
226 | pretty EmptyFC = pretty "EmptyFC"
227 | pretty (MkFC ident startPos endPos) = byShow ident <+> colon
228 | <+> prettyPos startPos <+> pretty "--"
229 | <+> prettyPos endPos
230 | pretty (MkVirtualFC ident startPos endPos) = byShow ident <+> colon
231 | <+> prettyPos startPos <+> pretty "--"
232 | <+> prettyPos endPos