Hex Artifact Content
Not logged in

Artifact 1db7f222fa9a6be47301c5a6444a3bffbbd0ab88:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 32 2d 32 30 31 34 20 54 68 65 20 52 75 73 74 20  2-2014 The Rust 
0020: 50 72 6f 6a 65 63 74 20 44 65 76 65 6c 6f 70 65  Project Develope
0030: 72 73 2e 20 53 65 65 20 74 68 65 20 43 4f 50 59  rs. See the COPY
0040: 52 49 47 48 54 0a 2f 2f 20 66 69 6c 65 20 61 74  RIGHT.// file at
0050: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 64   the top-level d
0060: 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 69 73  irectory of this
0070: 20 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e   distribution an
0080: 64 20 61 74 0a 2f 2f 20 68 74 74 70 3a 2f 2f 72  d at.// http://r
0090: 75 73 74 2d 6c 61 6e 67 2e 6f 72 67 2f 43 4f 50  ust-lang.org/COP
00a0: 59 52 49 47 48 54 2e 0a 2f 2f 0a 2f 2f 20 4c 69  YRIGHT..//.// Li
00b0: 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68 65  censed under the
00c0: 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65 2c   Apache License,
00d0: 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 3c 4c 49   Version 2.0 <LI
00e0: 43 45 4e 53 45 2d 41 50 41 43 48 45 20 6f 72 0a  CENSE-APACHE or.
00f0: 2f 2f 20 68 74 74 70 3a 2f 2f 77 77 77 2e 61 70  // http://www.ap
0100: 61 63 68 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 65  ache.org/license
0110: 73 2f 4c 49 43 45 4e 53 45 2d 32 2e 30 3e 20 6f  s/LICENSE-2.0> o
0120: 72 20 74 68 65 20 4d 49 54 20 6c 69 63 65 6e 73  r the MIT licens
0130: 65 0a 2f 2f 20 3c 4c 49 43 45 4e 53 45 2d 4d 49  e.// <LICENSE-MI
0140: 54 20 6f 72 20 68 74 74 70 3a 2f 2f 6f 70 65 6e  T or http://open
0150: 73 6f 75 72 63 65 2e 6f 72 67 2f 6c 69 63 65 6e  source.org/licen
0160: 73 65 73 2f 4d 49 54 3e 2c 20 61 74 20 79 6f 75  ses/MIT>, at you
0170: 72 0a 2f 2f 20 6f 70 74 69 6f 6e 2e 20 54 68 69  r.// option. Thi
0180: 73 20 66 69 6c 65 20 6d 61 79 20 6e 6f 74 20 62  s file may not b
0190: 65 20 63 6f 70 69 65 64 2c 20 6d 6f 64 69 66 69  e copied, modifi
01a0: 65 64 2c 20 6f 72 20 64 69 73 74 72 69 62 75 74  ed, or distribut
01b0: 65 64 0a 2f 2f 20 65 78 63 65 70 74 20 61 63 63  ed.// except acc
01c0: 6f 72 64 69 6e 67 20 74 6f 20 74 68 6f 73 65 20  ording to those 
01d0: 74 65 72 6d 73 2e 0a 75 73 65 20 73 65 6c 66 3a  terms..use self:
01e0: 3a 57 68 69 63 68 4c 69 6e 65 3a 3a 2a 3b 0a 0a  :WhichLine::*;..
01f0: 75 73 65 20 73 74 64 3a 3a 66 6d 74 3b 0a 75 73  use std::fmt;.us
0200: 65 20 73 74 64 3a 3a 66 73 3a 3a 46 69 6c 65 3b  e std::fs::File;
0210: 0a 75 73 65 20 73 74 64 3a 3a 69 6f 3a 3a 42 75  .use std::io::Bu
0220: 66 52 65 61 64 65 72 3b 0a 75 73 65 20 73 74 64  fReader;.use std
0230: 3a 3a 69 6f 3a 3a 70 72 65 6c 75 64 65 3a 3a 2a  ::io::prelude::*
0240: 3b 0a 75 73 65 20 73 74 64 3a 3a 70 61 74 68 3a  ;.use std::path:
0250: 3a 50 61 74 68 3b 0a 75 73 65 20 73 74 64 3a 3a  :Path;.use std::
0260: 73 74 72 3a 3a 46 72 6f 6d 53 74 72 3b 0a 0a 23  str::FromStr;..#
0270: 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 44  [derive(Clone, D
0280: 65 62 75 67 2c 20 50 61 72 74 69 61 6c 45 71 29  ebug, PartialEq)
0290: 5d 0a 70 75 62 20 65 6e 75 6d 20 45 72 72 6f 72  ].pub enum Error
02a0: 4b 69 6e 64 20 7b 0a 20 20 20 20 48 65 6c 70 2c  Kind {.    Help,
02b0: 0a 20 20 20 20 45 72 72 6f 72 2c 0a 20 20 20 20  .    Error,.    
02c0: 4e 6f 74 65 2c 0a 20 20 20 20 53 75 67 67 65 73  Note,.    Sugges
02d0: 74 69 6f 6e 2c 0a 20 20 20 20 57 61 72 6e 69 6e  tion,.    Warnin
02e0: 67 2c 0a 7d 0a 0a 69 6d 70 6c 20 46 72 6f 6d 53  g,.}..impl FromS
02f0: 74 72 20 66 6f 72 20 45 72 72 6f 72 4b 69 6e 64  tr for ErrorKind
0300: 20 7b 0a 20 20 20 20 74 79 70 65 20 45 72 72 20   {.    type Err 
0310: 3d 20 28 29 3b 0a 20 20 20 20 66 6e 20 66 72 6f  = ();.    fn fro
0320: 6d 5f 73 74 72 28 73 3a 20 26 73 74 72 29 20 2d  m_str(s: &str) -
0330: 3e 20 52 65 73 75 6c 74 3c 53 65 6c 66 2c 20 53  > Result<Self, S
0340: 65 6c 66 3a 3a 45 72 72 3e 20 7b 0a 20 20 20 20  elf::Err> {.    
0350: 20 20 20 20 6c 65 74 20 73 20 3d 20 73 2e 74 6f      let s = s.to
0360: 5f 75 70 70 65 72 63 61 73 65 28 29 3b 0a 20 20  _uppercase();.  
0370: 20 20 20 20 20 20 6c 65 74 20 70 61 72 74 30 3a        let part0:
0380: 20 26 73 74 72 20 3d 20 73 2e 73 70 6c 69 74 28   &str = s.split(
0390: 27 3a 27 29 2e 6e 65 78 74 28 29 2e 75 6e 77 72  ':').next().unwr
03a0: 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 6d 61  ap();.        ma
03b0: 74 63 68 20 70 61 72 74 30 20 7b 0a 20 20 20 20  tch part0 {.    
03c0: 20 20 20 20 20 20 20 20 22 48 45 4c 50 22 20 3d          "HELP" =
03d0: 3e 20 4f 6b 28 45 72 72 6f 72 4b 69 6e 64 3a 3a  > Ok(ErrorKind::
03e0: 48 65 6c 70 29 2c 0a 20 20 20 20 20 20 20 20 20  Help),.         
03f0: 20 20 20 22 45 52 52 4f 52 22 20 3d 3e 20 4f 6b     "ERROR" => Ok
0400: 28 45 72 72 6f 72 4b 69 6e 64 3a 3a 45 72 72 6f  (ErrorKind::Erro
0410: 72 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r),.            
0420: 22 4e 4f 54 45 22 20 3d 3e 20 4f 6b 28 45 72 72  "NOTE" => Ok(Err
0430: 6f 72 4b 69 6e 64 3a 3a 4e 6f 74 65 29 2c 0a 20  orKind::Note),. 
0440: 20 20 20 20 20 20 20 20 20 20 20 22 53 55 47 47             "SUGG
0450: 45 53 54 49 4f 4e 22 20 3d 3e 20 4f 6b 28 45 72  ESTION" => Ok(Er
0460: 72 6f 72 4b 69 6e 64 3a 3a 53 75 67 67 65 73 74  rorKind::Suggest
0470: 69 6f 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ion),.          
0480: 20 20 22 57 41 52 4e 22 20 3d 3e 20 4f 6b 28 45    "WARN" => Ok(E
0490: 72 72 6f 72 4b 69 6e 64 3a 3a 57 61 72 6e 69 6e  rrorKind::Warnin
04a0: 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
04b0: 22 57 41 52 4e 49 4e 47 22 20 3d 3e 20 4f 6b 28  "WARNING" => Ok(
04c0: 45 72 72 6f 72 4b 69 6e 64 3a 3a 57 61 72 6e 69  ErrorKind::Warni
04d0: 6e 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ng),.           
04e0: 20 5f 20 3d 3e 20 45 72 72 28 28 29 29 2c 0a 20   _ => Err(()),. 
04f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
0500: 0a 0a 69 6d 70 6c 20 66 6d 74 3a 3a 44 69 73 70  ..impl fmt::Disp
0510: 6c 61 79 20 66 6f 72 20 45 72 72 6f 72 4b 69 6e  lay for ErrorKin
0520: 64 20 7b 0a 20 20 20 20 66 6e 20 66 6d 74 28 26  d {.    fn fmt(&
0530: 73 65 6c 66 2c 20 66 3a 20 26 6d 75 74 20 66 6d  self, f: &mut fm
0540: 74 3a 3a 46 6f 72 6d 61 74 74 65 72 29 20 2d 3e  t::Formatter) ->
0550: 20 66 6d 74 3a 3a 52 65 73 75 6c 74 20 7b 0a 20   fmt::Result {. 
0560: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 73 65         match *se
0570: 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lf {.           
0580: 20 45 72 72 6f 72 4b 69 6e 64 3a 3a 48 65 6c 70   ErrorKind::Help
0590: 20 3d 3e 20 77 72 69 74 65 21 28 66 2c 20 22 68   => write!(f, "h
05a0: 65 6c 70 22 29 2c 0a 20 20 20 20 20 20 20 20 20  elp"),.         
05b0: 20 20 20 45 72 72 6f 72 4b 69 6e 64 3a 3a 45 72     ErrorKind::Er
05c0: 72 6f 72 20 3d 3e 20 77 72 69 74 65 21 28 66 2c  ror => write!(f,
05d0: 20 22 65 72 72 6f 72 22 29 2c 0a 20 20 20 20 20   "error"),.     
05e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4b 69 6e 64         ErrorKind
05f0: 3a 3a 4e 6f 74 65 20 3d 3e 20 77 72 69 74 65 21  ::Note => write!
0600: 28 66 2c 20 22 6e 6f 74 65 22 29 2c 0a 20 20 20  (f, "note"),.   
0610: 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4b 69           ErrorKi
0620: 6e 64 3a 3a 53 75 67 67 65 73 74 69 6f 6e 20 3d  nd::Suggestion =
0630: 3e 20 77 72 69 74 65 21 28 66 2c 20 22 73 75 67  > write!(f, "sug
0640: 67 65 73 74 69 6f 6e 22 29 2c 0a 20 20 20 20 20  gestion"),.     
0650: 20 20 20 20 20 20 20 45 72 72 6f 72 4b 69 6e 64         ErrorKind
0660: 3a 3a 57 61 72 6e 69 6e 67 20 3d 3e 20 77 72 69  ::Warning => wri
0670: 74 65 21 28 66 2c 20 22 77 61 72 6e 69 6e 67 22  te!(f, "warning"
0680: 29 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ),.        }.   
0690: 20 7d 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28 44   }.}..#[derive(D
06a0: 65 62 75 67 29 5d 0a 70 75 62 20 73 74 72 75 63  ebug)].pub struc
06b0: 74 20 45 72 72 6f 72 20 7b 0a 20 20 20 20 70 75  t Error {.    pu
06c0: 62 20 6c 69 6e 65 5f 6e 75 6d 3a 20 75 73 69 7a  b line_num: usiz
06d0: 65 2c 0a 20 20 20 20 2f 2f 2f 20 57 68 61 74 20  e,.    /// What 
06e0: 6b 69 6e 64 20 6f 66 20 6d 65 73 73 61 67 65 20  kind of message 
06f0: 77 65 20 65 78 70 65 63 74 20 28 65 2e 67 2e 20  we expect (e.g. 
0700: 77 61 72 6e 69 6e 67 2c 20 65 72 72 6f 72 2c 20  warning, error, 
0710: 73 75 67 67 65 73 74 69 6f 6e 29 2e 0a 20 20 20  suggestion)..   
0720: 20 2f 2f 2f 20 60 4e 6f 6e 65 60 20 69 66 20 6e   /// `None` if n
0730: 6f 74 20 73 70 65 63 69 66 69 65 64 20 6f 72 20  ot specified or 
0740: 75 6e 6b 6e 6f 77 6e 20 6d 65 73 73 61 67 65 20  unknown message 
0750: 6b 69 6e 64 2e 0a 20 20 20 20 70 75 62 20 6b 69  kind..    pub ki
0760: 6e 64 3a 20 4f 70 74 69 6f 6e 3c 45 72 72 6f 72  nd: Option<Error
0770: 4b 69 6e 64 3e 2c 0a 20 20 20 20 70 75 62 20 6d  Kind>,.    pub m
0780: 73 67 3a 20 53 74 72 69 6e 67 2c 0a 7d 0a 0a 23  sg: String,.}..#
0790: 5b 64 65 72 69 76 65 28 50 61 72 74 69 61 6c 45  [derive(PartialE
07a0: 71 2c 20 44 65 62 75 67 29 5d 0a 65 6e 75 6d 20  q, Debug)].enum 
07b0: 57 68 69 63 68 4c 69 6e 65 20 7b 0a 20 20 20 20  WhichLine {.    
07c0: 54 68 69 73 4c 69 6e 65 2c 0a 20 20 20 20 46 6f  ThisLine,.    Fo
07d0: 6c 6c 6f 77 50 72 65 76 69 6f 75 73 28 75 73 69  llowPrevious(usi
07e0: 7a 65 29 2c 0a 20 20 20 20 41 64 6a 75 73 74 42  ze),.    AdjustB
07f0: 61 63 6b 77 61 72 64 28 75 73 69 7a 65 29 2c 0a  ackward(usize),.
0800: 7d 0a 0a 2f 2f 2f 20 4c 6f 6f 6b 73 20 66 6f 72  }../// Looks for
0810: 20 65 69 74 68 65 72 20 22 2f 2f 7e 7c 20 4b 49   either "//~| KI
0820: 4e 44 20 4d 45 53 53 41 47 45 22 20 6f 72 20 22  ND MESSAGE" or "
0830: 2f 2f 7e 5e 5e 2e 2e 2e 20 4b 49 4e 44 20 4d 45  //~^^... KIND ME
0840: 53 53 41 47 45 22 0a 2f 2f 2f 20 54 68 65 20 66  SSAGE"./// The f
0850: 6f 72 6d 65 72 20 69 73 20 61 20 22 66 6f 6c 6c  ormer is a "foll
0860: 6f 77 22 20 74 68 61 74 20 69 6e 68 65 72 69 74  ow" that inherit
0870: 73 20 69 74 73 20 74 61 72 67 65 74 20 66 72 6f  s its target fro
0880: 6d 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20  m the preceding 
0890: 6c 69 6e 65 3b 0a 2f 2f 2f 20 74 68 65 20 6c 61  line;./// the la
08a0: 74 74 65 72 20 69 73 20 61 6e 20 22 61 64 6a 75  tter is an "adju
08b0: 73 74 73 22 20 74 68 61 74 20 67 6f 65 73 20 74  sts" that goes t
08c0: 68 61 74 20 6d 61 6e 79 20 6c 69 6e 65 73 20 75  hat many lines u
08d0: 70 2e 0a 2f 2f 2f 0a 2f 2f 2f 20 47 6f 61 6c 20  p..///./// Goal 
08e0: 69 73 20 74 6f 20 65 6e 61 62 6c 65 20 74 65 73  is to enable tes
08f0: 74 73 20 62 6f 74 68 20 6c 69 6b 65 3a 20 2f 2f  ts both like: //
0900: 7e 5e 5e 5e 20 45 52 52 4f 52 20 67 6f 20 75 70  ~^^^ ERROR go up
0910: 20 74 68 72 65 65 0a 2f 2f 2f 20 61 6e 64 20 61   three./// and a
0920: 6c 73 6f 20 2f 2f 7e 5e 20 45 52 52 4f 52 20 6d  lso //~^ ERROR m
0930: 65 73 73 61 67 65 20 6f 6e 65 20 66 6f 72 20 74  essage one for t
0940: 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 69 6e  he preceding lin
0950: 65 2c 20 61 6e 64 0a 2f 2f 2f 20 20 20 20 20 20  e, and.///      
0960: 20 20 20 20 2f 2f 7e 7c 20 45 52 52 4f 52 20 6d      //~| ERROR m
0970: 65 73 73 61 67 65 20 74 77 6f 20 66 6f 72 20 74  essage two for t
0980: 68 61 74 20 73 61 6d 65 20 6c 69 6e 65 2e 0a 2f  hat same line../
0990: 2f 2f 0a 2f 2f 2f 20 49 66 20 63 66 67 20 69 73  //./// If cfg is
09a0: 20 6e 6f 74 20 4e 6f 6e 65 20 28 69 2e 65 2e 2c   not None (i.e.,
09b0: 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   in an increment
09c0: 61 6c 20 74 65 73 74 29 2c 20 74 68 65 6e 20 77  al test), then w
09d0: 65 20 6c 6f 6f 6b 0a 2f 2f 2f 20 66 6f 72 20 60  e look./// for `
09e0: 2f 2f 5b 58 5d 7e 60 20 69 6e 73 74 65 61 64 2c  //[X]~` instead,
09f0: 20 77 68 65 72 65 20 60 58 60 20 69 73 20 74 68   where `X` is th
0a00: 65 20 63 75 72 72 65 6e 74 20 60 63 66 67 60 2e  e current `cfg`.
0a10: 0a 70 75 62 20 66 6e 20 6c 6f 61 64 5f 65 72 72  .pub fn load_err
0a20: 6f 72 73 28 74 65 73 74 66 69 6c 65 3a 20 26 50  ors(testfile: &P
0a30: 61 74 68 2c 20 63 66 67 3a 20 4f 70 74 69 6f 6e  ath, cfg: Option
0a40: 3c 26 73 74 72 3e 29 20 2d 3e 20 56 65 63 3c 45  <&str>) -> Vec<E
0a50: 72 72 6f 72 3e 20 7b 0a 20 20 20 20 6c 65 74 20  rror> {.    let 
0a60: 72 64 72 20 3d 20 42 75 66 52 65 61 64 65 72 3a  rdr = BufReader:
0a70: 3a 6e 65 77 28 46 69 6c 65 3a 3a 6f 70 65 6e 28  :new(File::open(
0a80: 74 65 73 74 66 69 6c 65 29 2e 75 6e 77 72 61 70  testfile).unwrap
0a90: 28 29 29 3b 0a 0a 20 20 20 20 2f 2f 20 60 6c 61  ());..    // `la
0aa0: 73 74 5f 6e 6f 6e 66 6f 6c 6c 6f 77 5f 65 72 72  st_nonfollow_err
0ab0: 6f 72 60 20 74 72 61 63 6b 73 20 74 68 65 20 6d  or` tracks the m
0ac0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 73 65 65  ost recently see
0ad0: 6e 0a 20 20 20 20 2f 2f 20 6c 69 6e 65 20 77 69  n.    // line wi
0ae0: 74 68 20 61 6e 20 65 72 72 6f 72 20 74 65 6d 70  th an error temp
0af0: 6c 61 74 65 20 74 68 61 74 20 64 69 64 20 6e 6f  late that did no
0b00: 74 20 75 73 65 20 74 68 65 0a 20 20 20 20 2f 2f  t use the.    //
0b10: 20 66 6f 6c 6c 6f 77 2d 73 79 6e 74 61 78 2c 20   follow-syntax, 
0b20: 22 2f 2f 7e 7c 20 2e 2e 2e 22 2e 0a 20 20 20 20  "//~| ..."..    
0b30: 2f 2f 0a 20 20 20 20 2f 2f 20 28 70 6e 6b 66 65  //.    // (pnkfe
0b40: 6c 69 78 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69  lix could not fi
0b50: 6e 64 20 61 6e 20 65 61 73 79 20 77 61 79 20 74  nd an easy way t
0b60: 6f 20 63 6f 6d 70 6f 73 65 20 49 74 65 72 61 74  o compose Iterat
0b70: 6f 72 3a 3a 73 63 61 6e 0a 20 20 20 20 2f 2f 20  or::scan.    // 
0b80: 61 6e 64 20 49 74 65 72 61 74 6f 72 3a 3a 66 69  and Iterator::fi
0b90: 6c 74 65 72 5f 6d 61 70 20 74 6f 20 70 61 73 73  lter_map to pass
0ba0: 20 61 6c 6f 6e 67 20 74 68 69 73 20 69 6e 66 6f   along this info
0bb0: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20  rmation into.   
0bc0: 20 2f 2f 20 60 70 61 72 73 65 5f 65 78 70 65 63   // `parse_expec
0bd0: 74 65 64 60 2e 20 53 6f 20 69 6e 73 74 65 61 64  ted`. So instead
0be0: 20 49 20 61 6d 20 73 74 6f 72 69 6e 67 20 74 68   I am storing th
0bf0: 61 74 20 73 74 61 74 65 20 68 65 72 65 20 61 6e  at state here an
0c00: 64 0a 20 20 20 20 2f 2f 20 75 70 64 61 74 69 6e  d.    // updatin
0c10: 67 20 69 74 20 69 6e 20 74 68 65 20 6d 61 70 20  g it in the map 
0c20: 63 61 6c 6c 62 61 63 6b 20 62 65 6c 6f 77 2e 29  callback below.)
0c30: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 6c 61 73  .    let mut las
0c40: 74 5f 6e 6f 6e 66 6f 6c 6c 6f 77 5f 65 72 72 6f  t_nonfollow_erro
0c50: 72 20 3d 20 4e 6f 6e 65 3b 0a 0a 20 20 20 20 6c  r = None;..    l
0c60: 65 74 20 74 61 67 20 3d 20 6d 61 74 63 68 20 63  et tag = match c
0c70: 66 67 20 7b 0a 20 20 20 20 20 20 20 20 53 6f 6d  fg {.        Som
0c80: 65 28 72 65 76 29 20 3d 3e 20 66 6f 72 6d 61 74  e(rev) => format
0c90: 21 28 22 2f 2f 5b 7b 7d 5d 7e 22 2c 20 72 65 76  !("//[{}]~", rev
0ca0: 29 2c 0a 20 20 20 20 20 20 20 20 4e 6f 6e 65 20  ),.        None 
0cb0: 3d 3e 20 66 6f 72 6d 61 74 21 28 22 2f 2f 7e 22  => format!("//~"
0cc0: 29 2c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 72  ),.    };..    r
0cd0: 64 72 2e 6c 69 6e 65 73 28 29 0a 20 20 20 20 20  dr.lines().     
0ce0: 20 20 20 2e 65 6e 75 6d 65 72 61 74 65 28 29 0a     .enumerate().
0cf0: 20 20 20 20 20 20 20 20 2e 66 69 6c 74 65 72 5f          .filter_
0d00: 6d 61 70 28 7c 28 6c 69 6e 65 5f 6e 75 6d 2c 20  map(|(line_num, 
0d10: 6c 69 6e 65 29 7c 20 7b 0a 20 20 20 20 20 20 20  line)| {.       
0d20: 20 20 20 20 20 70 61 72 73 65 5f 65 78 70 65 63       parse_expec
0d30: 74 65 64 28 6c 61 73 74 5f 6e 6f 6e 66 6f 6c 6c  ted(last_nonfoll
0d40: 6f 77 5f 65 72 72 6f 72 2c 20 6c 69 6e 65 5f 6e  ow_error, line_n
0d50: 75 6d 20 2b 20 31 2c 20 26 6c 69 6e 65 2e 75 6e  um + 1, &line.un
0d60: 77 72 61 70 28 29 2c 20 26 74 61 67 29 0a 20 20  wrap(), &tag).  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 6d                .m
0d80: 61 70 28 7c 28 77 68 69 63 68 2c 20 65 72 72 6f  ap(|(which, erro
0d90: 72 29 7c 20 7b 0a 20 20 20 20 20 20 20 20 20 20  r)| {.          
0da0: 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20            match 
0db0: 77 68 69 63 68 20 7b 0a 20 20 20 20 20 20 20 20  which {.        
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 46 6f 6c 6c 6f 77 50 72 65 76 69 6f 75 73 28 5f  FollowPrevious(_
0de0: 29 20 3d 3e 20 7b 7d 0a 20 20 20 20 20 20 20 20  ) => {}.        
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 5f 20 3d 3e 20 6c 61 73 74 5f 6e 6f 6e 66 6f 6c  _ => last_nonfol
0e10: 6c 6f 77 5f 65 72 72 6f 72 20 3d 20 53 6f 6d 65  low_error = Some
0e20: 28 65 72 72 6f 72 2e 6c 69 6e 65 5f 6e 75 6d 29  (error.line_num)
0e30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
0e60: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
0e70: 20 20 7d 29 0a 20 20 20 20 20 20 20 20 7d 29 0a    }).        }).
0e80: 20 20 20 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74          .collect
0e90: 28 29 0a 7d 0a 0a 66 6e 20 70 61 72 73 65 5f 65  ().}..fn parse_e
0ea0: 78 70 65 63 74 65 64 28 6c 61 73 74 5f 6e 6f 6e  xpected(last_non
0eb0: 66 6f 6c 6c 6f 77 5f 65 72 72 6f 72 3a 20 4f 70  follow_error: Op
0ec0: 74 69 6f 6e 3c 75 73 69 7a 65 3e 2c 0a 20 20 20  tion<usize>,.   
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
0ee0: 69 6e 65 5f 6e 75 6d 3a 20 75 73 69 7a 65 2c 0a  ine_num: usize,.
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 20 20 6c 69 6e 65 3a 20 26 73 74 72 2c 0a 20 20    line: &str,.  
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 74 61 67 3a 20 26 73 74 72 29 0a 20 20 20 20 20  tag: &str).     
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
0f40: 4f 70 74 69 6f 6e 3c 28 57 68 69 63 68 4c 69 6e  Option<(WhichLin
0f50: 65 2c 20 45 72 72 6f 72 29 3e 20 7b 0a 20 20 20  e, Error)> {.   
0f60: 20 6c 65 74 20 73 74 61 72 74 20 3d 20 6d 61 74   let start = mat
0f70: 63 68 20 6c 69 6e 65 2e 66 69 6e 64 28 74 61 67  ch line.find(tag
0f80: 29 20 7b 0a 20 20 20 20 20 20 20 20 53 6f 6d 65  ) {.        Some
0f90: 28 69 29 20 3d 3e 20 69 2c 0a 20 20 20 20 20 20  (i) => i,.      
0fa0: 20 20 4e 6f 6e 65 20 3d 3e 20 72 65 74 75 72 6e    None => return
0fb0: 20 4e 6f 6e 65 2c 0a 20 20 20 20 7d 3b 0a 20 20   None,.    };.  
0fc0: 20 20 6c 65 74 20 28 66 6f 6c 6c 6f 77 2c 20 61    let (follow, a
0fd0: 64 6a 75 73 74 73 29 20 3d 20 69 66 20 6c 69 6e  djusts) = if lin
0fe0: 65 5b 73 74 61 72 74 20 2b 20 74 61 67 2e 6c 65  e[start + tag.le
0ff0: 6e 28 29 2e 2e 5d 2e 63 68 61 72 73 28 29 2e 6e  n()..].chars().n
1000: 65 78 74 28 29 2e 75 6e 77 72 61 70 28 29 20 3d  ext().unwrap() =
1010: 3d 20 27 7c 27 20 7b 0a 20 20 20 20 20 20 20 20  = '|' {.        
1020: 28 74 72 75 65 2c 20 30 29 0a 20 20 20 20 7d 20  (true, 0).    } 
1030: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 28  else {.        (
1040: 66 61 6c 73 65 2c 20 6c 69 6e 65 5b 73 74 61 72  false, line[star
1050: 74 20 2b 20 74 61 67 2e 6c 65 6e 28 29 2e 2e 5d  t + tag.len()..]
1060: 2e 63 68 61 72 73 28 29 2e 74 61 6b 65 5f 77 68  .chars().take_wh
1070: 69 6c 65 28 7c 63 7c 20 2a 63 20 3d 3d 20 27 5e  ile(|c| *c == '^
1080: 27 29 2e 63 6f 75 6e 74 28 29 29 0a 20 20 20 20  ').count()).    
1090: 7d 3b 0a 20 20 20 20 6c 65 74 20 6b 69 6e 64 5f  };.    let kind_
10a0: 73 74 61 72 74 20 3d 20 73 74 61 72 74 20 2b 20  start = start + 
10b0: 74 61 67 2e 6c 65 6e 28 29 20 2b 20 61 64 6a 75  tag.len() + adju
10c0: 73 74 73 20 2b 20 28 66 6f 6c 6c 6f 77 20 61 73  sts + (follow as
10d0: 20 75 73 69 7a 65 29 3b 0a 20 20 20 20 6c 65 74   usize);.    let
10e0: 20 28 6b 69 6e 64 2c 20 6d 73 67 29 3b 0a 20 20   (kind, msg);.  
10f0: 20 20 6d 61 74 63 68 20 6c 69 6e 65 5b 6b 69 6e    match line[kin
1100: 64 5f 73 74 61 72 74 2e 2e 5d 0a 20 20 20 20 20  d_start..].     
1110: 20 20 20 2e 73 70 6c 69 74 5f 77 68 69 74 65 73     .split_whites
1120: 70 61 63 65 28 29 0a 20 20 20 20 20 20 20 20 2e  pace().        .
1130: 6e 65 78 74 28 29 0a 20 20 20 20 20 20 20 20 2e  next().        .
1140: 65 78 70 65 63 74 28 22 45 6e 63 6f 75 6e 74 65  expect("Encounte
1150: 72 65 64 20 75 6e 65 78 70 65 63 74 65 64 20 65  red unexpected e
1160: 6d 70 74 79 20 63 6f 6d 6d 65 6e 74 22 29 0a 20  mpty comment"). 
1170: 20 20 20 20 20 20 20 2e 70 61 72 73 65 3a 3a 3c         .parse::<
1180: 45 72 72 6f 72 4b 69 6e 64 3e 28 29 20 7b 0a 20  ErrorKind>() {. 
1190: 20 20 20 20 20 20 20 4f 6b 28 6b 29 20 3d 3e 20         Ok(k) => 
11a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
11b0: 20 49 66 20 77 65 20 66 69 6e 64 20 60 2f 2f 7e   If we find `//~
11c0: 20 45 52 52 4f 52 20 66 6f 6f 60 20 6f 72 20 73   ERROR foo` or s
11d0: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
11e0: 61 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  at:.            
11f0: 6b 69 6e 64 20 3d 20 53 6f 6d 65 28 6b 29 3b 0a  kind = Some(k);.
1200: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1210: 6c 65 74 74 65 72 73 20 3d 20 6c 69 6e 65 5b 6b  letters = line[k
1220: 69 6e 64 5f 73 74 61 72 74 2e 2e 5d 2e 63 68 61  ind_start..].cha
1230: 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rs();.          
1240: 20 20 6d 73 67 20 3d 20 6c 65 74 74 65 72 73 2e    msg = letters.
1250: 73 6b 69 70 5f 77 68 69 6c 65 28 7c 63 7c 20 63  skip_while(|c| c
1260: 2e 69 73 5f 77 68 69 74 65 73 70 61 63 65 28 29  .is_whitespace()
1270: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1280: 20 20 2e 73 6b 69 70 5f 77 68 69 6c 65 28 7c 63    .skip_while(|c
1290: 7c 20 21 63 2e 69 73 5f 77 68 69 74 65 73 70 61  | !c.is_whitespa
12a0: 63 65 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  ce()).          
12b0: 20 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 3a 3a        .collect::
12c0: 3c 53 74 72 69 6e 67 3e 28 29 3b 0a 20 20 20 20  <String>();.    
12d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 45 72      }.        Er
12e0: 72 28 5f 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  r(_) => {.      
12f0: 20 20 20 20 20 20 2f 2f 20 4f 74 68 65 72 77 69        // Otherwi
1300: 73 65 20 77 65 20 66 6f 75 6e 64 20 60 2f 2f 7e  se we found `//~
1310: 20 66 6f 6f 60 3a 0a 20 20 20 20 20 20 20 20 20   foo`:.         
1320: 20 20 20 6b 69 6e 64 20 3d 20 4e 6f 6e 65 3b 0a     kind = None;.
1330: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
1340: 6c 65 74 74 65 72 73 20 3d 20 6c 69 6e 65 5b 6b  letters = line[k
1350: 69 6e 64 5f 73 74 61 72 74 2e 2e 5d 2e 63 68 61  ind_start..].cha
1360: 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rs();.          
1370: 20 20 6d 73 67 20 3d 20 6c 65 74 74 65 72 73 2e    msg = letters.
1380: 73 6b 69 70 5f 77 68 69 6c 65 28 7c 63 7c 20 63  skip_while(|c| c
1390: 2e 69 73 5f 77 68 69 74 65 73 70 61 63 65 28 29  .is_whitespace()
13a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13b0: 20 20 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 53 74 72    .collect::<Str
13c0: 69 6e 67 3e 28 29 3b 0a 20 20 20 20 20 20 20 20  ing>();.        
13d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 74 20  }.    }.    let 
13e0: 6d 73 67 20 3d 20 6d 73 67 2e 74 72 69 6d 28 29  msg = msg.trim()
13f0: 2e 74 6f 5f 6f 77 6e 65 64 28 29 3b 0a 0a 20 20  .to_owned();..  
1400: 20 20 6c 65 74 20 28 77 68 69 63 68 2c 20 6c 69    let (which, li
1410: 6e 65 5f 6e 75 6d 29 20 3d 20 69 66 20 66 6f 6c  ne_num) = if fol
1420: 6c 6f 77 20 7b 0a 20 20 20 20 20 20 20 20 61 73  low {.        as
1430: 73 65 72 74 21 28 61 64 6a 75 73 74 73 20 3d 3d  sert!(adjusts ==
1440: 20 30 2c 20 22 75 73 65 20 65 69 74 68 65 72 20   0, "use either 
1450: 2f 2f 7e 7c 20 6f 72 20 2f 2f 7e 5e 2c 20 6e 6f  //~| or //~^, no
1460: 74 20 62 6f 74 68 2e 22 29 3b 0a 20 20 20 20 20  t both.");.     
1470: 20 20 20 6c 65 74 20 6c 69 6e 65 5f 6e 75 6d 20     let line_num 
1480: 3d 20 6c 61 73 74 5f 6e 6f 6e 66 6f 6c 6c 6f 77  = last_nonfollow
1490: 5f 65 72 72 6f 72 2e 65 78 70 65 63 74 28 22 65  _error.expect("e
14a0: 6e 63 6f 75 6e 74 65 72 65 64 20 2f 2f 7e 7c 20  ncountered //~| 
14b0: 77 69 74 68 6f 75 74 20 5c 0a 20 20 20 20 20 20  without \.      
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
14f0: 65 63 65 64 69 6e 67 20 2f 2f 7e 5e 20 6c 69 6e  eceding //~^ lin
1500: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 28 46  e.");.        (F
1510: 6f 6c 6c 6f 77 50 72 65 76 69 6f 75 73 28 6c 69  ollowPrevious(li
1520: 6e 65 5f 6e 75 6d 29 2c 20 6c 69 6e 65 5f 6e 75  ne_num), line_nu
1530: 6d 29 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  m).    } else {.
1540: 20 20 20 20 20 20 20 20 6c 65 74 20 77 68 69 63          let whic
1550: 68 20 3d 20 69 66 20 61 64 6a 75 73 74 73 20 3e  h = if adjusts >
1560: 20 30 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   0 {.           
1570: 20 41 64 6a 75 73 74 42 61 63 6b 77 61 72 64 28   AdjustBackward(
1580: 61 64 6a 75 73 74 73 29 0a 20 20 20 20 20 20 20  adjusts).       
1590: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15a0: 20 20 20 20 20 20 54 68 69 73 4c 69 6e 65 0a 20        ThisLine. 
15b0: 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
15c0: 20 20 6c 65 74 20 6c 69 6e 65 5f 6e 75 6d 20 3d    let line_num =
15d0: 20 6c 69 6e 65 5f 6e 75 6d 20 2d 20 61 64 6a 75   line_num - adju
15e0: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 28 77 68  sts;.        (wh
15f0: 69 63 68 2c 20 6c 69 6e 65 5f 6e 75 6d 29 0a 20  ich, line_num). 
1600: 20 20 20 7d 3b 0a 0a 20 20 20 20 64 65 62 75 67     };..    debug
1610: 21 28 22 6c 69 6e 65 3d 7b 7d 20 74 61 67 3d 7b  !("line={} tag={
1620: 3a 3f 7d 20 77 68 69 63 68 3d 7b 3a 3f 7d 20 6b  :?} which={:?} k
1630: 69 6e 64 3d 7b 3a 3f 7d 20 6d 73 67 3d 7b 3a 3f  ind={:?} msg={:?
1640: 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  }",.           l
1650: 69 6e 65 5f 6e 75 6d 2c 0a 20 20 20 20 20 20 20  ine_num,.       
1660: 20 20 20 20 74 61 67 2c 0a 20 20 20 20 20 20 20      tag,.       
1670: 20 20 20 20 77 68 69 63 68 2c 0a 20 20 20 20 20      which,.     
1680: 20 20 20 20 20 20 6b 69 6e 64 2c 0a 20 20 20 20        kind,.    
1690: 20 20 20 20 20 20 20 6d 73 67 29 3b 0a 20 20 20         msg);.   
16a0: 20 53 6f 6d 65 28 28 77 68 69 63 68 2c 0a 20 20   Some((which,.  
16b0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 20 7b 0a          Error {.
16c0: 20 20 20 20 20 20 20 20 6c 69 6e 65 5f 6e 75 6d          line_num
16d0: 3a 20 6c 69 6e 65 5f 6e 75 6d 2c 0a 20 20 20 20  : line_num,.    
16e0: 20 20 20 20 6b 69 6e 64 3a 20 6b 69 6e 64 2c 0a      kind: kind,.
16f0: 20 20 20 20 20 20 20 20 6d 73 67 3a 20 6d 73 67          msg: msg
1700: 2c 0a 20 20 20 20 7d 29 29 0a 7d 0a              ,.    })).}.