2013-09-23 5 views
-1

IActionManager [1]에 알려진 모든 UpdatableAction에 IActionHandler를 설치하여 ReSharper 동작의 실행을 관찰 할 수 있습니다. 불행하게도 전구 동작 (Context Actions 및 Quickfixes [2])은 ReSharper의 동작이 아니므로 동작 관리자에게 알려지지 않았습니다. 게다가, 전구 행동을위한 ActionManger와 비슷한 어떤 것 같지 않습니다.ReSharper 벌브 동작의 사용법을 관찰하십시오.

  • 모든 전구 동작에 대한 핸들을 얻는 방법이 있습니까?
  • Bulb-Action 실행에 대한 정보를 얻기 위해 ActionHandler와 같은 것을 사용할 수 있습니까? 경우

그것은 중요한 : 나는 Visual Studio에서 ReSharper에서 8 사전 2010

감사 해요!

[1] http://confluence.jetbrains.com/display/NETCOM/2.03+Actions+and+Menu+Items+%28R8%29

[2] http://confluence.jetbrains.com/display/NETCOM/2.06+Quick-Fixes+and+Context+Actions+%28R8%29

나는 마침내 내 문제에 대한 해결책을 발견
+0

그래서 설문 조사입니까? – TheGeekZn

+0

내 그룹은 코드 완성, 정적 코드 분석 등과 같은 IDE 도구 개선에 노력하고 있습니다. 현재 우리는 도구를 사용하는 방법과 장소를 개선하기 위해 도구 사용 방법을 분석하려고합니다. –

+0

이것은 개발 문제를 토대로 한 질문 및 답변 사이트입니다 (실습 정보가 아닙니다). 나는이 질문이 그와 관련이 있다고 생각하지 않는다. – TheGeekZn

답변

0

! 그것은 조금 주조와 반성을 포함하지만, 실제로 지금까지 한 모든 테스트에서 안정적으로 작동합니다.

R #에는 인터페이스가 IBulbItemsProvider이며, bulb 항목, 즉 R #- 문구 중 하나가 열릴 때마다 전구 동작을 감싸는 메뉴 항목에 대해 구현이 동적으로로드되고 쿼리됩니다. 이제 다음 공급자를 구현했습니다.

[SolutionComponent] 
public class BulbItemInstrumentationComponent : IBulbActionprovider 
{ 
    public int Priority { get{ return int.MaxValue; } } 

    public object PreExecute(ITextControl tc) { return null; } 

    public void CollectActions(IntentionsBulbItems ibis, ...) 
    { 
    var bulbItems = ibis.AllBulbMenuItems; 
    foreach (var execItem in bulbItems.Select(item => item.ExecutableItem)) 
    { 
     var proxy = execItem as IntentionAction.MyExecutableProxi; 
     if (proxy != null) 
     { 
     proxy.WrapBulbAction(); 
     continue; 
     } 

     var exec = execItem as ExecutableItem; 
     if (exec != null) 
     { 
     exec.WrapBulbAction(); 
     continue; 
     } 

     throw new Exception("unexpected item type: " + execItem.GetType().FullName); 
    } 
    } 
} 

반환 값은 내 공급자가 모든 기존 공급자 중 마지막에 호출되도록합니다. 이렇게하면 다른 공급자에서 수집 한 BulbMenuItems가 이미 포함 된 CollectAction()의 IntensionsBulbItems 매개 변수가 생성됩니다.

그런 다음이 모든 항목을 반복하고 내 관찰 래퍼를 설치하십시오. 따라서 항목 실행 파일을 실제 유형으로 다운 캐스팅해야합니다. R # Core의 전구 항목의 경우 위에서 언급 한 두 가지 유형 만 사용중인 것으로 보입니다. R # Extension의 공급자는 실제로 다른 유형을 사용할 수 있습니다.이 경우 루프의 끝에서 예외가 나중에 좀 더 관대 한 처리로 대체됩니다.)

WrapBulbAction() 확장에서 구현됩니다. 행동 양식. LoggingBulbActionProxy가 IBulbAction 자체 위임 IBulbAction에 대한 모든 호출을 구현

static class BulbItemInstrumentationExtensions 
{ 
    private static readonly MethodInfo MyExecutableProxiBulbActionSetter = 
    typeof (IntentionAction.MyExecutableProxi).GetProperty("BulbAction").GetSetMethod(true); 
    private static readonly FieldInfo ExecutableItemActionField = 
    typeof (ExecutableItem).GetField("myAction", BindingFlags.NonPublic | BindingFlags.Instance); 

    public static void WrapBulbAction(this IntentionAction.MyExecutableProxi proxi) 
    { 
    var originalBulbAction = proxy.BulbAction; 
    var bulbActionProxy = new LoggingBulbActionProxy(originalBulbAction); 
    MyExecutableProxiBulbActionSetter.Invoke(proxy, new object[] {bulbActionProxy}); 
    } 

    public static void WrapBulbAction(this ExecutableItem exec) 
    { 
    var originalAction = (Action) ExecutableItemActionField.GetValue(exec); 
    var actionProxy = new LoggingActionProxy(originalAction); 
    var newAction = (Action) (wrapper.Execute); 
    ExecutableItemActionField.SetValue(exec, newAction); 
    } 
} 

함으로써) (모든 실행 호출 로깅, 생성자에 전달 된 다음과 같은 이러한 보인다. LoggingActionProxy는 Execute() 메서드를 선언하는 클래스로, 로깅의 경우에는 생성자에 전달 된 Action에 위임합니다.

이제 R # BulbActions의 모든 사용법을 기록 할 수있게되었습니다. 내 길을 찾는 데 어려움이 있었지만 마침내 그 도전을 이겨냈습니다. 희망이 누군가 어딘가에 도움이되기를 바랍니다.