22using OmniSharp . Extensions . LanguageServer . Protocol . Server ;
33using OmniSharp . Extensions . LanguageServer . Protocol . Client . Capabilities ;
44using OmniSharp . Extensions . LanguageServer . Protocol . Document ;
5- using OmniSharp . Extensions . LanguageServer . Protocol . Window ;
6- using System . Text ;
75
86namespace RAScriptLanguageServer
97{
@@ -23,28 +21,153 @@ class HoverProvider(ILanguageServerFacade router, BufferManager bufferManager) :
2321 public override Task < Hover ? > Handle ( HoverParams request , CancellationToken cancellationToken )
2422 {
2523 var documentPath = request . TextDocument . Uri . ToString ( ) ;
26- var line = request . Position . Line ;
27- var character = request . Position . Character ;
24+ var t = request . Position ;
2825 var buffer = _bufferManager . GetBuffer ( documentPath ) ;
2926 var txt = buffer ? . GetDocumentText ( ) ;
30- if ( txt != null && txt . Length > 0 )
27+ if ( buffer != null && txt != null && txt . Length > 0 )
3128 {
32- var word = buffer ? . GetParser ( ) . GetWordAtPosition ( txt , line , character ) ;
33- if ( word != null && word . Length != 0 )
29+ var word = buffer . GetParser ( ) . GetWordAtPosition ( request . Position ) ;
30+ if ( word != null && word . Word . Length != 0 )
3431 {
35- var hoverText = buffer ? . GetParser ( ) . GetHoverText ( word ) ;
36- if ( hoverText != null && hoverText . Length > 0 )
32+ int startingOffset = buffer . GetParser ( ) . GetOffsetAt ( word . Start ) ;
33+ int endingOffset = buffer . GetParser ( ) . GetOffsetAt ( word . End ) ;
34+ string hoverClass = buffer . GetParser ( ) . DetectClass ( startingOffset ) ;
35+ int offset = startingOffset - 1 ;
36+
37+ // Special case: this keyword should show the class hover info
38+ if ( word . Word == "this" )
3739 {
38- var content = new List < MarkedString > ( ) ;
39- foreach ( var l in hoverText )
40+ List < HoverData > ? classDefinitions = buffer . GetParser ( ) . GetHoverData ( hoverClass ) ;
41+ if ( classDefinitions != null )
4042 {
41- content . Add ( new MarkedString ( l ) ) ;
43+ foreach ( HoverData hoverData in classDefinitions )
44+ {
45+ if ( hoverData . ClassName == "" )
46+ {
47+ var content = new List < MarkedString > ( ) ;
48+ foreach ( var l in hoverData . Lines )
49+ {
50+ content . Add ( new MarkedString ( l ) ) ;
51+ }
52+ Hover result = new ( )
53+ {
54+ Contents = new MarkedStringsOrMarkupContent ( content )
55+ } ;
56+ return Task . FromResult < Hover ? > ( result ) ;
57+ }
58+ }
4259 }
43- Hover result = new ( )
60+ }
61+ WordScope scope = buffer . GetParser ( ) . GetScope ( word . Start ) ;
62+ List < HoverData > ? definitions = buffer . GetParser ( ) . GetHoverData ( word . Word ) ;
63+ if ( definitions != null )
64+ {
65+ WordType wordType = buffer . GetParser ( ) . GetWordType ( word ) ;
66+ if ( ! wordType . Function && ! wordType . Class && ! wordType . CodeNote )
4467 {
45- Contents = new MarkedStringsOrMarkupContent ( content . ToArray ( ) )
46- } ;
47- return Task . FromResult < Hover ? > ( result ) ;
68+ // only provide hover data for code notes, classes and functions
69+ return Task . FromResult < Hover ? > ( null ) ;
70+ }
71+ // if we are hovering over the actual function signature itself, find it and return it
72+ foreach ( HoverData definition in definitions )
73+ {
74+ // magic number 9 here is length of word function plus a space in between the function name
75+ if ( startingOffset >= definition . Index && startingOffset <= definition . Index + 9 + definition . Key . Length )
76+ {
77+ var content = new List < MarkedString > ( ) ;
78+ foreach ( var l in definition . Lines )
79+ {
80+ content . Add ( new MarkedString ( l ) ) ;
81+ }
82+ Hover result = new ( )
83+ {
84+ Contents = new MarkedStringsOrMarkupContent ( content )
85+ } ;
86+ return Task . FromResult < Hover ? > ( result ) ;
87+ }
88+ }
89+
90+ // determine list of definitions for function calls found in code bodies
91+ List < HoverData > filteredDefinitions = new List < HoverData > ( ) ;
92+ foreach ( HoverData definition in definitions )
93+ {
94+ if ( scope . Global )
95+ {
96+ if ( definition . ClassName == "" )
97+ {
98+ // this should only be one occurence, but we can handle multiple
99+ filteredDefinitions . Add ( definition ) ;
100+ }
101+ }
102+ else
103+ {
104+ if ( definition . ClassName != "" )
105+ {
106+ // Special case: we can determine the exact definition is the definition if using this.<className>
107+ if ( scope . UsingThis && hoverClass == definition . ClassName )
108+ {
109+ var content = new List < MarkedString > ( ) ;
110+ foreach ( var l in definition . Lines )
111+ {
112+ content . Add ( new MarkedString ( l ) ) ;
113+ }
114+ Hover result = new ( )
115+ {
116+ Contents = new MarkedStringsOrMarkupContent ( content )
117+ } ;
118+ return Task . FromResult < Hover ? > ( result ) ;
119+ }
120+ // if its a function, further filter down by arg list length
121+ // otherwise just append if its a class
122+ if ( wordType . Function )
123+ {
124+ int numArgs = buffer . GetParser ( ) . CountArgsAt ( endingOffset ) ;
125+ if ( numArgs == definition . Args . Length )
126+ {
127+ filteredDefinitions . Add ( definition ) ;
128+ }
129+ }
130+ else
131+ {
132+ filteredDefinitions . Add ( definition ) ;
133+ }
134+ }
135+ }
136+ }
137+ if ( filteredDefinitions . Count == 1 )
138+ {
139+ HoverData definition = filteredDefinitions [ 0 ] ;
140+ var content = new List < MarkedString > ( ) ;
141+ foreach ( var l in definition . Lines )
142+ {
143+ content . Add ( new MarkedString ( l ) ) ;
144+ }
145+ Hover result = new ( )
146+ {
147+ Contents = new MarkedStringsOrMarkupContent ( content )
148+ } ;
149+ return Task . FromResult < Hover ? > ( result ) ;
150+ }
151+ else
152+ {
153+ // Special case: more than one functions in different classes are named the same and we cant determine the exact hover data
154+ string [ ] lines = [ ] ;
155+ foreach ( HoverData defintion in filteredDefinitions )
156+ {
157+ lines = lines . Concat ( defintion . Lines ) . ToArray ( ) ;
158+ }
159+ HoverData definition = filteredDefinitions [ 0 ] ;
160+ var content = new List < MarkedString > ( ) ;
161+ foreach ( var l in lines )
162+ {
163+ content . Add ( new MarkedString ( l ) ) ;
164+ }
165+ Hover result = new ( )
166+ {
167+ Contents = new MarkedStringsOrMarkupContent ( content )
168+ } ;
169+ return Task . FromResult < Hover ? > ( result ) ;
170+ }
48171 }
49172 }
50173 }
0 commit comments