Skip to content

Commit 38b5be8

Browse files
author
slavara
committed
Merge branch 'hotfix/fix_npe_hxproj' into develop
2 parents dd0be4d + bcf5420 commit 38b5be8

File tree

3 files changed

+90
-62
lines changed

3 files changed

+90
-62
lines changed

PostfixCodeCompletion/Completion/HaxeComplete.cs

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using System.Text.RegularExpressions;
45
using System.Threading;
56
using System.Windows.Forms;
67
using System.Xml;
@@ -15,7 +16,7 @@
1516

1617
namespace PostfixCodeCompletion.Completion
1718
{
18-
internal delegate void HaxeCompleteResultHandler<T>(HaxeComplete hc, T result, HaxeCompleteStatus status);
19+
internal delegate void HaxeCompleteResultHandler<in T>(HaxeComplete hc, T result, HaxeCompleteStatus status);
1920

2021
interface IHaxeCompletionHandler
2122
{
@@ -25,6 +26,9 @@ interface IHaxeCompletionHandler
2526

2627
internal class HaxeComplete
2728
{
29+
static readonly Regex reArg = new Regex("^(-cp|-resource)\\s*([^\"'].*)$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
30+
static readonly Regex reMacro = new Regex("^(--macro)\\s*([^\"'].*)$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
31+
2832
public readonly ScintillaControl Sci;
2933
public readonly ASResult Expr;
3034
public readonly string CurrentWord;
@@ -95,20 +99,56 @@ string[] BuildHxmlArgs()
9599
if (PluginBase.CurrentProject == null || !(PluginBase.CurrentProject is HaxeProject)
96100
|| !(ASContext.Context is Context))
97101
return null;
98-
var hxproj = ((HaxeProject) PluginBase.CurrentProject);
102+
var project = (HaxeProject) PluginBase.CurrentProject;
99103
var pos = GetDisplayPosition();
100104
var paths = ProjectManager.PluginMain.Settings.GlobalClasspaths.ToArray();
101-
var hxmlArgs = new List<string>(hxproj.BuildHXML(paths, "Nothing__", true))
105+
var args = new List<string>(project.BuildHXML(paths, "Nothing__", true))
102106
{
103-
"-cp " + Path.GetDirectoryName(tempFileName)
107+
$"-cp {Path.GetDirectoryName(tempFileName)}"
104108
};
109+
RemoveComments(args);
110+
QuotePath(args);
111+
EscapeMacros(args);
105112
var mode = "";
106113
if (CompilerService == HaxeCompilerService.Type) mode = "@type";
107-
hxmlArgs.Insert(0, string.Format("--display {0}@{1}{2}", tempFileName, pos, mode));
108-
hxmlArgs.Insert(1, "-D use_rtti_doc");
109-
hxmlArgs.Insert(2, "-D display-details");
110-
if (hxproj.TraceEnabled) hxmlArgs.Insert(2, "-debug");
111-
return hxmlArgs.ToArray();
114+
args.Insert(0, $"--display {tempFileName}@{pos}{mode}");
115+
args.Insert(1, "-D use_rtti_doc");
116+
args.Insert(2, "-D display-details");
117+
if (project.TraceEnabled) args.Insert(2, "-debug");
118+
return args.ToArray();
119+
}
120+
121+
static void RemoveComments(IList<string> args)
122+
{
123+
for (var i = 0; i < args.Count; i++)
124+
{
125+
var arg = args[i];
126+
if (string.IsNullOrEmpty(arg)) continue;
127+
if (arg.StartsWith('#')) // commented line
128+
args[i] = "";
129+
}
130+
}
131+
132+
static void QuotePath(IList<string> args)
133+
{
134+
for (var i = 0; i < args.Count; i++)
135+
{
136+
var arg = args[i];
137+
if (string.IsNullOrEmpty(arg)) continue;
138+
var m = reArg.Match(arg);
139+
if (m.Success) args[i] = $"{m.Groups[1].Value} \"{m.Groups[2].Value.Trim()}\"";
140+
}
141+
}
142+
143+
static void EscapeMacros(IList<string> args)
144+
{
145+
for (var i = 0; i < args.Count; i++)
146+
{
147+
var arg = args[i];
148+
if (string.IsNullOrEmpty(arg)) continue;
149+
var m = reMacro.Match(arg);
150+
if (m.Success) args[i] = $"{m.Groups[1].Value} \"{m.Groups[2].Value.Trim()}\"";
151+
}
112152
}
113153

114154
int GetDisplayPosition()

PostfixCodeCompletion/PluginMain.cs

Lines changed: 40 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void Initialize()
6565
/// </summary>
6666
public void Dispose()
6767
{
68-
if (completionModeHandler != null) completionModeHandler.Stop();
68+
completionModeHandler?.Stop();
6969
SaveSettings();
7070
}
7171

@@ -74,33 +74,36 @@ public void Dispose()
7474
/// </summary>
7575
public void HandleEvent(object sender, NotifyEvent e, HandlingPriority priority)
7676
{
77+
var completionList = Reflector.CompletionList.completionList;
7778
switch (e.Type)
7879
{
7980
case EventType.UIStarted:
80-
Reflector.CompletionList.completionList.VisibleChanged += OnCompletionListVisibleChanged;
81+
completionList.VisibleChanged -= OnCompletionListVisibleChanged;
82+
completionList.VisibleChanged += OnCompletionListVisibleChanged;
8183
break;
8284
case EventType.Command:
8385
if (((DataEvent) e).Action == ProjectManagerEvents.Project)
8486
{
8587
if (!(PluginBase.CurrentProject is HaxeProject)) return;
8688
var context = (Context) ASContext.GetLanguageContext("haxe");
87-
((HaXeSettings) context.Settings).CompletionModeChanged += OnHaxeCompletionModeChanged;
89+
if (context == null) return;
90+
var settings = (HaXeSettings) context.Settings;
91+
settings.CompletionModeChanged -= OnHaxeCompletionModeChanged;
92+
settings.CompletionModeChanged += OnHaxeCompletionModeChanged;
8893
OnHaxeCompletionModeChanged();
8994
}
9095
break;
9196
case EventType.Keys:
9297
var keys = ((KeyEvent) e).Value;
9398
if (keys == (Keys.Control | Keys.Space))
9499
{
100+
if (CompletionList.Active) return;
95101
var expr = GetPostfixCompletionExpr();
96102
if (expr == null || expr.IsNull()) return;
97103
e.Handled = ASComplete.OnShortcut(keys, PluginBase.MainForm.CurrentDocument.SciControl);
98-
if (!CompletionList.Active)
99-
{
100-
Reflector.CompletionList.completionList.VisibleChanged -= OnCompletionListVisibleChanged;
101-
UpdateCompletionList(expr);
102-
Reflector.CompletionList.completionList.VisibleChanged += OnCompletionListVisibleChanged;
103-
}
104+
completionList.VisibleChanged -= OnCompletionListVisibleChanged;
105+
UpdateCompletionList(expr);
106+
completionList.VisibleChanged += OnCompletionListVisibleChanged;
104107
}
105108
break;
106109
}
@@ -144,14 +147,12 @@ void AddEventHandlers()
144147
/// <summary>
145148
/// Saves the plugin settings
146149
/// </summary>
147-
void SaveSettings()
148-
{
149-
ObjectSerializer.Serialize(settingFilename, Settings);
150-
}
150+
void SaveSettings() => ObjectSerializer.Serialize(settingFilename, Settings);
151151

152152
static void UpdateCompletionList()
153153
{
154-
UpdateCompletionList(GetPostfixCompletionExpr());
154+
var expr = GetPostfixCompletionExpr();
155+
UpdateCompletionList(expr);
155156
}
156157

157158
static void UpdateCompletionList(ASResult expr)
@@ -163,10 +164,9 @@ static void UpdateCompletionList(ASResult expr)
163164
UpdateCompletionList(target, expr);
164165
return;
165166
}
166-
if (completionModeHandler == null) return;
167+
if (expr.Context == null || completionModeHandler == null) return;
167168
var sci = PluginBase.MainForm.CurrentDocument.SciControl;
168-
if (sci.ConfigurationLanguage.ToLower() != "haxe" || expr.Context == null || sci.CharAt(expr.Context.Position) != '.')
169-
return;
169+
if (sci.ConfigurationLanguage.ToLower() != "haxe" || sci.CharAt(expr.Context.Position) != '.') return;
170170
var hc = new HaxeComplete(sci, expr, false, completionModeHandler, HaxeCompilerService.Type);
171171
hc.GetPositionType(OnFunctionTypeResult);
172172
}
@@ -179,10 +179,15 @@ static void UpdateCompletionList(MemberModel target, ASResult expr)
179179
var allItems = Reflector.CompletionList.allItems;
180180
if (allItems != null)
181181
{
182-
allItems = new List<ICompletionListItem>(allItems);
182+
var labels = new HashSet<string>();
183+
foreach (var item in allItems)
184+
{
185+
labels.Add(item.Label);
186+
}
183187
foreach (var item in items)
184188
{
185-
if (!allItems.Exists(it => it.Label == item.Label)) allItems.Add(item);
189+
var label = item.Label;
190+
if (!labels.Contains(label)) allItems.Add(item);
186191
}
187192
items = allItems;
188193
}
@@ -191,6 +196,7 @@ static void UpdateCompletionList(MemberModel target, ASResult expr)
191196
CompletionList.Show(items, false, word);
192197
var list = Reflector.CompletionList.completionList;
193198
completionListItemCount = list.Items.Count;
199+
list.SelectedValueChanged -= OnCompletionListSelectedValueChanged;
194200
list.SelectedValueChanged += OnCompletionListSelectedValueChanged;
195201
}
196202

@@ -243,12 +249,9 @@ static List<ICompletionListItem> GetPostfixCompletionItems(MemberModel target, A
243249
if (expr.Member != null) result.AddRange(GetCompletionItems(expr.Member.Type, target, expr));
244250
else if (expr.Type != null) result.AddRange(GetCompletionItems(expr.Type.Type, target, expr));
245251
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_MEMBER, expr));
246-
if (GetTargetIsNullable(target))
247-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_NULLABLE, expr));
248-
if (GetTargetIsCollection(target))
249-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_COLLECTION, expr));
250-
if (GetTargetIsHash(target))
251-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_HASH, expr));
252+
if (IsNullable(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_NULLABLE, expr));
253+
if (IsCollection(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_COLLECTION, expr));
254+
if (IsHash(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_HASH, expr));
252255
if (PluginBase.MainForm.CurrentDocument.SciControl.ConfigurationLanguage.ToLower() == "haxe")
253256
{
254257
var type = expr.Type != null && !string.IsNullOrEmpty(expr.Type.Type) &&
@@ -257,27 +260,19 @@ static List<ICompletionListItem> GetPostfixCompletionItems(MemberModel target, A
257260
: null;
258261
if (type != null)
259262
{
260-
if (GetTargetIsCollection(type))
261-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_COLLECTION, expr));
262-
if (GetTargetIsHash(type))
263-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_HASH, expr));
263+
if (IsCollection(type)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_COLLECTION, expr));
264+
if (IsHash(type)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_HASH, expr));
264265
}
265266
}
266-
if (GetTargetIsBoolean(target))
267-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_BOOL, expr));
268-
if (GetTargetIsNumber(target))
269-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_NUMBER, expr));
270-
if (GetTargetIsString(target))
271-
result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_STRING, expr));
267+
if (IsBoolean(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_BOOL, expr));
268+
if (IsNumber(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_NUMBER, expr));
269+
if (IsString(target)) result.AddRange(GetCompletionItems(TemplateUtils.PATTERN_STRING, expr));
272270
return result.Distinct().ToList();
273271
}
274272

275-
static bool GetTargetIsNullable(MemberModel target)
276-
{
277-
return !GetTargetIsNumber(target) && target.Type != ASContext.Context.Features.booleanKey;
278-
}
273+
static bool IsNullable(MemberModel target) => !IsNumber(target) && target.Type != ASContext.Context.Features.booleanKey;
279274

280-
static bool GetTargetIsCollection(MemberModel target)
275+
static bool IsCollection(MemberModel target)
281276
{
282277
var type = target.Type;
283278
var arrayKey = ASContext.Context.Features.arrayKey;
@@ -286,7 +281,7 @@ static bool GetTargetIsCollection(MemberModel target)
286281
{
287282
case "as2":
288283
case "as3":
289-
return type.Contains("Vector.<") || type.Contains("@" + arrayKey);
284+
return type.Contains("Vector.<") || type.Contains($"@{arrayKey}");
290285
case "haxe":
291286
return Reflector.ASGenerator.CleanType(type) == Reflector.ASGenerator.CleanType(arrayKey)
292287
|| (type.Contains("Vector<") && Reflector.ASGenerator.CleanType(type) == Reflector.ASGenerator.CleanType("Vector<T>"));
@@ -295,7 +290,7 @@ static bool GetTargetIsCollection(MemberModel target)
295290
}
296291
}
297292

298-
static bool GetTargetIsHash(MemberModel target)
293+
static bool IsHash(MemberModel target)
299294
{
300295
switch (PluginBase.MainForm.CurrentDocument.SciControl.ConfigurationLanguage.ToLower())
301296
{
@@ -327,12 +322,9 @@ static bool IsIteratorOrIterable(MemberModel member)
327322
return cleanType == "Iterator" || cleanType == "Iterable";
328323
}
329324

330-
static bool GetTargetIsBoolean(MemberModel target)
331-
{
332-
return target.Type == ASContext.Context.Features.booleanKey;
333-
}
325+
static bool IsBoolean(MemberModel target) => target.Type == ASContext.Context.Features.booleanKey;
334326

335-
static bool GetTargetIsNumber(MemberModel target)
327+
static bool IsNumber(MemberModel target)
336328
{
337329
var type = target.Type;
338330
if (type == ASContext.Context.Features.numberKey) return true;
@@ -348,10 +340,7 @@ static bool GetTargetIsNumber(MemberModel target)
348340
}
349341
}
350342

351-
static bool GetTargetIsString(MemberModel target)
352-
{
353-
return target.Type == ASContext.Context.Features.stringKey;
354-
}
343+
static bool IsString(MemberModel target) => target.Type == ASContext.Context.Features.stringKey;
355344

356345
static IEnumerable<ICompletionListItem> GetCompletionItems(string pattern, MemberModel target, ASResult expr)
357346
{
@@ -460,7 +449,6 @@ static void OnCharAdded(ScintillaControl sender, int value)
460449
}
461450
catch (Exception e)
462451
{
463-
Console.WriteLine(e);
464452
ErrorManager.ShowError(e);
465453
}
466454
}

PostfixCodeCompletion/PostfixCodeCompletion.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
<DebugSymbols>true</DebugSymbols>
3737
<OutputPath>..\..\..\..\FlashDevelop\Bin\Debug\Plugins\</OutputPath>
3838
<DefineConstants>TRACE</DefineConstants>
39-
<Optimize>true</Optimize>
39+
<Optimize>false</Optimize>
4040
<DebugType>full</DebugType>
4141
<PlatformTarget>x86</PlatformTarget>
4242
<ErrorReport>prompt</ErrorReport>

0 commit comments

Comments
 (0)