Merge
diff --git a/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java b/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java
index 9ac5788..e930c75 100644
--- a/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java
+++ b/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java
@@ -27,13 +27,13 @@
 import java.util.Collection;
 import java.util.Locale;
 import javax.tools.JavaFileObject;
-import java.util.ResourceBundle;
 
 import com.sun.tools.javac.api.DiagnosticFormatter;
 import com.sun.tools.javac.api.Formattable;
 import com.sun.tools.javac.api.DiagnosticFormatter.PositionKind;
 import com.sun.tools.javac.file.JavacFileManager;
 import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*;
+import static com.sun.tools.javac.util.LayoutCharacters.*;
 
 /**
  * This abstract class provides a basic implementation of the functionalities that should be provided
@@ -72,8 +72,13 @@
 
     public String formatMessage(JCDiagnostic d, Locale l) {
         //this code should rely on the locale settings but it's not! See RFE 6443132
+        StringBuilder buf = new StringBuilder();
         Collection<String> args = formatArguments(d, l);
-        return localize(l, d.getCode(), args.toArray());
+        buf.append(localize(l, d.getCode(), args.toArray()));
+        if (d.isMultiline()) {
+            buf.append(formatSubdiagnostics(d, l));
+        }
+        return buf.toString();
     }
 
     public String formatKind(JCDiagnostic d, Locale l) {
@@ -165,6 +170,23 @@
         return sbuf.toString();
     }
 
+    /**
+     * Format all the subdiagnostics attached to a given diagnostic
+     *
+     * @param d diagnostic whose subdiagnostics are to be formatted
+     * @param l locale object to be used for i18n
+     * @return string representation of the subdiagnostics
+     */
+    protected String formatSubdiagnostics(JCDiagnostic d, Locale l) {
+        StringBuilder buf = new StringBuilder();
+        for (JCDiagnostic d2 : d.getSubdiagnostics()) {
+            buf.append('\n');
+            String subdiagMsg = format(d2, l);
+            buf.append(indent(subdiagMsg, DiagInc));
+        }
+        return buf.toString();
+    }
+
     /** Format the faulty source code line and point to the error.
      *  @param d The diagnostic for which the error line should be printed
      */
@@ -201,4 +223,44 @@
     public boolean displaySource(JCDiagnostic d) {
         return showSource && d.getType() != FRAGMENT;
     }
+
+    /**
+     * Creates a string with a given amount of empty spaces. Useful for
+     * indenting the text of a diagnostic message.
+     *
+     * @param nSpaces the amount of spaces to be added to the result string
+     * @return the indentation string
+     */
+    protected String indentString(int nSpaces) {
+        String spaces = "                        ";
+        if (nSpaces <= spaces.length())
+            return spaces.substring(0, nSpaces);
+        else {
+            StringBuilder buf = new StringBuilder();
+            for (int i = 0 ; i < nSpaces ; i++)
+                buf.append(" ");
+            return buf.toString();
+        }
+    }
+
+    /**
+     * Indent a string by prepending a given amount of empty spaces to each line
+     * of the string
+     *
+     * @param s the string to be indented
+     * @param nSpaces the amount of spaces that should be prepended to each line
+     * of the string
+     * @return an indented string
+     */
+    protected String indent(String s, int nSpaces) {
+        String indent = indentString(nSpaces);
+        StringBuilder buf = new StringBuilder();
+        String nl = "";
+        for (String line : s.split("\n")) {
+            buf.append(nl);
+            buf.append(indent + line);
+            nl = "\n";
+        }
+        return buf.toString();
+    }
 }
diff --git a/src/share/classes/com/sun/tools/javac/util/AbstractLog.java b/src/share/classes/com/sun/tools/javac/util/AbstractLog.java
index 1de1e82..7f0440f 100644
--- a/src/share/classes/com/sun/tools/javac/util/AbstractLog.java
+++ b/src/share/classes/com/sun/tools/javac/util/AbstractLog.java
@@ -67,6 +67,12 @@
         return s;
     }
 
+    /** Return the underlying diagnostic source
+     */
+    public DiagnosticSource currentSource() {
+        return source;
+    }
+
     /** Report an error, unless another error was already reported at same
      *  source position.
      *  @param key    The key for the localized error message.
diff --git a/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java b/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
index 2e8227f..ba4f4c7 100644
--- a/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
+++ b/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java
@@ -289,7 +289,7 @@
         this.source = source;
         this.position = pos;
         this.key = key;
-        this.args = args;
+            this.args = args;
 
         int n = (pos == null ? Position.NOPOS : pos.getPreferredPosition());
         if (n == Position.NOPOS || source == null)
@@ -309,6 +309,18 @@
     }
 
     /**
+     * Get the subdiagnostic list
+     * @return subdiagnostic list
+     */
+    public List<JCDiagnostic> getSubdiagnostics() {
+        return List.nil();
+    }
+
+    public boolean isMultiline() {
+        return false;
+    }
+
+    /**
      * Check whether or not this diagnostic is required to be shown.
      * @return true if this diagnostic is required to be shown.
      */
@@ -440,7 +452,32 @@
     }
 
     public String getMessage(Locale locale) {
-        // RFE 6406133: JCDiagnostic.getMessage ignores locale argument
         return defaultFormatter.formatMessage(this, locale);
     }
+
+    public static class MultilineDiagnostic extends JCDiagnostic {
+
+        private final List<JCDiagnostic> subdiagnostics;
+
+        public MultilineDiagnostic(JCDiagnostic other, List<JCDiagnostic> subdiagnostics) {
+            super(other.defaultFormatter,
+                  other.getType(),
+                  other.isMandatory(),
+                  other.getDiagnosticSource(),
+                  other.position,
+                  other.getCode(),
+                  other.getArgs());
+            this.subdiagnostics = subdiagnostics;
+        }
+
+        @Override
+        public List<JCDiagnostic> getSubdiagnostics() {
+            return subdiagnostics;
+        }
+
+        @Override
+        public boolean isMultiline() {
+            return true;
+        }
+    }
 }
diff --git a/src/share/classes/com/sun/tools/javac/util/LayoutCharacters.java b/src/share/classes/com/sun/tools/javac/util/LayoutCharacters.java
index eb82069..a9ed2b6 100644
--- a/src/share/classes/com/sun/tools/javac/util/LayoutCharacters.java
+++ b/src/share/classes/com/sun/tools/javac/util/LayoutCharacters.java
@@ -39,6 +39,10 @@
      */
     final static int TabInc = 8;
 
+    /** Diagnostic standard indentation
+     */
+    final static int DiagInc = 2;
+
     /** Tabulator character.
      */
     final static byte TAB   = 0x8;
diff --git a/src/share/classes/com/sun/tools/javac/util/Log.java b/src/share/classes/com/sun/tools/javac/util/Log.java
index 222ab4d..e9d21f7 100644
--- a/src/share/classes/com/sun/tools/javac/util/Log.java
+++ b/src/share/classes/com/sun/tools/javac/util/Log.java
@@ -190,9 +190,9 @@
         getSource(name).setEndPosTable(table);
     }
 
-    /** Return current source name.
+    /** Return current sourcefile.
      */
-    public JavaFileObject currentSource() {
+    public JavaFileObject currentSourceFile() {
         return source == null ? null : source.getFile();
     }
 
@@ -395,7 +395,7 @@
             printLines(errWriter, "error: " + msg);
         } else {
             int line = source.getLineNumber(pos);
-            JavaFileObject file = currentSource();
+            JavaFileObject file = source.getFile();
             if (file != null)
                 printLines(errWriter,
                            JavacFileManager.getJavacFileName(file) + ":" +
@@ -408,7 +408,7 @@
     /** report an error:
      */
     public void rawError(int pos, String msg) {
-        if (nerrors < MaxErrors && shouldReport(currentSource(), pos)) {
+        if (nerrors < MaxErrors && shouldReport(currentSourceFile(), pos)) {
             printRawError(pos, msg);
             prompt();
             nerrors++;
diff --git a/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java b/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
index 179955d..3e9fbbf 100644
--- a/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
+++ b/src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java
@@ -118,7 +118,7 @@
      * Report a mandatory warning.
      */
     public void report(DiagnosticPosition pos, String msg, Object... args) {
-        JavaFileObject currentSource = log.currentSource();
+        JavaFileObject currentSource = log.currentSourceFile();
 
         if (verbose) {
             if (sourcesWithReportedWarnings == null)
diff --git a/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java b/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java
index 5aa6ae3..4337797 100644
--- a/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java
+++ b/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java
@@ -85,6 +85,20 @@
     }
 
     @Override
+    protected String formatSubdiagnostics(JCDiagnostic d, Locale l) {
+        StringBuilder buf = new StringBuilder();
+        String sep = "";
+        buf.append(",{");
+        for (JCDiagnostic d2 : d.getSubdiagnostics()) {
+            buf.append(sep);
+            buf.append("(" + format(d2, l) + ")");
+            sep = ",";
+        }
+        buf.append('}');
+        return buf.toString();
+    }
+
+    @Override
     protected String localize(Locale l, String s, Object... args) {
         StringBuffer buf = new StringBuffer();
         buf.append(s);