1

私は、使用が追加されていない事実クラス名にある宣言されていない要素を見つけたときに、CodeRush が使用を追加できる方法を見つけるのに時間を費やしました。私の質問に対するこの回答で提案されている解決策( Refactor_resolve ) は機能しません (バグがありますか?)。

その過程で、CodeRush 用のプラグインを作成するのは簡単であることがわかったので、この機能を自分でコーディングする (そして共有する) ことにしました。(このチュートリアルCodeProviderのように)のみを実装します。私が仕事をする必要があると思うのは、次の質問に対する答えだけです。

  1. プラグインの起動時に、すべてのクラスとそのパッケージのリスト (セット、マップなど) を取得する必要があります。これは、プロジェクト内のすべてのクラス (インターフェイス...) とそのパッケージ、およびすべての参照ライブラリ内を意味します。また、これに関する更新も受け取る必要があります (ユーザーが参照を追加すると、新しいクラスが作成されます)。いくつかの CodeRush クラスまたはクラスから利用可能な VS インターフェイスからこれを取得できますCodeProviderか?

  2. CodeProviderユーザーが問題にカーソルを合わせたときに表示されるポップアップに作成済みを追加するにはどうすればよいですか?

4

1 に答える 1

2

ところで、Rory が "Refactor_Resolver" プラグインのいくつかのバグを修正したようで、現在は機能しています。あなたの質問については、ここに簡単な回答があります:

再 #1:

CodeRush には、ソリューションの解析中に構築されるすべてのタイプ、プロジェクト参照などの組み込みキャッシュがあります。しかし、現時点では内部で使用されており、プラグイン開発者には公開されていません。申し訳ありません。ただし、開始するのに役立ついくつかの API を次に示します。

  // Using the source code cache...

  // gets the active Solution object
  SolutionElement activeSolution = CodeRush.Source.ActiveSolution;
  if (activeSolution == null)
    return;

  // iterate thought all projects in the solution
  foreach (ProjectElement project in activeSolution.AllProjects)
  {
    string assemblyName = project.AssemblyName;

    // iterate inside source code symbols cache...
    Hashtable projectSymbols = activeProject.ProjectSymbols;
    foreach (object item in projectSymbols.Values)
    {
      ITypeElement typeElement = item as ITypeElement;
      if (typeElement == null)
        continue;

      // TODO: ...
    }
  }

アセンブリ参照キャッシュを取得するには、ScopeManager (DevExpress.DXCore.MetaData.dll にあります) を使用します。

  IEnumerable<IMetaDataScope> allMetaDataScopes = ScopeManager.All;
  foreach (IMetaDataScope scope in allMetaDataScopes)
  {
    IAssemblyInfo assembly = scope.Assembly;
    if (assembly != null)
    {
      ITypeInfo[] types = assembly.GetTypes();
      for (int i = 0; i < types.Length; i++)
      {
        ITypeInfo typeInfo = types[i];
        if (typeInfo == null)
          continue;

        // TODO: ...
      }
    }
  }

RE #2: CodeProvider をポップアップに追加するには、「CodeIssueMessage」プロパティを修正するコードの問題の名前に設定します。

myCodeProvider.CodeIssueMessage = "宣言されていない要素";

さらにサポートが必要な場合はお知らせください。

于 2010-05-25T18:29:24.007 に答える