You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/30 02:13:51 UTC

[dubbo] branch master updated: optimise compile error message in jdk compiler.(#8942) (#8943)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 7be2ab1  optimise compile error message in jdk compiler.(#8942) (#8943)
7be2ab1 is described below

commit 7be2ab138099aabe4f3a6d81b2be67e66e704b38
Author: violin <84...@qq.com>
AuthorDate: Thu Sep 30 10:13:41 2021 +0800

    optimise compile error message in jdk compiler.(#8942) (#8943)
    
    * optimise compile error message in jdk compiler.(#8942)
    
    * update with comment.
    
    * fix maven compile error.
    
    * code format and field name.
---
 .../dubbo/common/compiler/support/JdkCompiler.java | 13 ++++++++++-
 .../common/compiler/support/JavaCodeTest.java      | 25 ++++++++++++++++------
 .../common/compiler/support/JdkCompilerTest.java   | 17 +++++++++++++++
 3 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
index e5d5b22..41fd9db 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.compiler.support;
 
 
+import javax.tools.Diagnostic;
 import javax.tools.DiagnosticCollector;
 import javax.tools.FileObject;
 import javax.tools.ForwardingJavaFileManager;
@@ -28,6 +29,7 @@ import javax.tools.SimpleJavaFileObject;
 import javax.tools.StandardJavaFileManager;
 import javax.tools.StandardLocation;
 import javax.tools.ToolProvider;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -122,11 +124,20 @@ public class JdkCompiler extends AbstractCompiler {
         Boolean result = compiler.getTask(null, javaFileManager, diagnosticCollector, options,
                 null, Collections.singletonList(javaFileObject)).call();
         if (result == null || !result) {
-            throw new IllegalStateException("Compilation failed. class: " + name + ", diagnostics: " + diagnosticCollector);
+            throw new IllegalStateException("Compilation failed. class: " + name + ", diagnostics: " + getCompileErrorMessage(diagnosticCollector));
         }
         return classLoader.loadClass(name);
     }
 
+    private String getCompileErrorMessage(DiagnosticCollector<JavaFileObject> diagnostics) {
+        StringBuilder sb = new StringBuilder();
+        for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
+            sb.append("\n").append(diagnostic.toString());
+        }
+
+        return sb.toString();
+    }
+
     private static final class JavaFileObjectImpl extends SimpleJavaFileObject {
 
         private final CharSequence source;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
index 3023044..3d20085 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
@@ -20,13 +20,13 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 public class JavaCodeTest {
 
-    public static final AtomicInteger SUBFIX = new AtomicInteger(8);
+    public static final AtomicInteger SUFFIX = new AtomicInteger(8);
 
     String getSimpleCode() {
         StringBuilder code = new StringBuilder();
         code.append("package org.apache.dubbo.common.compiler.support;");
 
-        code.append("public class HelloServiceImpl" + SUBFIX.getAndIncrement() + " implements HelloService {");
+        code.append("public class HelloServiceImpl" + SUFFIX.getAndIncrement() + " implements HelloService {");
         code.append("   public String sayHello() { ");
         code.append("       return \"Hello world!\"; ");
         code.append("   }");
@@ -36,7 +36,7 @@ public class JavaCodeTest {
 
     String getSimpleCodeWithoutPackage(){
         StringBuilder code = new StringBuilder();
-        code.append("public class HelloServiceImpl" + SUBFIX.getAndIncrement() + "implements org.apache.dubbo.common.compiler.support.HelloService.HelloService {");
+        code.append("public class HelloServiceImpl" + SUFFIX.getAndIncrement() + "implements org.apache.dubbo.common.compiler.support.HelloService.HelloService {");
         code.append("   public String sayHello() { ");
         code.append("       return \"Hello world!\"; ");
         code.append("   }");
@@ -48,7 +48,7 @@ public class JavaCodeTest {
         StringBuilder code = new StringBuilder();
         code.append("package org.apache.dubbo.common.compiler.support;");
 
-        code.append("public class HelloServiceImpl" + SUBFIX.getAndIncrement() + " implements HelloService {");
+        code.append("public class HelloServiceImpl" + SUFFIX.getAndIncrement() + " implements HelloService {");
         code.append("   public String sayHello() { ");
         code.append("       return \"Hello world!\"; ");
         // code.append("   }");
@@ -76,7 +76,7 @@ public class JavaCodeTest {
         code.append("import java.lang.*;\n");
         code.append("import org.apache.dubbo.common.compiler.support;\n");
 
-        code.append("public class HelloServiceImpl2" + SUBFIX.getAndIncrement() + " implements HelloService {");
+        code.append("public class HelloServiceImpl2" + SUFFIX.getAndIncrement() + " implements HelloService {");
         code.append("   public String sayHello() { ");
         code.append("       return \"Hello world!\"; ");
         code.append("   }");
@@ -91,11 +91,24 @@ public class JavaCodeTest {
         code.append("import java.lang.*;\n");
         code.append("import org.apache.dubbo.common.compiler.support;\n");
 
-        code.append("public class HelloServiceImpl" + SUBFIX.getAndIncrement() + " extends org.apache.dubbo.common.compiler.support.HelloServiceImpl0 {\n");
+        code.append("public class HelloServiceImpl" + SUFFIX.getAndIncrement() + " extends org.apache.dubbo.common.compiler.support.HelloServiceImpl0 {\n");
         code.append("   public String sayHello() { ");
         code.append("       return \"Hello world3!\"; ");
         code.append("   }");
         code.append("}");
         return code.toString();
     }
+
+    String getSimpleCodeWithError() {
+        StringBuilder code = new StringBuilder();
+        code.append("package org.apache.dubbo.common.compiler.support;");
+
+        code.append("public class HelloServiceImpl" + SUFFIX.getAndIncrement() + " implements HelloService {");
+        code.append("   public String sayHello( { ");
+        code.append("       return \"Hello world!\"; ");
+        code.append("   }");
+        code.append("}");
+        return code.toString();
+    }
+
 }
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
index e0bc3a9..7cd207f 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
@@ -16,6 +16,10 @@
  */
 package org.apache.dubbo.common.compiler.support;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.hamcrest.core.StringContains;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -84,4 +88,17 @@ public class JdkCompilerTest extends JavaCodeTest {
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
         });
     }
+
+    @Test
+    public void testGetCompileClassWithError() {
+        Exception exception = null;
+        try {
+            JdkCompiler compiler = new JdkCompiler();
+            compiler.compile(getSimpleCodeWithError(), JdkCompiler.class.getClassLoader());
+        } catch (Exception e) {
+            exception = e;
+        }
+        assertNotNull(exception);
+        assertThat("can not acquire detail error message from exception.", exception.getMessage(), StringContains.containsString("public String sayHello( {"));
+    }
 }