1

Refactor->Inineメソッドをインライン化する必要があるときに使用できます。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

これは私が試したコード スケルトンです。この投稿のコードを使用しました -プログラムで呼び出すことができる Eclipse リファクタリング API はありますか? .

// 1. Get ICompiationUnit for type "smcho.Hello"
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject("Hello");
project.open(null /* IProgressMonitor */);

IJavaProject javaProject = JavaCore.create(project);
IType itype = javaProject.findType("smcho.Hello");
org.eclipse.jdt.core.ICompilationUnit icu = itype.getCompilationUnit();

// 2. Contribution and Description creation
RefactoringContribution contribution = RefactoringCore.getRefactoringContribution(IJavaRefactorings.INLINE_METHOD);
InlineMethodDescriptor descriptor = (InlineMethodDescriptor) contribution.createDescriptor();

descriptor.setProject(icu.getResource().getProject().getName( ));

// 3. executing the refactoring
RefactoringStatus status = new RefactoringStatus();
try {
    Refactoring refactoring = descriptor.createRefactoring(status);

    IProgressMonitor monitor = new NullProgressMonitor();
    refactoring.checkInitialConditions(monitor);
    refactoring.checkFinalConditions(monitor);
    Change change = refactoring.createChange(monitor);
    change.perform(monitor);
} catch (CoreException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 

コードを実行すると、このエラーが発生しました

org.eclipse.core.runtime.CoreException: The refactoring script argument 'input' is missing 
in the refactoring script.  

リファクタリングしたメソッド名を API に与える必要があると思います。コードのどこが間違っている可能性がありますか?

4

2 に答える 2

2

これは、インライン リファクタリング JDT API で動作するコードです。インライン化するには、開始位置と長さが必要です。

int[] selection= {start, length}; // getSelection();
InlineMethodRefactoring refactoring= InlineMethodRefactoring.create(this.icu, new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(this.icu, true), selection[0], selection[1]);
refactoring.setDeleteSource(true);
refactoring.setCurrentMode(Mode.INLINE_ALL); // or INLINE SINGLE based on the user's intervention

IProgressMonitor pm= new NullProgressMonitor();
RefactoringStatus res = refactoring.checkInitialConditions(pm);
res = refactoring.checkFinalConditions(pm);

final PerformRefactoringOperation op= new PerformRefactoringOperation(
refactoring, getCheckingStyle());
op.run(new NullProgressMonitor());

インライン化されるメソッドの名前がわかっている場合は、「JDT を使用したメソッド呼び出しの startPosition と長さの取得」のコードを使用できます。

于 2013-01-17T03:36:20.763 に答える
2

上記のコードでは、リファクタリング操作にメソッドを提供することはなく、プロジェクト コンテキストのみを提供します。しかし、そのために必要な API がわかりません。

このソース コードを見ると、JavaRefactoringDescriptorUtil.ATTRIBUTE_INPUT が使用されていることがわかります。これは、おそらく設定する必要があるものでもあります。おそらく、refactoring.ui プラグイン ソースでその属性への参照を検索できます。

于 2012-10-16T06:18:16.973 に答える