/**
* Copyright (c) 2016, The Envisage Project. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.frontend.analyser;
import java.io.File;
import abs.common.CompilerCondition;
import abs.frontend.ast.ASTNode;
public abstract class SemanticCondition extends CompilerCondition {
public ErrorMessage msg;
public String[] args;
public ASTNode<?> node;
@Override
public String getFileName() {
if (file == null) {
String name = node.getFileName();
if (name == null)
return "<unkown>";
file = new File(name);
}
return super.getFileName();
}
@Override
public int getLine() {
return node.getStartLine();
}
@Override
public int getColumn() {
return node.getStartColumn();
}
public ASTNode<?> getNode() {
return node;
}
@Override
public String getMessage() {
return getMsg();
}
public String getMsg() {
return msg.withArgs(args);
}
public String getMsgWithHint(String absCode) {
return getHelpMessage() + "\n" + getHint(absCode);
}
public String getHint(String absCode) {
int prevIndex = 0;
int endIndex = -1;
endIndex = absCode.indexOf('\n', prevIndex);
for (int l = 1; l < getLine() && endIndex != -1; l++) {
prevIndex = endIndex;
endIndex = absCode.indexOf('\n', prevIndex);
}
String line = "";
if (endIndex == -1)
line = absCode.substring(prevIndex);
else
line = absCode.substring(prevIndex, endIndex);
StringBuffer lineHint = new StringBuffer();
for (int c = 0; c < getColumn() - 1; c++) {
lineHint.append('-');
}
lineHint.append('^');
return line + "\n" + lineHint;
}
}