当我从协议实现中调用多方法时,我收到了一个长的错误信息。
包含错误输出的最小工作示例
https://github.com/exi/core-typed-errors
代码
(ns example.core
(:import java.io.File)
(:require [clojure.core.typed :as t]))
(declare dispatcher)
(t/ann-protocol MProto
myfn (t/IFn [MProto File -> String]))
(defprotocol MProto
(myfn [this obj]))
(t/ann-record MRec [name :- String])
(defrecord MRec [name]
MProto
(myfn [this obj] (dispatcher this obj)))
(t/ann dispatcher (t/IFn [MRec File -> String]))
(defmulti dispatcher (fn [rec obj] (class obj)))
(defmethod dispatcher
File
[rec obj]
(:name rec))
(defn -main [& args]
(let [rec (MRec. "myname")
file (File. ".")]
(when (not (nil? file))
(println (myfn rec file)))))
错误信息
初始化core.typed ...
构建core.typed基础环境 ...
已完成基础环境的构建
"已用时间: 3564.305528毫秒"
core.typed已初始化。
开始收集example.core
已完成example.core的收集
已收集1个命名空间,耗时681.706266毫秒
不检查clojure.core.typed(不依赖于clojure.core.typed)
开始检查example.core
nil 未检查example.core/MProto定义
13: 未检查example.core/->MRec定义
已检查example.core,耗时1019.900549毫秒
WARNING: 类型检查器:定义缺失:clojure.core/assert-same-protocol
提示:如果这是一个未检查的变量,请使用:no-check元数据与ann
WARNING: 类型检查器:定义缺失:clojure.core/-cache-protocol-fn
提示:如果这是一个未检查的变量,请使用:no-check元数据与ann
WARNING: 类型检查器:定义缺失:clojure.core/-reset-methods
提示:如果这是一个未检查的变量,请使用:no-check元数据与ann
已检查2个命名空间,耗时1717.619162毫秒
类型错误 (example/core.clj:9:1) 多态函数 clojure.core/alter-meta! 无法应用于参数
多态变量
b
域
clojure.lang.IReference [(t/U nil (IPersistentMap t/Any t/Any)) b ... b -> (t/U nil (IPersistentMap t/Any t/Any))] b ... b
参数
(Var t/Any t/Any) (t/All [b c d] (t/IFn [(t/Map b c) b c -> (t/Map b c)] [(t/Vec d) t/AnyInteger d -> (t/Vec d)])) (t/Val :doc) nil
范围
(t/U nil (IPersistentMap t/Any t/Any))
in: (clojure.core/alter-meta! (var example.core/MProto) clojure.core/assoc :doc nil)
in: (clojure.core/alter-meta! (var example.core/MProto) clojure.core/assoc :doc nil)
类型错误 (example/core.clj:9:1) 未声明的变量引用:clojure.core/assert-same-protocol
提示:通过check-ns或cf添加对 clojure.core/assert-same-protocol 的注解
输入: (var clojure.core/assert-same-protocol)
类型错误(example/core.clj)不能在类型 clojure.core.typed/Any 上调用实例方法 example.core.MProto/myfn
在: (.myfn gf__this__763 gf__obj__764)
类型错误(example/core.clj)实例方法 example.core.MProto/myfn 无法应用于参数
域
对象
参数
t/Any
范围
(t/U nil Object)
在: (.myfn gf__this__763 gf__obj__764)
在: (.myfn gf__this__763 gf__obj__764)
类型错误(example/core.clj)实例字段 __methodImplCache expected clojure.lang.AFunction, 实际 [clojure.core.typed/Any clojure.core.typed/Any -> clojure.core.typed/Any]
在: (.-__methodImplCache G__753)
类型错误(example/core.clj)静态方法 clojure.lang.Util/classOf 无法应用于参数
域
对象
参数
t/Any
范围
(t/U nil Class)
在: (clojure.lang.Util/classOf gf__this__766)
在: (clojure.lang.Util/classOf gf__this__766)
类型错误(example/core.clj)无法在类型 (clojure.core.typed/U nil clojure.lang.MethodImplCache) 上调用实例方法 clojure.lang.MethodImplCache/fnFor
在: (.fnFor cache__5915__auto__ (clojure.lang.Util/classOf gf__this__766))
类型错误(example/core.clj)无法调用类型: IFn
在: (f__5916__auto__ gf__this__766 gf__obj__767)
类型错误(example/core.clj)未注解的变量 clojure.core/-cache-protocol-fn
提示:通过 check-ns 或 cf 为 clojure.core/-cache-protocol-fn 添加注解
在: clojure.core/-cache-protocol-fn
类型错误(example/core.clj)实例字段 __methodImplCache expected clojure.lang.AFunction, 实际 [clojure.core.typed/Any clojure.core.typed/Any -> Error]
在: (.-__methodImplCache f__5918__auto__)
类型错误(example/core.clj)类型不匹配
期望: (t/U nil MethodImplCache)
实际: t/Any
在: cache__5917__auto__
类型错误(example/core.clj:9:1)多态函数 clojure.core/alter-var-root 无法应用于参数
多态变量
w
r
b
域
(t/Var2 w r) [r b ... b -> w] b ... b
参数
(Var t/Any t/Any) (t/All [k v] (t/IFn [nil * -> nil] [(clojure.lang.IPersistentMap k v) (clojure.lang.IPersistentMap k v) * -> (clojure.lang.IPersistentMap k v)] [(t/Option (clojure.lang.IPersistentMap k v)) * -> (t/Option (clojure.lang.IPersistentMap k v))])) (t/HMap :mandatory {:method-builders (APersistentMap (t/Var2 t/Nothing t/Any) [t/Any -> [t/Any t/Any -> Error] :filters {:then tt, :else ff}]), :method-map (t/HMap :mandatory {:myfn (t/Val :myfn)} :complete? true), :var (Var t/Any t/Any), :sigs (t/HMap :mandatory {:myfn (t/HMap :mandatory {:file (t/Val "example/core.clj"), :line (t/Val 10), :column (t/Val 4), :end-line (t/Val 10), :end-column (t/Val 9), :name (t/Val myfn), :arglists (ISeq (t/HVec [(t/Val this) (t/Val obj)])))), :complete? true)} :complete? true), :on (t/Val example.core.MProto), :on-interface (t/Val example.core.MProto)} :complete? true)
范围
w
在: (clojure.core/alter-var-root (var example.core/MProto) clojure.core/merge (clojure.core/assoc {:on (quote example.core.MProto), :on-interface example.core.MProto} :sigs (quote {:myfn {:doc nil, :arglists ([this obj]), :name myfn, :end-column 9, :end-line 10, :column 4, :line 10, :file "example/core.clj"}}) :var (var example.core/MProto) :method-map {:myfn :myfn} :method-builders {(clojure.core/intern clojure.core/*ns* (clojure.core/with-meta (quote myfn) (clojure.core/merge (quote {:doc nil, :arglists ([this obj]), :name myfn, :end-column 9, :end-line 10, :column 4, :line 10, :file "example/core.clj"}) {:protocol (var example.core/MProto)}))) (fn* ([cache__5917__auto__] (let* [G__754 (fn* ([gf__this__763 gf__obj__764] (.myfn gf__this__763 gf__obj__764))) f__5918__auto__ (fn* G__753 ([gf__this__766 gf__obj__767] (let* [cache__5915__auto__ (.-__methodImplCache G__753) f__5916__auto__ (.fnFor cache__5915__auto__ (clojure.lang.Util/classOf gf__this__766))] (if f__5916__auto__ (f__5916__auto__ gf__this__766 gf__obj__767) ((clojure.core/-cache-protocol-fn G__753 gf__this__766 example.core.MProto G__754) gf__this__766 gf__obj__767)))))] (do (set! (.-__methodImplCache f__5918__auto__) cache__5917__auto__) f__5918__auto__))))}))
在: (clojure.core/alter-var-root (var example.core/MProto) clojure.core/merge (clojure.core/assoc {:on (quote example.core.MProto), :on-interface example.core.MProto} :sigs (quote {:myfn #}) :var (var example.core/MProto) ...))
类型错误(example/core.clj)未注解的变量 clojure.core/-reset-methods
提示:通过 check-ns 或 cf 为 clojure.core/-reset-methods 添加注解
在: clojure.core/-reset-methods
类型检查器:发现 13 个错误
发现错误
子进程失败