Files
fantaibao-qlexpress4/src/main/java/com/alibaba/qlexpress4/exception/ExMessageUtil.java
small-red-hat 2dfed7464e
Some checks failed
Reduce Adoc / reduce (push) Failing after 57s
Java Unit Test with Maven / test (push) Failing after 1m42s
first
2025-12-29 13:59:13 +08:00

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);
}
}