Skip to content

Commit 077ae4e

Browse files
committed
Implement usage completion (#701)
1 parent b909af4 commit 077ae4e

File tree

2 files changed

+58
-24
lines changed

2 files changed

+58
-24
lines changed

External/Plugins/HaXeContext/Completion/HaxeComplete.cs

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ internal class HaxeComplete
3737
public HaxeCompleteStatus Status;
3838
public string Errors;
3939
private HaxeCompleteResult result;
40-
private HaxePositionCompleteResult positionResult;
40+
private List<HaxePositionResult> positionResults;
4141

4242
readonly IHaxeCompletionHandler handler;
4343
readonly string FileName;
@@ -58,23 +58,27 @@ public HaxeComplete(ScintillaControl sci, ASExpr expr, bool autoHide, IHaxeCompl
5858

5959
public void GetList(HaxeCompleteResultHandler<HaxeCompleteResult> callback)
6060
{
61-
PluginBase.MainForm.CallCommand("Save", null);
61+
StartThread(callback, () => result);
62+
}
6263

63-
ThreadPool.QueueUserWorkItem(_ =>
64-
{
65-
Status = ParseLines(handler.GetCompletion(BuildHxmlArgs()));
66-
Notify(callback, result);
67-
});
64+
public void GetPosition(HaxeCompleteResultHandler<HaxePositionResult> callback)
65+
{
66+
StartThread(callback, () => positionResults.Count > 0 ? positionResults[0] : null);
67+
}
68+
69+
public void GetUsages(HaxeCompleteResultHandler<List<HaxePositionResult>> callback)
70+
{
71+
StartThread(callback, () => positionResults);
6872
}
6973

70-
public void GetPosition(HaxeCompleteResultHandler<HaxePositionCompleteResult> callback)
74+
private void StartThread<T>(HaxeCompleteResultHandler<T> callback, Func<T> resultFunc)
7175
{
7276
PluginBase.MainForm.CallCommand("Save", null);
7377

7478
ThreadPool.QueueUserWorkItem(_ =>
7579
{
7680
Status = ParseLines(handler.GetCompletion(BuildHxmlArgs()));
77-
Notify(callback, positionResult);
81+
Notify(callback, resultFunc());
7882
});
7983
}
8084

@@ -121,8 +125,7 @@ string[] BuildHxmlArgs()
121125
else
122126
hxmlArgs.Add(GetMainClassName());
123127

124-
String mode = (CompilerService == HaxeCompilerService.COMPLETION) ? "" : "@position";
125-
hxmlArgs.Insert(0, String.Format("--display \"{0}\"@{1}{2}", FileName, pos, mode));
128+
hxmlArgs.Insert(0, String.Format("--display \"{0}\"@{1}{2}", FileName, pos, GetMode()));
126129
hxmlArgs.Insert(1, "-D use_rtti_doc");
127130
hxmlArgs.Insert(2, "-D display-details");
128131

@@ -131,6 +134,20 @@ string[] BuildHxmlArgs()
131134
return hxmlArgs.ToArray();
132135
}
133136

137+
string GetMode()
138+
{
139+
switch (CompilerService)
140+
{
141+
case HaxeCompilerService.POSITION:
142+
return "@position";
143+
144+
case HaxeCompilerService.USAGE:
145+
return "@usage";
146+
}
147+
148+
return "";
149+
}
150+
134151
void QuotePath(List<string> hxmlArgs)
135152
{
136153
for (int i = 0; i < hxmlArgs.Count; i++)
@@ -235,6 +252,7 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
235252
{
236253
result = new HaxeCompleteResult();
237254
result.Members = new MemberList();
255+
positionResults = new List<HaxePositionResult>();
238256
MemberModel member = null;
239257

240258
while (reader.Read())
@@ -244,7 +262,19 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
244262
switch (reader.Name)
245263
{
246264
case "list":
247-
return HaxeCompleteStatus.MEMBERS;
265+
switch (CompilerService)
266+
{
267+
case HaxeCompilerService.COMPLETION:
268+
return HaxeCompleteStatus.MEMBERS;
269+
270+
case HaxeCompilerService.POSITION:
271+
return HaxeCompleteStatus.POSITION;
272+
273+
case HaxeCompilerService.USAGE:
274+
return HaxeCompleteStatus.USAGE;
275+
}
276+
break;
277+
248278
case "i":
249279
member = null;
250280
break;
@@ -273,16 +303,16 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
273303
break;
274304

275305
case "pos":
276-
positionResult = ExtractPos(reader);
277-
return HaxeCompleteStatus.POSITION;
306+
positionResults.Add(ExtractPos(reader));
307+
break;
278308
}
279309
}
280310
return HaxeCompleteStatus.MEMBERS;
281311
}
282312

283-
HaxePositionCompleteResult ExtractPos(XmlTextReader reader)
313+
HaxePositionResult ExtractPos(XmlTextReader reader)
284314
{
285-
var result = new HaxePositionCompleteResult();
315+
var result = new HaxePositionResult();
286316

287317
string value = ReadValue(reader);
288318
Match match = rePosition.Match(value);
@@ -388,13 +418,15 @@ enum HaxeCompleteStatus: int
388418
ERROR = 2,
389419
TYPE = 3,
390420
MEMBERS = 4,
391-
POSITION = 5
421+
POSITION = 5,
422+
USAGE = 6
392423
}
393424

394425
enum HaxeCompilerService
395426
{
396427
COMPLETION,
397-
POSITION
428+
POSITION,
429+
USAGE
398430
}
399431

400432
class HaxeCompleteResult
@@ -403,7 +435,7 @@ class HaxeCompleteResult
403435
public MemberList Members;
404436
}
405437

406-
class HaxePositionCompleteResult
438+
class HaxePositionResult
407439
{
408440
public string Path;
409441
public HaxePositionCompleteRangeType RangeType;

External/Plugins/HaXeContext/Context.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,23 +1410,23 @@ public override bool HandleGotoDeclaration(ScintillaControl sci, ASExpr expressi
14101410
return false;
14111411

14121412
var hc = new HaxeComplete(sci, expression, false, completionModeHandler, HaxeCompilerService.POSITION);
1413-
hc.GetPosition(OnPositionCompletionResult);
1413+
hc.GetPosition(OnPositionResult);
14141414
return true;
14151415
}
14161416

1417-
internal void OnPositionCompletionResult(HaxeComplete hc, HaxePositionCompleteResult result, HaxeCompleteStatus status)
1417+
internal void OnPositionResult(HaxeComplete hc, HaxePositionResult result, HaxeCompleteStatus status)
14181418
{
14191419
if (hc.Sci.InvokeRequired)
14201420
{
14211421
hc.Sci.BeginInvoke((MethodInvoker)delegate
14221422
{
1423-
HandlePositionCompletionResult(hc, result, status);
1423+
HandlePositionResult(hc, result, status);
14241424
});
14251425
}
1426-
else HandlePositionCompletionResult(hc, result, status);
1426+
else HandlePositionResult(hc, result, status);
14271427
}
14281428

1429-
private void HandlePositionCompletionResult(HaxeComplete hc, HaxePositionCompleteResult result, HaxeCompleteStatus status)
1429+
private void HandlePositionResult(HaxeComplete hc, HaxePositionResult result, HaxeCompleteStatus status)
14301430
{
14311431
switch (status)
14321432
{
@@ -1435,6 +1435,8 @@ private void HandlePositionCompletionResult(HaxeComplete hc, HaxePositionComplet
14351435
break;
14361436

14371437
case HaxeCompleteStatus.POSITION:
1438+
if (result == null) return;
1439+
14381440
ASComplete.SaveLastLookupPosition(hc.Sci);
14391441

14401442
PluginBase.MainForm.OpenEditableDocument(result.Path, false);

0 commit comments

Comments
 (0)