【问题标题】:Eclipse CDT ASTRewrite not workingEclipse CDT ASTRewrite 不工作
【发布时间】:2016-02-11 09:23:29
【问题描述】:

我想在 C 源代码中添加一些代码,所以我尝试使用 ASTRewrite。
我的 Github 项目:cdt-rewrite
我的代码:


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.DefaultLogService;
import org.eclipse.cdt.core.parser.FileContent;
import org.eclipse.cdt.core.parser.IncludeFileContentProvider;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change;


public class Main {

    public static void main(String[] args) throws Exception {
        IASTTranslationUnit u = getTranslationUnit(new File("D:/test.c"));
        System.out.println(u.getRawSignature());

        ASTRewrite rw = ASTRewrite.create(u);
        u.accept(new ASTVisitor(true) {

            @Override
            public int visit(IASTStatement stm) {

                if (stm instanceof IASTIfStatement){
                    rw.insertBefore(stm.getParent(), stm, 
                            rw.createLiteralNode("callTo(1,2,3);"), null);
                }

                return PROCESS_CONTINUE;
            }

        });

        Change c = rw.rewriteAST();
        c.perform(new NullProgressMonitor());
        //String changedSource = someHowGetCode(c);
    }

    static IASTTranslationUnit getTranslationUnit(File source) throws Exception{
        FileContent reader = FileContent.create(
                source.getAbsolutePath(), 
                getContentFile(source).toCharArray());

        return GCCLanguage.getDefault().getASTTranslationUnit(
                reader, 
                new ScannerInfo(), 
                IncludeFileContentProvider.getSavedFilesProvider(), 
                null, 
                ILanguage.OPTION_IS_SOURCE_UNIT, 
                new DefaultLogService());
    }

    static String getContentFile(File file) throws IOException {
        StringBuilder content = new StringBuilder();
        String line;

        try (BufferedReader br = new BufferedReader(
                new InputStreamReader(new FileInputStream(file)))) {
            while ((line = br.readLine()) != null)
                content.append(line).append('\n');
        }

        return content.toString();
    }
}

但是当我运行这段代码时,出现了异常:

int test(int x){
    if (x < 0)
        return 0;
    int i, s = 0;
    for (i = 1; i < x; i++)
        s = s + i;
    return s;
}

Exception in thread "main" java.lang.NullPointerException
    at org.eclipse.cdt.internal.formatter.ChangeFormatter.formatChangedCode(ChangeFormatter.java:92)
    at org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:117)
    at org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGenerator.generateChange(ChangeGenerator.java:104)
    at org.eclipse.cdt.internal.core.dom.rewrite.ASTRewriteAnalyzer.rewriteAST(ASTRewriteAnalyzer.java:26)
    at org.eclipse.cdt.core.dom.rewrite.ASTRewrite.rewriteAST(ASTRewrite.java:212)
    at Main.main(Main.java:44)

有谁知道如何解决这个异常?
谢谢你

【问题讨论】:

    标签: java eclipse eclipse-cdt


    【解决方案1】:

    AFAIK 此代码依赖于在 OSGi 中运行,但您似乎已经使用 main 创建了一个 Java 项目。您需要一个带有 MANIFEST.MF 的插件项目,该项目引用您需要的内容。

    如果你想控制程序的入口点,你可以创建一个Eclipse Application。如果您想将此重写代码升级为 Eclipse/CDT 的一部分,那么您可能需要不同的入口点,例如绑定到菜单/工具栏/键组合的 Eclipse Command

    【讨论】:

    • 我正在开发一个插件,并尝试使用 eclipse c ast 解析器重写 c 代码。我得到了与问题中提到的相同的 NPE。你有什么进一步的建议吗? @乔纳格雷厄姆
    • 没什么可添加的——如果你想像 OP 一样在外面使用它,那么我的答案仍然是 AFAIK。如果您在 OSGi 中使用,那么您有一个新问题 - 您似乎在这里提出并回答了这个问题:stackoverflow.com/a/67398617/2796832。很高兴您解决了您的问题。
    猜你喜欢
    • 2021-07-26
    • 2011-07-12
    • 2015-09-27
    • 2013-05-23
    • 1970-01-01
    • 2013-05-27
    • 2012-07-07
    • 1970-01-01
    • 2010-12-04
    相关资源
    最近更新 更多