簡體   English   中英

Eclipse CDT ASTRewrite無法正常工作

[英]Eclipse CDT ASTRewrite not working

我想在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)

有人知道如何解決此異常嗎?
謝謝

AFAIK該代碼取決於在OSGi中運行,但是您似乎已經制作了一個帶有main的Java項目。 您需要一個帶有MANIFEST.MF的插件項目,該項目引用您的需求。

如果要控制程序的入口點,則可以創建Eclipse應用程序。 如果您希望將此重寫代碼作為Eclipse / CDT的一部分,那么可能需要不同的入口點,例如與菜單/工具欄/鍵組合綁定的Eclipse Command

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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