2012-10-02 09:12:39 +02:00
/****************************************************************************
2008-12-02 12:01:29 +01:00
* *
2016-01-15 14:57:40 +01:00
* * Copyright ( C ) 2016 The Qt Company Ltd .
* * Contact : https : //www.qt.io/licensing/
2008-12-02 12:01:29 +01:00
* *
2012-10-02 09:12:39 +02:00
* * This file is part of Qt Creator .
2008-12-02 12:01:29 +01:00
* *
2012-10-02 09:12:39 +02:00
* * Commercial License Usage
* * Licensees holding valid commercial Qt licenses may use this file in
* * accordance with the commercial license agreement provided with the
* * Software or , alternatively , in accordance with the terms contained in
2016-01-15 14:57:40 +01:00
* * a written agreement between you and The Qt Company . For licensing terms
* * and conditions see https : //www.qt.io/terms-conditions. For further
* * information use the contact form at https : //www.qt.io/contact-us.
2008-12-02 14:17:16 +01:00
* *
2016-01-15 14:57:40 +01:00
* * GNU General Public License Usage
* * Alternatively , this file may be used under the terms of the GNU
* * General Public License version 3 as published by the Free Software
* * Foundation with exceptions as appearing in the file LICENSE . GPL3 - EXCEPT
* * included in the packaging of this file . Please review the following
* * information to ensure the GNU General Public License requirements will
* * be met : https : //www.gnu.org/licenses/gpl-3.0.html.
2010-12-17 16:01:08 +01:00
* *
2012-10-02 09:12:39 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-12-02 12:01:29 +01:00
# include "msvcparser.h"
2009-02-16 13:12:12 +01:00
# include "projectexplorerconstants.h"
2015-04-20 17:13:45 +02:00
# include "buildmanager.h"
2013-06-17 12:05:06 +03:00
2013-07-19 11:37:46 +03:00
# include <utils/qtcassert.h>
2013-10-23 22:07:46 +03:00
# include <utils/fileutils.h>
2008-12-02 12:01:29 +01:00
2015-05-22 15:13:18 +02:00
// As of MSVC 2015: "foo.cpp(42) :" -> "foo.cpp(42):"
static const char FILE_POS_PATTERN [ ] = " (cl|LINK|.+[^ ]) ?: " ;
2011-08-18 13:58:23 +02:00
static const char ERROR_PATTERN [ ] = " [A-Z]+ \\ d \\ d \\ d \\ d ?: " ;
2011-05-19 16:11:59 +02:00
2012-01-26 13:38:25 +01:00
static QPair < Utils : : FileName , int > parseFileName ( const QString & input )
2011-05-19 16:11:59 +02:00
{
QString fileName = input ;
if ( fileName . startsWith ( QLatin1String ( " LINK " ) )
| | fileName . startsWith ( QLatin1String ( " cl " ) ) )
2012-01-26 13:38:25 +01:00
return qMakePair ( Utils : : FileName ( ) , - 1 ) ;
2011-05-19 16:11:59 +02:00
// Extract linenumber (if it is there):
int linenumber = - 1 ;
if ( fileName . endsWith ( QLatin1Char ( ' ) ' ) ) ) {
int pos = fileName . lastIndexOf ( QLatin1Char ( ' ( ' ) ) ;
if ( pos > = 0 ) {
bool ok = false ;
2016-02-03 13:49:53 +01:00
int n = fileName . midRef ( pos + 1 , fileName . count ( ) - pos - 2 ) . toInt ( & ok ) ;
2011-05-19 16:11:59 +02:00
if ( ok ) {
fileName = fileName . left ( pos ) ;
linenumber = n ;
}
}
}
2013-10-23 22:07:46 +03:00
const QString normalized = Utils : : FileUtils : : normalizePathName ( fileName ) ;
2013-06-17 12:05:06 +03:00
return qMakePair ( Utils : : FileName : : fromUserInput ( normalized ) , linenumber ) ;
2010-08-13 13:27:02 +02:00
}
2009-02-16 13:12:12 +01:00
using namespace ProjectExplorer ;
2008-12-02 12:01:29 +01:00
2016-02-04 13:29:04 +01:00
// nmake/jom messages.
static bool handleNmakeJomMessage ( const QString & line , Task * task )
{
int matchLength = 0 ;
if ( line . startsWith ( QLatin1String ( " Error: " ) ) )
matchLength = 6 ;
else if ( line . startsWith ( QLatin1String ( " Warning: " ) ) )
matchLength = 8 ;
if ( ! matchLength )
return false ;
* task = Task ( Task : : Error ,
line . mid ( matchLength ) . trimmed ( ) , /* description */
Utils : : FileName ( ) , /* fileName */
- 1 , /* linenumber */
Constants : : TASK_CATEGORY_COMPILE ) ;
return true ;
}
static Task : : TaskType taskType ( const QString & category )
{
Task : : TaskType type = Task : : Unknown ;
if ( category = = QLatin1String ( " warning " ) )
type = Task : : Warning ;
else if ( category = = QLatin1String ( " error " ) )
type = Task : : Error ;
return type ;
}
2008-12-02 12:01:29 +01:00
MsvcParser : : MsvcParser ( )
{
2010-09-30 12:47:45 +02:00
setObjectName ( QLatin1String ( " MsvcParser " ) ) ;
2010-09-08 18:17:52 +02:00
m_compileRegExp . setPattern ( QString : : fromLatin1 ( " ^ " ) + QLatin1String ( FILE_POS_PATTERN )
2011-05-19 16:11:59 +02:00
+ QLatin1String ( " (Command line |fatal )?(warning|error) ( " )
2010-09-08 18:17:52 +02:00
+ QLatin1String ( ERROR_PATTERN ) + QLatin1String ( " .*)$ " ) ) ;
2013-07-19 11:37:46 +03:00
QTC_CHECK ( m_compileRegExp . isValid ( ) ) ;
2013-11-18 09:39:17 +02:00
m_additionalInfoRegExp . setPattern ( QString : : fromLatin1 ( " ^ (?:(could be |or ) \\ s*')?(.*) \\ (( \\ d+) \\ ) : (.*)$ " ) ) ;
2013-07-19 11:37:46 +03:00
QTC_CHECK ( m_additionalInfoRegExp . isValid ( ) ) ;
2008-12-02 12:01:29 +01:00
}
2009-12-09 13:54:46 +01:00
void MsvcParser : : stdOutput ( const QString & line )
2008-12-02 12:01:29 +01:00
{
2014-09-22 16:02:49 +02:00
QRegularExpressionMatch match = m_additionalInfoRegExp . match ( line ) ;
if ( line . startsWith ( QLatin1String ( " " ) ) & & ! match . hasMatch ( ) ) {
2010-09-02 16:43:22 +02:00
if ( m_lastTask . isNull ( ) )
return ;
2012-01-09 16:30:33 +01:00
m_lastTask . description . append ( QLatin1Char ( ' \n ' ) ) ;
2010-09-02 16:43:22 +02:00
m_lastTask . description . append ( line . mid ( 8 ) ) ;
// trim trailing spaces:
int i = 0 ;
for ( i = m_lastTask . description . length ( ) - 1 ; i > = 0 ; - - i ) {
if ( ! m_lastTask . description . at ( i ) . isSpace ( ) )
break ;
}
m_lastTask . description . truncate ( i + 1 ) ;
if ( m_lastTask . formats . isEmpty ( ) ) {
QTextLayout : : FormatRange fr ;
2012-01-09 16:30:33 +01:00
fr . start = m_lastTask . description . indexOf ( QLatin1Char ( ' \n ' ) ) + 1 ;
2010-09-02 16:43:22 +02:00
fr . length = m_lastTask . description . length ( ) - fr . start ;
fr . format . setFontItalic ( true ) ;
m_lastTask . formats . append ( fr ) ;
} else {
m_lastTask . formats [ 0 ] . length = m_lastTask . description . length ( ) - m_lastTask . formats [ 0 ] . start ;
}
2015-04-20 17:13:45 +02:00
+ + m_lines ;
2010-09-02 16:43:22 +02:00
return ;
}
2010-09-08 18:17:52 +02:00
if ( processCompileLine ( line ) )
2009-11-12 15:54:45 +01:00
return ;
2016-02-04 13:29:04 +01:00
if ( handleNmakeJomMessage ( line , & m_lastTask ) ) {
2015-04-20 17:13:45 +02:00
m_lines = 1 ;
2012-10-12 16:33:00 +02:00
return ;
}
2014-09-22 16:02:49 +02:00
if ( match . hasMatch ( ) ) {
QString description = match . captured ( 1 )
+ match . captured ( 4 ) . trimmed ( ) ;
if ( ! match . captured ( 1 ) . isEmpty ( ) )
2013-11-18 09:39:17 +02:00
description . chop ( 1 ) ; // Remove trailing quote
m_lastTask = Task ( Task : : Unknown , description ,
2014-09-22 16:02:49 +02:00
Utils : : FileName : : fromUserInput ( match . captured ( 2 ) ) , /* fileName */
match . captured ( 3 ) . toInt ( ) , /* linenumber */
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) ;
2015-04-20 17:13:45 +02:00
m_lines = 1 ;
2009-11-12 15:54:45 +01:00
return ;
2008-12-02 12:01:29 +01:00
}
2010-07-27 14:22:23 +02:00
IOutputParser : : stdOutput ( line ) ;
2008-12-02 12:01:29 +01:00
}
2010-09-01 12:55:03 +02:00
void MsvcParser : : stdError ( const QString & line )
2010-09-08 18:17:52 +02:00
{
if ( processCompileLine ( line ) )
return ;
2013-09-27 00:51:39 +03:00
// Jom outputs errors to stderr
2016-02-04 13:29:04 +01:00
if ( handleNmakeJomMessage ( line , & m_lastTask ) ) {
2015-04-20 17:13:45 +02:00
m_lines = 1 ;
2013-09-27 00:51:39 +03:00
return ;
}
2010-09-08 18:17:52 +02:00
IOutputParser : : stdError ( line ) ;
}
bool MsvcParser : : processCompileLine ( const QString & line )
2010-09-01 12:55:03 +02:00
{
2013-05-03 16:08:00 +02:00
doFlush ( ) ;
2010-09-02 16:43:22 +02:00
2014-09-22 16:02:49 +02:00
QRegularExpressionMatch match = m_compileRegExp . match ( line ) ;
if ( match . hasMatch ( ) ) {
QPair < Utils : : FileName , int > position = parseFileName ( match . captured ( 1 ) ) ;
2016-02-04 13:29:04 +01:00
m_lastTask = Task ( taskType ( match . captured ( 3 ) ) ,
match . captured ( 4 ) . trimmed ( ) /* description */ ,
2011-05-19 16:11:59 +02:00
position . first , position . second ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) ;
2015-04-20 17:13:45 +02:00
m_lines = 1 ;
2010-09-08 18:17:52 +02:00
return true ;
2010-09-01 12:55:03 +02:00
}
2010-09-08 18:17:52 +02:00
return false ;
2010-09-01 12:55:03 +02:00
}
2013-05-03 16:08:00 +02:00
void MsvcParser : : doFlush ( )
2010-09-02 16:43:22 +02:00
{
if ( m_lastTask . isNull ( ) )
return ;
2013-05-03 16:08:00 +02:00
Task t = m_lastTask ;
m_lastTask . clear ( ) ;
2015-04-20 17:13:45 +02:00
emit addTask ( t , m_lines , 1 ) ;
2010-09-02 16:43:22 +02:00
}
2010-08-12 16:29:58 +02:00
// Unit tests:
# ifdef WITH_TESTS
# include <QTest>
# include "projectexplorer.h"
# include "projectexplorer / outputparser_test.h"
using namespace ProjectExplorer : : Internal ;
2013-08-19 15:51:26 +02:00
using namespace ProjectExplorer ;
2010-08-12 16:29:58 +02:00
void ProjectExplorerPlugin : : testMsvcOutputParsers_data ( )
{
QTest : : addColumn < QString > ( " input " ) ;
QTest : : addColumn < OutputParserTester : : Channel > ( " inputChannel " ) ;
QTest : : addColumn < QString > ( " childStdOutLines " ) ;
QTest : : addColumn < QString > ( " childStdErrLines " ) ;
2013-08-19 15:51:26 +02:00
QTest : : addColumn < QList < Task > > ( " tasks " ) ;
2010-08-12 16:29:58 +02:00
QTest : : addColumn < QString > ( " outputLines " ) ;
QTest : : newRow ( " pass-through stdout " )
< < QString : : fromLatin1 ( " Sometext " ) < < OutputParserTester : : STDOUT
2011-05-18 18:39:14 +02:00
< < QString : : fromLatin1 ( " Sometext \n " ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < QList < Task > ( )
2010-08-12 16:29:58 +02:00
< < QString ( ) ;
QTest : : newRow ( " pass-through stderr " )
< < QString : : fromLatin1 ( " Sometext " ) < < OutputParserTester : : STDERR
2011-05-18 18:39:14 +02:00
< < QString ( ) < < QString : : fromLatin1 ( " Sometext \n " )
2013-08-19 15:51:26 +02:00
< < QList < Task > ( )
2010-08-12 16:29:58 +02:00
< < QString ( ) ;
QTest : : newRow ( " labeled error " )
< < QString : : fromLatin1 ( " qmlstandalone \\ main.cpp(54) : error C4716: 'findUnresolvedModule' : must return a value " ) < < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2012-11-21 22:40:31 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " C4716: 'findUnresolvedModule' : must return a value " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " qmlstandalone \\ main.cpp " ) ) , 54 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-08-12 16:29:58 +02:00
< < QString ( ) ;
2015-05-22 15:13:18 +02:00
QTest : : newRow ( " labeled error-2015 " )
< < QString : : fromLatin1 ( " qmlstandalone \\ main.cpp(54): error C4716: 'findUnresolvedModule' : must return a value " ) < < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
< < ( QList < Task > ( )
< < Task ( Task : : Error ,
QLatin1String ( " C4716: 'findUnresolvedModule' : must return a value " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " qmlstandalone \\ main.cpp " ) ) , 54 ,
Constants : : TASK_CATEGORY_COMPILE ) )
< < QString ( ) ;
2010-08-12 16:29:58 +02:00
QTest : : newRow ( " labeled warning " )
< < QString : : fromLatin1 ( " x: \\ src \\ plugins \\ projectexplorer \\ msvcparser.cpp(69) : warning C4100: 'something' : unreferenced formal parameter " ) < < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2012-11-21 22:40:31 +02:00
< < Task ( Task : : Warning ,
QLatin1String ( " C4100: 'something' : unreferenced formal parameter " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " x: \\ src \\ plugins \\ projectexplorer \\ msvcparser.cpp " ) ) , 69 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-08-12 16:29:58 +02:00
< < QString ( ) ;
2010-08-13 13:27:02 +02:00
QTest : : newRow ( " additional information " )
< < QString : : fromLatin1 ( " x: \\ src \\ plugins \\ texteditor \\ icompletioncollector.h(50) : warning C4099: 'TextEditor::CompletionItem' : type name first seen using 'struct' now seen using 'class' \n "
" x: \\ src \\ plugins \\ texteditor \\ completionsupport.h(39) : see declaration of 'TextEditor::CompletionItem' " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-08-13 13:27:02 +02:00
< < Task ( Task : : Warning ,
QLatin1String ( " C4099: 'TextEditor::CompletionItem' : type name first seen using 'struct' now seen using 'class' " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " x: \\ src \\ plugins \\ texteditor \\ icompletioncollector.h " ) ) , 50 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE )
2010-08-13 13:27:02 +02:00
< < Task ( Task : : Unknown ,
QLatin1String ( " see declaration of 'TextEditor::CompletionItem' " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " x: \\ src \\ plugins \\ texteditor \\ completionsupport.h " ) ) , 39 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-08-13 13:27:02 +02:00
< < QString ( ) ;
2010-09-01 12:55:03 +02:00
QTest : : newRow ( " fatal linker error " )
< < QString : : fromLatin1 ( " LINK : fatal error LNK1146: no argument specified with option '/LIBPATH:' " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-09-01 12:55:03 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " LNK1146: no argument specified with option '/LIBPATH:' " ) ,
2012-01-26 13:38:25 +01:00
Utils : : FileName ( ) , - 1 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-09-01 12:55:03 +02:00
< < QString ( ) ;
// This actually comes through stderr!
QTest : : newRow ( " command line warning " )
< < QString : : fromLatin1 ( " cl : Command line warning D9002 : ignoring unknown option '-fopenmp' " )
< < OutputParserTester : : STDERR
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-09-01 12:55:03 +02:00
< < Task ( Task : : Warning ,
QLatin1String ( " D9002 : ignoring unknown option '-fopenmp' " ) ,
2012-01-26 13:38:25 +01:00
Utils : : FileName ( ) , - 1 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-09-01 12:55:03 +02:00
< < QString ( ) ;
2010-09-02 16:43:22 +02:00
QTest : : newRow ( " complex error " )
< < QString : : fromLatin1 ( " .. \\ untitled \\ main.cpp(19) : error C2440: 'initializing' : cannot convert from 'int' to 'std::_Tree<_Traits>::iterator' \n "
" with \n "
" [ \n "
" _Traits=std::_Tmap_traits<int,double,std::less<int>,std::allocator<std::pair<const int,double>>,false> \n "
" ] \n "
" No constructor could take the source type, or constructor overload resolution was ambiguous " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-09-02 16:43:22 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " C2440: 'initializing' : cannot convert from 'int' to 'std::_Tree<_Traits>::iterator' \n "
" with \n "
" [ \n "
" _Traits=std::_Tmap_traits<int,double,std::less<int>,std::allocator<std::pair<const int,double>>,false> \n "
" ] \n "
" No constructor could take the source type, or constructor overload resolution was ambiguous " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " .. \\ untitled \\ main.cpp " ) ) , 19 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-09-02 16:43:22 +02:00
< < QString ( ) ;
2010-09-08 18:17:52 +02:00
QTest : : newRow ( " Linker error 1 " )
< < QString : : fromLatin1 ( " main.obj : error LNK2019: unresolved external symbol \" public: void __thiscall Data::doit(void) \" (?doit@Data@@QAEXXZ) referenced in function _main " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-09-08 18:17:52 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " LNK2019: unresolved external symbol \" public: void __thiscall Data::doit(void) \" (?doit@Data@@QAEXXZ) referenced in function _main " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " main.obj " ) ) , - 1 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-09-08 18:17:52 +02:00
< < QString ( ) ;
QTest : : newRow ( " Linker error 2 " )
< < QString : : fromLatin1 ( " debug \\ Experimentation.exe : fatal error LNK1120: 1 unresolved externals " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2010-09-08 18:17:52 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " LNK1120: 1 unresolved externals " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " debug \\ Experimentation.exe " ) ) , - 1 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2010-09-08 18:17:52 +02:00
< < QString ( ) ;
2013-09-27 00:51:39 +03:00
QTest : : newRow ( " nmake error " )
2012-10-12 16:33:00 +02:00
< < QString : : fromLatin1 ( " Error: dependent '.. \\ .. \\ .. \\ .. \\ creator-2.5 \\ src \\ plugins \\ coreplugin \\ ifile.h' does not exist. " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2012-10-12 16:33:00 +02:00
< < Task ( Task : : Error ,
QLatin1String ( " dependent '.. \\ .. \\ .. \\ .. \\ creator-2.5 \\ src \\ plugins \\ coreplugin \\ ifile.h' does not exist. " ) ,
Utils : : FileName ( ) , - 1 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2012-10-12 16:33:00 +02:00
< < QString ( ) ;
2013-09-27 00:51:39 +03:00
QTest : : newRow ( " jom error " )
< < QString : : fromLatin1 ( " Error: dependent 'main.cpp' does not exist. " )
< < OutputParserTester : : STDERR
< < QString ( ) < < QString ( )
< < ( QList < Task > ( )
< < Task ( Task : : Error ,
QLatin1String ( " dependent 'main.cpp' does not exist. " ) ,
Utils : : FileName ( ) , - 1 ,
Constants : : TASK_CATEGORY_COMPILE ) )
< < QString ( ) ;
2012-10-12 16:33:00 +02:00
2011-05-19 16:11:59 +02:00
QTest : : newRow ( " Multiline error " )
< < QString : : fromLatin1 ( " c: \\ Program Files (x86) \\ Microsoft Visual Studio 10.0 \\ VC \\ INCLUDE \\ xutility(2227) : warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' \n "
" c: \\ Program Files (x86) \\ Microsoft Visual Studio 10.0 \\ VC \\ INCLUDE \\ xutility(2212) : see declaration of 'std::_Copy_impl' \n "
" symbolgroupvalue.cpp(2314) : see reference to function template instantiation '_OutIt std::copy<const unsigned char*,unsigned short*>(_InIt,_InIt,_OutIt)' being compiled \n "
" with \n "
" [ \n "
" _OutIt=unsigned short *, \n "
" _InIt=const unsigned char * \n "
" ] " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
2013-08-19 15:51:26 +02:00
< < ( QList < Task > ( )
2011-05-19 16:11:59 +02:00
< < Task ( Task : : Warning ,
QLatin1String ( " C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " c: \\ Program Files (x86) \\ Microsoft Visual Studio 10.0 \\ VC \\ INCLUDE \\ xutility " ) ) , 2227 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE )
2011-05-19 16:11:59 +02:00
< < Task ( Task : : Unknown ,
QLatin1String ( " see declaration of 'std::_Copy_impl' " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " c: \\ Program Files (x86) \\ Microsoft Visual Studio 10.0 \\ VC \\ INCLUDE \\ xutility " ) ) , 2212 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE )
2011-05-19 16:11:59 +02:00
< < Task ( Task : : Unknown ,
QLatin1String ( " see reference to function template instantiation '_OutIt std::copy<const unsigned char*,unsigned short*>(_InIt,_InIt,_OutIt)' being compiled \n "
" with \n "
" [ \n "
" _OutIt=unsigned short *, \n "
" _InIt=const unsigned char * \n "
" ] " ) ,
2012-11-21 22:40:31 +02:00
Utils : : FileName : : fromUserInput ( QLatin1String ( " symbolgroupvalue.cpp " ) ) , 2314 ,
2013-08-19 15:51:26 +02:00
Constants : : TASK_CATEGORY_COMPILE ) )
2011-05-19 16:11:59 +02:00
< < QString ( ) ;
2013-11-18 09:39:17 +02:00
QTest : : newRow ( " Ambiguous symbol " )
< < QString : : fromLatin1 ( " D: \\ Project \\ file.h(98) : error C2872: 'UINT64' : ambiguous symbol \n "
" could be 'C: \\ Program Files (x86) \\ Microsoft SDKs \\ Windows \\ v7.0A \\ include \\ basetsd.h(83) : unsigned __int64 UINT64' \n "
" or 'D: \\ Project \\ types.h(71) : Types::UINT64' " )
< < OutputParserTester : : STDOUT
< < QString ( ) < < QString ( )
< < ( QList < Task > ( )
< < Task ( Task : : Error ,
QLatin1String ( " C2872: 'UINT64' : ambiguous symbol " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " D: \\ Project \\ file.h " ) ) , 98 ,
Constants : : TASK_CATEGORY_COMPILE )
< < Task ( Task : : Unknown ,
QLatin1String ( " could be unsigned __int64 UINT64 " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " C: \\ Program Files (x86) \\ Microsoft SDKs \\ Windows \\ v7.0A \\ include \\ basetsd.h " ) ) , 83 ,
Constants : : TASK_CATEGORY_COMPILE )
< < Task ( Task : : Unknown ,
QLatin1String ( " or Types::UINT64 " ) ,
Utils : : FileName : : fromUserInput ( QLatin1String ( " D: \\ Project \\ types.h " ) ) , 71 ,
Constants : : TASK_CATEGORY_COMPILE ) )
< < QString ( ) ;
2010-08-12 16:29:58 +02:00
}
void ProjectExplorerPlugin : : testMsvcOutputParsers ( )
{
OutputParserTester testbench ;
testbench . appendOutputParser ( new MsvcParser ) ;
QFETCH ( QString , input ) ;
QFETCH ( OutputParserTester : : Channel , inputChannel ) ;
QFETCH ( QList < Task > , tasks ) ;
QFETCH ( QString , childStdOutLines ) ;
QFETCH ( QString , childStdErrLines ) ;
QFETCH ( QString , outputLines ) ;
testbench . testParsing ( input , inputChannel ,
tasks , childStdOutLines , childStdErrLines ,
outputLines ) ;
}
2011-11-24 16:11:37 +01:00
# endif // WITH_TEST