]> source.dussan.org Git - aspectj.git/commitdiff
Improve usage text, error and warning output in batch compiler
authorAlexander Kriegisch <Alexander@Kriegisch.name>
Sat, 20 Mar 2021 03:24:57 +0000 (10:24 +0700)
committerAlexander Kriegisch <Alexander@Kriegisch.name>
Sat, 20 Mar 2021 03:24:57 +0000 (10:24 +0700)
- Usage texts are now printed to stdOut, no longer stdErr.
- 'java ...Main -?' no longer prints usage text twice (once to stdOut
  and then again to stdErr).
- AjdtCommand.inferKind: Usage texts are no longer mis-identified as
  warnings or errors just because they contain substrings "warning" or
  "error". Matching is now more precise, looking for "[warning]" and
  "[error]". But in that case the method would not be called anyway
  because errors and warnings are identified in other ways already. As a
  fall-back, the categories IMessage.ERROR and IMessage.WARNING still
  exist in the method.
- In case of compile errors, no usage message is printed anymore,
  because previously the user had to scroll up a lot in order to see the
  actual messages. This is also in line with ECJ. The same is true for
  warnings, but it was like this in Ajc already.
- AjdtCommand.inferKind: There is a new category IMessage.USAGE
  especially for AspectJ usage texts, which will be identified by string
  matching and then correctly handled (i.e. printed to stdOut, not
  stdErr).
- Usage text printing is no longer done in AspectJ but in the AspectJ
  "shadows" fork of JDT. This helps to get rid of some now obsolete code
  here.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
bridge/src/main/java/org/aspectj/bridge/IMessage.java
bridge/src/main/java/org/aspectj/bridge/Message.java
bridge/src/main/java/org/aspectj/bridge/context/PinpointingMessageHandler.java
org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/ajc/AjdtCommand.java
org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/ajc/BuildArgParser.java
org.aspectj.ajdt.core/src/main/java/org/aspectj/tools/ajc/Main.java
org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip
org.eclipse.jdt.core/jdtcore-for-aspectj.jar
testing/src/test/java/org/aspectj/testing/xml/SoftMessage.java

index b53a8c727ada76eed8bc1d87fc38ea0e21e33a69..21ef8d7ab3d78e1981128318e27e1329b2aed185 100644 (file)
@@ -28,8 +28,9 @@ public interface IMessage {
        // int values must sync with KINDS order below
        Kind WEAVEINFO = new Kind("weaveinfo", 5);
        Kind INFO = new Kind("info", 10);
+       Kind USAGE = new Kind("usage", 15);
        Kind DEBUG = new Kind("debug", 20);
-       Kind TASKTAG = new Kind("task", 25); // represents a 'TODO' from eclipse - producted by the compiler and
+       Kind TASKTAG = new Kind("task", 25); // represents a 'TODO' from eclipse - produced by the compiler and
                                                                                                                                // consumed by AJDT
                                                                                                                                Kind WARNING = new Kind("warning", 30);
        Kind ERROR = new Kind("error", 40);
@@ -42,7 +43,7 @@ public interface IMessage {
        /**
         * list of Kind in precedence order. 0 is less than IMessage.Kind#COMPARATOR.compareTo(KINDS.get(i), KINDS.get(i + 1))
         */
-       List<Kind> KINDS = Collections.unmodifiableList(Arrays.asList(new Kind[] { WEAVEINFO, INFO, DEBUG, TASKTAG,
+       List<Kind> KINDS = Collections.unmodifiableList(Arrays.asList(new Kind[] { WEAVEINFO, INFO, USAGE, DEBUG, TASKTAG,
                        WARNING, ERROR, FAIL, ABORT }));
 
        /** @return non-null String with simple message */
@@ -60,6 +61,9 @@ public interface IMessage {
        /** @return true if this is an internal debug message */
        boolean isDebug();
 
+       /** @return true if this is a compiler usage message */
+       boolean isUsage();
+
        /** @return true if this is information for the user */
        boolean isInfo();
 
index a4f17072bf528d92a67c8ace9ca5459d05f22009..959491c1f15610b34c29ffa4e11996dc90bdfb33 100644 (file)
@@ -121,6 +121,13 @@ public class Message implements IMessage {
                return kind == IMessage.DEBUG;
        }
 
+       /**
+        * @return true if kind == IMessage.USAGE
+        */
+       public boolean isUsage() {
+               return kind == IMessage.USAGE;
+       }
+
        public boolean isTaskTag() {
                return kind == IMessage.TASKTAG;
        }
index c54ff678966945506333e25d06d4656d9d75c5d6..b8c975cd0177f203da93f7cbf2d5bc1dc98432a7 100644 (file)
@@ -91,6 +91,7 @@ public class PinpointingMessageHandler implements IMessageHandler {
                public boolean isError() { return delegate.isError(); }
                public boolean isWarning() { return delegate.isWarning();}
                public boolean isDebug() { return delegate.isDebug();}
+               public boolean isUsage() { return delegate.isUsage();}
                public boolean isInfo() { return delegate.isInfo();}
                public boolean isAbort() { return delegate.isAbort();}
                public boolean isTaskTag() { return delegate.isTaskTag();}
index 7fa4e9c3676c679b112b83d2e7bd4db3002ae6a0..36168343f2c9a48e0b31b990d61e1c55ca83ced6 100644 (file)
@@ -44,19 +44,6 @@ public class AjdtCommand implements ICommand {
                buildManager = new AjBuildManager(handler); 
                savedArgs = new String[args.length];
         System.arraycopy(args, 0, savedArgs, 0, savedArgs.length);
-               for (String arg : args) {
-// AMC - PR58681. No need to abort on -help as the Eclipse compiler does the right thing.
-//            if ("-help".equals(args[i])) {
-//                // should be info, but handler usually suppresses
-//                MessageUtil.abort(handler, BuildArgParser.getUsage());
-//                return true;
-//            } else
-                       if ("-X".equals(arg)) {
-                               // should be info, but handler usually suppresses
-                               MessageUtil.abort(handler, BuildArgParser.getXOptionUsage());
-                               return true;
-                       }
-               }
         return doCommand(handler, false);
     }
 
@@ -103,9 +90,11 @@ public class AjdtCommand implements ICommand {
             if (!config.hasSources()) {
                 MessageUtil.error(counter, "no sources specified");
             }
-            if (counter.hasErrors())  { // print usage for config errors
-                String usage = BuildArgParser.getUsage();
-                MessageUtil.abort(handler, usage);
+            if (counter.hasErrors())  {
+                // Do *not* print usage for config errors (just like ECJ does it). Otherwise the user would have to
+                // scroll up several screens in order to actually see the error messages.
+                // String usage = BuildArgParser.getUsage();
+                // MessageUtil.abort(handler, usage);
                 return false;
             }
             //System.err.println("errs: " + counter.hasErrors());          
@@ -166,14 +155,23 @@ public class AjdtCommand implements ICommand {
         return config;
     }
     
-    /** @return IMessage.WARNING unless message contains error or info */
+    /**
+     * Heuristically infer the type of output message logged by the AspectJ compiler. This is a simple keyword matcher
+     * looking for substrings like "[error]", "[warning]", "AspectJ-specific options:", "AspectJ-specific non-standard
+     * options:"
+     *
+     * @param message AspectJ compiler message
+     * @return inferred message kind, either of ERROR, WARNING, USAGE, INFO
+     */
     protected static IMessage.Kind inferKind(String message) { // XXX dubious
-        if (message.contains("error")) {
+        if (message.contains("[error]")) {
             return IMessage.ERROR;
-        } else if (message.contains("info")) {
-            return IMessage.INFO;
-        } else {
+        } else if (message.contains("[warning]")) {
             return IMessage.WARNING;
+        } else if (message.contains("AspectJ-specific options:") || message.contains("AspectJ-specific non-standard options:")) {
+            return IMessage.USAGE;
+        } else {
+            return IMessage.INFO;
         }
     }
 }
index c120e0293d929c1259c26d946e8ba88c8f50f286..e078ba7fbe3513a2bea3d479e2f9827c4108e79e 100644 (file)
@@ -314,12 +314,6 @@ public class BuildArgParser extends Main {
                super.initializeAnnotationProcessorManager();
        }
 
-       @Override
-       public void printUsage() {
-               System.out.println(getUsage());
-               System.out.flush();
-       }
-
        /**
         * Get messages not dumped to handler or any PrintWriter.
         *
index 4b15f0333da0c7c2fd7c7bf7b112e09ec61bf7e2..81ec01a4202d7673dd3cee46a6eee08ae171893a 100644 (file)
@@ -640,6 +640,8 @@ public class Main {
                                return System.err;
                        } else if (verbose && IMessage.INFO.equals(kind)) {
                                return System.out;
+                       } else if (IMessage.USAGE.equals(kind)) {
+                               return System.out;
                        } else if (IMessage.WEAVEINFO.equals(kind)) {
                                return System.out;
                        } else {
index 8c211a9ad2fe08607b646cc6bfc351f037ccc1d0..37f003c8dcd6703b1761e76f0c4f25245ef66fe1 100644 (file)
Binary files a/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip and b/org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip differ
index 5ea181e54de92411c8753f17d13c8a19d9fc9d78..4275229c0f6974e55fb26d7da4a2e42981b54f74 100644 (file)
Binary files a/org.eclipse.jdt.core/jdtcore-for-aspectj.jar and b/org.eclipse.jdt.core/jdtcore-for-aspectj.jar differ
index 970a1c457e04e580d06422342dbc7a2ea91e3c27..594c4b395ade2d95a9e307ebedace56a0260cc47 100644 (file)
@@ -205,6 +205,13 @@ public class SoftMessage implements IMessage {
                return kind == IMessage.DEBUG;
        }
 
+       /**
+        * @return true if kind == IMessage.USAGE
+        */
+       public boolean isUsage() {
+               return kind == IMessage.USAGE;
+       }
+
        /** 
         * @return true if kind == IMessage.INFO  
         */