private static ITreeNode FindMarkedNode( [NotNull] ISolution solution, [NotNull] ITextControl textControl, TextRange markerRange, TextRange nameRange, [NotNull] Type nodeType) { var node = TextControlToPsi.GetSourceTokenAtOffset( solution, textControl, markerRange.StartOffset); while (node != null) { if (nodeType.IsInstanceOfType(node)) { var range = node.GetDocumentRange().TextRange; if (range == markerRange || range == markerRange.SetEndTo(nameRange.EndOffset) || range == markerRange.SetEndTo(nameRange.StartOffset)) { return node; } // "x as T. \r\nvar t = ..." case if (node is IIsExpression || node is IAsExpression) { var typeUsage = node.LastChild as IUserTypeUsage; if (typeUsage != null) { var delimiter = typeUsage.ScalarTypeName.Delimiter; if (delimiter != null) { var endOffset = delimiter.GetDocumentRange().TextRange.EndOffset; if (range.SetEndTo(endOffset) == markerRange) return node; } } } var referenceName = node as IReferenceName; if (referenceName != null) { var delimiter = referenceName.Delimiter; if (delimiter != null) { var endOffset = delimiter.GetDocumentRange().TextRange.EndOffset; if (range.SetEndTo(endOffset) == markerRange) return node; } } } node = node.Parent; } return null; }