pub enum Kind {
Reflect,
Native,
Dispatch,
Callback,
Ambiguous,
}Expand description
SPEC §4 ⟨0.7⟩’s CLOSED FIVE-KIND unknownWhy VOCABULARY, as a TABLE — and the single place this
engine SPELLS a reason, not merely the single place it reads one.
SOUNDNESS R490. ReasonClass::classify below has carried the note “THIS IS THE ONLY PLACE THIS
ENGINE HOLDS SPEC §4’s KIND VOCABULARY” since ⟨0.24⟩, and it was true of the READER and false of the
WRITERS: the nightly dylint lint at the repo root is a SECOND PRODUCER publishing into
.candor/baseline.candor.Cdylib.json, and it had drifted in three kinds (generic-iter:,
iter-combinator:, deref:) and two details. That is the hazard classify’s own comment describes,
one repo over and in the direction it was not looking.
SO THIS TABLE IS WHAT BOTH HALVES READ. classify matches on Kind::token() rather than on its own
copy of the five strings, so adding, renaming or removing a kind moves the classifier and the
producers in the same edit — the JVM engine’s failure (a correct classify beside a typed Kind
enum missing ambiguous, one token with two answers inside one engine) is not reachable from here.
It is NOT a closed set for PARSING. §2 forward-compatibility lets a producer emit a kind this
version has never heard of, and classify’s catch-all is what keeps such a kind inside
Unknown[*] / Unknown[dynamic]. This type constrains what THIS ENGINE WRITES.
Variants§
Reflect
invocation chosen at runtime by name/metadata — reflection, Method.invoke, eval
Native
a boundary to code the engine cannot analyse — native methods, FFI/extern, intrinsics
Dispatch
an unresolved virtual / interface / protocol dispatch with a resolvable owner type + member
Callback
an unresolved higher-order / owner-less invocation over a function/closure VALUE — §4 names the shapes: param, field, bound, computed, opaque-iterable
Ambiguous
⟨0.24⟩ the analyser’s OWN name resolution was ambiguous — two or more separately-written definitions competing for one name, so no owner could be formed at all
Implementations§
Source§impl Kind
impl Kind
Sourcepub const ALL: [Kind; 5]
pub const ALL: [Kind; 5]
The five, in a form a census can iterate. classify and the source-hygiene census both read
THIS, so neither can hold its own list.
Sourcepub fn token(self) -> &'static str
pub fn token(self) -> &'static str
The §4 kind token — the part before the first :, and the part every gate reads.
Sourcepub fn class(self) -> ReasonClass
pub fn class(self) -> ReasonClass
SPEC §6.2’s projection of this kind onto a policy CLASS. ambiguous projects to dispatch:
§6.2’s table has named ambiguous* since ⟨0.19⟩, and reclassifying it to indirect was measured
to take deny E Unknown[dispatch] from 58 of 200 crates to 0 of 200.
Sourcepub fn reason(self, detail: &str) -> String
pub fn reason(self, detail: &str) -> String
Spell a §4 reason: kind:detail. The detail is best-effort for every kind EXCEPT dispatch:
with an owner — use Kind::dispatch_on there, which is the normative shape.
⟨0.24⟩ A DOT-FREE dispatch: detail is not a defect: it is the RESERVED form for “no owner could
be formed at all”, free text, explicitly not conformance-compared. That is why this constructor
accepts one rather than forcing every caller through dispatch_on.
Sourcepub fn dispatch_on(owner: &str, member: &str) -> String
pub fn dispatch_on(owner: &str, member: &str) -> String
dispatch:<owner-type>.<member> — §4’s ONE normative detail, and the shape §3.1’s dispatch
frontier parses (possibleViaUnknownDispatch keys on the dot). The owner is passed as the type’s
own name, never as a language path: Store.put, not p::Store::put.