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
}
]