Skip to content

Commit d7e2732

Browse files
author
slavara
committed
Merge branch 'develop' into feature/issue27
2 parents 9a30caa + bff76d7 commit d7e2732

37 files changed

+183
-126
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/Helpers/Reflector.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,25 @@ internal string GetShortType(string type)
6666
return (string)methodInfo.Invoke(null, new object[] { type });
6767
}
6868

69-
internal ASResult GetStatementReturnType(ScintillaControl sci, string line, int positionFromLine)
69+
internal StatementReturnType GetStatementReturnType(ScintillaControl sci, string line, int positionFromLine)
7070
{
7171
var methodInfo = typeof(ASGenerator).GetMethod("GetStatementReturnType", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static);
7272
var returnType = methodInfo.Invoke(null, new object[] { sci, ASContext.Context.CurrentClass, line, positionFromLine });
73-
var expr = returnType != null
74-
? (ASResult) returnType.GetType().GetField("resolve").GetValue(returnType)
75-
: null;
76-
return expr;
73+
if (returnType == null) return null;
74+
var result = new StatementReturnType
75+
{
76+
Resolve = (ASResult) returnType.GetType().GetField("resolve").GetValue(returnType),
77+
Position = (int) returnType.GetType().GetField("position").GetValue(returnType),
78+
Word = (string) returnType.GetType().GetField("word").GetValue(returnType)
79+
};
80+
return result;
7781
}
7882
}
83+
84+
internal class StatementReturnType
85+
{
86+
public ASResult Resolve;
87+
public int Position;
88+
public string Word;
89+
}
7990
}

PostfixCodeCompletion/Helpers/TemplateUtils.cs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using HaXeContext;
1111
using PluginCore;
1212
using PluginCore.Helpers;
13-
using ScintillaNet;
1413

1514
namespace PostfixCodeCompletion.Helpers
1615
{
@@ -19,15 +18,16 @@ static class TemplateUtils
1918
public const string PATTERN_BLOCK = @"\$\([^\)]*{0}.*?\)";
2019
public const string PATTERN_T_BLOCK = @"[^\$]*?\$\({0}\)";
2120
internal const string POSTFIX_GENERATORS = "PostfixGenerators";
22-
internal const string PATTERN_MEMBER = "Member";
23-
internal const string PATTERN_NULLABLE = "Nullable";
24-
internal const string PATTERN_COLLECTION = "Collection";
21+
internal const string PATTERN_MEMBER = "PCCMember";
22+
internal const string PATTERN_NULLABLE = "PCCNullable";
23+
internal const string PATTERN_COLLECTION = "PCCCollection";
2524
internal const string PATTERN_COLLECTION_KEY_TYPE = "$(CollectionKeyType)";
2625
internal const string PATTERN_COLLECTION_ITEM_TYPE = "$(CollectionItemType)";
27-
internal const string PATTERN_HASH = "Hash";
28-
internal const string PATTERN_BOOL = "Boolean";
29-
internal const string PATTERN_NUMBER = "Number";
30-
internal const string PATTERN_STRING = "String";
26+
internal const string PATTERN_HASH = "PCCHash";
27+
internal const string PATTERN_BOOL = "PCCBoolean";
28+
internal const string PATTERN_NUMBER = "PCCNumber";
29+
internal const string PATTERN_STRING = "PCCString";
30+
internal const string PATTERN_TYPE = "PCCType";
3131
public static Settings Settings { get; set; }
3232

3333
static readonly List<string> Templates = new List<string>
@@ -38,7 +38,8 @@ static class TemplateUtils
3838
PATTERN_HASH,
3939
PATTERN_BOOL,
4040
PATTERN_NUMBER,
41-
PATTERN_STRING
41+
PATTERN_STRING,
42+
PATTERN_TYPE
4243
};
4344

4445
internal static bool GetHasTemplates()
@@ -82,7 +83,7 @@ internal static Dictionary<string, string> GetTemplates(string type)
8283
foreach (var file in Directory.GetFiles(path, "*.fds"))
8384
{
8485
var content = GetFileContent(file);
85-
var marker = "#pcc:" + type;
86+
var marker = $"#pcc:{type}";
8687
var startIndex = content.IndexOf(marker, StringComparison.Ordinal);
8788
if (startIndex != -1)
8889
{
@@ -113,7 +114,11 @@ internal static KeyValuePair<string, string> GetVarNameToQualifiedName(ASResult
113114
{
114115
string type = null;
115116
var varname = string.Empty;
116-
var word = string.Empty;
117+
var sci = PluginBase.MainForm.CurrentDocument.SciControl;
118+
var lineNum = sci.CurrentLine;
119+
var line = sci.GetLine(lineNum);
120+
var returnType = Reflector.ASGenerator.GetStatementReturnType(sci, line, sci.PositionFromLine(lineNum));
121+
var word = returnType?.Word;
117122
var member = expr.Member;
118123
if (member != null && member.Type != null) type = member.Type;
119124
else
@@ -126,7 +131,7 @@ internal static KeyValuePair<string, string> GetVarNameToQualifiedName(ASResult
126131
if (!string.IsNullOrEmpty(word) && (string.IsNullOrEmpty(type) || Regex.IsMatch(type, "(<[^]]+>)"))) word = null;
127132
if (!string.IsNullOrEmpty(type) && type == ASContext.Context.Features.voidKey) type = null;
128133
if (string.IsNullOrEmpty(varname)) varname = Reflector.ASGenerator.GuessVarName(word, type);
129-
if (!string.IsNullOrEmpty(varname) && varname == word && varname.Length == 1) varname = varname + "1";
134+
if (!string.IsNullOrEmpty(varname) && varname == word) varname = $"{varname}1";
130135
return new KeyValuePair<string, string>(varname, type);
131136
}
132137

@@ -145,7 +150,7 @@ internal static string ProcessMemberTemplate(string template, ASResult expr)
145150
internal static string ProcessCollectionTemplate(string template, ASResult expr)
146151
{
147152
var type = expr.Member != null ? expr.Member.Type : expr.Type.QualifiedName;
148-
if (type.Contains("@")) type = type.Replace("@", ".<") + ">";
153+
if (type.Contains("@")) type = $"{type.Replace("@", ".<")}>";
149154
type = Regex.Match(type, "<([^]]+)>").Groups[1].Value;
150155
type = Reflector.ASGenerator.GetShortType(type);
151156
switch (PluginBase.MainForm.CurrentDocument.SciControl.ConfigurationLanguage)

0 commit comments

Comments
 (0)