private async Task <Hover> GetSelfHoverAsync(Expression expr, IModuleAnalysis analysis, PythonAst tree, Position position, CancellationToken cancellationToken)
        {
            if (!(expr is NameExpression name) || name.Name != "self")
            {
                return(null);
            }
            var classDef = analysis.GetVariables(expr, position).FirstOrDefault(v => v.Type == VariableType.Definition);

            if (classDef == null)
            {
                return(null);
            }

            var instanceInfo = classDef.Variable.Types.OfType <IInstanceInfo>().FirstOrDefault();

            if (instanceInfo == null)
            {
                return(null);
            }

            var cd          = instanceInfo.ClassInfo.ClassDefinition;
            var classParams = new TextDocumentPositionParams {
                position     = cd.NameExpression.GetStart(tree),
                textDocument = new TextDocumentIdentifier {
                    uri = classDef.Location.DocumentUri
                }
            };

            return(await Hover(classParams, cancellationToken));
        }