Bladeren bron

HPCC-21544 Java compile error reporting issues

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 6 jaren geleden
bovenliggende
commit
9473e5e592
2 gewijzigde bestanden met toevoegingen van 25 en 13 verwijderingen
  1. 2 2
      ecl/hql/hqlgram2.cpp
  2. 23 11
      plugins/javaembed/javaembed.cpp

+ 2 - 2
ecl/hql/hqlgram2.cpp

@@ -9784,7 +9784,7 @@ IHqlExpression * HqlGram::checkEmbedBody(const attribute & errpos, DefineIdSt *
                             if (strnicmp(err, "warning:", 8)==0)
                             {
                                 err = strchr(err, ':') + 1;
-                                while (isspace(*err))
+                                if (isspace(*err))
                                     err++;
                                 reportWarning(CategoryEmbed, WRN_EMBEDWARNING, pos, "%s", err);
                             }
@@ -9793,7 +9793,7 @@ IHqlExpression * HqlGram::checkEmbedBody(const attribute & errpos, DefineIdSt *
                                 if (strnicmp(err, "error:", 6)==0)
                                 {
                                     err = strchr(err, ':') + 1;
-                                    while (isspace(*err))
+                                    if (isspace(*err))
                                         err++;
                                 }
                                 reportError(ERR_EMBEDERROR, pos, "%s", err);

+ 23 - 11
plugins/javaembed/javaembed.cpp

@@ -4507,27 +4507,44 @@ static bool isFullClassFile(StringBuffer &className, bool &seenPublic, size32_t
     return false;
 }
 
-static StringBuffer & cleanupJavaError(StringBuffer &ret, const char *err, unsigned lineNumberOffset)
+static bool suppressJavaError(const char *err)
 {
-    // Remove filename (as it's generated) and fix up line number. Skip errors that do not have line number in
+    if (!err || !*err)
+        return true;
+    if (streq(err, "1 error"))
+        return true;
+    char *rest;
+    if (strtoul(err, &rest, 10) && streq(rest, " errors"))
+        return true;
+    return false;
+}
+
+static StringBuffer & cleanupJavaError(StringBuffer &ret, StringBuffer &prefix, const char *err, unsigned lineNumberOffset)
+{
+    // Remove filename (as it's generated) and fix up line number. Errors that do not have line number use previous error's line number.
     const char *colon = strchr(err, ':');
+    // Java errors are a bit of a pain - if you suppress the ones without line numbers you get too little information, if you don't you get too much
     if (colon && isdigit(colon[1]))
     {
         char *end;
         unsigned lineno = strtoul(colon+1, &end, 10) - lineNumberOffset;
-        ret.appendf("(%u,1)%s", lineno, end);
+        prefix.clear().appendf("(%u,1)", lineno);
+        ret.append(prefix).append(end);
     }
+    else if (!suppressJavaError(err))
+        ret.append(prefix).appendf(": error: %s", err);
     return ret;
 }
 
 static void cleanupJavaErrors(StringBuffer &ret, const char *errors, unsigned lineNumberOffset)
 {
     StringArray errlines;
-    errlines.appendList(errors, "\n");
+    errlines.appendList(errors, "\n", false);
+    StringBuffer prefix;
     ForEachItemIn(idx, errlines)
     {
         StringBuffer cleaned;
-        cleanupJavaError(cleaned, errlines.item(idx), lineNumberOffset);
+        cleanupJavaError(cleaned, prefix, errlines.item(idx), lineNumberOffset);
         if (cleaned.length())
             ret.append(cleaned).append('\n');
     }
@@ -4593,12 +4610,7 @@ void doPrecompile(size32_t & __lenResult, void * & __result, const char *funcNam
         unsigned retcode = pipe->wait();
         cleanupJavaErrors(errors, javaErrors, lineNumberOffset);
         if (retcode)
-        {
-            if (javaErrors.length())
-                throw makeStringExceptionV(0, "%s", errors.str());
-            else
-                throw makeStringException(0, "Failed to precompile java code");
-        }
+            throw makeStringException(0, "Failed to precompile java code");
         VStringBuffer mainfile("%s" PATHSEPSTR "%s.class", tmpDirName.str(), classname.str());
         JavaClassReader reader(mainfile);
         DBGLOG("Analysing generated class %s", reader.queryClassName());