几个小时后,我能够实现我想要的。如果有人会尝试做同样的事情,那么您可以找到以下步骤。
我正在使用“Roslyn”来获取这些信息,所以我需要下载 nuget 包,如“Microsoft.CodeAnalysis”等。
我还使用 IMouseProcessorProvider 来对鼠标事件做出反应:
[Export(typeof(IMouseProcessorProvider))]
[Order]
[ContentType("CSharp")]
[Name("MouseNavigation")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal class MouseNavigationProvider : IMouseProcessorProvider
之后使用以下代码,我能够获取类型信息
SnapshotPoint caretPosition = _textView.Caret.Position.BufferPosition;
Document document = caretPosition.Snapshot.GetOpenDocumentInCurrentContextWithChanges();
SemanticModel semanticModel = document.GetSemanticModelAsync().Result;
if (semanticModel == null)
return null;
TypeInfo typeInfo;
SyntaxNode expressionNode = document.GetSyntaxRootAsync().Result.FindToken(caretPosition).Parent;
if (expressionNode is VariableDeclaratorSyntax)
{
SyntaxNode childNode = expressionNode.ChildNodes()?.FirstOrDefault()
?.ChildNodes()?.FirstOrDefault();
typeInfo = semanticModel.GetTypeInfo(childNode);
}
else if (expressionNode is ClassDeclarationSyntax)
{
throw new NotImplementedException();
}
else
{
// NOTE: This probably should be changed for specific type of syntax, but right now it is only for testing purposes
typeInfo = semanticModel.GetTypeInfo(expressionNode);
if (typeInfo.Type == null)
{
expressionNode = expressionNode.Parent;
typeInfo = semanticModel.GetTypeInfo(expressionNode);
}
}