first
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user