【发布时间】:2015-05-01 05:29:16
【问题描述】:
我一直在进行大量研究,但很难理解 IProblem 和 IMarker 之间的关系。我已经能够创建问题并添加标记,但两者似乎没有联系。问题和标记是独立的吗?起初我在想,如果我向 ReconcileContext 添加问题,标记会自动出现,但事实并非如此。有谁知道我做错了什么?
SecureCompilationParticipant.java:
public class SecureCompilationParticipant extends CompilationParticipant {
public boolean isActive(IJavaProject project) {
return true;
}
@Override
public void reconcile(ReconcileContext context) {
// Call Parent
super.reconcile(context);
// Used in expression loop
int start, end, line;
String fileName;
// Check to see if content has changed
IJavaElementDelta elementDelta = context.getDelta();
IJavaElement element = elementDelta.getElement();
if((elementDelta.getFlags() & IJavaElementDelta.F_CONTENT) != 0) {
System.out.printf("The content of %s has changed%n",
element.getElementName());
try {
CompilationUnit compilation = context.getAST8();
NodeVisitor visitor = new NodeVisitor();
compilation.accept(visitor);
// Iterate through expressions
for (ExpressionStatement expressionStatement : visitor.getExpressionStatements()) {
start = expressionStatement.getStartPosition();
end = start + expressionStatement.getLength();
line = compilation.getLineNumber(start - 1);
fileName = element.getElementName();
System.out.printf("Expression: %s%n", expressionStatement.getExpression().toString());
CategorizedProblem[] problems = new CategorizedProblem[0];
ArrayList<CategorizedProblem> problemList = new ArrayList<CategorizedProblem>();
// Put problems
SecureCodingProblem problem = new SecureCodingProblem(fileName);
problem.setSourceStart(start);
problem.setSourceEnd(end);
problem.setSourceLineNumber(line);
problemList.add(problem);
context.putProblems(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, problemList.toArray(problems));
// Create marker
IResource resource = element.getUnderlyingResource();
IMarker marker = resource.createMarker(IMarker.PROBLEM);
marker.setAttribute(IMarker.MESSAGE, "This is a test marker");
marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
marker.setAttribute(IMarker.LINE_NUMBER, line);
marker.setAttribute(IMarker.LOCATION, String.format("Line %d", line));
}
} catch (JavaModelException e) {
// From CompilationUnit compilation = context.getAST8();
e.printStackTrace();
} catch (CoreException e) {
// From IMarker marker = resource.createMarker(IMarker.PROBLEM);
e.printStackTrace();
}
}
}
}
SecureCodingProblem.java:
public class SecureCodingProblem extends CategorizedProblem {
private int m_sourceStart;
private int m_sourceEnd;
private int m_sourceLineNumber;
private char[] m_fileName;
public SecureCodingProblem(String fileName) {
m_fileName = fileName.toCharArray();
}
@Override
public String[] getArguments() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getID() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getMessage() {
// TODO Auto-generated method stub
return "This is a problem";
}
@Override
public char[] getOriginatingFileName() {
// TODO Auto-generated method stub
return m_fileName;
}
@Override
public int getSourceEnd() {
// TODO Auto-generated method stub
return m_sourceEnd;
}
@Override
public int getSourceLineNumber() {
// TODO Auto-generated method stub
return m_sourceLineNumber;
}
@Override
public int getSourceStart() {
// TODO Auto-generated method stub
return m_sourceStart;
}
@Override
public boolean isError() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isWarning() {
// TODO Auto-generated method stub
return true;
}
@Override
public void setSourceEnd(int sourceEnd) {
m_sourceEnd = sourceEnd;
}
@Override
public void setSourceLineNumber(int lineNumber) {
m_sourceLineNumber = lineNumber;
}
@Override
public void setSourceStart(int sourceStart) {
m_sourceStart = sourceStart;
}
@Override
public int getCategoryID() {
// TODO Auto-generated method stub
return CategorizedProblem.CAT_CODE_STYLE;
}
@Override
public String getMarkerType() {
// TODO Auto-generated method stub
return IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER;
}
}
【问题讨论】:
标签: java eclipse compiler-construction compilation eclipse-plugin