Browse Source

Improve usage text, error and warning output in batch compiler

- 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>
tags/java16-add-opens
Alexander Kriegisch 3 years ago
parent
commit
31b2d60b89

+ 6
- 2
bridge/src/main/java/org/aspectj/bridge/IMessage.java View 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();


+ 7
- 0
bridge/src/main/java/org/aspectj/bridge/Message.java View 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;
}

+ 1
- 0
bridge/src/main/java/org/aspectj/bridge/context/PinpointingMessageHandler.java View 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();}

+ 19
- 21
org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/ajc/AjdtCommand.java View 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;
}
}
}

+ 0
- 6
org.aspectj.ajdt.core/src/main/java/org/aspectj/ajdt/ajc/BuildArgParser.java View 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.
*

+ 2
- 0
org.aspectj.ajdt.core/src/main/java/org/aspectj/tools/ajc/Main.java View 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 {

BIN
org.eclipse.jdt.core/jdtcore-for-aspectj-src.zip View File


BIN
org.eclipse.jdt.core/jdtcore-for-aspectj.jar View File


+ 7
- 0
testing/src/test/java/org/aspectj/testing/xml/SoftMessage.java View 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
*/

Loading…
Cancel
Save