@ -132,18 +132,29 @@ void SetFdToBinaryMode(int fd) {
class CommandLineInterface : : ErrorPrinter : public MultiFileErrorCollector ,
public io : : ErrorCollector {
public :
ErrorPrinter ( ) { }
ErrorPrinter ( ErrorFormat format ) : format_ ( format ) { }
~ ErrorPrinter ( ) { }
// implements MultiFileErrorCollector ------------------------------
void AddError ( const string & filename , int line , int column ,
const string & message ) {
cerr < < filename ;
// Users typically expect 1-based line/column numbers, so we add 1
// to each here.
cerr < < filename ;
if ( line ! = - 1 ) {
cerr < < " : " < < ( line + 1 ) < < " : " < < ( column + 1 ) ;
// Allow for both GCC- and Visual-Studio-compatible output.
switch ( format_ ) {
case CommandLineInterface : : ERROR_FORMAT_GCC :
cerr < < " : " < < ( line + 1 ) < < " : " < < ( column + 1 ) ;
break ;
case CommandLineInterface : : ERROR_FORMAT_MSVS :
cerr < < " ( " < < ( line + 1 ) < < " ) : error in column= " < < ( column + 1 ) ;
break ;
}
}
cerr < < " : " < < message < < endl ;
}
@ -151,6 +162,9 @@ class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector,
void AddError ( int line , int column , const string & message ) {
AddError ( " input " , line , column , message ) ;
}
private :
const ErrorFormat format_ ;
} ;
// -------------------------------------------------------------------
@ -294,6 +308,7 @@ CommandLineInterface::ErrorReportingFileOutput::~ErrorReportingFileOutput() {
CommandLineInterface : : CommandLineInterface ( )
: mode_ ( MODE_COMPILE ) ,
error_format_ ( ERROR_FORMAT_GCC ) ,
imports_in_descriptor_set_ ( false ) ,
disallow_services_ ( false ) ,
inputs_are_proto_path_relative_ ( false ) { }
@ -326,7 +341,7 @@ int CommandLineInterface::Run(int argc, const char* const argv[]) {
}
// Allocate the Importer.
ErrorPrinter error_collector ;
ErrorPrinter error_collector ( error_format_ ) ;
Importer importer ( & source_tree , & error_collector ) ;
vector < const FileDescriptor * > parsed_files ;
@ -657,6 +672,16 @@ bool CommandLineInterface::InterpretArgument(const string& name,
codec_type_ = value ;
} else if ( name = = " --error_format " ) {
if ( value = = " gcc " ) {
error_format_ = ERROR_FORMAT_GCC ;
} else if ( value = = " msvs " ) {
error_format_ = ERROR_FORMAT_MSVS ;
} else {
cerr < < " Unknown error format: " < < value < < endl ;
return false ;
}
} else {
// Some other flag. Look it up in the generators list.
GeneratorMap : : const_iterator iter = generators_ . find ( name ) ;
@ -722,7 +747,10 @@ void CommandLineInterface::PrintHelpText() {
" the input files to FILE. \n "
" --include_imports When using --descriptor_set_out, also include \n "
" all dependencies of the input files in the \n "
" set, so that the set is self-contained. " < < endl ;
" set, so that the set is self-contained. \n "
" --error_format=FORMAT Set the format in which to print errors. \n "
" FORMAT may be 'gcc' (the default) or 'msvs' \n "
" (Microsoft Visual Studio format). " < < endl ;
for ( GeneratorMap : : iterator iter = generators_ . begin ( ) ;
iter ! = generators_ . end ( ) ; + + iter ) {
@ -788,7 +816,7 @@ bool CommandLineInterface::EncodeOrDecode(const DescriptorPool* pool) {
if ( mode_ = = MODE_ENCODE ) {
// Input is text.
ErrorPrinter error_collector ;
ErrorPrinter error_collector ( error_format_ ) ;
TextFormat : : Parser parser ;
parser . RecordErrorsTo ( & error_collector ) ;
parser . AllowPartialMessage ( true ) ;