All files

src/compiler/purity.panack

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

    1 import "checker.panack"
    2 
    3 pure is_impure_builtin(name: Str): Bool {
    4   (name == "async_fake_read" || name == "tcp_exchange" || name == "tcp_serve") || name == "fs_read" || name == "fs_write" || name == "fs_metadata" || name == "fs_list" || name == "fs_create_directory" || name == "fs_remove_file" || name == "fs_remove_directory" || name == "fs_temp_file" || name == "fs_temp_directory" || name == "host_sleep" || name == "process_run" ||
    5   name == "instant_now" || name == "print" || name == "read_line" || name == "read_file" ||
    6   name == "write_file" || name == "read_bytes" || name == "write_bytes" ||
    7   name == "command_args" || name == "environment_has" ||
    8   name == "environment_get" || name == "eprint" || name == "process_exit" ||
    9   name == "path_resolve" || name == "file_exists" || name == "run_bytecode" ||
   10   name == "run_bytecode_args"
   11 }
   12 
   13 record EffectEvidence {
   14   function_name: Str, span: Option[SourceSpan], kind: Str, mode: Str,
   15   target: Str, basis: Str, target_effect: Str, awaited: Bool, violations: [Str]
   16 }
   17 record CheckedEffects { diagnostics: [Diagnostic], evidence: [EffectEvidence] }
   18 
   19 pure combine_effects(left: CheckedEffects, right: CheckedEffects): CheckedEffects {
   20   CheckedEffects(concat(left.diagnostics, right.diagnostics), concat(left.evidence, right.evidence))
   21 }
   22 
   23 pure check_expression_purity(expression: Expr, program: Program, environment: Map[Str,TypeInfo]): [Diagnostic] {
   24   check_expression_effects(expression, program, environment, false)
   25 }
   26 pure check_expression_effects(expression: Expr, program: Program, environment: Map[Str,TypeInfo], awaited: Bool): [Diagnostic] {
   27   check_effect_expression(expression, program, environment, awaited, false, None()).diagnostics
   28 }
   29 pure check_block_purity(block: Block, program: Program, parent: Map[Str,TypeInfo]): [Diagnostic] {
   30   check_effect_block(block, program, parent, false).diagnostics
   31 }
   32 pure check_program_purity(program: Program): [Diagnostic] {
   33   check_program_effect_evidence(program, false).diagnostics
   34 }
   35 
   36 pure check_effect_expression(expression: Expr, program: Program, environment: Map[Str,TypeInfo], awaited: Bool, retain: Bool, origin: Option[SourceSpan]): CheckedEffects {
   37   mut result: CheckedEffects = CheckedEffects([], [])
   38   mode: Str = if map_has(environment, "$effect") { map_get(environment, "$effect").name } else { "pure" }
   39   mut await_call: Bool = false
   40   mut kind: Str = ""
   41   mut target_name: Str = ""
   42   mut basis: Str = ""
   43   mut target_effect: Str = ""
   44   mut violations: [Str] = []
   45   match expression {
   46     LocatedExpr(position, value) => {
   47       await_call = true
   48       nested: CheckedEffects = check_effect_expression(value, program, environment, awaited, retain, if retain { Some(position) } else { None() })
   49       result = CheckedEffects(checker_diagnostics_at(nested.diagnostics, position.start), nested.evidence)
   50     },
   51     NatExpr(value) => {},
   52     DecimalExpr(text) => {},
   53     StringExpr(text) => {},
   54     BoolExpr(value) => {},
   55     NameExpr(name) => {},
   56     FunctionExpr(name) => {},
   57     ArrayExpr(items) => {
   58       for item in items {
   59         result = combine_effects(result, check_effect_expression(item, program, environment, false, retain, None()))
   60       }
   61     },
   62     UnaryExpr(operator, operand) => {
   63       if operator == "await" {
   64         kind = "await"
   65         if mode != "async" {
   66           reason: Str = "await requires an async function"
   67           result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
   68           if retain { violations = append(violations, reason); }
   69         }
   70         result = combine_effects(result, check_effect_expression(operand, program, environment, true, retain, None()))
   71       } else { result = check_effect_expression(operand, program, environment, false, retain, None()); }
   72     },
   73     BinaryExpr(operator, left, right) => {
   74       result = check_effect_expression(left, program, environment, false, retain, None())
   75       result = combine_effects(result, check_effect_expression(right, program, environment, false, retain, None()))
   76     },
   77     DotCallExpr(target, name, arguments, types) => {
   78       result = CheckedEffects([checker_diagnostic("unresolved dot call requires module binding resolution")], [])
   79     },
   80     CallExpr(name, arguments, type_arguments) => {
   81       await_call = true
   82       function: FunctionLookup = function_type(program, name)
   83       mut async_call: Bool = (name == "async_fake_read" || name == "tcp_exchange" || name == "tcp_serve") || (function.found && function.is_async)
   84       mut impure: Bool = is_impure_builtin(name) || (function.found && !function.is_pure)
   85       if name == "$method_call" && len(arguments) > 0 {
   86         target: CheckedExpression = check_expression(arguments[0], environment, map(), program)
   87         effect: Str = type_shape(target.info.name).base
   88         async_call = effect == "AsyncFn"
   89         impure = effect != "PureFn"
   90       }
   91       if retain {
   92         kind = "call"
   93         target_name = if name == "$method_call" { "call" } else { name }
   94         basis = if name == "$method_call" { "callable type" } else {
   95           if function.found { "function declaration" } else { "builtin or constructor contract" }
   96         }
   97         target_effect = if async_call { "async" } else { if impure { "ordinary" } else { "pure" } }
   98       }
   99       display_name: Str = if name == "$method_call" { "call" } else { name }
  100       if awaited && !async_call {
  101         reason: Str = "await requires an async call"
  102         result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  103         if retain { violations = append(violations, reason); }
  104       }
  105       if async_call && (!awaited || mode != "async") {
  106         reason: Str = "async call requires await inside an async function"
  107         result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  108         if retain { violations = append(violations, reason); }
  109       }
  110       if mode == "pure" && impure {
  111         reason: Str = "pure function cannot call impure function ${display_name}"
  112         result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  113         if retain { violations = append(violations, reason); }
  114       }
  115       if mode == "async" && impure && !async_call {
  116         reason: Str = "async function cannot call blocking function ${display_name}"
  117         result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  118         if retain { violations = append(violations, reason); }
  119       }
  120       for argument in arguments {
  121         result = combine_effects(result, check_effect_expression(argument, program, environment, false, retain, None()))
  122       }
  123     },
  124     FieldExpr(target, field) => {
  125       result = check_effect_expression(target, program, environment, false, retain, None())
  126     },
  127     IndexExpr(target, index) => {
  128       result = check_effect_expression(target, program, environment, false, retain, None())
  129       result = combine_effects(result, check_effect_expression(index, program, environment, false, retain, None()))
  130     },
  131     IfExpr(condition, yes, no, has_else) => {
  132       result = check_effect_expression(condition, program, environment, false, retain, None())
  133       result = combine_effects(result, check_effect_block(yes, program, environment, retain))
  134       result = combine_effects(result, check_effect_block(no, program, environment, retain))
  135     },
  136     BlockExpr(block) => {
  137       result = check_effect_block(block, program, environment, retain)
  138     },
  139     MatchExpr(subject, arms) => {
  140       result = check_effect_expression(subject, program, environment, false, retain, None())
  141       checked: CheckedExpression = check_expression(subject, environment, map(), program)
  142       shape: TypeShape = type_shape(checked.info.name)
  143       enum_value: EnumLookup = enum_type(program, shape.base)
  144       mut substitutions: Map[Str,Str] = map()
  145       mut index: Nat = 0
  146       while index < len(enum_value.parameters) && index < len(shape.arguments) {
  147         substitutions = map_put(substitutions, enum_value.parameters[index], shape.arguments[index])
  148         index = index + 1
  149       }
  150       for arm in arms {
  151         mut arm_environment: Map[Str,TypeInfo] = environment
  152         for variant in enum_value.variants {
  153           if variant.name == arm.pattern.variant {
  154             mut binding_index: Nat = 0
  155             for binding in arm.pattern.bindings {
  156               if binding_index < len(variant.payload) {
  157                 binding_type: Str = substitute_type(variant.payload[binding_index], enum_value.parameters, substitutions)
  158                 arm_environment = map_put(arm_environment, binding, plain_type(binding_type))
  159               }
  160               binding_index = binding_index + 1
  161             }
  162           }
  163         }
  164         result = combine_effects(result, check_effect_expression(arm.body, program, arm_environment, false, retain, None()))
  165       }
  166     }
  167   }
  168   if awaited && !await_call {
  169     kind = "await operand"
  170     reason: Str = "await requires an async call"
  171     result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  172     if retain { violations = append(violations, reason); }
  173   }
  174   if retain && kind != "" {
  175     entry: EffectEvidence = EffectEvidence("", origin, kind, mode, target_name, basis, target_effect, awaited, violations)
  176     result = CheckedEffects(result.diagnostics, concat([entry], result.evidence))
  177   }
  178   result
  179 }
  180 
  181 pure check_effect_block(block: Block, program: Program, parent: Map[Str,TypeInfo], retain: Bool): CheckedEffects {
  182   mut result: CheckedEffects = CheckedEffects([], [])
  183   mut environment: Map[Str,TypeInfo] = parent
  184   for statement in block.statements {
  185     match statement {
  186       BindingStatement(name, type_name, mutable, value) => {
  187         result = combine_effects(result, check_effect_expression(value, program, environment, false, retain, None()))
  188         if len(type_name) > 0 {
  189           environment = map_put(environment, name, TypeInfo(type_name, false, 0, mutable))
  190         } else {
  191           checked: CheckedExpression = check_expression(value, environment, map(), program)
  192           environment = map_put(environment, name, local_binding_info(checked.info.name, checked.info, mutable))
  193         }
  194       },
  195       AssignmentStatement(name, value) => {
  196         result = combine_effects(result, check_effect_expression(value, program, environment, false, retain, None()))
  197         if !map_has(environment, name) {
  198           checked: CheckedExpression = check_expression(value, environment, map(), program)
  199           environment = map_put(environment, name, local_binding_info(checked.info.name, checked.info, false))
  200         }
  201       },
  202       ExpressionStatement(value) => {
  203         if expression_is_await(value) {
  204           checked: CheckedExpression = check_expression(value, environment, map(), program)
  205           if checked.info.name != "Unit" {
  206             reason: Str = "bind, match or return a non-Unit await result"
  207             result = CheckedEffects(append(result.diagnostics, checker_diagnostic(reason)), result.evidence)
  208             if retain {
  209               mode: Str = if map_has(environment, "$effect") { map_get(environment, "$effect").name } else { "pure" }
  210               entry: EffectEvidence = EffectEvidence("", expression_span(value), "await result", mode, "", "result type", checked.info.name, true, [reason])
  211               result = CheckedEffects(result.diagnostics, append(result.evidence, entry))
  212             }
  213           }
  214         }
  215         result = combine_effects(result, check_effect_expression(value, program, environment, false, retain, None()))
  216       },
  217       WhileStatement(condition, body) => {
  218         result = combine_effects(result, check_effect_expression(condition, program, environment, false, retain, None()))
  219         result = combine_effects(result, check_effect_block(body, program, environment, retain))
  220       },
  221       ForStatement(name, iterable, body) => {
  222         result = combine_effects(result, check_effect_expression(iterable, program, environment, false, retain, None()))
  223         checked: CheckedExpression = check_expression(iterable, environment, map(), program)
  224         shape: TypeShape = type_shape(checked.info.name)
  225         item: Str = if len(shape.arguments) > 0 { shape.arguments[0] } else { "Nat" }
  226         loop_environment: Map[Str,TypeInfo] = map_put(environment, name, plain_type(item))
  227         result = combine_effects(result, check_effect_block(body, program, loop_environment, retain))
  228       }
  229     }
  230   }
  231   match block.value {
  232     NoBlockValue() => {},
  233     TailBlockValue(value) => {
  234       result = combine_effects(result, check_effect_expression(value, program, environment, false, retain, None()))
  235     }
  236   }
  237   result
  238 }
  239 
  240 pure check_program_effect_evidence(program: Program, retain: Bool): CheckedEffects {
  241   check_selected_effect_evidence(program, retain, false, map())
  242 }
  243 
  244 pure check_selected_effect_evidence(program: Program, retain: Bool, selected: Bool, function_types: Map[Str,Bool]): CheckedEffects {
  245   mut result: CheckedEffects = CheckedEffects([], [])
  246   for declaration in program.declarations {
  247     match declaration {
  248       TypeDeclaration(name, base, guard) => {
  249         result = combine_effects(result, check_effect_expression(guard, program, map(), false, false, None()))
  250       },
  251       FunctionDeclaration(name, parameters, return_type, is_pure, is_async, body, type_parameters) => {
  252         if !selected || (function_types.has(name) && function_types.get(name)) {
  253           mut environment: Map[Str,TypeInfo] = map()
  254           environment = map_put(environment, "$effect", plain_type(if is_async { "async" } else { if is_pure { "pure" } else { "ordinary" } }))
  255           for parameter in parameters {
  256             environment = map_put(environment, parameter.name, plain_type(parameter.type_name))
  257           }
  258           checked: CheckedEffects = check_effect_block(body, program, environment, retain)
  259           mut entries: [EffectEvidence] = []
  260           if retain {
  261             for entry in checked.evidence {
  262               entries = append(entries, EffectEvidence(name, entry.span, entry.kind, entry.mode, entry.target,
  263                 entry.basis, entry.target_effect, entry.awaited, entry.violations))
  264             }
  265           }
  266           result = combine_effects(result, CheckedEffects(checked.diagnostics, entries))
  267         }
  268       },
  269       ImportDeclaration(path) => {},
  270       RecordDeclaration(name, parameters, fields) => {},
  271       EnumDeclaration(name, parameters, variants) => {}
  272     }
  273   }
  274   result
  275 }
  276 
  277 // Ordinary compilation preserves the type-first diagnostic contract. Recovery
  278 // is evidence-only: effect violations remain on local records, never replacing
  279 // or extending the original type diagnostics for an already rejected program.
  280 pure check_frontend_effects(program: Program, checked: CheckedProgram, retain: Bool): CheckedEffects {
  281   if len(checked.diagnostics) == 0 {
  282     check_program_effect_evidence(program, retain)
  283   } else {
  284     if retain && checked.declarations_valid {
  285       recovered: CheckedEffects = check_selected_effect_evidence(program, true, true, checked.function_types)
  286       CheckedEffects(checked.diagnostics, recovered.evidence)
  287     } else { CheckedEffects(checked.diagnostics, []) }
  288   }
  289 }
  290 
  291 pure check_program_frontend(program: Program): [Diagnostic] {
  292   checked: CheckedProgram = check_program_evidence(program, false)
  293   check_frontend_effects(program, checked, false).diagnostics
  294 }
  295 
  296 pure check_source_frontend(source: Str): Str {
  297   match lex(source) {
  298     Ok(tokens) => {
  299       match parse_program_complete(tokens) {
  300         Ok(program) => render_resolver_diagnostics(check_program_frontend(program)),
  301         Error(error) => error.message
  302       }
  303     },
  304     Error(errors) => "lexing failed"
  305   }
  306 }
  307 
  308 pure check_module_graph_frontend(units: [SourceUnit], entry: Str): [Diagnostic] {
  309   empty: Set[Str] = set()
  310   initial: ModuleGraphState = ModuleGraphState([], empty, empty, duplicate_module_diagnostics(units))
  311   graph: ModuleGraphState = visit_module(units, entry, initial)
  312   if len(graph.diagnostics) > 0 {
  313     graph.diagnostics
  314   } else {
  315     check_program_frontend(append_program_declarations(graph.programs))
  316   }
  317 }
  318 
  319 pure check_loaded_source_frontend(sources: [LoadedSource], entry: Str): Str {
  320   mut units: [SourceUnit] = []
  321   mut diagnostics: [Diagnostic] = []
  322   for source in sources {
  323     match lex_file(source.source, source.path) {
  324       Ok(tokens) => {
  325         match parse_program_complete(tokens) {
  326           Ok(program) => { units = append(units, SourceUnit(source.path, program)); },
  327           Error(error) => { diagnostics = append(diagnostics, error); }
  328         }
  329       },
  330       Error(errors) => {
  331         for error in errors {
  332           diagnostics = append(diagnostics, error)
  333         }
  334       }
  335     }
  336   }
  337   if len(diagnostics) > 0 {
  338     render_resolver_diagnostics(diagnostics)
  339   } else {
  340     render_resolver_diagnostics(check_module_graph_frontend(units, entry))
  341   }
  342 }
  343 
  344 pure expression_is_await(expression: Expr): Bool {
  345   mut result: Bool = false
  346   match expression {
  347     LocatedExpr(position, value) => { result = expression_is_await(value); },
  348     NatExpr(value) => {}, DecimalExpr(text) => {}, StringExpr(text) => {}, BoolExpr(value) => {},
  349     NameExpr(name) => {}, FunctionExpr(name) => {}, ArrayExpr(items) => {},
  350     UnaryExpr(operator, operand) => { result = operator == "await"; }, BinaryExpr(operator, left, right) => {},
  351     CallExpr(name, arguments, type_arguments) => {}, DotCallExpr(dot_target, dot_name, dot_arguments, dot_types) => {}, FieldExpr(target, field) => {}, IndexExpr(target, index) => {},
  352     IfExpr(condition, yes, no, has_else) => {}, BlockExpr(block) => {}, MatchExpr(subject, arms) => {}
  353   }
  354   result
  355 }
  356 

Functions

[
  {
    "id": "declaration/1",
    "name": "is_impure_builtin",
    "line": 3,
    "state": "covered",
    "entries": "6720"
  },
  {
    "id": "declaration/4",
    "name": "combine_effects",
    "line": 19,
    "state": "covered",
    "entries": "31673"
  },
  {
    "id": "declaration/5",
    "name": "check_expression_purity",
    "line": 23,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/6",
    "name": "check_expression_effects",
    "line": 26,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/7",
    "name": "check_block_purity",
    "line": 29,
    "state": "zero",
    "entries": "0"
  },
  {
    "id": "declaration/8",
    "name": "check_program_purity",
    "line": 32,
    "state": "covered",
    "entries": "25"
  },
  {
    "id": "declaration/9",
    "name": "check_effect_expression",
    "line": 36,
    "state": "covered",
    "entries": "75020"
  },
  {
    "id": "declaration/10",
    "name": "check_effect_block",
    "line": 181,
    "state": "covered",
    "entries": "5614"
  },
  {
    "id": "declaration/11",
    "name": "check_program_effect_evidence",
    "line": 240,
    "state": "covered",
    "entries": "211"
  },
  {
    "id": "declaration/12",
    "name": "check_selected_effect_evidence",
    "line": 244,
    "state": "covered",
    "entries": "220"
  },
  {
    "id": "declaration/13",
    "name": "check_frontend_effects",
    "line": 280,
    "state": "covered",
    "entries": "282"
  },
  {
    "id": "declaration/14",
    "name": "check_program_frontend",
    "line": 291,
    "state": "covered",
    "entries": "245"
  },
  {
    "id": "declaration/15",
    "name": "check_source_frontend",
    "line": 296,
    "state": "covered",
    "entries": "221"
  },
  {
    "id": "declaration/16",
    "name": "check_module_graph_frontend",
    "line": 308,
    "state": "covered",
    "entries": "1"
  },
  {
    "id": "declaration/17",
    "name": "check_loaded_source_frontend",
    "line": 319,
    "state": "covered",
    "entries": "1"
  },
  {
    "id": "declaration/18",
    "name": "expression_is_await",
    "line": 344,
    "state": "covered",
    "entries": "1332"
  }
]

Source branch outcomes

[
  {
    "id": "declaration/1/tail/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6446"
  },
  {
    "id": "declaration/1/tail/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "274"
  },
  {
    "id": "declaration/1/tail/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6446"
  },
  {
    "id": "declaration/1/tail/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "274"
  },
  {
    "id": "declaration/1/tail/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6447"
  },
  {
    "id": "declaration/1/tail/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "273"
  },
  {
    "id": "declaration/1/tail/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6465"
  },
  {
    "id": "declaration/1/tail/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "255"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6466"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "254"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6490"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "230"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6501"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "219"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6505"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "215"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6506"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "214"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6507"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "213"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6508"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "212"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6508"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "212"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6511"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "209"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6519"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "201"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6706"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "14"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6708"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "12"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6709"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "11"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6710"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6714"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6715"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6716"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6719"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6719"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 4,
    "state": "covered",
    "hits": "6719"
  },
  {
    "id": "declaration/1/tail/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 4,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/9/statement/1/value/decision/true",
    "outcome": "true",
    "line": 38,
    "state": "covered",
    "hits": "74884"
  },
  {
    "id": "declaration/9/statement/1/value/decision/false",
    "outcome": "false",
    "line": 38,
    "state": "covered",
    "hits": "136"
  },
  {
    "id": "declaration/9/statement/8/value/arm/0",
    "outcome": "LocatedExpr",
    "line": 46,
    "state": "covered",
    "hits": "37509"
  },
  {
    "id": "declaration/9/statement/8/value/arm/0/body/block/statement/1/value/args/5/decision/true",
    "outcome": "true",
    "line": 48,
    "state": "covered",
    "hits": "179"
  },
  {
    "id": "declaration/9/statement/8/value/arm/0/body/block/statement/1/value/args/5/decision/false",
    "outcome": "false",
    "line": 48,
    "state": "covered",
    "hits": "37330"
  },
  {
    "id": "declaration/9/statement/8/value/arm/1",
    "outcome": "NatExpr",
    "line": 51,
    "state": "covered",
    "hits": "2022"
  },
  {
    "id": "declaration/9/statement/8/value/arm/2",
    "outcome": "DecimalExpr",
    "line": 52,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/9/statement/8/value/arm/3",
    "outcome": "StringExpr",
    "line": 53,
    "state": "covered",
    "hits": "2524"
  },
  {
    "id": "declaration/9/statement/8/value/arm/4",
    "outcome": "BoolExpr",
    "line": 54,
    "state": "covered",
    "hits": "561"
  },
  {
    "id": "declaration/9/statement/8/value/arm/5",
    "outcome": "NameExpr",
    "line": 55,
    "state": "covered",
    "hits": "13645"
  },
  {
    "id": "declaration/9/statement/8/value/arm/6",
    "outcome": "FunctionExpr",
    "line": 56,
    "state": "covered",
    "hits": "44"
  },
  {
    "id": "declaration/9/statement/8/value/arm/7",
    "outcome": "ArrayExpr",
    "line": 57,
    "state": "covered",
    "hits": "521"
  },
  {
    "id": "declaration/9/statement/8/value/arm/7/body/block/statement/0/decision/body",
    "outcome": "body",
    "line": 58,
    "state": "covered",
    "hits": "229"
  },
  {
    "id": "declaration/9/statement/8/value/arm/7/body/block/statement/0/decision/exit",
    "outcome": "exit",
    "line": 58,
    "state": "covered",
    "hits": "521"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8",
    "outcome": "UnaryExpr",
    "line": 62,
    "state": "covered",
    "hits": "229"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/decision/true",
    "outcome": "true",
    "line": 63,
    "state": "covered",
    "hits": "42"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/decision/false",
    "outcome": "false",
    "line": 63,
    "state": "covered",
    "hits": "187"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/true/statement/1/value/decision/true",
    "outcome": "true",
    "line": 65,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/true/statement/1/value/decision/false",
    "outcome": "false",
    "line": 65,
    "state": "covered",
    "hits": "36"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/true/statement/1/value/true/tail/decision/true",
    "outcome": "true",
    "line": 68,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/8/value/arm/8/body/block/tail/true/statement/1/value/true/tail/decision/false",
    "outcome": "false",
    "line": 68,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/9/statement/8/value/arm/9",
    "outcome": "BinaryExpr",
    "line": 73,
    "state": "covered",
    "hits": "4496"
  },
  {
    "id": "declaration/9/statement/8/value/arm/10",
    "outcome": "DotCallExpr",
    "line": 77,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11",
    "outcome": "CallExpr",
    "line": 80,
    "state": "covered",
    "hits": "6696"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 83,
    "state": "covered",
    "hits": "6695"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 83,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 83,
    "state": "covered",
    "hits": "6695"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 83,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/left/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 83,
    "state": "covered",
    "hits": "6695"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/left/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 83,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 83,
    "state": "covered",
    "hits": "2391"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/2/value/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 83,
    "state": "covered",
    "hits": "4304"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/3/value/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 84,
    "state": "covered",
    "hits": "6439"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/3/value/decision/skip-right",
    "outcome": "skip-right",
    "line": 84,
    "state": "covered",
    "hits": "257"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/3/value/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 84,
    "state": "covered",
    "hits": "2391"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/3/value/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 84,
    "state": "covered",
    "hits": "4048"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/4/value/decision/true",
    "outcome": "true",
    "line": 85,
    "state": "covered",
    "hits": "63"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/4/value/decision/false",
    "outcome": "false",
    "line": 85,
    "state": "covered",
    "hits": "6633"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/4/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 85,
    "state": "covered",
    "hits": "63"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/4/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 85,
    "state": "covered",
    "hits": "6633"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/decision/true",
    "outcome": "true",
    "line": 91,
    "state": "covered",
    "hits": "68"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/decision/false",
    "outcome": "false",
    "line": 91,
    "state": "covered",
    "hits": "6628"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/1/value/decision/true",
    "outcome": "true",
    "line": 93,
    "state": "covered",
    "hits": "14"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/1/value/decision/false",
    "outcome": "false",
    "line": 93,
    "state": "covered",
    "hits": "54"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/2/value/decision/true",
    "outcome": "true",
    "line": 94,
    "state": "covered",
    "hits": "14"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/2/value/decision/false",
    "outcome": "false",
    "line": 94,
    "state": "covered",
    "hits": "54"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/2/value/false/tail/decision/true",
    "outcome": "true",
    "line": 95,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/2/value/false/tail/decision/false",
    "outcome": "false",
    "line": 95,
    "state": "covered",
    "hits": "35"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/3/value/decision/true",
    "outcome": "true",
    "line": 97,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/3/value/decision/false",
    "outcome": "false",
    "line": 97,
    "state": "covered",
    "hits": "58"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/3/value/false/tail/decision/true",
    "outcome": "true",
    "line": 97,
    "state": "covered",
    "hits": "39"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/5/value/true/statement/3/value/false/tail/decision/false",
    "outcome": "false",
    "line": 97,
    "state": "covered",
    "hits": "19"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/6/value/decision/true",
    "outcome": "true",
    "line": 99,
    "state": "covered",
    "hits": "63"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/6/value/decision/false",
    "outcome": "false",
    "line": 99,
    "state": "covered",
    "hits": "6633"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/decision/true",
    "outcome": "true",
    "line": 100,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/decision/false",
    "outcome": "false",
    "line": 100,
    "state": "covered",
    "hits": "6691"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 100,
    "state": "covered",
    "hits": "37"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 100,
    "state": "covered",
    "hits": "6659"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/true/tail/decision/true",
    "outcome": "true",
    "line": 103,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/7/value/true/tail/decision/false",
    "outcome": "false",
    "line": 103,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/decision/true",
    "outcome": "true",
    "line": 105,
    "state": "covered",
    "hits": "13"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/decision/false",
    "outcome": "false",
    "line": 105,
    "state": "covered",
    "hits": "6683"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 105,
    "state": "covered",
    "hits": "39"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 105,
    "state": "covered",
    "hits": "6657"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/condition/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 105,
    "state": "covered",
    "hits": "32"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/condition/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 105,
    "state": "covered",
    "hits": "7"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/true/tail/decision/true",
    "outcome": "true",
    "line": 108,
    "state": "covered",
    "hits": "4"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/8/value/true/tail/decision/false",
    "outcome": "false",
    "line": 108,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/decision/true",
    "outcome": "true",
    "line": 110,
    "state": "covered",
    "hits": "63"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/decision/false",
    "outcome": "false",
    "line": 110,
    "state": "covered",
    "hits": "6633"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 110,
    "state": "covered",
    "hits": "5796"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 110,
    "state": "covered",
    "hits": "900"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/true/tail/decision/true",
    "outcome": "true",
    "line": 113,
    "state": "covered",
    "hits": "24"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/9/value/true/tail/decision/false",
    "outcome": "false",
    "line": 113,
    "state": "covered",
    "hits": "39"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/decision/true",
    "outcome": "true",
    "line": 115,
    "state": "covered",
    "hits": "10"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/decision/false",
    "outcome": "false",
    "line": 115,
    "state": "covered",
    "hits": "6686"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 115,
    "state": "covered",
    "hits": "43"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 115,
    "state": "covered",
    "hits": "6653"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/condition/left/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 115,
    "state": "covered",
    "hits": "79"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/condition/left/decision/skip-right",
    "outcome": "skip-right",
    "line": 115,
    "state": "covered",
    "hits": "6617"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/true/tail/decision/true",
    "outcome": "true",
    "line": 118,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/10/value/true/tail/decision/false",
    "outcome": "false",
    "line": 118,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/11/decision/body",
    "outcome": "body",
    "line": 120,
    "state": "covered",
    "hits": "11747"
  },
  {
    "id": "declaration/9/statement/8/value/arm/11/body/block/statement/11/decision/exit",
    "outcome": "exit",
    "line": 120,
    "state": "covered",
    "hits": "6696"
  },
  {
    "id": "declaration/9/statement/8/value/arm/12",
    "outcome": "FieldExpr",
    "line": 124,
    "state": "covered",
    "hits": "3152"
  },
  {
    "id": "declaration/9/statement/8/value/arm/13",
    "outcome": "IndexExpr",
    "line": 127,
    "state": "covered",
    "hits": "636"
  },
  {
    "id": "declaration/9/statement/8/value/arm/14",
    "outcome": "IfExpr",
    "line": 131,
    "state": "covered",
    "hits": "1556"
  },
  {
    "id": "declaration/9/statement/8/value/arm/15",
    "outcome": "BlockExpr",
    "line": 136,
    "state": "covered",
    "hits": "1012"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16",
    "outcome": "MatchExpr",
    "line": 139,
    "state": "covered",
    "hits": "412"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/6/decision/body",
    "outcome": "body",
    "line": 146,
    "state": "covered",
    "hits": "454"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/6/decision/exit",
    "outcome": "exit",
    "line": 146,
    "state": "covered",
    "hits": "412"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/6/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 146,
    "state": "covered",
    "hits": "454"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/6/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 146,
    "state": "covered",
    "hits": "412"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/decision/body",
    "outcome": "body",
    "line": 150,
    "state": "covered",
    "hits": "1660"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/decision/exit",
    "outcome": "exit",
    "line": 150,
    "state": "covered",
    "hits": "412"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/decision/body",
    "outcome": "body",
    "line": 152,
    "state": "covered",
    "hits": "16916"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/decision/exit",
    "outcome": "exit",
    "line": 152,
    "state": "covered",
    "hits": "1660"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/decision/true",
    "outcome": "true",
    "line": 153,
    "state": "covered",
    "hits": "1660"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/decision/false",
    "outcome": "false",
    "line": 153,
    "state": "covered",
    "hits": "15256"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/true/statement/1/decision/body",
    "outcome": "body",
    "line": 155,
    "state": "covered",
    "hits": "2421"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/true/statement/1/decision/exit",
    "outcome": "exit",
    "line": 155,
    "state": "covered",
    "hits": "1660"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/true/statement/1/body/statement/0/value/decision/true",
    "outcome": "true",
    "line": 156,
    "state": "covered",
    "hits": "2421"
  },
  {
    "id": "declaration/9/statement/8/value/arm/16/body/block/statement/7/body/statement/1/body/tail/true/statement/1/body/statement/0/value/decision/false",
    "outcome": "false",
    "line": 156,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/9/statement/9/value/decision/true",
    "outcome": "true",
    "line": 168,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/9/statement/9/value/decision/false",
    "outcome": "false",
    "line": 168,
    "state": "covered",
    "hits": "75015"
  },
  {
    "id": "declaration/9/statement/9/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 168,
    "state": "covered",
    "hits": "84"
  },
  {
    "id": "declaration/9/statement/9/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 168,
    "state": "covered",
    "hits": "74936"
  },
  {
    "id": "declaration/9/statement/9/value/true/tail/decision/true",
    "outcome": "true",
    "line": 172,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/9/statement/9/value/true/tail/decision/false",
    "outcome": "false",
    "line": 172,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/9/statement/10/value/decision/true",
    "outcome": "true",
    "line": 174,
    "state": "covered",
    "hits": "82"
  },
  {
    "id": "declaration/9/statement/10/value/decision/false",
    "outcome": "false",
    "line": 174,
    "state": "covered",
    "hits": "74938"
  },
  {
    "id": "declaration/9/statement/10/value/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 174,
    "state": "covered",
    "hits": "360"
  },
  {
    "id": "declaration/9/statement/10/value/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 174,
    "state": "covered",
    "hits": "74660"
  },
  {
    "id": "declaration/10/statement/2/decision/body",
    "outcome": "body",
    "line": 184,
    "state": "covered",
    "hits": "5216"
  },
  {
    "id": "declaration/10/statement/2/decision/exit",
    "outcome": "exit",
    "line": 184,
    "state": "covered",
    "hits": "5614"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/0",
    "outcome": "BindingStatement",
    "line": 186,
    "state": "covered",
    "hits": "1858"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/0/body/block/tail/decision/true",
    "outcome": "true",
    "line": 188,
    "state": "covered",
    "hits": "1852"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/0/body/block/tail/decision/false",
    "outcome": "false",
    "line": 188,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/1",
    "outcome": "AssignmentStatement",
    "line": 195,
    "state": "covered",
    "hits": "2193"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/1/body/block/tail/decision/true",
    "outcome": "true",
    "line": 197,
    "state": "covered",
    "hits": "168"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/1/body/block/tail/decision/false",
    "outcome": "false",
    "line": 197,
    "state": "covered",
    "hits": "2025"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2",
    "outcome": "ExpressionStatement",
    "line": 202,
    "state": "covered",
    "hits": "666"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/decision/true",
    "outcome": "true",
    "line": 203,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/decision/false",
    "outcome": "false",
    "line": 203,
    "state": "covered",
    "hits": "660"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/decision/true",
    "outcome": "true",
    "line": 205,
    "state": "covered",
    "hits": "5"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/decision/false",
    "outcome": "false",
    "line": 205,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/true/tail/decision/true",
    "outcome": "true",
    "line": 208,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/true/tail/decision/false",
    "outcome": "false",
    "line": 208,
    "state": "covered",
    "hits": "3"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/true/tail/true/statement/0/value/decision/true",
    "outcome": "true",
    "line": 209,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/2/body/block/statement/0/value/true/tail/true/tail/true/statement/0/value/decision/false",
    "outcome": "false",
    "line": 209,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/3",
    "outcome": "WhileStatement",
    "line": 217,
    "state": "covered",
    "hits": "130"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/4",
    "outcome": "ForStatement",
    "line": 221,
    "state": "covered",
    "hits": "369"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/4/body/block/statement/3/value/decision/true",
    "outcome": "true",
    "line": 225,
    "state": "covered",
    "hits": "305"
  },
  {
    "id": "declaration/10/statement/2/body/tail/arm/4/body/block/statement/3/value/decision/false",
    "outcome": "false",
    "line": 225,
    "state": "covered",
    "hits": "64"
  },
  {
    "id": "declaration/10/statement/3/value/arm/0",
    "outcome": "NoBlockValue",
    "line": 232,
    "state": "covered",
    "hits": "2586"
  },
  {
    "id": "declaration/10/statement/3/value/arm/1",
    "outcome": "TailBlockValue",
    "line": 233,
    "state": "covered",
    "hits": "3028"
  },
  {
    "id": "declaration/12/statement/1/decision/body",
    "outcome": "body",
    "line": 246,
    "state": "covered",
    "hits": "1370"
  },
  {
    "id": "declaration/12/statement/1/decision/exit",
    "outcome": "exit",
    "line": 246,
    "state": "covered",
    "hits": "220"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/0",
    "outcome": "TypeDeclaration",
    "line": 248,
    "state": "covered",
    "hits": "17"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1",
    "outcome": "FunctionDeclaration",
    "line": 251,
    "state": "covered",
    "hits": "1000"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/decision/true",
    "outcome": "true",
    "line": 252,
    "state": "covered",
    "hits": "991"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/decision/false",
    "outcome": "false",
    "line": 252,
    "state": "covered",
    "hits": "9"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 252,
    "state": "covered",
    "hits": "26"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 252,
    "state": "covered",
    "hits": "974"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/condition/right/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 252,
    "state": "covered",
    "hits": "25"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/condition/right/decision/skip-right",
    "outcome": "skip-right",
    "line": 252,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/1/value/args/2/args/0/decision/true",
    "outcome": "true",
    "line": 254,
    "state": "covered",
    "hits": "76"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/1/value/args/2/args/0/decision/false",
    "outcome": "false",
    "line": 254,
    "state": "covered",
    "hits": "915"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/1/value/args/2/args/0/false/tail/decision/true",
    "outcome": "true",
    "line": 254,
    "state": "covered",
    "hits": "751"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/1/value/args/2/args/0/false/tail/decision/false",
    "outcome": "false",
    "line": 254,
    "state": "covered",
    "hits": "164"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/2/decision/body",
    "outcome": "body",
    "line": 255,
    "state": "covered",
    "hits": "1387"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/2/decision/exit",
    "outcome": "exit",
    "line": 255,
    "state": "covered",
    "hits": "991"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/5/value/decision/true",
    "outcome": "true",
    "line": 260,
    "state": "covered",
    "hits": "86"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/5/value/decision/false",
    "outcome": "false",
    "line": 260,
    "state": "covered",
    "hits": "905"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/5/value/true/statement/0/decision/body",
    "outcome": "body",
    "line": 261,
    "state": "covered",
    "hits": "83"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/1/body/block/tail/true/statement/5/value/true/statement/0/decision/exit",
    "outcome": "exit",
    "line": 261,
    "state": "covered",
    "hits": "86"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/2",
    "outcome": "ImportDeclaration",
    "line": 269,
    "state": "covered",
    "hits": "68"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/3",
    "outcome": "RecordDeclaration",
    "line": 270,
    "state": "covered",
    "hits": "161"
  },
  {
    "id": "declaration/12/statement/1/body/tail/arm/4",
    "outcome": "EnumDeclaration",
    "line": 271,
    "state": "covered",
    "hits": "124"
  },
  {
    "id": "declaration/13/tail/decision/true",
    "outcome": "true",
    "line": 281,
    "state": "covered",
    "hits": "113"
  },
  {
    "id": "declaration/13/tail/decision/false",
    "outcome": "false",
    "line": 281,
    "state": "covered",
    "hits": "169"
  },
  {
    "id": "declaration/13/tail/false/tail/decision/true",
    "outcome": "true",
    "line": 284,
    "state": "covered",
    "hits": "8"
  },
  {
    "id": "declaration/13/tail/false/tail/decision/false",
    "outcome": "false",
    "line": 284,
    "state": "covered",
    "hits": "161"
  },
  {
    "id": "declaration/13/tail/false/tail/condition/decision/evaluate-right",
    "outcome": "evaluate-right",
    "line": 284,
    "state": "covered",
    "hits": "18"
  },
  {
    "id": "declaration/13/tail/false/tail/condition/decision/skip-right",
    "outcome": "skip-right",
    "line": 284,
    "state": "covered",
    "hits": "151"
  },
  {
    "id": "declaration/15/tail/arm/0",
    "outcome": "Ok",
    "line": 298,
    "state": "covered",
    "hits": "221"
  },
  {
    "id": "declaration/15/tail/arm/0/body/block/tail/arm/0",
    "outcome": "Ok",
    "line": 300,
    "state": "covered",
    "hits": "206"
  },
  {
    "id": "declaration/15/tail/arm/0/body/block/tail/arm/1",
    "outcome": "Error",
    "line": 301,
    "state": "covered",
    "hits": "15"
  },
  {
    "id": "declaration/15/tail/arm/1",
    "outcome": "Error",
    "line": 304,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/decision/true",
    "outcome": "true",
    "line": 312,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/16/tail/decision/false",
    "outcome": "false",
    "line": 312,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/17/statement/2/decision/body",
    "outcome": "body",
    "line": 322,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/17/statement/2/decision/exit",
    "outcome": "exit",
    "line": 322,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/0",
    "outcome": "Ok",
    "line": 324,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/0/body/block/tail/arm/0",
    "outcome": "Ok",
    "line": 326,
    "state": "covered",
    "hits": "2"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/0/body/block/tail/arm/1",
    "outcome": "Error",
    "line": 327,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/1",
    "outcome": "Error",
    "line": 330,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/1/body/block/statement/0/decision/body",
    "outcome": "body",
    "line": 331,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/statement/2/body/tail/arm/1/body/block/statement/0/decision/exit",
    "outcome": "exit",
    "line": 331,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/tail/decision/true",
    "outcome": "true",
    "line": 337,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/17/tail/decision/false",
    "outcome": "false",
    "line": 337,
    "state": "covered",
    "hits": "1"
  },
  {
    "id": "declaration/18/statement/1/value/arm/0",
    "outcome": "LocatedExpr",
    "line": 347,
    "state": "covered",
    "hits": "666"
  },
  {
    "id": "declaration/18/statement/1/value/arm/1",
    "outcome": "NatExpr",
    "line": 348,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/2",
    "outcome": "DecimalExpr",
    "line": 348,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/3",
    "outcome": "StringExpr",
    "line": 348,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/4",
    "outcome": "BoolExpr",
    "line": 348,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/5",
    "outcome": "NameExpr",
    "line": 349,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/6",
    "outcome": "FunctionExpr",
    "line": 349,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/7",
    "outcome": "ArrayExpr",
    "line": 349,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/8",
    "outcome": "UnaryExpr",
    "line": 350,
    "state": "covered",
    "hits": "6"
  },
  {
    "id": "declaration/18/statement/1/value/arm/9",
    "outcome": "BinaryExpr",
    "line": 350,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/10",
    "outcome": "CallExpr",
    "line": 351,
    "state": "covered",
    "hits": "182"
  },
  {
    "id": "declaration/18/statement/1/value/arm/11",
    "outcome": "DotCallExpr",
    "line": 351,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/12",
    "outcome": "FieldExpr",
    "line": 351,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/13",
    "outcome": "IndexExpr",
    "line": 351,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/14",
    "outcome": "IfExpr",
    "line": 352,
    "state": "covered",
    "hits": "396"
  },
  {
    "id": "declaration/18/statement/1/value/arm/15",
    "outcome": "BlockExpr",
    "line": 352,
    "state": "zero",
    "hits": "0"
  },
  {
    "id": "declaration/18/statement/1/value/arm/16",
    "outcome": "MatchExpr",
    "line": 352,
    "state": "covered",
    "hits": "82"
  }
]

Reviewed declaration exclusions

[
  {
    "id": "declaration/0",
    "reason": "import",
    "line": 1
  },
  {
    "id": "declaration/2",
    "reason": "record-declaration",
    "line": 13
  },
  {
    "id": "declaration/3",
    "reason": "record-declaration",
    "line": 17
  }
]