簡體   English   中英

在Eclipse插件中創建標記和問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM