【问题标题】:Creating Markers and Problems in Eclipse Plugin在 Eclipse 插件中创建标记和问题
【发布时间】: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


    【解决方案1】:

    IProblem 专用于 Java 开发工具,而 IMarker 可用于工作区中的任何文件。

    IProblem 的 JavaDoc 说:

    注意:编译器内部产生 IProblems, JavaBuilder 将其放入标记中,以便保留问题描述。 这解释了为什么没有 API 允许检测到 IProblem 编译时。但是,Java 问题标记具有等价的 给 IProblem 的信息,特别是他们的 ID(属性“id”)是 设置为此接口上定义的 ID 之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多