src/compiler/diagnostics.panack
Green: covered; red: known zero; amber: unavailable. Blank lines are outside the executable-start-line denominator.
1 import "types.panack" 2 3 pure diagnostic_spaces(count: Nat): Str { 4 mut output: Str = "" 5 for index in 0..count { output = output + " " } 6 output 7 } 8 9 pure diagnostic_hex(value: Nat): Str { 10 digits: Str = "0123456789abcdef" 11 if value < 16 { digits[value] } 12 else { diagnostic_hex(quotient(value, 16)) + digits[value % 16] } 13 } 14 15 pure diagnostic_character(character: Str): Str { 16 encoded: Bytes = utf8_encode(character) 17 count: Nat = byte_len(encoded) 18 if count == 0 { "" } 19 else { 20 mut value: Nat = byte_get(encoded, 0) 21 if count == 1 && value >= 32 && value < 127 { 22 if character == "\\" { "\\\\" } else { character } 23 } else { 24 if count > 1 { 25 value = value % (if count == 2 { 32 } else { if count == 3 { 16 } else { 8 } }) 26 mut index: Nat = 1 27 while index < count { 28 value = value * 64 + byte_get(encoded, index) % 64 29 index = index + 1 30 } 31 } 32 "\\u{" + diagnostic_hex(value) + "}" 33 } 34 } 35 } 36 37 pure diagnostic_excerpt(diagnostic: Diagnostic, source: Str): Str { 38 position: SourcePos = diagnostic.position 39 if position.line == 0 || position.column == 0 { "" } 40 else { 41 mut line: Nat = 1 42 mut start: Nat = 0 43 mut cursor: Nat = 0 44 while cursor < len(source) && line < position.line { 45 if source[cursor] == "\n" { line = line + 1; start = cursor + 1 } 46 cursor = cursor + 1 47 } 48 if line != position.line { "" } 49 else { 50 mut end: Nat = start 51 while end < len(source) && source[end] != "\n" { end = end + 1 } 52 if end < len(source) && end > start { 53 if end >= 1 { 54 previous: Nat = end - 1 55 if source[previous] == "\r" { end = previous } 56 } 57 } 58 text: Str = slice(source, start, end) 59 if position.column > len(text) + 1 { "" } 60 else { 61 mut displayed: Str = "" 62 mut width: Nat = 0 63 mut caret: Nat = 0 64 mut index: Nat = 0 65 while index < len(text) { 66 if index + 1 == position.column { caret = width } 67 character: Str = text[index] 68 cell: Str = if character == "\t" { 69 diagnostic_spaces([4, 3, 2, 1][width % 4]) 70 } else { diagnostic_character(character) } 71 displayed = displayed + cell 72 width = width + len(cell) 73 index = index + 1 74 } 75 if position.column == len(text) + 1 { caret = width } 76 number: Str = "${line}" 77 "\n " + number + " | " + displayed + "\n " + 78 diagnostic_spaces(len(number)) + " | " + diagnostic_spaces(caret) + "^" 79 } 80 } 81 } 82 } 83 84 pure diagnostic_with_source(diagnostic: Diagnostic, sources: Map[Str,Str]): Str { 85 header: Str = diagnostic_text(diagnostic) 86 file: Str = diagnostic.position.file 87 if len(file) > 0 && sources.has(file) { 88 header + diagnostic_excerpt(diagnostic, sources.get(file)) 89 } else { header } 90 } 91
Functions
[
{
"id": "declaration/1",
"name": "diagnostic_spaces",
"line": 3,
"state": "covered",
"entries": "19"
},
{
"id": "declaration/2",
"name": "diagnostic_hex",
"line": 9,
"state": "covered",
"entries": "18"
},
{
"id": "declaration/3",
"name": "diagnostic_character",
"line": 15,
"state": "covered",
"entries": "5861"
},
{
"id": "declaration/4",
"name": "diagnostic_excerpt",
"line": 37,
"state": "covered",
"entries": "12"
},
{
"id": "declaration/5",
"name": "diagnostic_with_source",
"line": 84,
"state": "covered",
"entries": "14"
}
]Source branch outcomes
[
{
"id": "declaration/1/statement/1/decision/body",
"outcome": "body",
"line": 5,
"state": "covered",
"hits": "82"
},
{
"id": "declaration/1/statement/1/decision/exit",
"outcome": "exit",
"line": 5,
"state": "covered",
"hits": "19"
},
{
"id": "declaration/2/tail/decision/true",
"outcome": "true",
"line": 11,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/2/tail/decision/false",
"outcome": "false",
"line": 11,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/3/tail/decision/true",
"outcome": "true",
"line": 18,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/3/tail/decision/false",
"outcome": "false",
"line": 18,
"state": "covered",
"hits": "5861"
},
{
"id": "declaration/3/tail/false/tail/decision/true",
"outcome": "true",
"line": 21,
"state": "covered",
"hits": "5855"
},
{
"id": "declaration/3/tail/false/tail/decision/false",
"outcome": "false",
"line": 21,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/3/tail/false/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 21,
"state": "covered",
"hits": "5855"
},
{
"id": "declaration/3/tail/false/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 21,
"state": "covered",
"hits": "6"
},
{
"id": "declaration/3/tail/false/tail/condition/left/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 21,
"state": "covered",
"hits": "5857"
},
{
"id": "declaration/3/tail/false/tail/condition/left/decision/skip-right",
"outcome": "skip-right",
"line": 21,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/3/tail/false/tail/true/tail/decision/true",
"outcome": "true",
"line": 22,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/3/tail/false/tail/true/tail/decision/false",
"outcome": "false",
"line": 22,
"state": "covered",
"hits": "5854"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/decision/true",
"outcome": "true",
"line": 24,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/decision/false",
"outcome": "false",
"line": 24,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/0/value/right/decision/true",
"outcome": "true",
"line": 25,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/0/value/right/decision/false",
"outcome": "false",
"line": 25,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/0/value/right/false/tail/decision/true",
"outcome": "true",
"line": 25,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/0/value/right/false/tail/decision/false",
"outcome": "false",
"line": 25,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/2/decision/body",
"outcome": "body",
"line": 27,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/3/tail/false/tail/false/statement/0/value/true/statement/2/decision/exit",
"outcome": "exit",
"line": 27,
"state": "covered",
"hits": "4"
},
{
"id": "declaration/4/tail/decision/true",
"outcome": "true",
"line": 39,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/4/tail/decision/false",
"outcome": "false",
"line": 39,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/4/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 39,
"state": "covered",
"hits": "11"
},
{
"id": "declaration/4/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 39,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/4/tail/false/statement/3/decision/body",
"outcome": "body",
"line": 44,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/4/tail/false/statement/3/decision/exit",
"outcome": "exit",
"line": 44,
"state": "covered",
"hits": "10"
},
{
"id": "declaration/4/tail/false/statement/3/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 44,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/4/tail/false/statement/3/condition/decision/skip-right",
"outcome": "skip-right",
"line": 44,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/4/tail/false/statement/3/body/statement/0/value/decision/true",
"outcome": "true",
"line": 45,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/4/tail/false/statement/3/body/statement/0/value/decision/false",
"outcome": "false",
"line": 45,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/4/tail/false/tail/decision/true",
"outcome": "true",
"line": 48,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/4/tail/false/tail/decision/false",
"outcome": "false",
"line": 48,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/4/tail/false/tail/false/statement/1/decision/body",
"outcome": "body",
"line": 51,
"state": "covered",
"hits": "32"
},
{
"id": "declaration/4/tail/false/tail/false/statement/1/decision/exit",
"outcome": "exit",
"line": 51,
"state": "covered",
"hits": "9"
},
{
"id": "declaration/4/tail/false/tail/false/statement/1/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 51,
"state": "covered",
"hits": "34"
},
{
"id": "declaration/4/tail/false/tail/false/statement/1/condition/decision/skip-right",
"outcome": "skip-right",
"line": 51,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/decision/true",
"outcome": "true",
"line": 52,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/decision/false",
"outcome": "false",
"line": 52,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 52,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/condition/decision/skip-right",
"outcome": "skip-right",
"line": 52,
"state": "covered",
"hits": "7"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/true/tail/decision/true",
"outcome": "true",
"line": 53,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/true/tail/decision/false",
"outcome": "false",
"line": 53,
"state": "zero",
"hits": "0"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/true/tail/true/tail/decision/true",
"outcome": "true",
"line": 55,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/4/tail/false/tail/false/statement/2/value/true/tail/true/tail/decision/false",
"outcome": "false",
"line": 55,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/4/tail/false/tail/false/tail/decision/true",
"outcome": "true",
"line": 59,
"state": "covered",
"hits": "1"
},
{
"id": "declaration/4/tail/false/tail/false/tail/decision/false",
"outcome": "false",
"line": 59,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/decision/body",
"outcome": "body",
"line": 65,
"state": "covered",
"hits": "28"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/decision/exit",
"outcome": "exit",
"line": 65,
"state": "covered",
"hits": "8"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/body/statement/0/value/decision/true",
"outcome": "true",
"line": 66,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/body/statement/0/value/decision/false",
"outcome": "false",
"line": 66,
"state": "covered",
"hits": "23"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/body/statement/2/value/decision/true",
"outcome": "true",
"line": 68,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/4/body/statement/2/value/decision/false",
"outcome": "false",
"line": 68,
"state": "covered",
"hits": "25"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/5/value/decision/true",
"outcome": "true",
"line": 75,
"state": "covered",
"hits": "3"
},
{
"id": "declaration/4/tail/false/tail/false/tail/false/statement/5/value/decision/false",
"outcome": "false",
"line": 75,
"state": "covered",
"hits": "5"
},
{
"id": "declaration/5/tail/decision/true",
"outcome": "true",
"line": 87,
"state": "covered",
"hits": "12"
},
{
"id": "declaration/5/tail/decision/false",
"outcome": "false",
"line": 87,
"state": "covered",
"hits": "2"
},
{
"id": "declaration/5/tail/condition/decision/evaluate-right",
"outcome": "evaluate-right",
"line": 87,
"state": "covered",
"hits": "13"
},
{
"id": "declaration/5/tail/condition/decision/skip-right",
"outcome": "skip-right",
"line": 87,
"state": "covered",
"hits": "1"
}
]Reviewed declaration exclusions
[
{
"id": "declaration/0",
"reason": "import",
"line": 1
}
]