2013-01-23 1 views
2

내 DSL에 quickfix 옵션을 추가했습니다.이 옵션에서 일부 요소의 이름 변경을 포함하여 문서 텍스트를 약간 수정하고 싶습니다. 해당 요소의 텍스트를 잘 바꿀 수는 있지만 리팩터링 이름 변경과 같은 모든 참조의 이름을 바꾸고 싶습니다. 어떻게해야합니까?이름 바꾸기 리팩터링을 quickfix의 일부로 사용하는 방법?

퀵 픽스 내부에서 내장 리 네임 리펙토링을 어떻게 든 트리거 할 수 있습니까? 또는 요소의 모든 참조를 검토하고 변경하려면 어떻게해야합니까?

답변

1

그래서 리니렉션 리펙터를 프로그래밍 방식으로 트리거하는 방법을 발견했습니다. 나는 내 코드에 @SuppressWarnings("restriction")를 추가했다 이후는 그렇지 않은 추측 - - 그것은 "올바른"방법이 있는지 모르겠어요하지만 작동 :

private void performDirectRenameRefactoring(EObject object, String newName) throws InterruptedException { 
    XtextEditor editor = EditorUtils.getActiveXtextEditor(); 
    IRenameElementContext renameContext = new IRenameElementContext.Impl(
     EcoreUtil.getURI(object), 
     object.eClass(), 
     editor, 
     editor.getSelectionProvider().getSelection(), 
     null); 
    IRenameSupport rename = renameSupportFactory.create(renameContext, newName); 
    rename.startDirectRefactoring(); 
} 

그래서 빠른 수정에서이 전화를, EObject을 받고 새 이름을 계산하기 만하면됩니다. 당신은 (AN (당신이 문제를 처리하는 경우 당신이해야한다) 중 하나 IssueResolutionAcceptor에서 IXtextDocument 또는 IModificationContext에서 얻을 수

private EObject findObject(IXtextDocument doc, final Issue issue) { 
    EObject object = doc.readOnly(new IUnitOfWork<EObject, XtextResource>() { 
     public EObject exec(XtextResource state) throws Exception { 
      return state.getEObject(issue.getUriToProblem().fragment()); 
     } 
    }); 
} 

: 문제가 EObject 자체의 일부를 차지하는 경우, 객체 검색 할 수 있습니다 당신이 변화를 제안한다면 당신이 가지고 있어야합니다).

0

오크, 해결책 주셔서 대단히 감사합니다. Xtend에 제 버전이 있습니다.

@Inject(optional=true) 
IRenameSupport.Factory renameSupportFactory; 

@Inject(optional=true) 
IRenameContextFactory renameContextFactory; 

@Fix(VhdlValidator::INVALID_SIGNAL_NAME_ENDING) 
def addSignalEnding(Issue issue, IssueResolutionAcceptor acceptor) { 
    acceptor.accept(issue, 'Add the "_s" ending', 'Add the "_s" ending.', 'upcase.png') [ 
     EObject element, IModificationContext context | 

     val editor = EditorUtils.getActiveXtextEditor(); 

     val renameElementContext = editor.getDocument().readOnly(
      new IUnitOfWork<IRenameElementContext, XtextResource>() 
      { 
       override def IRenameElementContext exec(XtextResource state) 
       { 
        renameContextFactory.createRenameElementContext(element, 
          editor, null, state); 
       } 
      }); 

     val rename = renameSupportFactory.create(renameElementContext, (element as Signal).name + "_s"); 
     rename.startDirectRefactoring(); 

    ] 
}