From a4f835d03a4cad5e4b454faa8eebbf3eefc0448c Mon Sep 17 00:00:00 2001 From: Cédric Bosdonnat Date: Tue, 14 Sep 2010 14:20:04 +0200 Subject: idlc-error-offset.diff: Add character offset for idlc errors i#81780 --- idlc/inc/idlc/idlc.hxx | 8 ++++++++ idlc/source/errorhandler.cxx | 15 ++++++++++++--- idlc/source/idlc.cxx | 2 ++ idlc/source/parser.y | 7 ++++++- idlc/source/scanner.ll | 33 +++++++++++++++++++++++---------- 5 files changed, 51 insertions(+), 14 deletions(-) (limited to 'idlc') diff --git a/idlc/inc/idlc/idlc.hxx b/idlc/inc/idlc/idlc.hxx index cec8e58900fb..663698143f7e 100644 --- a/idlc/inc/idlc/idlc.hxx +++ b/idlc/inc/idlc/idlc.hxx @@ -102,6 +102,12 @@ public: { m_warningCount++; } sal_uInt32 getLineNumber() { return m_lineNumber; } + sal_uInt32 getOffsetStart() + { return m_offsetStart; } + sal_uInt32 getOffsetEnd() + { return m_offsetEnd; } + void setOffset( sal_uInt32 start, sal_uInt32 end) + { m_offsetStart = start; m_offsetEnd = end; } void setLineNumber(sal_uInt32 lineNumber) { m_lineNumber = lineNumber; } void incLineNumber() @@ -136,6 +142,8 @@ private: sal_uInt32 m_errorCount; sal_uInt32 m_warningCount; sal_uInt32 m_lineNumber; + sal_uInt32 m_offsetStart; + sal_uInt32 m_offsetEnd; ParseState m_parseState; StringSet m_includes; }; diff --git a/idlc/source/errorhandler.cxx b/idlc/source/errorhandler.cxx index 4ab4844eeca7..2bc8a6699403 100644 --- a/idlc/source/errorhandler.cxx +++ b/idlc/source/errorhandler.cxx @@ -488,7 +488,7 @@ static OString flagToString(sal_uInt32 flag) return flagStr; } -static void errorHeader(ErrorCode eCode, sal_Int32 lineNumber) +static void errorHeader(ErrorCode eCode, sal_Int32 lineNumber, sal_uInt32 start, sal_uInt32 end) { OString file; if ( idlc()->getFileName() == idlc()->getRealFileName() ) @@ -496,14 +496,23 @@ static void errorHeader(ErrorCode eCode, sal_Int32 lineNumber) else file = idlc()->getFileName(); - fprintf(stderr, "%s(%lu) : %s", file.getStr(), + fprintf(stderr, "%s:%lu [%lu:%lu] : %s", file.getStr(), sal::static_int_cast< unsigned long >(lineNumber), + sal::static_int_cast< unsigned long >(start), + sal::static_int_cast< unsigned long >(end), errorCodeToMessage(eCode)); } +static void errorHeader(ErrorCode eCode, sal_uInt32 lineNumber) +{ + errorHeader(eCode, lineNumber, + idlc()->getOffsetStart(), idlc()->getOffsetEnd()); +} + static void errorHeader(ErrorCode eCode) { - errorHeader(eCode, idlc()->getLineNumber()); + errorHeader(eCode, idlc()->getLineNumber(), + idlc()->getOffsetStart(), idlc()->getOffsetEnd()); } static void warningHeader(WarningCode wCode) diff --git a/idlc/source/idlc.cxx b/idlc/source/idlc.cxx index 1477739cd531..f8317f3b55c0 100644 --- a/idlc/source/idlc.cxx +++ b/idlc/source/idlc.cxx @@ -219,6 +219,8 @@ Idlc::Idlc(Options* pOptions) , m_errorCount(0) , m_warningCount(0) , m_lineNumber(0) + , m_offsetStart(0) + , m_offsetEnd(0) , m_parseState(PS_NoState) { m_pScopes = new AstStack(); diff --git a/idlc/source/parser.y b/idlc/source/parser.y index 8da9c7ad63b5..b6c56c60faaf 100644 --- a/idlc/source/parser.y +++ b/idlc/source/parser.y @@ -103,13 +103,16 @@ #include #include + +#include using namespace ::rtl; #define YYDEBUG 1 #define YYERROR_VERBOSE 1 +#define YYLEX_PARAM &yylval, &yylloc -extern int yylex(void); +extern int yylex (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ); void yyerror(char const *); void checkIdentifier(::rtl::OString* id) @@ -262,6 +265,7 @@ bool includes(AstDeclaration const * type1, AstDeclaration const * type2) { #pragma warning(disable: 4273 4701 4706) #endif %} +%locations /* * Declare the type of values in the grammar */ @@ -972,6 +976,7 @@ attribute_get_raises: rtl::OStringToOUString( idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8)); $$.exceptions = $2; + int line = @2.first_line; } ; diff --git a/idlc/source/scanner.ll b/idlc/source/scanner.ll index 4125195f5916..d8596585cb95 100644 --- a/idlc/source/scanner.ll +++ b/idlc/source/scanner.ll @@ -46,12 +46,21 @@ #include "attributeexceptions.hxx" + class AstExpression; class AstArray; class AstMember; #include +/* handle locations */ +int yycolumn = 1; + +#define YY_USER_ACTION yylloc->first_line = yylloc->last_line = yylineno; \ + yylloc->first_column = yycolumn; yylloc->last_column = yycolumn+yyleng-1; \ + idlc()->setOffset(yylloc->first_column, yylloc->last_column); \ + yycolumn += yyleng; + sal_Int32 beginLine = 0; ::rtl::OString docu; @@ -225,6 +234,7 @@ static void parseLineAndFile(sal_Char* pBuf) for (; *r != '\0' && *r != ' ' && *r != '\t'; r++) ; *r++ = 0; idlc()->setLineNumber((sal_uInt32)atol(h)); + yylineno = atol(h); /* Find file name, if present */ for (; *r != '"'; r++) @@ -260,6 +270,7 @@ static void parseLineAndFile(sal_Char* pBuf) #endif %} +%option bison-bridge bison-locations %option noyywrap %option never-interactive @@ -281,8 +292,10 @@ IDENTIFIER ("_"?({ALPHA}|{DIGIT})+)* %% [ \t\r]+ ; /* eat up whitespace */ -[\n] { - idlc()->incLineNumber(); +[\n] { + idlc()->incLineNumber(); + yycolumn = 1; + yylineno++; } attribute return IDL_ATTRIBUTE; @@ -347,39 +360,39 @@ published return IDL_PUBLISHED; "..." return IDL_ELLIPSIS; ("-")?{INT_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + return asciiToInteger(yytext, &yylval->ival, &yylval->uval); } ("-")?{OCT_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + return asciiToInteger(yytext, &yylval->ival, &yylval->uval); } ("-")?{HEX_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + return asciiToInteger(yytext, &yylval->ival, &yylval->uval); } ("-")?{DIGIT}+(e|E){1}(("+"|"-")?{DIGIT}+)+(f|F)? | ("-")?"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? | ("-")?{DIGIT}*"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? { - yylval.dval = asciiToFloat( yytext ); + yylval->dval = asciiToFloat( yytext ); return IDL_FLOATING_PT_LITERAL; } {IDENTIFIER} { - yylval.sval = new ::rtl::OString(yytext); + yylval->sval = new ::rtl::OString(yytext); return IDL_IDENTIFIER; } \<\< { - yylval.strval = yytext; + yylval->strval = yytext; return IDL_LEFTSHIFT; } \>\> { - yylval.strval = yytext; + yylval->strval = yytext; return IDL_RIGHTSHIFT; } \:\: { - yylval.strval = yytext; + yylval->strval = yytext; return IDL_SCOPESEPARATOR; } -- cgit