All files

src/compiler/module_signatures.panack

Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.

    1 import "module_resolution.panack"
    2 import "checker.panack"
    3 
    4 // Semantic tags never encode nominal identity as an inference-placeholder name.
    5 enum SignatureEffect { SignaturePure, SignatureOrdinary, SignatureAsync }
    6 enum SignatureTypeIdentity {
    7   SignatureCore(Str),
    8   SignatureNominal(DeclarationIdentity),
    9   SignatureParameter(DeclarationIdentity, Nat),
   10   SignatureCallable(SignatureEffect),
   11   // Body-local missing evidence; never a declaration name or a signature binder.
   12   SignatureHole(DeclarationIdentity, [Nat], Nat)
   13 }
   14 record SignatureType { identity: SignatureTypeIdentity, arguments: [SignatureType] }
   15 record SignatureSlot { name: Str, type: SignatureType }
   16 record ModuleSignature {
   17   binding: ModuleDeclarationBinding,
   18   parameters: [Str],
   19   slots: [SignatureSlot],
   20   effect: Option[SignatureEffect]
   21 }
   22 record CheckedModuleSignatures {
   23   declarations: [ModuleSignature],
   24   diagnostics: [Diagnostic]
   25 }
   26 
   27 pure signature_effect(is_pure: Bool, is_async: Bool): SignatureEffect {
   28   if is_async { SignatureAsync() } else { if is_pure { SignaturePure() } else { SignatureOrdinary() } }
   29 }
   30 
   31 pure signature_declaration(modules: [LoadedModule], identity: DeclarationIdentity): Result[TopLevel,Str] {
   32   mut found: Option[TopLevel] = None()
   33   for module in modules {
   34     if module.bindings.identity == identity.module {
   35       for declaration in module.parsed.program.declarations {
   36         name: Str = match declaration {
   37           ImportDeclaration(path) => "", TypeDeclaration(name, base, guard) => name,
   38           RecordDeclaration(name, parameters, fields) => name, EnumDeclaration(name, parameters, variants) => name,
   39           FunctionDeclaration(name, parameters, result, pure_flag, async_flag, body, types) => name
   40         }
   41         if name == identity.name { found = Some(declaration) }
   42       }
   43     }
   44   }
   45   match found { Some(declaration) => Ok(declaration), None() => Error("missing signature declaration " + identity.module.path + ":" + identity.name) }
   46 }
   47 
   48 // Reachability is by original identity, not the spelling chosen in a signature.
   49 // Thus an explicit public re-export can expose an otherwise private import alias.
   50 pure signature_public_identity(graph: ModuleBindingGraph, owner: ModuleIdentity, identity: DeclarationIdentity, visited: [ModuleIdentity]): Bool {
   51   mut reachable: Bool = identity.module == ModuleIdentity(ToolchainModulePackage(), "core.panack") && (identity.name == "Option" || identity.name == "Result")
   52   if !reachable && !module_identity_in(visited, owner) {
   53     match binding_graph_module(graph, owner) {
   54       Error(message) => {},
   55       Ok(module) => {
   56         for binding in module.declarations {
   57           if binding.is_public && binding.identity == identity { reachable = true }
   58         }
   59         mut index: Nat = 0
   60         for imported in module.imports {
   61           if imported.is_public {
   62             match binding_graph_target(graph, owner, index) {
   63               Error(message) => {},
   64               Ok(target) => {
   65                 for selector in module_import_names(imported) {
   66                   if selector.name == "" {
   67                     reachable = reachable || signature_public_identity(graph, target, identity, append(visited, owner))
   68                   } else {
   69                     match resolve_module_path_inner(graph, target, selector.name, true, []) {
   70                       Error(message) => {},
   71                       Ok(resolved) => match resolved {
   72                         DeclarationTarget(binding) => { reachable = reachable || binding.identity == identity },
   73                         NamespaceTarget(namespace) => { reachable = reachable || signature_public_identity(graph, namespace, identity, append(visited, owner)) }
   74                       }
   75                     }
   76                   }
   77                 }
   78               }
   79             }
   80           }
   81           index = index + 1
   82         }
   83       }
   84     }
   85   }
   86   // Exporting an enum exposes its qualified constructors, but exporting only
   87   // one constructor does not expose the parent enum type.
   88   if !reachable {
   89     match binding_graph_module(graph, identity.module) {
   90       Error(message) => {},
   91       Ok(origin) => {
   92         for declaration in origin.declarations {
   93           if declaration.identity == identity {
   94             match declaration.kind {
   95               ModuleVariant(parent) => {
   96                 reachable = signature_public_identity(graph, owner, DeclarationIdentity(identity.module, parent), visited)
   97               },
   98               ModuleFunction() => {}, ModuleGuardedType() => {}, ModuleRecord() => {}, ModuleEnum() => {}
   99             }
  100           }
  101         }
  102       }
  103     }
  104   }
  105   reachable
  106 }
  107 
  108 pure signature_type(graph: ModuleBindingGraph, modules: [LoadedModule], owner: DeclarationIdentity, parameters: [Str], spelling: Str, exported: Bool, allow_void: Bool): Result[SignatureType,Str] {
  109   shape: TypeShape = type_shape(spelling)
  110   mut head: SignatureTypeIdentity = SignatureCore(shape.base)
  111   mut arity: Nat = 0
  112   mut known: Bool = false
  113   mut callable: Bool = false
  114   mut failure: Option[Str] = None()
  115   mut index: Nat = 0
  116   for parameter in parameters {
  117     if parameter == shape.base { known = true; head = SignatureParameter(owner, index) }
  118     index = index + 1
  119   }
  120   if !known {
  121     known = is_scalar_base(shape.base) || shape.base == "Bytes" || shape.base == "Path" || shape.base == "Duration" || shape.base == "Instant"
  122     if shape.base == "Void" {
  123       known = true
  124       if !allow_void { failure = Some("Void is only valid as a function return type") }
  125     }
  126     if shape.base == "Array" || shape.base == "Set" || shape.base == "Option" { known = true; arity = 1 }
  127     if shape.base == "Map" || shape.base == "Result" { known = true; arity = 2 }
  128     if shape.base == "Fn" || shape.base == "PureFn" || shape.base == "AsyncFn" {
  129       known = true; callable = true; arity = len(shape.arguments)
  130       head = SignatureCallable(signature_effect(shape.base == "PureFn", shape.base == "AsyncFn"))
  131       if arity == 0 { failure = Some(shape.base + " expects at least a return type") }
  132     }
  133     if !known {
  134       match resolve_module_type(graph, owner.module, shape.base) {
  135         Error(message) => { failure = Some(message) },
  136         Ok(binding) => {
  137           head = SignatureNominal(binding.identity)
  138           implicit_core: Bool = binding.identity.module == ModuleIdentity(ToolchainModulePackage(), "core.panack") && (binding.identity.name == "Option" || binding.identity.name == "Result")
  139           if implicit_core {
  140             head = SignatureCore(binding.identity.name)
  141           }
  142           if exported && !implicit_core && !signature_public_identity(graph, owner.module, binding.identity, []) {
  143             failure = Some("public signature exposes inaccessible type " + shape.base + " from " + binding.identity.module.path)
  144           }
  145           match signature_declaration(modules, binding.identity) {
  146             Error(message) => { failure = Some(message) },
  147             Ok(declaration) => match declaration {
  148               RecordDeclaration(name, types, fields) => { arity = len(types) },
  149               EnumDeclaration(name, types, variants) => { arity = len(types) },
  150               TypeDeclaration(name, base, guard) => {},
  151               ImportDeclaration(path) => { failure = Some("import is not a nominal type") },
  152               FunctionDeclaration(name, values, result, pure_flag, async_flag, body, types) => { failure = Some("function is not a nominal type") }
  153             }
  154           }
  155         }
  156       }
  157     }
  158   }
  159   if len(shape.arguments) != arity { failure = Some(shape.base + " has incorrect type argument count") }
  160   mut arguments: [SignatureType] = []
  161   index = 0
  162   for argument in shape.arguments {
  163     return_slot: Bool = callable && shape.base != "AsyncFn" && index + 1 == len(shape.arguments)
  164     match signature_type(graph, modules, owner, parameters, argument, exported, return_slot) {
  165       Error(message) => { if failure == None() { failure = Some(message) } },
  166       Ok(resolved) => { arguments = append(arguments, resolved) }
  167     }
  168     index = index + 1
  169   }
  170   match failure { Some(message) => Error(message), None() => Ok(SignatureType(head, arguments)) }
  171 }
  172 
  173 // Substitution uses the binder's tagged identity, not another module's spelling.
  174 pure substitute_signature_type(value: SignatureType, owner: DeclarationIdentity, arguments: [SignatureType]): Result[SignatureType,Str] {
  175   mut replacement: Option[SignatureType] = None()
  176   mut failure: Option[Str] = None()
  177   match value.identity {
  178     SignatureParameter(binder, index) => {
  179       if binder == owner {
  180         if index < len(arguments) { replacement = Some(arguments[index]) }
  181         else { failure = Some("missing signature substitution") }
  182       }
  183     },
  184     SignatureCore(name) => {}, SignatureNominal(identity) => {}, SignatureCallable(effect) => {}, SignatureHole(binder, path, index) => {}
  185   }
  186   mut nested: [SignatureType] = []
  187   for child in value.arguments {
  188     match substitute_signature_type(child, owner, arguments) {
  189       Error(message) => { failure = Some(message) }, Ok(resolved) => { nested = append(nested, resolved) }
  190     }
  191   }
  192   match failure {
  193     Some(message) => Error(message),
  194     None() => match replacement { Some(resolved) => Ok(resolved), None() => Ok(SignatureType(value.identity, nested)) }
  195   }
  196 }
  197 
  198 pure check_module_signatures(graph: ModuleBindingGraph, modules: [LoadedModule], module: LoadedModule): CheckedModuleSignatures {
  199   mut signatures: [ModuleSignature] = []
  200   mut diagnostics: [Diagnostic] = []
  201   mut declaration_index: Nat = 0
  202   for declaration in module.parsed.program.declarations {
  203     before: Nat = len(diagnostics)
  204     syntax: DeclarationSyntax = module.parsed.syntax[declaration_index]
  205     mut name: Str = ""
  206     mut parameters: [Str] = []
  207     mut fields: [RecordField] = []
  208     mut effect: Option[SignatureEffect] = None()
  209     mut result_void: Bool = false
  210     match declaration {
  211       ImportDeclaration(path) => {},
  212       TypeDeclaration(declared, base, guard) => {
  213         name = declared; fields = [RecordField("base", base)]
  214         if syntax.is_public {
  215           uses: ResolvedModuleUses = resolve_module_expression_uses(graph, module.bindings.identity, guard, syntax.span, set_add(set(), "value"))
  216           diagnostics = concat(diagnostics, uses.diagnostics)
  217           for reference in uses.references {
  218             match reference.target {
  219               NamespaceTarget(identity) => {},
  220               DeclarationTarget(binding) => {
  221                 if !signature_public_identity(graph, module.bindings.identity, binding.identity, []) {
  222                   diagnostics = append(diagnostics, Diagnostic("public guard depends on inaccessible declaration " + reference.spelling + " from " + binding.identity.module.path, reference.span.start))
  223                 }
  224               }
  225             }
  226           }
  227         }
  228       },
  229       RecordDeclaration(declared, types, members) => { name = declared; parameters = types; fields = members },
  230       EnumDeclaration(declared, types, variants) => {
  231         name = declared; parameters = types
  232         for variant in variants {
  233           mut payload_index: Nat = 0
  234           for payload in variant.payload { fields = append(fields, RecordField(variant.name + ":${payload_index}", payload)); payload_index = payload_index + 1 }
  235         }
  236       },
  237       FunctionDeclaration(declared, values, result, pure_flag, async_flag, body, types) => {
  238         name = declared; parameters = types; effect = Some(signature_effect(pure_flag, async_flag)); result_void = !async_flag
  239         for parameter in values { fields = append(fields, RecordField(parameter.name, parameter.type_name)) }
  240         fields = append(fields, RecordField("return", result))
  241       }
  242     }
  243     if name != "" {
  244       owner: DeclarationIdentity = DeclarationIdentity(module.bindings.identity, name)
  245       mut seen: Set[Str] = set()
  246       mut valid: Bool = len(diagnostics) == before
  247       core_owner: Bool = owner.module == ModuleIdentity(ToolchainModulePackage(), "core.panack")
  248       if (module_reserved_binding(name) || name == "Rat" || name == "Array") && !(core_owner && (name == "Option" || name == "Result")) {
  249         diagnostics = append(diagnostics, Diagnostic("declaration " + name + " conflicts with a reserved core identity", syntax.span.start)); valid = false
  250       }
  251       for parameter in parameters {
  252         if seen.has(parameter) || module_reserved_binding(parameter) || parameter == "Rat" || parameter == "Array" {
  253           diagnostics = append(diagnostics, Diagnostic("invalid or duplicate type parameter " + parameter, syntax.span.start)); valid = false
  254         }
  255         seen = seen.add(parameter)
  256       }
  257       mut slots: [SignatureSlot] = []
  258       mut field_index: Nat = 0
  259       for field in fields {
  260         match signature_type(graph, modules, owner, parameters, field.type_name, syntax.is_public, field_index + 1 == len(fields) && result_void) {
  261           Error(message) => { diagnostics = append(diagnostics, Diagnostic("signature " + name + "." + field.name + ": " + message, syntax.span.start)); valid = false },
  262           Ok(resolved) => { slots = append(slots, SignatureSlot(field.name, resolved)) }
  263         }
  264         field_index = field_index + 1
  265       }
  266       if valid {
  267         for binding in module.bindings.declarations {
  268           if binding.identity == owner { signatures = append(signatures, ModuleSignature(binding, parameters, slots, effect)) }
  269         }
  270       }
  271     }
  272     declaration_index = declaration_index + 1
  273   }
  274   CheckedModuleSignatures(signatures, diagnostics)
  275 }
  276 

Functions

[
  {
    "id": "declaration/8",
    "name": "signature_effect",
    "line": 27,
    "state": "covered",
    "entries": "326"
  },
  {
    "id": "declaration/9",
    "name": "signature_declaration",
    "line": 31,
    "state": "covered",
    "entries": "115"
  },
  {
    "id": "declaration/10",
    "name": "signature_public_identity",
    "line": 50,
    "state": "covered",
    "entries": "69"
  },
  {
    "id": "declaration/11",
    "name": "signature_type",
    "line": 108,
    "state": "covered",
    "entries": "783"
  },
  {
    "id": "declaration/12",
    "name": "substitute_signature_type",
    "line": 174,
    "state": "covered",
    "entries": "358"
  },
  {
    "id": "declaration/13",
    "name": "check_module_signatures",
    "line": 198,
    "state": "covered",
    "entries": "276"
  }
]

Source branch outcomes

[
  {
    "id": "declaration/8/tail/decision/true",
    "outcome": "true",
    "line": 28,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/8/tail/decision/false",
    "outcome": "false",
    "line": 28,
    "state": "covered",
    "hits": "319"
  },
  {
    "id": "declaration/8/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 28,
    "state": "covered",
    "hits": "306"
  },
  {
    "id": "declaration/8/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 28,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/9/statement/1/decision/body",
    "outcome": "body",
    "line": 33,
    "state": "covered",
    "hits": "253"
  },
  {
    "id": "declaration/9/statement/1/decision/exit",
    "outcome": "exit",
    "line": 33,
    "state": "covered",
    "hits": "115"
  },
  {
    "id": "declaration/9/statement/1/body/tail/decision/true",
    "outcome": "true",
    "line": 34,
    "state": "covered",
    "hits": "115"
  },
  {
    "id": "declaration/9/statement/1/body/tail/decision/false",
    "outcome": "false",
    "line": 34,
    "state": "covered",
    "hits": "138"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/decision/body",
    "outcome": "body",
    "line": 35,
    "state": "covered",
    "hits": "272"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/decision/exit",
    "outcome": "exit",
    "line": 35,
    "state": "covered",
    "hits": "115"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/statement/0/value/arm/0",
    "outcome": "ImportDeclaration",
    "line": 37,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/statement/0/value/arm/1",
    "outcome": "TypeDeclaration",
    "line": 37,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/statement/0/value/arm/2",
    "outcome": "RecordDeclaration",
    "line": 38,
    "state": "covered",
    "hits": "126"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/statement/0/value/arm/3",
    "outcome": "EnumDeclaration",
    "line": 38,
    "state": "covered",
    "hits": "52"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/statement/0/value/arm/4",
    "outcome": "FunctionDeclaration",
    "line": 39,
    "state": "covered",
    "hits": "92"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/tail/decision/true",
    "outcome": "true",
    "line": 41,
    "state": "covered",
    "hits": "115"
  },
  {
    "id": "declaration/9/statement/1/body/tail/true/statement/0/body/tail/decision/false",
    "outcome": "false",
    "line": 41,
    "state": "covered",
    "hits": "157"
  },
  {
    "id": "declaration/9/tail/arm/0",
    "outcome": "Some",
    "line": 45,
    "state": "covered",
    "hits": "115"
  },
  {
    "id": "declaration/9/tail/arm/1",
    "outcome": "None",
    "line": 45,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 51,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/10/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 51,
    "state": "covered",
    "hits": "65"
  },
  {
    "id": "declaration/10/statement/0/value/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 51,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/0/value/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 51,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/1/value/decision/true",
    "outcome": "true",
    "line": 52,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/10/statement/1/value/decision/false",
    "outcome": "false",
    "line": 52,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/1/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 52,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/10/statement/1/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 52,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/0",
    "outcome": "Error",
    "line": 54,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1",
    "outcome": "Ok",
    "line": 55,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/decision/body",
    "outcome": "body",
    "line": 56,
    "state": "covered",
    "hits": "135"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/decision/exit",
    "outcome": "exit",
    "line": 56,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/true",
    "outcome": "true",
    "line": 57,
    "state": "covered",
    "hits": "41"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/false",
    "outcome": "false",
    "line": 57,
    "state": "covered",
    "hits": "94"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/body/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 57,
    "state": "covered",
    "hits": "126"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/0/body/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 57,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/decision/body",
    "outcome": "body",
    "line": 60,
    "state": "covered",
    "hits": "27"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/decision/exit",
    "outcome": "exit",
    "line": 60,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 61,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 61,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/0",
    "outcome": "Error",
    "line": 63,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1",
    "outcome": "Ok",
    "line": 64,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/decision/body",
    "outcome": "body",
    "line": 65,
    "state": "covered",
    "hits": "21"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/decision/exit",
    "outcome": "exit",
    "line": 65,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/true",
    "outcome": "true",
    "line": 66,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/false",
    "outcome": "false",
    "line": 66,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/true/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 67,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/true/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 67,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/0",
    "outcome": "Error",
    "line": 70,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1",
    "outcome": "Ok",
    "line": 71,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/0",
    "outcome": "DeclarationTarget",
    "line": 72,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/0/body/block/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 72,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/0/body/block/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 72,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/1",
    "outcome": "NamespaceTarget",
    "line": 73,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/1/body/block/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 73,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/1/value/true/tail/arm/1/body/block/statement/2/body/statement/0/value/true/tail/arm/1/body/block/statement/0/body/tail/false/tail/arm/1/body/arm/1/body/block/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 73,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/2/value/decision/true",
    "outcome": "true",
    "line": 88,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/10/statement/2/value/decision/false",
    "outcome": "false",
    "line": 88,
    "state": "covered",
    "hits": "54"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/0",
    "outcome": "Error",
    "line": 90,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1",
    "outcome": "Ok",
    "line": 91,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/decision/body",
    "outcome": "body",
    "line": 92,
    "state": "covered",
    "hits": "37"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/decision/exit",
    "outcome": "exit",
    "line": 92,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/true",
    "outcome": "true",
    "line": 93,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/decision/false",
    "outcome": "false",
    "line": 93,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/true/tail/arm/0",
    "outcome": "ModuleVariant",
    "line": 95,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/true/tail/arm/1",
    "outcome": "ModuleFunction",
    "line": 98,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/true/tail/arm/2",
    "outcome": "ModuleGuardedType",
    "line": 98,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/true/tail/arm/3",
    "outcome": "ModuleRecord",
    "line": 98,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/10/statement/2/value/true/tail/arm/1/body/block/statement/0/body/tail/true/tail/arm/4",
    "outcome": "ModuleEnum",
    "line": 98,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/7/decision/body",
    "outcome": "body",
    "line": 116,
    "state": "covered",
    "hits": "191"
  },
  {
    "id": "declaration/11/statement/7/decision/exit",
    "outcome": "exit",
    "line": 116,
    "state": "covered",
    "hits": "783"
  },
  {
    "id": "declaration/11/statement/7/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 117,
    "state": "covered",
    "hits": "169"
  },
  {
    "id": "declaration/11/statement/7/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 117,
    "state": "covered",
    "hits": "22"
  },
  {
    "id": "declaration/11/statement/8/value/decision/true",
    "outcome": "true",
    "line": 120,
    "state": "covered",
    "hits": "615"
  },
  {
    "id": "declaration/11/statement/8/value/decision/false",
    "outcome": "false",
    "line": 120,
    "state": "covered",
    "hits": "168"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 121,
    "state": "covered",
    "hits": "215"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 121,
    "state": "covered",
    "hits": "400"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 121,
    "state": "covered",
    "hits": "215"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 121,
    "state": "covered",
    "hits": "400"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 121,
    "state": "covered",
    "hits": "215"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 121,
    "state": "covered",
    "hits": "400"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 121,
    "state": "covered",
    "hits": "217"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/0/value/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 121,
    "state": "covered",
    "hits": "398"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/1/value/decision/true",
    "outcome": "true",
    "line": 122,
    "state": "covered",
    "hits": "21"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/1/value/decision/false",
    "outcome": "false",
    "line": 122,
    "state": "covered",
    "hits": "594"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/1/value/true/tail/decision/true",
    "outcome": "true",
    "line": 124,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/1/value/true/tail/decision/false",
    "outcome": "false",
    "line": 124,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/decision/true",
    "outcome": "true",
    "line": 126,
    "state": "covered",
    "hits": "83"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/decision/false",
    "outcome": "false",
    "line": 126,
    "state": "covered",
    "hits": "532"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 126,
    "state": "covered",
    "hits": "568"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 126,
    "state": "covered",
    "hits": "47"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 126,
    "state": "covered",
    "hits": "572"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/2/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 126,
    "state": "covered",
    "hits": "43"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/3/value/decision/true",
    "outcome": "true",
    "line": 127,
    "state": "covered",
    "hits": "11"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/3/value/decision/false",
    "outcome": "false",
    "line": 127,
    "state": "covered",
    "hits": "604"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/3/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 127,
    "state": "covered",
    "hits": "609"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/3/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 127,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/decision/true",
    "outcome": "true",
    "line": 128,
    "state": "covered",
    "hits": "17"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/decision/false",
    "outcome": "false",
    "line": 128,
    "state": "covered",
    "hits": "598"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 128,
    "state": "covered",
    "hits": "599"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 128,
    "state": "covered",
    "hits": "16"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 128,
    "state": "covered",
    "hits": "604"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 128,
    "state": "covered",
    "hits": "11"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/true/tail/decision/true",
    "outcome": "true",
    "line": 131,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/8/value/true/statement/4/value/true/tail/decision/false",
    "outcome": "false",
    "line": 131,
    "state": "covered",
    "hits": "16"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/decision/true",
    "outcome": "true",
    "line": 133,
    "state": "covered",
    "hits": "83"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/decision/false",
    "outcome": "false",
    "line": 133,
    "state": "covered",
    "hits": "532"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/0",
    "outcome": "Error",
    "line": 135,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1",
    "outcome": "Ok",
    "line": 136,
    "state": "covered",
    "hits": "83"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/1/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 138,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/1/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 138,
    "state": "covered",
    "hits": "80"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/1/value/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 138,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/1/value/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 138,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/2/value/decision/true",
    "outcome": "true",
    "line": 139,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/2/value/decision/false",
    "outcome": "false",
    "line": 139,
    "state": "covered",
    "hits": "80"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/decision/true",
    "outcome": "true",
    "line": 142,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/decision/false",
    "outcome": "false",
    "line": 142,
    "state": "covered",
    "hits": "78"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 142,
    "state": "covered",
    "hits": "47"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 142,
    "state": "covered",
    "hits": "36"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 142,
    "state": "covered",
    "hits": "50"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/statement/3/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 142,
    "state": "covered",
    "hits": "33"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/0",
    "outcome": "Error",
    "line": 146,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1",
    "outcome": "Ok",
    "line": 147,
    "state": "covered",
    "hits": "83"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1/body/arm/0",
    "outcome": "RecordDeclaration",
    "line": 148,
    "state": "covered",
    "hits": "64"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1/body/arm/1",
    "outcome": "EnumDeclaration",
    "line": 149,
    "state": "covered",
    "hits": "18"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1/body/arm/2",
    "outcome": "TypeDeclaration",
    "line": 150,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1/body/arm/3",
    "outcome": "ImportDeclaration",
    "line": 151,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/8/value/true/tail/true/tail/arm/1/body/block/tail/arm/1/body/arm/4",
    "outcome": "FunctionDeclaration",
    "line": 152,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/9/value/decision/true",
    "outcome": "true",
    "line": 159,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/11/statement/9/value/decision/false",
    "outcome": "false",
    "line": 159,
    "state": "covered",
    "hits": "782"
  },
  {
    "id": "declaration/11/statement/12/decision/body",
    "outcome": "body",
    "line": 162,
    "state": "covered",
    "hits": "164"
  },
  {
    "id": "declaration/11/statement/12/decision/exit",
    "outcome": "exit",
    "line": 162,
    "state": "covered",
    "hits": "783"
  },
  {
    "id": "declaration/11/statement/12/body/statement/0/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 163,
    "state": "covered",
    "hits": "21"
  },
  {
    "id": "declaration/11/statement/12/body/statement/0/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 163,
    "state": "covered",
    "hits": "143"
  },
  {
    "id": "declaration/11/statement/12/body/statement/0/value/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 163,
    "state": "covered",
    "hits": "23"
  },
  {
    "id": "declaration/11/statement/12/body/statement/0/value/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 163,
    "state": "covered",
    "hits": "141"
  },
  {
    "id": "declaration/11/statement/12/body/statement/1/value/arm/0",
    "outcome": "Error",
    "line": 165,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/11/statement/12/body/statement/1/value/arm/0/body/block/tail/decision/true",
    "outcome": "true",
    "line": 165,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/11/statement/12/body/statement/1/value/arm/0/body/block/tail/decision/false",
    "outcome": "false",
    "line": 165,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/11/statement/12/body/statement/1/value/arm/1",
    "outcome": "Ok",
    "line": 166,
    "state": "covered",
    "hits": "160"
  },
  {
    "id": "declaration/11/tail/arm/0",
    "outcome": "Some",
    "line": 170,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/11/tail/arm/1",
    "outcome": "None",
    "line": 170,
    "state": "covered",
    "hits": "770"
  },
  {
    "id": "declaration/12/statement/2/value/arm/0",
    "outcome": "SignatureParameter",
    "line": 178,
    "state": "covered",
    "hits": "220"
  },
  {
    "id": "declaration/12/statement/2/value/arm/0/body/block/tail/decision/true",
    "outcome": "true",
    "line": 179,
    "state": "covered",
    "hits": "219"
  },
  {
    "id": "declaration/12/statement/2/value/arm/0/body/block/tail/decision/false",
    "outcome": "false",
    "line": 179,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/statement/2/value/arm/0/body/block/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 180,
    "state": "covered",
    "hits": "218"
  },
  {
    "id": "declaration/12/statement/2/value/arm/0/body/block/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 180,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/statement/2/value/arm/1",
    "outcome": "SignatureCore",
    "line": 184,
    "state": "covered",
    "hits": "97"
  },
  {
    "id": "declaration/12/statement/2/value/arm/2",
    "outcome": "SignatureNominal",
    "line": 184,
    "state": "covered",
    "hits": "39"
  },
  {
    "id": "declaration/12/statement/2/value/arm/3",
    "outcome": "SignatureCallable",
    "line": 184,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/12/statement/2/value/arm/4",
    "outcome": "SignatureHole",
    "line": 184,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/12/statement/4/decision/body",
    "outcome": "body",
    "line": 187,
    "state": "covered",
    "hits": "92"
  },
  {
    "id": "declaration/12/statement/4/decision/exit",
    "outcome": "exit",
    "line": 187,
    "state": "covered",
    "hits": "358"
  },
  {
    "id": "declaration/12/statement/4/body/tail/arm/0",
    "outcome": "Error",
    "line": 189,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/12/statement/4/body/tail/arm/1",
    "outcome": "Ok",
    "line": 189,
    "state": "covered",
    "hits": "92"
  },
  {
    "id": "declaration/12/tail/arm/0",
    "outcome": "Some",
    "line": 193,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/tail/arm/1",
    "outcome": "None",
    "line": 194,
    "state": "covered",
    "hits": "357"
  },
  {
    "id": "declaration/12/tail/arm/1/body/arm/0",
    "outcome": "Some",
    "line": 194,
    "state": "covered",
    "hits": "218"
  },
  {
    "id": "declaration/12/tail/arm/1/body/arm/1",
    "outcome": "None",
    "line": 194,
    "state": "covered",
    "hits": "139"
  },
  {
    "id": "declaration/13/statement/3/decision/body",
    "outcome": "body",
    "line": 202,
    "state": "covered",
    "hits": "467"
  },
  {
    "id": "declaration/13/statement/3/decision/exit",
    "outcome": "exit",
    "line": 202,
    "state": "covered",
    "hits": "276"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/0",
    "outcome": "ImportDeclaration",
    "line": 211,
    "state": "covered",
    "hits": "46"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1",
    "outcome": "TypeDeclaration",
    "line": 212,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/decision/true",
    "outcome": "true",
    "line": 214,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/decision/false",
    "outcome": "false",
    "line": 214,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/decision/body",
    "outcome": "body",
    "line": 217,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/decision/exit",
    "outcome": "exit",
    "line": 217,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/body/tail/arm/0",
    "outcome": "NamespaceTarget",
    "line": 219,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/body/tail/arm/1",
    "outcome": "DeclarationTarget",
    "line": 220,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/body/tail/arm/1/body/block/tail/decision/true",
    "outcome": "true",
    "line": 221,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/1/body/block/tail/true/statement/2/body/tail/arm/1/body/block/tail/decision/false",
    "outcome": "false",
    "line": 221,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/2",
    "outcome": "RecordDeclaration",
    "line": 229,
    "state": "covered",
    "hits": "69"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/3",
    "outcome": "EnumDeclaration",
    "line": 230,
    "state": "covered",
    "hits": "37"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/3/body/block/statement/2/decision/body",
    "outcome": "body",
    "line": 232,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/3/body/block/statement/2/decision/exit",
    "outcome": "exit",
    "line": 232,
    "state": "covered",
    "hits": "37"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/3/body/block/statement/2/body/statement/1/decision/body",
    "outcome": "body",
    "line": 234,
    "state": "covered",
    "hits": "35"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/3/body/block/statement/2/body/statement/1/decision/exit",
    "outcome": "exit",
    "line": 234,
    "state": "covered",
    "hits": "67"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/4",
    "outcome": "FunctionDeclaration",
    "line": 237,
    "state": "covered",
    "hits": "306"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/4/body/block/statement/4/decision/body",
    "outcome": "body",
    "line": 239,
    "state": "covered",
    "hits": "158"
  },
  {
    "id": "declaration/13/statement/3/body/statement/7/value/arm/4/body/block/statement/4/decision/exit",
    "outcome": "exit",
    "line": 239,
    "state": "covered",
    "hits": "306"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/decision/true",
    "outcome": "true",
    "line": 243,
    "state": "covered",
    "hits": "421"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/decision/false",
    "outcome": "false",
    "line": 243,
    "state": "covered",
    "hits": "46"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/decision/true",
    "outcome": "true",
    "line": 248,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/decision/false",
    "outcome": "false",
    "line": 248,
    "state": "covered",
    "hits": "419"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 248,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 248,
    "state": "covered",
    "hits": "417"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 248,
    "state": "covered",
    "hits": "417"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 248,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 248,
    "state": "covered",
    "hits": "417"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 248,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/right/operand/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 248,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/right/operand/decision/skip-right",
    "outcome": "skip-right",
    "line": 248,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/right/operand/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 248,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/4/value/condition/right/operand/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 248,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/decision/body",
    "outcome": "body",
    "line": 251,
    "state": "covered",
    "hits": "107"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/decision/exit",
    "outcome": "exit",
    "line": 251,
    "state": "covered",
    "hits": "421"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 252,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 252,
    "state": "covered",
    "hits": "106"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 252,
    "state": "covered",
    "hits": "106"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 252,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 252,
    "state": "covered",
    "hits": "106"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 252,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 252,
    "state": "covered",
    "hits": "106"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/5/body/statement/0/value/condition/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 252,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/decision/body",
    "outcome": "body",
    "line": 259,
    "state": "covered",
    "hits": "583"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/decision/exit",
    "outcome": "exit",
    "line": 259,
    "state": "covered",
    "hits": "421"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/body/statement/0/value/subject/args/6/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 260,
    "state": "covered",
    "hits": "417"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/body/statement/0/value/subject/args/6/decision/skip-right",
    "outcome": "skip-right",
    "line": 260,
    "state": "covered",
    "hits": "166"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/body/statement/0/value/arm/0",
    "outcome": "Error",
    "line": 261,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/statement/8/body/statement/0/value/arm/1",
    "outcome": "Ok",
    "line": 262,
    "state": "covered",
    "hits": "575"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/decision/true",
    "outcome": "true",
    "line": 266,
    "state": "covered",
    "hits": "407"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/decision/false",
    "outcome": "false",
    "line": 266,
    "state": "covered",
    "hits": "14"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/true/statement/0/decision/body",
    "outcome": "body",
    "line": 267,
    "state": "covered",
    "hits": "946"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/true/statement/0/decision/exit",
    "outcome": "exit",
    "line": 267,
    "state": "covered",
    "hits": "407"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/true/statement/0/body/tail/decision/true",
    "outcome": "true",
    "line": 268,
    "state": "covered",
    "hits": "407"
  },
  {
    "id": "declaration/13/statement/3/body/statement/8/value/true/tail/true/statement/0/body/tail/decision/false",
    "outcome": "false",
    "line": 268,
    "state": "covered",
    "hits": "539"
  }
]

Reviewed declaration exclusions

[
  {
    "id": "declaration/0",
    "reason": "import",
    "line": 1
  },
  {
    "id": "declaration/1",
    "reason": "import",
    "line": 2
  },
  {
    "id": "declaration/2",
    "reason": "enum-declaration",
    "line": 5
  },
  {
    "id": "declaration/3",
    "reason": "enum-declaration",
    "line": 6
  },
  {
    "id": "declaration/4",
    "reason": "record-declaration",
    "line": 14
  },
  {
    "id": "declaration/5",
    "reason": "record-declaration",
    "line": 15
  },
  {
    "id": "declaration/6",
    "reason": "record-declaration",
    "line": 16
  },
  {
    "id": "declaration/7",
    "reason": "record-declaration",
    "line": 22
  }
]