![](/img/trans.png)
[英]Eclipse Plugin Dev - Creating and updating custom markers as files are edited
[英]Creating Markers and Problems in Eclipse Plugin
我一直在進行大量研究,但是很難理解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;
}
}
IProblem
特定於Java開發工具,而IMarker
可以用於工作區中的任何文件。
用於IProblem
的JavaDoc說:
注意:編譯器在內部生成IProblem,JavaBuilder將其轉換為標記,以保留問題描述。 這解釋了為什么沒有API允許在編譯時檢測到IProblem。 但是,Java問題標記攜帶與IProblem等效的信息,尤其是將其ID(屬性“ id”)設置為在此接口上定義的ID之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.