瀏覽代碼

HPCC-13229 Improve error reporting of #WEBSERVICE and other #commands

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 10 年之前
父節點
當前提交
4cba3fc9a1
共有 6 個文件被更改,包括 39 次插入31 次删除
  1. 5 0
      ecl/eclcc/eclcc.cpp
  2. 4 2
      ecl/hql/hqlgram.y
  3. 9 12
      ecl/hqlcpp/hqlcpp.cpp
  4. 4 2
      ecl/hqlcpp/hqlhtcpp.cpp
  5. 16 14
      ecl/hqlcpp/hqlttcpp.cpp
  6. 1 1
      ecl/hqlcpp/hqlttcpp.ipp

+ 5 - 0
ecl/eclcc/eclcc.cpp

@@ -819,6 +819,11 @@ void EclCC::instantECL(EclCompileInstance & instance, IWorkUnit *wu, const char
                 }
             }
         }
+        catch (IError * _e)
+        {
+            Owned<IError> e = _e;
+            errorProcessor.report(e);
+        }
         catch (IException * _e)
         {
             Owned<IException> e = _e;

+ 4 - 2
ecl/hql/hqlgram.y

@@ -2274,9 +2274,11 @@ action
                         {
                             $1.annotateExprWithLocation();
                             $$.inherit($1);
-                            $$.setPosition($1);
                         }
-    | setMetaCommand
+    | setMetaCommand    {
+                            $1.annotateExprWithLocation();
+                            $$.inherit($1);
+                        }
     ;
 
 actionStmt

+ 9 - 12
ecl/hqlcpp/hqlcpp.cpp

@@ -2183,19 +2183,16 @@ void HqlCppTranslator::ThrowStringException(int code,const char *format, ...)
     throw ret;
 }
 
-void HqlCppTranslator::reportErrorDirect(IHqlExpression * location, int code,const char *msg, bool alwaysAbort)
+void HqlCppTranslator::reportErrorDirect(IHqlExpression * exprOrLocation, int code,const char *msg, bool alwaysAbort)
 {
-    if (location)
-    {
-        ECLlocation loc;
-        loc.extractLocationAttr(location);
-        if (alwaysAbort)
-            throw createError(code, msg, loc.sourcePath->str(), loc.lineno, loc.column, loc.position);
-        errorProcessor->reportError(code, msg, loc.sourcePath->str(), loc.lineno, loc.column, loc.position);
-    }
-    else
-//        errorProcessor->reportError(code, msg, NULL, 0, 0, 0);
-        throw MakeStringExceptionDirect(code, msg);
+    ECLlocation loc;
+    if (!loc.extractLocationAttr(exprOrLocation))
+        loc.extractLocationAttr(queryActiveActivityLocation());
+    const char * sourcePath = loc.sourcePath->str();
+
+    if (alwaysAbort)
+        throw createError(code, msg, sourcePath, loc.lineno, loc.column, loc.position);
+    errorProcessor->reportError(code, msg, sourcePath, loc.lineno, loc.column, loc.position);
 }
 
 void HqlCppTranslator::reportError(IHqlExpression * location, int code,const char *format, ...)

+ 4 - 2
ecl/hqlcpp/hqlhtcpp.cpp

@@ -6760,10 +6760,12 @@ ABoundActivity * HqlCppTranslator::buildActivity(BuildCtx & ctx, IHqlExpression
                 }
         }
     }
+    catch (IError * e)
+    {
+        throw;
+    }
     catch (IException * e)
     {
-        if (dynamic_cast<IError *>(e))
-            throw;
         IHqlExpression * location = queryActiveActivityLocation();
         if (location)
         {

+ 16 - 14
ecl/hqlcpp/hqlttcpp.cpp

@@ -271,7 +271,7 @@ NewThorStoredReplacer::NewThorStoredReplacer(HqlCppTranslator & _translator, IWo
 }
 
 
-void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
+void NewThorStoredReplacer::doAnalyse(IHqlExpression * expr)
 {
     //NOTE: This is called very early before no_assertconstant has been processed, so we need to explicitly
     //constant fold, and check it is constant (bug 26963)
@@ -286,7 +286,7 @@ void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
         {
             Owned<IWUWebServicesInfo> wsi = wu->updateWebServicesInfo(false);
             if (wsi)
-                throwError(HQLERR_MultipleHashWebserviceCalls);
+                translator.ERRORAT(expr, HQLERR_MultipleHashWebserviceCalls);
             wsi.setown(wu->updateWebServicesInfo(true));
 
             IHqlExpression *wsExpr = expr->queryChild(0);
@@ -306,9 +306,9 @@ void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
             IValue * value = foldedValue->queryValue();
 
             if (!name)
-                throwError1(HQLERR_ExpectedConstantDebug, getExprECL(foldedName, errorTemp).str());
+                translator.reportError(expr, ECODETEXT(HQLERR_ExpectedConstantDebug), getExprECL(foldedName, errorTemp).str());
             if (!value)
-                throwError1(HQLERR_ExpectedConstantDebug, getExprECL(foldedValue, errorTemp).str());
+                translator.reportError(expr, ECODETEXT(HQLERR_ExpectedConstantDebug), getExprECL(foldedValue, errorTemp).str());
 
             StringBuffer nameText,valueText;
             name->getStringValue(nameText);
@@ -329,9 +329,9 @@ void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
             IValue * value = foldedValue->queryValue();
 
             if (!name)
-                throwError1(HQLERR_ExpectedConstantWorkunit, getExprECL(foldedName, errorTemp).str());
+                translator.reportError(expr, ECODETEXT(HQLERR_ExpectedConstantWorkunit), getExprECL(foldedName, errorTemp).str());
             if (!value)
-                throwError1(HQLERR_ExpectedConstantWorkunit, getExprECL(foldedValue, errorTemp).str());
+                translator.reportError(expr, ECODETEXT(HQLERR_ExpectedConstantWorkunit), getExprECL(foldedValue, errorTemp).str());
 
             StringBuffer nameText,valueText;
             name->getStringValue(nameText);
@@ -368,7 +368,7 @@ void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
                 wu->setWuScope(valueText.str());
             }
             else
-                throwError1(HQLERR_UnsupportedHashWorkunit, nameText.str());
+                translator.reportError(expr, ECODETEXT(HQLERR_UnsupportedHashWorkunit), nameText.str());
         }
         else if (kind == linkAtom)
         {
@@ -395,7 +395,9 @@ void NewThorStoredReplacer::doAnalyseBody(IHqlExpression * expr)
             seenMeta = true;
     }
 
-    QuickHqlTransformer::doAnalyseBody(expr);
+    //Walk the body rather than expr so that the no_setmeta isn't processed again.
+    //If the code above was in doAnalyseBody() the error location information would not be available.
+    QuickHqlTransformer::doAnalyseBody(expr->queryBody());
 }
 
 bool NewThorStoredReplacer::needToTransform()
@@ -479,10 +481,10 @@ IHqlExpression * NewThorStoredReplacer::createTransformed(IHqlExpression * expr)
                             othersText.append(",");
                             getExprECL(&activeReplacements.item(i), othersText);
                         }
-                        throwError3(HQLERR_RecursiveStoredOther,  forceConstant ? "CONSTANT" : "STORED", nameText.str(), othersText.str()+1);
+                        translator.reportError(expr, ECODETEXT(HQLERR_RecursiveStoredOther),  forceConstant ? "CONSTANT" : "STORED", nameText.str(), othersText.str()+1);
                     }
                     else
-                        throwError2(HQLERR_RecursiveStored,  forceConstant ? "CONSTANT" : "STORED", nameText.str());
+                        translator.reportError(expr, ECODETEXT(HQLERR_RecursiveStored),  forceConstant ? "CONSTANT" : "STORED", nameText.str());
                 }
 
                 ITypeInfo * exprType = expr->queryType();
@@ -505,12 +507,12 @@ IHqlExpression * NewThorStoredReplacer::createTransformed(IHqlExpression * expr)
                             getExprECL(matchedName, nameText);
                             getFriendlyTypeStr(exprType, exprTypeText);
                             getFriendlyTypeStr(replacementType, replacementTypeText);
-                            throwError3(HQLERR_HashStoredTypeMismatch, nameText.str(), exprTypeText.str(), replacementTypeText.str());
+                            translator.reportError(expr, ECODETEXT(HQLERR_HashStoredTypeMismatch), nameText.str(), exprTypeText.str(), replacementTypeText.str());
                         }
                         else if (expr->queryRecord() != replacement->queryRecord())
                         {
                             StringBuffer s;
-                            throwError1(HQLERR_HashStoredRecordMismatch, getExprECL(matchedName, s).str());
+                            translator.reportError(expr, ECODETEXT(HQLERR_HashStoredRecordMismatch), getExprECL(matchedName, s).str());
                         }
                     }
                     break;
@@ -522,7 +524,7 @@ IHqlExpression * NewThorStoredReplacer::createTransformed(IHqlExpression * expr)
                             getExprECL(matchedName, nameText);
                             getFriendlyTypeStr(exprType, exprTypeText);
                             getFriendlyTypeStr(replacementType, replacementTypeText);
-                            throwError3(HQLERR_HashStoredTypeMismatch, nameText.str(), exprTypeText.str(), replacementTypeText.str());
+                            translator.reportError(expr, ECODETEXT(HQLERR_HashStoredTypeMismatch), nameText.str(), exprTypeText.str(), replacementTypeText.str());
                         }
                         replacement.setown(ensureExprType(replacement, exprType));
                         break;
@@ -541,7 +543,7 @@ IHqlExpression * NewThorStoredReplacer::createTransformed(IHqlExpression * expr)
                                 getExprECL(matchedName, nameText);
                                 getFriendlyTypeStr(exprType, exprTypeText);
                                 getFriendlyTypeStr(replacementType, replacementTypeText);
-                                throwError3(HQLERR_HashStoredTypeMismatch, nameText.str(), exprTypeText.str(), replacementTypeText.str());
+                                translator.reportError(expr, ECODETEXT(HQLERR_HashStoredTypeMismatch), nameText.str(), exprTypeText.str(), replacementTypeText.str());
                             }
                         default:
                             replacement.setown(ensureExprType(replacement, exprType));

+ 1 - 1
ecl/hqlcpp/hqlttcpp.ipp

@@ -30,7 +30,7 @@ class NewThorStoredReplacer : public QuickHqlTransformer
 public:
     NewThorStoredReplacer(HqlCppTranslator & _translator, IWorkUnit * _wu, ICodegenContextCallback * _logger);
 
-    virtual void doAnalyseBody(IHqlExpression * expr);
+    virtual void doAnalyse(IHqlExpression * expr);
     virtual IHqlExpression * createTransformed(IHqlExpression * expr);
 
     bool needToTransform();