All files

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