in src/GoToDef/GoToDefMouseHandler.cs [296:354]
private bool TryHighlightItemUnderMouse(Point position)
{
bool updated = false;
try
{
var line = _view.TextViewLines.GetTextViewLineContainingYCoordinate(position.Y);
if (line == null)
return false;
var bufferPosition = line.GetBufferPositionFromXCoordinate(position.X);
if (!bufferPosition.HasValue)
return false;
// Quick check - if the mouse is still inside the current underline span, we're already set.
var currentSpan = CurrentUnderlineSpan;
if (currentSpan.HasValue && currentSpan.Value.Contains(bufferPosition.Value))
{
updated = true;
return true;
}
var extent = _navigator.GetExtentOfWord(bufferPosition.Value);
if (!extent.IsSignificant)
return false;
// For C#, we ignore namespaces after using statements - GoToDef will fail for those.
if (_view.TextBuffer.ContentType.IsOfType("csharp"))
{
string lineText = bufferPosition.Value.GetContainingLine().GetText().Trim();
if (lineText.StartsWith("using", StringComparison.OrdinalIgnoreCase))
return false;
}
// Now, check for valid classification type. C# and C++ (at least) classify the things we are interested
// in as either "identifier" or "user types" (though "identifier" will yield some false positives). VB, unfortunately,
// doesn't classify identifiers.
foreach (var classification in _aggregator.GetClassificationSpans(extent.Span))
{
var name = classification.ClassificationType.Classification.ToLower();
if ((name.Contains("identifier") || name.Contains("user types")) &&
SetHighlightSpan(classification.Span))
{
updated = true;
return true;
}
}
// No update occurred, so return false.
return false;
}
finally
{
if (!updated)
SetHighlightSpan(null);
}
}