[ooo-build-commit] .: idlc/inc idlc/source

Cédric Bosdonnat cbosdo at kemper.freedesktop.org
Tue Sep 14 05:26:17 PDT 2010


 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(-)

New commits:
commit 55c5db853fc0d96179874b4c01dba2774ecf5cd1
Author: Cédric Bosdonnat <cedricbosdo at openoffice.org>
Date:   Tue Sep 14 14:20:04 2010 +0200

    idlc-error-offset.diff: Add character offset for idlc errors
    
    i#81780

diff --git a/idlc/inc/idlc/idlc.hxx b/idlc/inc/idlc/idlc.hxx
index 051a9e6..b7ae506 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 a9006b9..b620d1a 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 1cb6ed2..1c75d78 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 8da9c7a..b6c56c6 100644
--- a/idlc/source/parser.y
+++ b/idlc/source/parser.y
@@ -103,13 +103,16 @@
 
 #include <algorithm>
 #include <vector>
+
+#include <parser.hxx>
     
 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 4125195..d859658 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 <parser.hxx>
 
+/* 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;
 	}
 


More information about the ooo-build-commit mailing list