src/Pure/Tools/check_source.scala
author wenzelm
Tue, 29 Apr 2014 16:14:27 +0200
changeset 56791 23883e1879c5
child 56792 792dd0e9cebb
permissions -rw-r--r--
some sanity checks for Isabelle sources;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56791
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/check_source.scala
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     3
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     4
Some sanity checks for Isabelle sources.
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     5
*/
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     6
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     7
package isabelle
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     8
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
     9
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    10
object Check_Source
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    11
{
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    12
  def check_file(path: Path)
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    13
  {
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    14
    val file_name = path.implode
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    15
    val file_pos = path.position
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    16
    def line_pos(i: Int) = Position.Line_File(i + 1, file_name)
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    17
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    18
    val content = File.read(path)
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    19
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    20
    for { (line, i) <- split_lines(content).iterator.zipWithIndex }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    21
    {
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    22
      try {
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    23
        Symbol.decode_strict(line)
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    24
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    25
        for { c <- Word.codepoint_iterator(line); if c > 128 && !Character.isAlphabetic(c) }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    26
        {
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    27
          Output.warning("Suspicious Unicode character " + quote(new String(Array(c), 0, 1)) +
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    28
            Position.here(line_pos(i)))
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    29
        }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    30
      }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    31
      catch { case ERROR(msg) => Output.error_message(msg + Position.here(line_pos(i))) }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    32
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    33
      if (line.contains('\t'))
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    34
        Output.warning("TAB character " + Position.here(line_pos(i)))
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    35
    }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    36
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    37
    if (content.contains('\r'))
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    38
      Output.warning("CR character " + Position.here(file_pos))
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    39
  }
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    40
}
23883e1879c5 some sanity checks for Isabelle sources;
wenzelm
parents:
diff changeset
    41