Skip to content

Commit 3083381

Browse files
committed
Merge pull request #977 from Gama11/UsageCompletion
Implement usage completion, closes #701
2 parents f1bcfe7 + f167818 commit 3083381

File tree

2 files changed

+60
-25
lines changed

2 files changed

+60
-25
lines changed

External/Plugins/HaXeContext/Completion/HaxeComplete.cs

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal class HaxeComplete
4141
public HaxeCompleteStatus Status;
4242
public string Errors;
4343
private HaxeCompleteResult result;
44-
private HaxePositionCompleteResult positionResult;
44+
private List<HaxePositionResult> positionResults;
4545

4646
readonly IHaxeCompletionHandler handler;
4747
readonly string FileName;
@@ -62,23 +62,27 @@ public HaxeComplete(ScintillaControl sci, ASExpr expr, bool autoHide, IHaxeCompl
6262

6363
public void GetList(HaxeCompleteResultHandler<HaxeCompleteResult> callback)
6464
{
65-
PluginBase.MainForm.CallCommand("Save", null);
65+
StartThread(callback, () => result);
66+
}
6667

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

74-
public void GetPosition(HaxeCompleteResultHandler<HaxePositionCompleteResult> callback)
73+
public void GetUsages(HaxeCompleteResultHandler<List<HaxePositionResult>> callback)
74+
{
75+
StartThread(callback, () => positionResults);
76+
}
77+
78+
private void StartThread<T>(HaxeCompleteResultHandler<T> callback, Func<T> resultFunc)
7579
{
7680
PluginBase.MainForm.CallCommand("Save", null);
7781

7882
ThreadPool.QueueUserWorkItem(_ =>
7983
{
8084
Status = ParseLines(handler.GetCompletion(BuildHxmlArgs()));
81-
Notify(callback, positionResult);
85+
Notify(callback, resultFunc());
8286
});
8387
}
8488

@@ -113,8 +117,7 @@ string[] BuildHxmlArgs()
113117
QuotePath(hxmlArgs);
114118
EscapeMacros(hxmlArgs);
115119

116-
String mode = (CompilerService == HaxeCompilerService.COMPLETION) ? "" : "@position";
117-
hxmlArgs.Insert(0, String.Format("--display \"{0}\"@{1}{2}", FileName, pos, mode));
120+
hxmlArgs.Insert(0, String.Format("--display \"{0}\"@{1}{2}", FileName, pos, GetMode()));
118121
hxmlArgs.Insert(1, "-D use_rtti_doc");
119122
hxmlArgs.Insert(2, "-D display-details");
120123

@@ -123,6 +126,20 @@ string[] BuildHxmlArgs()
123126
return hxmlArgs.ToArray();
124127
}
125128

129+
private string GetMode()
130+
{
131+
switch (CompilerService)
132+
{
133+
case HaxeCompilerService.POSITION:
134+
return "@position";
135+
136+
case HaxeCompilerService.USAGE:
137+
return "@usage";
138+
}
139+
140+
return "";
141+
}
142+
126143
private void RemoveComments(List<string> hxmlArgs)
127144
{
128145
for (int i = 0; i < hxmlArgs.Count; i++)
@@ -189,6 +206,7 @@ int GetDisplayPosition()
189206
break;
190207

191208
case HaxeCompilerService.POSITION:
209+
case HaxeCompilerService.USAGE:
192210
pos = Sci.WordEndPosition(Sci.CurrentPos, true) + 1;
193211
break;
194212
}
@@ -258,6 +276,7 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
258276
{
259277
result = new HaxeCompleteResult();
260278
result.Members = new MemberList();
279+
positionResults = new List<HaxePositionResult>();
261280
MemberModel member = null;
262281

263282
while (reader.Read())
@@ -267,8 +286,20 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
267286
switch (reader.Name)
268287
{
269288
case "list":
270-
result.Members.Sort();
271-
return HaxeCompleteStatus.MEMBERS;
289+
switch (CompilerService)
290+
{
291+
case HaxeCompilerService.COMPLETION:
292+
result.Members.Sort();
293+
return HaxeCompleteStatus.MEMBERS;
294+
295+
case HaxeCompilerService.POSITION:
296+
return HaxeCompleteStatus.POSITION;
297+
298+
case HaxeCompilerService.USAGE:
299+
return HaxeCompleteStatus.USAGE;
300+
}
301+
break;
302+
272303
case "i":
273304
member = null;
274305
break;
@@ -297,18 +328,18 @@ HaxeCompleteStatus ProcessList(XmlTextReader reader)
297328
break;
298329

299330
case "pos":
300-
positionResult = ExtractPos(reader);
301-
return HaxeCompleteStatus.POSITION;
331+
positionResults.Add(ExtractPos(reader));
332+
break;
302333
}
303334
}
304335

305336
result.Members.Sort();
306337
return HaxeCompleteStatus.MEMBERS;
307338
}
308339

309-
HaxePositionCompleteResult ExtractPos(XmlTextReader reader)
340+
HaxePositionResult ExtractPos(XmlTextReader reader)
310341
{
311-
var result = new HaxePositionCompleteResult();
342+
var result = new HaxePositionResult();
312343

313344
string value = ReadValue(reader);
314345
Match match = rePosition.Match(value);
@@ -414,13 +445,15 @@ enum HaxeCompleteStatus: int
414445
ERROR = 2,
415446
TYPE = 3,
416447
MEMBERS = 4,
417-
POSITION = 5
448+
POSITION = 5,
449+
USAGE = 6
418450
}
419451

420452
enum HaxeCompilerService
421453
{
422454
COMPLETION,
423-
POSITION
455+
POSITION,
456+
USAGE
424457
}
425458

426459
class HaxeCompleteResult
@@ -429,7 +462,7 @@ class HaxeCompleteResult
429462
public MemberList Members;
430463
}
431464

432-
class HaxePositionCompleteResult
465+
class HaxePositionResult
433466
{
434467
public string Path;
435468
public HaxePositionCompleteRangeType RangeType;

External/Plugins/HaXeContext/Context.cs

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

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

1415-
internal void OnPositionCompletionResult(HaxeComplete hc, HaxePositionCompleteResult result, HaxeCompleteStatus status)
1415+
internal void OnPositionResult(HaxeComplete hc, HaxePositionResult result, HaxeCompleteStatus status)
14161416
{
14171417
if (hc.Sci.InvokeRequired)
14181418
{
14191419
hc.Sci.BeginInvoke((MethodInvoker)delegate
14201420
{
1421-
HandlePositionCompletionResult(hc, result, status);
1421+
HandlePositionResult(hc, result, status);
14221422
});
14231423
}
1424-
else HandlePositionCompletionResult(hc, result, status);
1424+
else HandlePositionResult(hc, result, status);
14251425
}
14261426

1427-
private void HandlePositionCompletionResult(HaxeComplete hc, HaxePositionCompleteResult result, HaxeCompleteStatus status)
1427+
private void HandlePositionResult(HaxeComplete hc, HaxePositionResult result, HaxeCompleteStatus status)
14281428
{
14291429
switch (status)
14301430
{
@@ -1433,6 +1433,8 @@ private void HandlePositionCompletionResult(HaxeComplete hc, HaxePositionComplet
14331433
break;
14341434

14351435
case HaxeCompleteStatus.POSITION:
1436+
if (result == null) return;
1437+
14361438
ASComplete.SaveLastLookupPosition(hc.Sci);
14371439

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

0 commit comments

Comments
 (0)