on master help sign in
Finish TODO on infinite type errors
commit15b9171816cbbf3eee4fc1e1a63fcbfef5df2947 authorEvan Czaplicki <evancz@users.noreply.github.com> dateSat 10 Feb 2018, 16:50 (9 years ago) parent9809b00
2 files changed+30−5
src/Reporting/Error/Type.hs+28−3 src/Type/Solve.hs+2−2
src/Reporting/Error/Type.hs+28−3
@@ -40,7 +40,7 @@ import qualified Type.Error as T
4040data Error
4141 = BadExpr R.Region Category T.Type (Expected T.Type)
4242 | BadPattern R.Region PCategory T.Type (PExpected T.Type)
43− | InfiniteType T.Type
43+ | InfiniteType R.Region N.Name T.Type
4444
4545
4646
@@ -170,8 +170,8 @@ toReport source localizer err =
170170 BadPattern region category tipe expected ->
171171 toPatternReport source localizer region category tipe expected
172172
173− InfiniteType overallType ->
174− error "TODO" source localizer overallType
173+ InfiniteType region name overallType ->
174+ toInfiniteReport source localizer region name overallType
175175
176176
177177
@@ -1250,3 +1250,28 @@ badEquality localizer op tipe expectedType =
12501250 ]
12511251 )
12521252 )
1253+
1254+
1255+
1256+-- INFINITE TYPES
1257+
1258+
1259+toInfiniteReport :: Code.Source -> T.Localizer -> R.Region -> N.Name -> T.Type -> Report.Report
1260+toInfiniteReport source localizer region name overallType =
1261+ Report.Report "INFINITE TYPE" region [] $
1262+ Report.toCodeSnippet source region Nothing
1263+ (
1264+ H.reflow $
1265+ "I am inferring a weird self-referential type for " <> N.toString name <> ":"
1266+ ,
1267+ H.stack
1268+ [ H.reflow $
1269+ "Here is my best effort at writing down the type. You will see ∞ for\
1270+ \ parts of the type that repeat something already printed out infinitely."
1271+ , indentType localizer overallType
1272+ , H.reflowLink
1273+ "Staring at the type is usually not so helpful, so I recommend reading the hints at"
1274+ "infinite-type"
1275+ "to get unstuck."
1276+ ]
1277+ )
src/Type/Solve.hs+2−2
@@ -260,14 +260,14 @@ addError (State savedEnv rank errors) err =
260260
261261
262262occurs :: State -> (N.Name, A.Located Variable) -> IO State
263−occurs state (_name, A.At _region variable) =
263+occurs state (name, A.At region variable) =
264264 do hasOccurred <- Occurs.occurs variable
265265 if hasOccurred
266266 then
267267 do errorType <- Type.toErrorType variable
268268 (Descriptor _ rank mark copy) <- UF.get variable
269269 UF.set variable (Descriptor Error rank mark copy)
270− return $ state { _errors = Error.InfiniteType errorType : _errors state }
270+ return $ state { _errors = Error.InfiniteType region name errorType : _errors state }
271271 else
272272 return state
273273