Coverage Report - org.codehaus.plexus.compiler.csharp.DefaultCSharpCompilerParser
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultCSharpCompilerParser
84%
63/75
65%
21/32
5,5
 
 1  
 package org.codehaus.plexus.compiler.csharp;
 2  
 
 3  
 import org.codehaus.plexus.compiler.CompilerMessage;
 4  
 import org.codehaus.plexus.util.StringUtils;
 5  
 
 6  
 /**
 7  
  * Handles output from both mono with only the line number
 8  
  * <p/>
 9  
  * ex error = "/home/trygvis/dev/com.myrealbox/trunk/mcs/nunit20/core/./TestRunnerThread.cs(29) error CS0246: Cannot find type 'NameValueCollection'"
 10  
  * <p/>
 11  
  * and errors from mono & csc on windows which has column num also
 12  
  * <p/>
 13  
  * ex error = "src\\test\\csharp\\Hierarchy\\Logger.cs(98,4): warning CS0618: 'NUnit.Framework.Assertion' is obsolete: 'Use Assert class instead'";
 14  
  *
 15  
  * @author <a href="mailto:gdodinet@karmicsoft.com">Gilles Dodinet</a>
 16  
  * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
 17  
  * @author <a href="mailto:matthew.pocock@ncl.ac.uk">Matthew Pocock</a>
 18  
  * @author <a href="mailto:chris.stevenson@gmail.com">Chris Stevenson</a>
 19  
  */
 20  0
 public class DefaultCSharpCompilerParser
 21  
 {
 22  
 
 23  1
     private static String ERROR_PREFIX = "error ";
 24  
 
 25  1
     private static String COMPILATION_PREFIX = "Compilation ";
 26  
 
 27  1
     private static String MAGIC_LINE_MARKER = ".cs(";
 28  
 
 29  1
     private static String MAGIC_LINE_MARKER_2 = ")";
 30  
 
 31  
 
 32  
     public static CompilerMessage parseLine( String line )
 33  
     {
 34  49
         CompilerMessage ce = null;
 35  
 
 36  49
         if ( isOutputWithNoColumnNumber( line ) )
 37  
         {
 38  20
             ce = parseLineWithNoColumnNumber( line );
 39  
         }
 40  
         else
 41  
         {
 42  29
             ce = parseLineWithColumnNumberAndLineNumber( line );
 43  
         }
 44  
 
 45  49
         return ce;
 46  
     }
 47  
 
 48  
     private static boolean isOutputWithNoColumnNumber( String line )
 49  
     {
 50  
 
 51  49
         int i = line.indexOf( MAGIC_LINE_MARKER );
 52  
 
 53  49
         if ( i == -1 )
 54  
         {
 55  5
             return true;
 56  
         }
 57  
 
 58  44
         String chunk1 = line.substring( i + MAGIC_LINE_MARKER.length() );
 59  
 
 60  44
         int j = chunk1.indexOf( MAGIC_LINE_MARKER_2 );
 61  
 
 62  44
         String chunk2 = chunk1.substring( 0, j );
 63  
 
 64  44
         return ( chunk2.indexOf( "," ) == -1 );
 65  
     }
 66  
 
 67  
     private static CompilerMessage parseLineWithNoColumnNumber( String line )
 68  
     {
 69  
 
 70  20
         String file = null;
 71  20
         boolean error = true;
 72  20
         int startline = -1;
 73  20
         int startcolumn = -1;
 74  20
         int endline = -1;
 75  20
         int endcolumn = -1;
 76  
         String message;
 77  
 
 78  20
         if ( line.startsWith( ERROR_PREFIX ) )
 79  
         {
 80  1
             message = line.substring( ERROR_PREFIX.length() );
 81  
         }
 82  19
         else if ( line.startsWith( COMPILATION_PREFIX ) )
 83  
         {
 84  
             // ignore
 85  
 
 86  4
             return null;
 87  
         }
 88  15
         else if ( line.indexOf( MAGIC_LINE_MARKER ) != -1 )
 89  
         {
 90  15
             int i = line.indexOf( MAGIC_LINE_MARKER );
 91  
 
 92  15
             int j = line.indexOf( ' ', i );
 93  
 
 94  15
             file = line.substring( 0, i + 3 );
 95  
 
 96  15
             String num = line.substring( i + MAGIC_LINE_MARKER.length(), j - 1 );
 97  
 
 98  15
             startline = Integer.parseInt( num );
 99  
 
 100  15
             endline = startline;
 101  
 
 102  15
             message = line.substring( j + 1 + ERROR_PREFIX.length() );
 103  
 
 104  15
             error = line.indexOf( ") error" ) != -1;
 105  15
         }
 106  
         else
 107  
         {
 108  0
             System.err.println( "Unknown output: " + line );
 109  
 
 110  0
             return null;
 111  
         }
 112  
 
 113  16
         return new CompilerMessage( file, error, startline, startcolumn, endline, endcolumn, message );
 114  
 
 115  
     }
 116  
 
 117  
     private static CompilerMessage parseLineWithColumnNumberAndLineNumber( String line )
 118  
     {
 119  
 
 120  29
         String file = null;
 121  29
         boolean error = true;
 122  29
         int startline = -1;
 123  29
         int startcolumn = -1;
 124  29
         int endline = -1;
 125  29
         int endcolumn = -1;
 126  
         String message;
 127  
 
 128  29
         if ( line.startsWith( ERROR_PREFIX ) )
 129  
         {
 130  0
             message = line.substring( ERROR_PREFIX.length() );
 131  
         }
 132  29
         else if ( line.startsWith( COMPILATION_PREFIX ) )
 133  
         {
 134  0
             return null;
 135  
         }
 136  29
         else if ( line.indexOf( MAGIC_LINE_MARKER ) != -1 )
 137  
         {
 138  29
             int i = line.indexOf( MAGIC_LINE_MARKER );
 139  
 
 140  29
             int j = line.indexOf( ' ', i );
 141  
 
 142  29
             file = line.substring( 0, i + 3 );
 143  
 
 144  29
             String linecol = line.substring( i + MAGIC_LINE_MARKER.length(), j - 2 );
 145  
 
 146  29
             String linenum = null;
 147  29
             String colnum = null;
 148  
 
 149  29
             if ( linecol.indexOf( "," ) > -1 && linecol.split( "," ).length == 2 )
 150  
             {
 151  29
                 linenum = linecol.split( "," )[0];
 152  29
                 colnum = linecol.split( "," )[1];
 153  
             }
 154  0
             else if ( linecol.split( "," ).length == 1 )
 155  
             {
 156  0
                 linenum = linecol.split( "," )[0];
 157  0
                 colnum = "-1";
 158  
             }
 159  
             else
 160  
             {
 161  0
                 linenum = linecol.trim();
 162  0
                 colnum = "-1";
 163  
             }
 164  
 
 165  29
             startline = StringUtils.isEmpty( linenum ) ? -1 : Integer.parseInt( linenum );
 166  
 
 167  29
             startcolumn = StringUtils.isEmpty( colnum ) ? -1 : Integer.parseInt( colnum );
 168  
 
 169  29
             endline = startline;
 170  
 
 171  29
             endcolumn = startcolumn;
 172  
 
 173  29
             message = line.substring( j + 1 + ERROR_PREFIX.length() );
 174  
 
 175  29
             error = line.indexOf( "): error" ) != -1;
 176  29
         }
 177  
         else
 178  
         {
 179  0
             System.err.println( "Unknown output: " + line );
 180  
 
 181  0
             return null;
 182  
         }
 183  
 
 184  29
         return new CompilerMessage( file, error, startline, startcolumn, endline, endcolumn, message );
 185  
     }
 186  
 
 187  
 }