Savoir si le curseur est à l’intérieur d’un bloc de méthode, de classe ou d’espace de nom

J’aimerais créer un complément Visual Studio permettant d’identifier si le curseur est actuellement dans un bloc de méthode, de classe ou d’espace de nom. En d’autres termes, si le curseur se déplace, le complément devrait pouvoir noter le statut dans lequel il se trouve et-so élément.

Si cela peut être étendu à n’importe quel bloc C # entouré d’accolades, par exemple des propriétés, ce serait excellent.

Bien que j’ai vérifié des questions similaires, s’il vous plaît laissez-moi savoir s’il s’agit d’une question répétée afin que je puisse la marquer en conséquence. Si d’autres questions relatives à VS Addin sont évidemment utiles ici, merci de me le faire savoir également.

En gros, j’aimerais savoir quelles techniques nous pouvons utiliser et comment cela peut être accompli.

EDIT: Je suppose que la réponse courte pour commencer est la suivante:

  • Obtenez Visual Studio 2010 SDK SP1
  • Utilisez probablement le modèle de projet “Extensibilité” “Ornement du texte de l’éditeur” ou un autre modèle similaire.

En fait, je pense que la première chose à faire est de juger du nombre de méthodes ou de propriétés dans votre classe et de leur position. Après avoir obtenu ces informations. L’étape suivante consiste à déterminer quelle est la position actuelle du curseur. Ensuite, vous pouvez comparer les informations sur les méthodes que vous avez obtenues. Jusqu’à présent, vous pouvez connaître la méthode utilisée par votre curseur. C’est une solution approximative que je trouve.

Parlons de quelques détails techniques:

1.Comment connaître la position des méthodes et des propriétés?

vous pouvez utiliser NRefacotry ou CSParser pour ce faire (j’utilise NRefactory pour terminer mon besoin)

2.Comment obtenir la position du curseur?

il existe une méthode appelée “GetCaretPos” dans IVsTextView. Vous pouvez obtenir ActiveTextView via TextManager. Ensuite, vous pouvez utiliser la méthode “GetCaretPos”. Voici quelques codes qui pourraient vous aider.

public static IVsTextManager TextManager { get { if (textManager == null) { Object obj = Package.GetGlobalService(typeof(SVsTextManager)); if (obj == null) { throw new ArgumentException("get textmanager failed in VSTextView"); } textManager = obj as IVsTextManager; } return textManager; } } public static IVsTextView ActiveTextView { get { IVsTextView activeView = null; if (TextManager != null) { TextManager.GetActiveView(1, activeTextBuffer, out activeView); } return activeView; } }