68 lines
2.2 KiB
Java
68 lines
2.2 KiB
Java
package com.alibaba.qlexpress4.exception;
|
|
|
|
import java.text.MessageFormat;
|
|
|
|
/**
|
|
* Author: DQinYuan
|
|
*/
|
|
public class ExMessageUtil {
|
|
|
|
private static final String REPORT_TEMPLATE = "[Error {0}: {1}]\n[Near: {2}]\n{3}\n[Line: {4}, Column: {5}]";
|
|
|
|
private static final int SNIPPET_EXTENSION_LEN = 20;
|
|
|
|
public static class ExMessage {
|
|
private final String message;
|
|
|
|
private final String snippet;
|
|
|
|
public ExMessage(String message, String snippet) {
|
|
this.message = message;
|
|
this.snippet = snippet;
|
|
}
|
|
|
|
public String getMessage() {
|
|
return message;
|
|
}
|
|
|
|
public String getSnippet() {
|
|
return snippet;
|
|
}
|
|
}
|
|
|
|
public static ExMessage format(String script, int tokenStartPos, int tokenLine, int tokenCol, String lexeme,
|
|
String errorCode, String reason) {
|
|
int startReportPos = Math.max(tokenStartPos - SNIPPET_EXTENSION_LEN, 0);
|
|
int endReportPos = Math.min(tokenStartPos + lexeme.length() + SNIPPET_EXTENSION_LEN, script.length());
|
|
|
|
StringBuilder snippetBuilder = new StringBuilder();
|
|
if (startReportPos > 0) {
|
|
snippetBuilder.append("...");
|
|
}
|
|
for (int i = startReportPos; i < endReportPos; i++) {
|
|
char codeChar = script.charAt(i);
|
|
snippetBuilder.append(codeChar < ' ' ? ' ' : codeChar);
|
|
}
|
|
if (endReportPos < script.length()) {
|
|
snippetBuilder.append("...");
|
|
}
|
|
|
|
StringBuilder carteBuilder = new StringBuilder().append(" ");
|
|
if (startReportPos > 0) {
|
|
carteBuilder.append(" ");
|
|
}
|
|
for (int i = startReportPos; i < tokenStartPos; i++) {
|
|
carteBuilder.append(' ');
|
|
}
|
|
for (int i = 0; i < lexeme.length(); i++) {
|
|
carteBuilder.append('^');
|
|
}
|
|
|
|
String snippet = snippetBuilder.toString();
|
|
String message = MessageFormat
|
|
.format(REPORT_TEMPLATE, errorCode, reason, snippet, carteBuilder.toString(), tokenLine, tokenCol);
|
|
return new ExMessage(message, snippet);
|
|
}
|
|
|
|
}
|