16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.jshell;
27
28 import com.sun.source.tree.CompilationUnitTree;
29 import com.sun.source.tree.Tree;
30 import com.sun.source.util.Trees;
31 import com.sun.tools.javac.api.JavacTaskImpl;
32 import com.sun.tools.javac.api.JavacTool;
33 import com.sun.tools.javac.util.Context;
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.Iterator;
37 import java.util.List;
38 import javax.tools.Diagnostic;
39 import javax.tools.DiagnosticCollector;
40 import javax.tools.JavaCompiler;
41 import javax.tools.JavaFileManager;
42 import javax.tools.JavaFileObject;
43 import javax.tools.ToolProvider;
44 import static jdk.jshell.Util.*;
45 import com.sun.source.tree.ImportTree;
46 import com.sun.tools.javac.code.Types;
47 import com.sun.tools.javac.util.JavacMessages;
48 import jdk.jshell.MemoryFileManager.OutputMemoryJavaFileObject;
49 import java.util.Collections;
50 import java.util.Locale;
51 import static javax.tools.StandardLocation.CLASS_OUTPUT;
52 import static jdk.internal.jshell.debug.InternalDebugControl.DBG_GEN;
53 import java.io.File;
54 import java.util.Collection;
55 import java.util.HashMap;
56 import java.util.LinkedHashMap;
378 if (messages == null) {
379 messages = JavacMessages.instance(context);
380 }
381 return messages;
382 }
383
384 Trees trees() {
385 if (trees == null) {
386 trees = Trees.instance(task);
387 }
388 return trees;
389 }
390
391 // ------------------ diags functionality
392
393 DiagList getDiagnostics() {
394 if (diags == null) {
395 LinkedHashMap<String, Diag> diagMap = new LinkedHashMap<>();
396 for (Diagnostic<? extends JavaFileObject> in : diagnostics.getDiagnostics()) {
397 Diag d = diag(in);
398 String uniqueKey = d.getCode() + ":" + d.getPosition() + ":" + d.getMessage(null);
399 diagMap.put(uniqueKey, d);
400 }
401 diags = new DiagList(diagMap.values());
402 }
403 return diags;
404 }
405
406 boolean hasErrors() {
407 return getDiagnostics().hasErrors();
408 }
409
410 String shortErrorMessage() {
411 StringBuilder sb = new StringBuilder();
412 for (Diag diag : getDiagnostics()) {
413 for (String line : diag.getMessage(null).split("\\r?\\n")) {
414 if (!line.trim().startsWith("location:")) {
415 sb.append(line);
416 }
417 }
418 }
419 return sb.toString();
420 }
421
422 void debugPrintDiagnostics(String src) {
423 for (Diag diag : getDiagnostics()) {
424 state.debug(DBG_GEN, "ERROR --\n");
425 for (String line : diag.getMessage(null).split("\\r?\\n")) {
426 if (!line.trim().startsWith("location:")) {
427 state.debug(DBG_GEN, "%s\n", line);
428 }
429 }
430 int start = (int) diag.getStartPosition();
431 int end = (int) diag.getEndPosition();
432 if (src != null) {
433 String[] srcLines = src.split("\\r?\\n");
434 for (String line : srcLines) {
435 state.debug(DBG_GEN, "%s\n", line);
436 }
437
438 StringBuilder sb = new StringBuilder();
439 for (int i = 0; i < start; ++i) {
440 sb.append(' ');
441 }
442 sb.append('^');
443 if (end > start) {
444 for (int i = start + 1; i < end; ++i) {
445 sb.append('-');
|
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.jshell;
27
28 import com.sun.source.tree.CompilationUnitTree;
29 import com.sun.source.tree.Tree;
30 import com.sun.source.util.Trees;
31 import com.sun.tools.javac.api.JavacTaskImpl;
32 import com.sun.tools.javac.api.JavacTool;
33 import com.sun.tools.javac.util.Context;
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.List;
37 import javax.tools.Diagnostic;
38 import javax.tools.DiagnosticCollector;
39 import javax.tools.JavaCompiler;
40 import javax.tools.JavaFileManager;
41 import javax.tools.JavaFileObject;
42 import javax.tools.ToolProvider;
43 import static jdk.jshell.Util.*;
44 import com.sun.source.tree.ImportTree;
45 import com.sun.tools.javac.code.Types;
46 import com.sun.tools.javac.util.JavacMessages;
47 import jdk.jshell.MemoryFileManager.OutputMemoryJavaFileObject;
48 import java.util.Collections;
49 import java.util.Locale;
50 import static javax.tools.StandardLocation.CLASS_OUTPUT;
51 import static jdk.internal.jshell.debug.InternalDebugControl.DBG_GEN;
52 import java.io.File;
53 import java.util.Collection;
54 import java.util.HashMap;
55 import java.util.LinkedHashMap;
377 if (messages == null) {
378 messages = JavacMessages.instance(context);
379 }
380 return messages;
381 }
382
383 Trees trees() {
384 if (trees == null) {
385 trees = Trees.instance(task);
386 }
387 return trees;
388 }
389
390 // ------------------ diags functionality
391
392 DiagList getDiagnostics() {
393 if (diags == null) {
394 LinkedHashMap<String, Diag> diagMap = new LinkedHashMap<>();
395 for (Diagnostic<? extends JavaFileObject> in : diagnostics.getDiagnostics()) {
396 Diag d = diag(in);
397 String uniqueKey = d.getCode() + ":" + d.getPosition() + ":" + d.getMessage(PARSED_LOCALE);
398 diagMap.put(uniqueKey, d);
399 }
400 diags = new DiagList(diagMap.values());
401 }
402 return diags;
403 }
404
405 boolean hasErrors() {
406 return getDiagnostics().hasErrors();
407 }
408
409 String shortErrorMessage() {
410 StringBuilder sb = new StringBuilder();
411 for (Diag diag : getDiagnostics()) {
412 for (String line : diag.getMessage(PARSED_LOCALE).split("\\r?\\n")) {
413 if (!line.trim().startsWith("location:")) {
414 sb.append(line);
415 }
416 }
417 }
418 return sb.toString();
419 }
420
421 void debugPrintDiagnostics(String src) {
422 for (Diag diag : getDiagnostics()) {
423 state.debug(DBG_GEN, "ERROR --\n");
424 for (String line : diag.getMessage(PARSED_LOCALE).split("\\r?\\n")) {
425 if (!line.trim().startsWith("location:")) {
426 state.debug(DBG_GEN, "%s\n", line);
427 }
428 }
429 int start = (int) diag.getStartPosition();
430 int end = (int) diag.getEndPosition();
431 if (src != null) {
432 String[] srcLines = src.split("\\r?\\n");
433 for (String line : srcLines) {
434 state.debug(DBG_GEN, "%s\n", line);
435 }
436
437 StringBuilder sb = new StringBuilder();
438 for (int i = 0; i < start; ++i) {
439 sb.append(' ');
440 }
441 sb.append('^');
442 if (end > start) {
443 for (int i = start + 1; i < end; ++i) {
444 sb.append('-');
|