7

J'écris ma propre extension Visual Studio 2010 qui devrait m'aider à naviguer dans une solution assez volumineuse.
J'ai déjà une extension VS basée sur une boîte de dialogue qui me montre un nom de classe et un nom de fonction en fonction de certains critères de recherche. Je peux maintenant cliquer sur cette classe/méthode et je peux alors déjà ouvrir le bon fichier et passer à la fonction.
Ce que je veux maintenant faire est de placer le curseur au début de cette fonction.
Mon code pour accéder à la fonction est:Définition de la position du curseur avec Visual Studio Extension

Solution currentSolution = ((EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0")).Solution; 
ProjectItem requestedItem = GetRequestedProjectItemToOpen(currentSolution.Projects, "fileToBeOpened"); 
if (requestedItem != null) 
{ 
    // open the document 
    Window window = requestedItem.Open(Constants.vsViewKindCode); 
    window.Activate(); 

    // search for the function to be opened 
    foreach (CodeElement codeElement in requestedItem.FileCodeModel.CodeElements) 
    { 
     // get the namespace elements 
     if (codeElement.Kind == vsCMElement.vsCMElementNamespace) 
     { 
      foreach (CodeElement namespaceElement in codeElement.Children) 
      { 
       // get the class elements 
       if (namespaceElement.Kind == vsCMElement.vsCMElementClass) 
       { 
        foreach (CodeElement classElement in namespaceElement.Children) 
        { 
         try 
         { 
          // get the function elements 
          if (classElement.Kind == vsCMElement.vsCMElementFunction) 
          { 
           if (classElement.Name.Equals("functionToBeOpened", StringComparison.Ordinal)) 
           { 
            classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); 
            this.Close(); 
           } 
          } 
         } 
         catch 
         { 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Les points importants sont window.Activate(); pour ouvrir le fichier correct et classElement.StartPoint.TryToShow(vsPaneShowHow.vsPaneShowTop, null); pour accéder à la fonction correcte.
Malheureusement, le curseur n'est pas positionné au début de la fonction demandée. Comment puis-je faire ceci? Je pense à quelque chose comme classElement.StartPoint.SetCursor().
Vive Simon

+0

complexe Cyclomatically? En outre, on dirait que vous ne renoncez pas à la méthode lorsque vous trouvez ce que vous cherchez, ce qui pourrait avoir des effets secondaires (WAG). – Will

+0

@Will: Oui, je sais. Ceci est juste une sorte de code prototype. Juste pour montrer comment j'ouvre la classe et la fonction demandées ... –

Répondre

12

Je l'ai finalement obtenu ...
Il vous suffit d'utiliser l'interface TextSelection où vous avez la méthode MoveToPoint.
Ainsi, le code d'en haut est maintenant:

// open the file in a VS code window and activate the pane 
Window window = requestedItem.Open(Constants.vsViewKindCode); 
window.Activate(); 

// get the function element and show it 
CodeElement function = CodeElementSearcher.GetFunction(requestedItem, myFunctionName); 

// get the text of the document 
TextSelection textSelection = window.Document.Selection as TextSelection; 

// now set the cursor to the beginning of the function 
textSelection.MoveToPoint(function.StartPoint); 
Questions connexes