From a23e496b80a5f85acef61272870d378c8d8fe1bd Mon Sep 17 00:00:00 2001 From: Claudio Russo Date: Thu, 3 Oct 2024 12:02:31 +0100 Subject: [PATCH] add --ai-errors; tailor messages to dump relevant context on identifier lookup (for ai), or abbreviate and suggest for user --- src/mo_frontend/typing.ml | 98 +++++++--- test/fail/ok/M0028.tc.ok | 2 +- test/fail/ok/M0029.tc.ok | 1 - test/fail/ok/bad-type-comp.tc.ok | 6 +- test/fail/ok/modexp1.tc.ok | 2 +- test/fail/ok/pretty.tc.ok | 2 +- test/fail/ok/suggest-ai.tc.ok | 4 +- test/fail/ok/suggest-label.tc.ok | 2 +- test/fail/ok/suggest-local-type.tc.ok | 2 +- test/fail/ok/suggest-local.tc.ok | 2 +- test/fail/ok/suggest-long.tc.ok | 261 +------------------------- test/fail/ok/suggest-short.tc.ok | 261 +------------------------- test/fail/ok/suggest-type.tc.ok | 1 - test/fail/ok/type-comp.tc.ok | 1 - 14 files changed, 88 insertions(+), 557 deletions(-) diff --git a/src/mo_frontend/typing.ml b/src/mo_frontend/typing.ml index b6e6c3141e0..ed33e28016f 100644 --- a/src/mo_frontend/typing.ml +++ b/src/mo_frontend/typing.ml @@ -116,15 +116,15 @@ let kind_of_field_pattern pf = match pf.it with (* Suggestions *) -let suggest id ids = +let suggest desc id ids = if !Flags.ai_errors then - "\n Identifier " ^ id ^ " is not available. Try something else?" + Printf.sprintf + "\nThe %s %s is not available. Try something else?" + desc + id else let suggestions = - let rec log2 = function - | 1 -> 0 - | n -> 1 + log2 ((n + 1) / 2) in - let limit = log2 (String.length id) in + let limit = Lib.Int.log2 (String.length id) in let distance = Lib.String.levenshtein_distance id in let weighted_ids = List.filter_map (fun id0 -> let d = distance id0 in @@ -135,10 +135,10 @@ let suggest id ids = in if suggestions = [] then "" else - let ids, id = Lib.List.split_last suggestions in - "\nDid you mean " ^ - (if ids <> [] then (String.concat ", " ids) ^ " or " else "") ^ - id ^ "?" + let rest, last = Lib.List.split_last suggestions in + Printf.sprintf "\nDid you mean %s %s?" + desc + ((if rest <> [] then (String.concat ", " rest) ^ " or " else "") ^ last) (* Error bookkeeping *) @@ -154,6 +154,49 @@ let display_typ = Lib.Format.display T.pp_typ let display_typ_expand = Lib.Format.display T.pp_typ_expand +let display_obj fmt (s, fs) = + if !Flags.ai_errors || (List.length fs) < 16 then + Format.fprintf fmt "type:%a" display_typ (T.Obj(s, fs)) + else + Format.fprintf fmt "%s." (String.trim(T.string_of_obj_sort s)) + +let display_vals fmt vals = + if !Flags.ai_errors then + let tfs = T.Env.fold (fun x (t, _, _, _) acc -> + if x = "Prim" || (String.length x >= 0 && x.[0] = '@') + then acc + else T.{lab = x; src = {depr = None; region = Source.no_region }; typ = t}::acc) + vals [] + in + let ty = T.Obj(T.Object, List.rev tfs) in + Format.fprintf fmt " in environment:%a" display_typ ty + else + Format.fprintf fmt "" + +let display_labs fmt labs = + if !Flags.ai_errors then + let tfs = T.Env.fold (fun x t acc -> + T.{lab = x; src = {depr = None; region = Source.no_region }; typ = t}::acc) + labs [] + in + let ty = T.Obj(T.Object, List.rev tfs) in + Format.fprintf fmt " in label environment:%a" display_typ ty + else + Format.fprintf fmt "" + +let display_typs fmt typs = + if !Flags.ai_errors then + let tfs = T.Env.fold (fun x c acc -> + if x = "Prim" || (String.length x >= 0 && x.[0] = '@') + then acc + else T.{lab = x; src = {depr = None; region = Source.no_region }; typ = T.Typ c}::acc) + typs [] + in + let ty = T.Obj(T.Object, List.rev tfs) in + Format.fprintf fmt " in type environment:%a" display_typ ty + else + Format.fprintf fmt "" + let type_error at code text : Diag.message = Diag.error_message at code "type" text @@ -426,8 +469,9 @@ and check_obj_path' env path : T.typ = | Some (t, _, _, Unavailable) -> error env id.at "M0025" "unavailable variable %s" id.it | None -> - error env id.at "M0026" "unbound variable %s%s" id.it - (suggest id.it (T.Env.keys env.vals)) + error env id.at "M0026" "unbound variable %s%a%s" id.it + display_vals env.vals + (suggest "variable" id.it (T.Env.keys env.vals)) ) | DotH (path', id) -> let s, fs = check_obj_path env path' in @@ -436,9 +480,10 @@ and check_obj_path' env path : T.typ = error env id.at "M0027" "cannot infer type of forward field reference %s" id.it | t -> t | exception Invalid_argument _ -> - error env id.at "M0028" "field %s does not exist in type%a%s" - id.it display_typ_expand (T.Obj (s, fs)) - (suggest id.it + error env id.at "M0028" "field %s does not exist in %a%s" + id.it + display_obj (s, fs) + (suggest "field" id.it (List.filter_map (function { T.typ=T.Typ _;_} -> None @@ -456,8 +501,9 @@ and check_typ_path' env path : T.con = (match T.Env.find_opt id.it env.typs with | Some c -> c | None -> - error env id.at "M0029" "unbound type %s%s" id.it - (suggest id.it (T.Env.keys env.typs)) + error env id.at "M0029" "unbound type %s%a%s" id.it + display_typs env.typs + (suggest "type" id.it (T.Env.keys env.typs)) ) | DotH (path', id) -> let s, fs = check_obj_path env path' in @@ -468,7 +514,7 @@ and check_typ_path' env path : T.con = | exception Invalid_argument _ -> error env id.at "M0030" "type field %s does not exist in type%a%s" id.it display_typ_expand (T.Obj (s, fs)) - (suggest id.it + (suggest "type field" id.it (List.filter_map (function { T.lab; T.typ=T.Typ _;_ } -> Some lab | _ -> None) fs)) @@ -1198,8 +1244,9 @@ and infer_exp'' env exp : T.typ = else t | Some (t, _, _, Available) -> id.note <- (if T.is_mut t then Var else Const); t | None -> - error env id.at "M0057" "unbound variable %s%s" id.it - (suggest id.it (T.Env.keys env.vals)) + error env id.at "M0057" "unbound variable %s%a%s" id.it + display_vals env.vals + (suggest "variable" id.it (T.Env.keys env.vals)) ) | LitE lit -> T.Prim (infer_lit env lit exp.at) @@ -1435,10 +1482,10 @@ and infer_exp'' env exp : T.typ = t | exception Invalid_argument _ -> error env exp1.at "M0072" - "field %s does not exist in type %a%s" + "field %s does not exist in %a%s" id.it - display_typ_expand t1 - (suggest id.it + display_obj (s, tfs) + (suggest "field" id.it (List.filter_map (function { T.typ=T.Typ _;_} -> None @@ -1640,8 +1687,9 @@ and infer_exp'' env exp : T.typ = match String.split_on_char ' ' id.it with | ["continue"; name] -> name | _ -> id.it - in local_error env id.at "M0083" "unbound label %s%s" name - (suggest id.it (T.Env.keys env.labs)) + in local_error env id.at "M0083" "unbound label %s%a%s" name + display_labs env.labs + (suggest "label" id.it (T.Env.keys env.labs)) ); T.Non | RetE exp1 -> diff --git a/test/fail/ok/M0028.tc.ok b/test/fail/ok/M0028.tc.ok index f3d3ad55e7e..c14eef5e016 100644 --- a/test/fail/ok/M0028.tc.ok +++ b/test/fail/ok/M0028.tc.ok @@ -1,2 +1,2 @@ -M0028.mo:2.11-2.12: type error [M0028], field Y does not exist in type +M0028.mo:2.11-2.12: type error [M0028], field Y does not exist in type: module {} diff --git a/test/fail/ok/M0029.tc.ok b/test/fail/ok/M0029.tc.ok index a8c6653adbc..d9c3e45061e 100644 --- a/test/fail/ok/M0029.tc.ok +++ b/test/fail/ok/M0029.tc.ok @@ -1,2 +1 @@ M0029.mo:1.9-1.12: type error [M0029], unbound type Foo -Did you mean Bool? diff --git a/test/fail/ok/bad-type-comp.tc.ok b/test/fail/ok/bad-type-comp.tc.ok index d508c4cf61f..352a2c4aed5 100644 --- a/test/fail/ok/bad-type-comp.tc.ok +++ b/test/fail/ok/bad-type-comp.tc.ok @@ -8,10 +8,10 @@ cannot produce expected type module {type T = Null} bad-type-comp.mo:7.73-7.74: type error [M0018], duplicate type field name T in object type bad-type-comp.mo:11.15-11.16: type error [M0029], unbound type T -Did you mean Text? +Did you mean type Text? bad-type-comp.mo:17.15-17.16: type error [M0029], unbound type U -Did you mean UpgradeOptions? +Did you mean type UpgradeOptions? bad-type-comp.mo:24.17-24.27: type error [M0137], type T = A__9 references type parameter A__9 from an outer scope bad-type-comp.mo:29.23-29.33: type error [M0137], type T = A__10 references type parameter A__10 from an outer scope bad-type-comp.mo:35.25-35.26: type error [M0029], unbound type T -Did you mean Text? +Did you mean type Text? diff --git a/test/fail/ok/modexp1.tc.ok b/test/fail/ok/modexp1.tc.ok index 3dcab56dcc4..19059dae89e 100644 --- a/test/fail/ok/modexp1.tc.ok +++ b/test/fail/ok/modexp1.tc.ok @@ -1,2 +1,2 @@ -modexp1.mo:8.13-8.14: type error [M0072], field g does not exist in type +modexp1.mo:8.13-8.14: type error [M0072], field g does not exist in type: module {f : () -> ()} diff --git a/test/fail/ok/pretty.tc.ok b/test/fail/ok/pretty.tc.ok index f847e6c9037..0f5a045f01a 100644 --- a/test/fail/ok/pretty.tc.ok +++ b/test/fail/ok/pretty.tc.ok @@ -45,7 +45,7 @@ pretty.mo:28.23-28.24: type error [M0096], expression of type } cannot produce expected type Nat -pretty.mo:40.1-40.12: type error [M0072], field foo does not exist in type +pretty.mo:40.1-40.12: type error [M0072], field foo does not exist in type: module { bar1 : Nat; bar2 : Nat; diff --git a/test/fail/ok/suggest-ai.tc.ok b/test/fail/ok/suggest-ai.tc.ok index 3e9099efe5b..4e734901185 100644 --- a/test/fail/ok/suggest-ai.tc.ok +++ b/test/fail/ok/suggest-ai.tc.ok @@ -1,4 +1,4 @@ -suggest-ai.mo:4.1-4.5: type error [M0072], field stableM does not exist in type +suggest-ai.mo:4.1-4.5: type error [M0072], field stableM does not exist in type: module { type ErrorCode = { @@ -256,4 +256,4 @@ suggest-ai.mo:4.1-4.5: type error [M0072], field stableM does not exist in type time : () -> Nat64; trap : Text -> None } - Identifier stableM is not available. Try something else? +The field stableM is not available. Try something else? diff --git a/test/fail/ok/suggest-label.tc.ok b/test/fail/ok/suggest-label.tc.ok index 7f7605e0f49..f514bf245e5 100644 --- a/test/fail/ok/suggest-label.tc.ok +++ b/test/fail/ok/suggest-label.tc.ok @@ -1,2 +1,2 @@ suggest-label.mo:2.9-2.11: type error [M0083], unbound label fo -Did you mean foo? +Did you mean label foo? diff --git a/test/fail/ok/suggest-local-type.tc.ok b/test/fail/ok/suggest-local-type.tc.ok index d6f3b9f89a7..1dea0ca8b86 100644 --- a/test/fail/ok/suggest-local-type.tc.ok +++ b/test/fail/ok/suggest-local-type.tc.ok @@ -1,2 +1,2 @@ suggest-local-type.mo:2.13-2.15: type error [M0029], unbound type Fo -Did you mean Foo? +Did you mean type Foo? diff --git a/test/fail/ok/suggest-local.tc.ok b/test/fail/ok/suggest-local.tc.ok index 32fd135ebd6..9ddc338e23f 100644 --- a/test/fail/ok/suggest-local.tc.ok +++ b/test/fail/ok/suggest-local.tc.ok @@ -1,2 +1,2 @@ suggest-local.mo:2.1-2.2: type error [M0057], unbound variable x -Did you mean xxx? +Did you mean variable xxx? diff --git a/test/fail/ok/suggest-long.tc.ok b/test/fail/ok/suggest-long.tc.ok index e3df9481ae7..733a0b26080 100644 --- a/test/fail/ok/suggest-long.tc.ok +++ b/test/fail/ok/suggest-long.tc.ok @@ -1,259 +1,2 @@ -suggest-long.mo:3.1-3.5: type error [M0072], field stableM does not exist in type - module { - type ErrorCode = - { - #call_error : {err_code : Nat32}; - #canister_error; - #canister_reject; - #destination_invalid; - #future : Nat32; - #system_fatal; - #system_transient - }; - Array_init : (Nat, T) -> [var T]; - Array_tabulate : (Nat, Nat -> T) -> [T]; - Ret : () -> T; - Types : - module { - type Any = Any; - type Blob = Blob; - type Bool = Bool; - type Char = Char; - type Error = Error; - type Float = Float; - type Int = Int; - type Int16 = Int16; - type Int32 = Int32; - type Int64 = Int64; - type Int8 = Int8; - type Nat = Nat; - type Nat16 = Nat16; - type Nat32 = Nat32; - type Nat64 = Nat64; - type Nat8 = Nat8; - type None = None; - type Null = Null; - type Principal = Principal; - type Region = Region; - type Text = Text - }; - abs : Int -> Nat; - arccos : Float -> Float; - arcsin : Float -> Float; - arctan : Float -> Float; - arctan2 : (Float, Float) -> Float; - arrayMutToBlob : [var Nat8] -> Blob; - arrayToBlob : [Nat8] -> Blob; - blobCompare : (Blob, Blob) -> Int8; - blobOfPrincipal : Principal -> Blob; - blobToArray : Blob -> [Nat8]; - blobToArrayMut : Blob -> [var Nat8]; - btstInt16 : (Int16, Int16) -> Bool; - btstInt32 : (Int32, Int32) -> Bool; - btstInt64 : (Int64, Int64) -> Bool; - btstInt8 : (Int8, Int8) -> Bool; - btstNat16 : (Nat16, Nat16) -> Bool; - btstNat32 : (Nat32, Nat32) -> Bool; - btstNat64 : (Nat64, Nat64) -> Bool; - btstNat8 : (Nat8, Nat8) -> Bool; - call_raw : (Principal, Text, Blob) -> async Blob; - cancelTimer : Nat -> (); - canisterVersion : () -> Nat64; - charIsAlphabetic : Char -> Bool; - charIsLowercase : Char -> Bool; - charIsUppercase : Char -> Bool; - charIsWhitespace : Char -> Bool; - charToLower : Char -> Char; - charToNat32 : Char -> Nat32; - charToText : Char -> Text; - charToUpper : Char -> Char; - clzInt16 : Int16 -> Int16; - clzInt32 : Int32 -> Int32; - clzInt64 : Int64 -> Int64; - clzInt8 : Int8 -> Int8; - clzNat16 : Nat16 -> Nat16; - clzNat32 : Nat32 -> Nat32; - clzNat64 : Nat64 -> Nat64; - clzNat8 : Nat8 -> Nat8; - cos : Float -> Float; - createActor : (Blob, Blob) -> async Principal; - ctzInt16 : Int16 -> Int16; - ctzInt32 : Int32 -> Int32; - ctzInt64 : Int64 -> Int64; - ctzInt8 : Int8 -> Int8; - ctzNat16 : Nat16 -> Nat16; - ctzNat32 : Nat32 -> Nat32; - ctzNat64 : Nat64 -> Nat64; - ctzNat8 : Nat8 -> Nat8; - cyclesAccept : Nat -> Nat; - cyclesAdd : Nat -> (); - cyclesAvailable : () -> Nat; - cyclesBalance : () -> Nat; - cyclesBurn : Nat -> Nat; - cyclesRefunded : () -> Nat; - debugPrint : Text -> (); - debugPrintChar : Char -> (); - debugPrintInt : Int -> (); - debugPrintNat : Nat -> (); - decodeUtf8 : Blob -> ?Text; - encodeUtf8 : Text -> Blob; - error : Text -> Error; - errorCode : Error -> ErrorCode; - errorMessage : Error -> Text; - exists : (T -> Bool) -> Bool; - exp : Float -> Float; - floatAbs : Float -> Float; - floatCeil : Float -> Float; - floatCopySign : (Float, Float) -> Float; - floatFloor : Float -> Float; - floatMax : (Float, Float) -> Float; - floatMin : (Float, Float) -> Float; - floatNearest : Float -> Float; - floatSqrt : Float -> Float; - floatToFormattedText : (Float, Nat8, Nat8) -> Text; - floatToInt : Float -> Int; - floatToInt64 : Float -> Int64; - floatToText : Float -> Text; - floatTrunc : Float -> Float; - forall : (T -> Bool) -> Bool; - getCandidLimits : - () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; - getCertificate : () -> ?Blob; - hashBlob : Blob -> Nat32; - idlHash : Text -> Nat32; - int16ToInt : Int16 -> Int; - int16ToInt32 : Int16 -> Int32; - int16ToInt8 : Int16 -> Int8; - int16ToNat16 : Int16 -> Nat16; - int32ToInt : Int32 -> Int; - int32ToInt16 : Int32 -> Int16; - int32ToInt64 : Int32 -> Int64; - int32ToNat32 : Int32 -> Nat32; - int64ToFloat : Int64 -> Float; - int64ToInt : Int64 -> Int; - int64ToInt32 : Int64 -> Int32; - int64ToNat64 : Int64 -> Nat64; - int8ToInt : Int8 -> Int; - int8ToInt16 : Int8 -> Int16; - int8ToNat8 : Int8 -> Nat8; - intToFloat : Int -> Float; - intToInt16 : Int -> Int16; - intToInt16Wrap : Int -> Int16; - intToInt32 : Int -> Int32; - intToInt32Wrap : Int -> Int32; - intToInt64 : Int -> Int64; - intToInt64Wrap : Int -> Int64; - intToInt8 : Int -> Int8; - intToInt8Wrap : Int -> Int8; - intToNat16Wrap : Int -> Nat16; - intToNat32Wrap : Int -> Nat32; - intToNat64Wrap : Int -> Nat64; - intToNat8Wrap : Int -> Nat8; - isController : Principal -> Bool; - log : Float -> Float; - nat16ToInt16 : Nat16 -> Int16; - nat16ToNat : Nat16 -> Nat; - nat16ToNat32 : Nat16 -> Nat32; - nat16ToNat8 : Nat16 -> Nat8; - nat32ToChar : Nat32 -> Char; - nat32ToInt32 : Nat32 -> Int32; - nat32ToNat : Nat32 -> Nat; - nat32ToNat16 : Nat32 -> Nat16; - nat32ToNat64 : Nat32 -> Nat64; - nat64ToInt64 : Nat64 -> Int64; - nat64ToNat : Nat64 -> Nat; - nat64ToNat32 : Nat64 -> Nat32; - nat8ToInt8 : Nat8 -> Int8; - nat8ToNat : Nat8 -> Nat; - nat8ToNat16 : Nat8 -> Nat16; - natToNat16 : Nat -> Nat16; - natToNat32 : Nat -> Nat32; - natToNat64 : Nat -> Nat64; - natToNat8 : Nat -> Nat8; - performanceCounter : Nat32 -> Nat64; - popcntInt16 : Int16 -> Int16; - popcntInt32 : Int32 -> Int32; - popcntInt64 : Int64 -> Int64; - popcntInt8 : Int8 -> Int8; - popcntNat16 : Nat16 -> Nat16; - popcntNat32 : Nat32 -> Nat32; - popcntNat64 : Nat64 -> Nat64; - popcntNat8 : Nat8 -> Nat8; - principalOfActor : (actor {}) -> Principal; - principalOfBlob : Blob -> Principal; - regionGrow : (Region, Nat64) -> Nat64; - regionId : Region -> Nat; - regionLoadBlob : (Region, Nat64, Nat) -> Blob; - regionLoadFloat : (Region, Nat64) -> Float; - regionLoadInt16 : (Region, Nat64) -> Int16; - regionLoadInt32 : (Region, Nat64) -> Int32; - regionLoadInt64 : (Region, Nat64) -> Int64; - regionLoadInt8 : (Region, Nat64) -> Int8; - regionLoadNat16 : (Region, Nat64) -> Nat16; - regionLoadNat32 : (Region, Nat64) -> Nat32; - regionLoadNat64 : (Region, Nat64) -> Nat64; - regionLoadNat8 : (Region, Nat64) -> Nat8; - regionNew : () -> Region; - regionSize : Region -> Nat64; - regionStoreBlob : (Region, Nat64, Blob) -> (); - regionStoreFloat : (Region, Nat64, Float) -> (); - regionStoreInt16 : (Region, Nat64, Int16) -> (); - regionStoreInt32 : (Region, Nat64, Int32) -> (); - regionStoreInt64 : (Region, Nat64, Int64) -> (); - regionStoreInt8 : (Region, Nat64, Int8) -> (); - regionStoreNat16 : (Region, Nat64, Nat16) -> (); - regionStoreNat32 : (Region, Nat64, Nat32) -> (); - regionStoreNat64 : (Region, Nat64, Nat64) -> (); - regionStoreNat8 : (Region, Nat64, Nat8) -> (); - rts_callback_table_count : () -> Nat; - rts_callback_table_size : () -> Nat; - rts_collector_instructions : () -> Nat; - rts_heap_size : () -> Nat; - rts_logical_stable_memory_size : () -> Nat; - rts_max_live_size : () -> Nat; - rts_max_stack_size : () -> Nat; - rts_memory_size : () -> Nat; - rts_mutator_instructions : () -> Nat; - rts_reclaimed : () -> Nat; - rts_stable_memory_size : () -> Nat; - rts_total_allocation : () -> Nat; - rts_upgrade_instructions : () -> Nat; - rts_version : () -> Text; - setCandidLimits : - {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); - setCertifiedData : Blob -> (); - setTimer : (Nat64, Bool, () -> async ()) -> Nat; - shiftLeft : (Nat, Nat32) -> Nat; - shiftRight : (Nat, Nat32) -> Nat; - sin : Float -> Float; - stableMemoryGrow : Nat64 -> Nat64; - stableMemoryLoadBlob : (Nat64, Nat) -> Blob; - stableMemoryLoadFloat : Nat64 -> Float; - stableMemoryLoadInt16 : Nat64 -> Int16; - stableMemoryLoadInt32 : Nat64 -> Int32; - stableMemoryLoadInt64 : Nat64 -> Int64; - stableMemoryLoadInt8 : Nat64 -> Int8; - stableMemoryLoadNat16 : Nat64 -> Nat16; - stableMemoryLoadNat32 : Nat64 -> Nat32; - stableMemoryLoadNat64 : Nat64 -> Nat64; - stableMemoryLoadNat8 : Nat64 -> Nat8; - stableMemorySize : () -> Nat64; - stableMemoryStoreBlob : (Nat64, Blob) -> (); - stableMemoryStoreFloat : (Nat64, Float) -> (); - stableMemoryStoreInt16 : (Nat64, Int16) -> (); - stableMemoryStoreInt32 : (Nat64, Int32) -> (); - stableMemoryStoreInt64 : (Nat64, Int64) -> (); - stableMemoryStoreInt8 : (Nat64, Int8) -> (); - stableMemoryStoreNat16 : (Nat64, Nat16) -> (); - stableMemoryStoreNat32 : (Nat64, Nat32) -> (); - stableMemoryStoreNat64 : (Nat64, Nat64) -> (); - stableMemoryStoreNat8 : (Nat64, Nat8) -> (); - stableVarQuery : () -> shared query () -> async {size : Nat64}; - tan : Float -> Float; - textCompare : (Text, Text) -> Int8; - textLowercase : Text -> Text; - textUppercase : Text -> Text; - time : () -> Nat64; - trap : Text -> None - } -Did you mean stableMemoryGrow, stableMemorySize, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? +suggest-long.mo:3.1-3.5: type error [M0072], field stableM does not exist in module. +Did you mean field stableMemoryGrow, stableMemorySize, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? diff --git a/test/fail/ok/suggest-short.tc.ok b/test/fail/ok/suggest-short.tc.ok index d0739510565..c2166ac4774 100644 --- a/test/fail/ok/suggest-short.tc.ok +++ b/test/fail/ok/suggest-short.tc.ok @@ -1,259 +1,2 @@ -suggest-short.mo:3.1-3.5: type error [M0072], field s does not exist in type - module { - type ErrorCode = - { - #call_error : {err_code : Nat32}; - #canister_error; - #canister_reject; - #destination_invalid; - #future : Nat32; - #system_fatal; - #system_transient - }; - Array_init : (Nat, T) -> [var T]; - Array_tabulate : (Nat, Nat -> T) -> [T]; - Ret : () -> T; - Types : - module { - type Any = Any; - type Blob = Blob; - type Bool = Bool; - type Char = Char; - type Error = Error; - type Float = Float; - type Int = Int; - type Int16 = Int16; - type Int32 = Int32; - type Int64 = Int64; - type Int8 = Int8; - type Nat = Nat; - type Nat16 = Nat16; - type Nat32 = Nat32; - type Nat64 = Nat64; - type Nat8 = Nat8; - type None = None; - type Null = Null; - type Principal = Principal; - type Region = Region; - type Text = Text - }; - abs : Int -> Nat; - arccos : Float -> Float; - arcsin : Float -> Float; - arctan : Float -> Float; - arctan2 : (Float, Float) -> Float; - arrayMutToBlob : [var Nat8] -> Blob; - arrayToBlob : [Nat8] -> Blob; - blobCompare : (Blob, Blob) -> Int8; - blobOfPrincipal : Principal -> Blob; - blobToArray : Blob -> [Nat8]; - blobToArrayMut : Blob -> [var Nat8]; - btstInt16 : (Int16, Int16) -> Bool; - btstInt32 : (Int32, Int32) -> Bool; - btstInt64 : (Int64, Int64) -> Bool; - btstInt8 : (Int8, Int8) -> Bool; - btstNat16 : (Nat16, Nat16) -> Bool; - btstNat32 : (Nat32, Nat32) -> Bool; - btstNat64 : (Nat64, Nat64) -> Bool; - btstNat8 : (Nat8, Nat8) -> Bool; - call_raw : (Principal, Text, Blob) -> async Blob; - cancelTimer : Nat -> (); - canisterVersion : () -> Nat64; - charIsAlphabetic : Char -> Bool; - charIsLowercase : Char -> Bool; - charIsUppercase : Char -> Bool; - charIsWhitespace : Char -> Bool; - charToLower : Char -> Char; - charToNat32 : Char -> Nat32; - charToText : Char -> Text; - charToUpper : Char -> Char; - clzInt16 : Int16 -> Int16; - clzInt32 : Int32 -> Int32; - clzInt64 : Int64 -> Int64; - clzInt8 : Int8 -> Int8; - clzNat16 : Nat16 -> Nat16; - clzNat32 : Nat32 -> Nat32; - clzNat64 : Nat64 -> Nat64; - clzNat8 : Nat8 -> Nat8; - cos : Float -> Float; - createActor : (Blob, Blob) -> async Principal; - ctzInt16 : Int16 -> Int16; - ctzInt32 : Int32 -> Int32; - ctzInt64 : Int64 -> Int64; - ctzInt8 : Int8 -> Int8; - ctzNat16 : Nat16 -> Nat16; - ctzNat32 : Nat32 -> Nat32; - ctzNat64 : Nat64 -> Nat64; - ctzNat8 : Nat8 -> Nat8; - cyclesAccept : Nat -> Nat; - cyclesAdd : Nat -> (); - cyclesAvailable : () -> Nat; - cyclesBalance : () -> Nat; - cyclesBurn : Nat -> Nat; - cyclesRefunded : () -> Nat; - debugPrint : Text -> (); - debugPrintChar : Char -> (); - debugPrintInt : Int -> (); - debugPrintNat : Nat -> (); - decodeUtf8 : Blob -> ?Text; - encodeUtf8 : Text -> Blob; - error : Text -> Error; - errorCode : Error -> ErrorCode; - errorMessage : Error -> Text; - exists : (T -> Bool) -> Bool; - exp : Float -> Float; - floatAbs : Float -> Float; - floatCeil : Float -> Float; - floatCopySign : (Float, Float) -> Float; - floatFloor : Float -> Float; - floatMax : (Float, Float) -> Float; - floatMin : (Float, Float) -> Float; - floatNearest : Float -> Float; - floatSqrt : Float -> Float; - floatToFormattedText : (Float, Nat8, Nat8) -> Text; - floatToInt : Float -> Int; - floatToInt64 : Float -> Int64; - floatToText : Float -> Text; - floatTrunc : Float -> Float; - forall : (T -> Bool) -> Bool; - getCandidLimits : - () -> {bias : Nat32; denominator : Nat32; numerator : Nat32}; - getCertificate : () -> ?Blob; - hashBlob : Blob -> Nat32; - idlHash : Text -> Nat32; - int16ToInt : Int16 -> Int; - int16ToInt32 : Int16 -> Int32; - int16ToInt8 : Int16 -> Int8; - int16ToNat16 : Int16 -> Nat16; - int32ToInt : Int32 -> Int; - int32ToInt16 : Int32 -> Int16; - int32ToInt64 : Int32 -> Int64; - int32ToNat32 : Int32 -> Nat32; - int64ToFloat : Int64 -> Float; - int64ToInt : Int64 -> Int; - int64ToInt32 : Int64 -> Int32; - int64ToNat64 : Int64 -> Nat64; - int8ToInt : Int8 -> Int; - int8ToInt16 : Int8 -> Int16; - int8ToNat8 : Int8 -> Nat8; - intToFloat : Int -> Float; - intToInt16 : Int -> Int16; - intToInt16Wrap : Int -> Int16; - intToInt32 : Int -> Int32; - intToInt32Wrap : Int -> Int32; - intToInt64 : Int -> Int64; - intToInt64Wrap : Int -> Int64; - intToInt8 : Int -> Int8; - intToInt8Wrap : Int -> Int8; - intToNat16Wrap : Int -> Nat16; - intToNat32Wrap : Int -> Nat32; - intToNat64Wrap : Int -> Nat64; - intToNat8Wrap : Int -> Nat8; - isController : Principal -> Bool; - log : Float -> Float; - nat16ToInt16 : Nat16 -> Int16; - nat16ToNat : Nat16 -> Nat; - nat16ToNat32 : Nat16 -> Nat32; - nat16ToNat8 : Nat16 -> Nat8; - nat32ToChar : Nat32 -> Char; - nat32ToInt32 : Nat32 -> Int32; - nat32ToNat : Nat32 -> Nat; - nat32ToNat16 : Nat32 -> Nat16; - nat32ToNat64 : Nat32 -> Nat64; - nat64ToInt64 : Nat64 -> Int64; - nat64ToNat : Nat64 -> Nat; - nat64ToNat32 : Nat64 -> Nat32; - nat8ToInt8 : Nat8 -> Int8; - nat8ToNat : Nat8 -> Nat; - nat8ToNat16 : Nat8 -> Nat16; - natToNat16 : Nat -> Nat16; - natToNat32 : Nat -> Nat32; - natToNat64 : Nat -> Nat64; - natToNat8 : Nat -> Nat8; - performanceCounter : Nat32 -> Nat64; - popcntInt16 : Int16 -> Int16; - popcntInt32 : Int32 -> Int32; - popcntInt64 : Int64 -> Int64; - popcntInt8 : Int8 -> Int8; - popcntNat16 : Nat16 -> Nat16; - popcntNat32 : Nat32 -> Nat32; - popcntNat64 : Nat64 -> Nat64; - popcntNat8 : Nat8 -> Nat8; - principalOfActor : (actor {}) -> Principal; - principalOfBlob : Blob -> Principal; - regionGrow : (Region, Nat64) -> Nat64; - regionId : Region -> Nat; - regionLoadBlob : (Region, Nat64, Nat) -> Blob; - regionLoadFloat : (Region, Nat64) -> Float; - regionLoadInt16 : (Region, Nat64) -> Int16; - regionLoadInt32 : (Region, Nat64) -> Int32; - regionLoadInt64 : (Region, Nat64) -> Int64; - regionLoadInt8 : (Region, Nat64) -> Int8; - regionLoadNat16 : (Region, Nat64) -> Nat16; - regionLoadNat32 : (Region, Nat64) -> Nat32; - regionLoadNat64 : (Region, Nat64) -> Nat64; - regionLoadNat8 : (Region, Nat64) -> Nat8; - regionNew : () -> Region; - regionSize : Region -> Nat64; - regionStoreBlob : (Region, Nat64, Blob) -> (); - regionStoreFloat : (Region, Nat64, Float) -> (); - regionStoreInt16 : (Region, Nat64, Int16) -> (); - regionStoreInt32 : (Region, Nat64, Int32) -> (); - regionStoreInt64 : (Region, Nat64, Int64) -> (); - regionStoreInt8 : (Region, Nat64, Int8) -> (); - regionStoreNat16 : (Region, Nat64, Nat16) -> (); - regionStoreNat32 : (Region, Nat64, Nat32) -> (); - regionStoreNat64 : (Region, Nat64, Nat64) -> (); - regionStoreNat8 : (Region, Nat64, Nat8) -> (); - rts_callback_table_count : () -> Nat; - rts_callback_table_size : () -> Nat; - rts_collector_instructions : () -> Nat; - rts_heap_size : () -> Nat; - rts_logical_stable_memory_size : () -> Nat; - rts_max_live_size : () -> Nat; - rts_max_stack_size : () -> Nat; - rts_memory_size : () -> Nat; - rts_mutator_instructions : () -> Nat; - rts_reclaimed : () -> Nat; - rts_stable_memory_size : () -> Nat; - rts_total_allocation : () -> Nat; - rts_upgrade_instructions : () -> Nat; - rts_version : () -> Text; - setCandidLimits : - {bias : Nat32; denominator : Nat32; numerator : Nat32} -> (); - setCertifiedData : Blob -> (); - setTimer : (Nat64, Bool, () -> async ()) -> Nat; - shiftLeft : (Nat, Nat32) -> Nat; - shiftRight : (Nat, Nat32) -> Nat; - sin : Float -> Float; - stableMemoryGrow : Nat64 -> Nat64; - stableMemoryLoadBlob : (Nat64, Nat) -> Blob; - stableMemoryLoadFloat : Nat64 -> Float; - stableMemoryLoadInt16 : Nat64 -> Int16; - stableMemoryLoadInt32 : Nat64 -> Int32; - stableMemoryLoadInt64 : Nat64 -> Int64; - stableMemoryLoadInt8 : Nat64 -> Int8; - stableMemoryLoadNat16 : Nat64 -> Nat16; - stableMemoryLoadNat32 : Nat64 -> Nat32; - stableMemoryLoadNat64 : Nat64 -> Nat64; - stableMemoryLoadNat8 : Nat64 -> Nat8; - stableMemorySize : () -> Nat64; - stableMemoryStoreBlob : (Nat64, Blob) -> (); - stableMemoryStoreFloat : (Nat64, Float) -> (); - stableMemoryStoreInt16 : (Nat64, Int16) -> (); - stableMemoryStoreInt32 : (Nat64, Int32) -> (); - stableMemoryStoreInt64 : (Nat64, Int64) -> (); - stableMemoryStoreInt8 : (Nat64, Int8) -> (); - stableMemoryStoreNat16 : (Nat64, Nat16) -> (); - stableMemoryStoreNat32 : (Nat64, Nat32) -> (); - stableMemoryStoreNat64 : (Nat64, Nat64) -> (); - stableMemoryStoreNat8 : (Nat64, Nat8) -> (); - stableVarQuery : () -> shared query () -> async {size : Nat64}; - tan : Float -> Float; - textCompare : (Text, Text) -> Int8; - textLowercase : Text -> Text; - textUppercase : Text -> Text; - time : () -> Nat64; - trap : Text -> None - } -Did you mean sin, setTimer, shiftLeft, shiftRight, stableVarQuery, setCandidLimits, setCertifiedData, stableMemoryGrow, stableMemorySize, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? +suggest-short.mo:3.1-3.5: type error [M0072], field s does not exist in module. +Did you mean field sin, setTimer, shiftLeft, shiftRight, stableVarQuery, setCandidLimits, setCertifiedData, stableMemoryGrow, stableMemorySize, stableMemoryLoadBlob, stableMemoryLoadInt8, stableMemoryLoadNat8, stableMemoryLoadFloat, stableMemoryLoadInt16, stableMemoryLoadInt32, stableMemoryLoadInt64, stableMemoryLoadNat16, stableMemoryLoadNat32, stableMemoryLoadNat64, stableMemoryStoreBlob, stableMemoryStoreInt8, stableMemoryStoreNat8, stableMemoryStoreFloat, stableMemoryStoreInt16, stableMemoryStoreInt32, stableMemoryStoreInt64, stableMemoryStoreNat16, stableMemoryStoreNat32 or stableMemoryStoreNat64? diff --git a/test/fail/ok/suggest-type.tc.ok b/test/fail/ok/suggest-type.tc.ok index 17ecd4a69af..1333e4eaceb 100644 --- a/test/fail/ok/suggest-type.tc.ok +++ b/test/fail/ok/suggest-type.tc.ok @@ -22,4 +22,3 @@ suggest-type.mo:3.21-3.24: type error [M0030], type field Num does not exist in type Region = Region; type Text = Text } -Did you mean Nat or Null? diff --git a/test/fail/ok/type-comp.tc.ok b/test/fail/ok/type-comp.tc.ok index b7a654f03bf..5da39f6b33c 100644 --- a/test/fail/ok/type-comp.tc.ok +++ b/test/fail/ok/type-comp.tc.ok @@ -8,5 +8,4 @@ type-comp.mo:14.41-14.43: type error [M0046], type argument does not match parameter bound {} type-comp.mo:20.38-20.43: type error [M0029], unbound type Bogus -Did you mean Bool? type-comp.mo:28.28-28.49: type error [M0137], type Open = (A__18, B) references type parameter A__18 from an outer scope