Skip to content

Commit 097a24f

Browse files
committed
Merge pull request #963 from Neverbirth/typeparams
Haxe type parameters improvements
2 parents 43f8633 + c9112f1 commit 097a24f

File tree

1 file changed

+172
-19
lines changed

1 file changed

+172
-19
lines changed

External/Plugins/ASCompletion/Completion/ASComplete.cs

Lines changed: 172 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,18 +2146,18 @@ static private bool HandleNewCompletion(ScintillaControl Sci, string tail, bool
21462146
// show all project classes
21472147
HandleAllClassesCompletion(Sci, tail, true, true);
21482148
SelectTypedNewMember(Sci);
2149-
return true;
21502149
}
2151-
2152-
// Consolidate known classes
2153-
MemberList known = new MemberList();
2154-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2155-
// show
2156-
List<ICompletionListItem> list = new List<ICompletionListItem>();
2157-
foreach(MemberModel member in known)
2158-
list.Add(new MemberItem(new MemberModel(member.Type, member.Type, member.Flags, member.Access)));
2159-
CompletionList.Show(list, autoHide, tail);
2160-
SelectTypedNewMember(Sci);
2150+
else
2151+
{
2152+
// Consolidate known classes
2153+
MemberList known = GetVisibleElements();
2154+
// show
2155+
List<ICompletionListItem> list = new List<ICompletionListItem>();
2156+
foreach (MemberModel member in known)
2157+
list.Add(new MemberItem(new MemberModel(member.Type, member.Type, member.Flags, member.Access)));
2158+
CompletionList.Show(list, autoHide, tail);
2159+
SelectTypedNewMember(Sci);
2160+
}
21612161
return true;
21622162
}
21632163

@@ -2174,8 +2174,7 @@ static private bool HandleImportCompletion(ScintillaControl Sci, string tail, bo
21742174
else
21752175
{
21762176
// list visible classes
2177-
MemberList known = new MemberList();
2178-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2177+
MemberList known = GetVisibleElements();
21792178

21802179
// show
21812180
List<ICompletionListItem> list = new List<ICompletionListItem>();
@@ -2206,8 +2205,7 @@ static private bool HandleColonCompletion(ScintillaControl Sci, string tail, boo
22062205
bool outOfDate = ASContext.Context.UnsetOutOfDate();
22072206

22082207
// list visible classes
2209-
MemberList known = new MemberList();
2210-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2208+
MemberList known = GetVisibleElements();
22112209

22122210
// show
22132211
List<ICompletionListItem> list = new List<ICompletionListItem>();
@@ -2260,6 +2258,21 @@ private static ComaExpression GetFunctionContext(ScintillaControl Sci, bool auto
22602258
}
22612259
keyword = GetWordLeft(Sci, ref position);
22622260
ContextFeatures features = ASContext.Context.Features;
2261+
if (keyword == "" && Sci.CharAt(position) == '>' && features.hasGenerics)
2262+
{
2263+
int groupCount = 1;
2264+
position--;
2265+
while (position >= 0 && groupCount > 0)
2266+
{
2267+
c = (char)Sci.CharAt(position);
2268+
if ("({[<".IndexOf(c) > -1)
2269+
groupCount--;
2270+
else if (")}]>".IndexOf(c) > -1)
2271+
groupCount++;
2272+
position--;
2273+
}
2274+
keyword = GetWordLeft(Sci, ref position);
2275+
}
22632276
if (keyword == features.functionKey)
22642277
coma = ComaExpression.FunctionDeclaration;
22652278
else
@@ -2315,11 +2328,35 @@ static public void HandleAllClassesCompletion(ScintillaControl Sci, string tail,
23152328
}
23162329
}
23172330

2318-
if (ASContext.Context.Features.hasDelegates && !ASContext.Context.CurrentClass.IsVoid())
2331+
if (!ASContext.Context.CurrentClass.IsVoid())
23192332
{
2320-
foreach (MemberModel field in ASContext.Context.CurrentClass.Members)
2321-
if ((field.Flags & FlagType.Delegate) > 0)
2322-
known.Add(field);
2333+
if (ASContext.Context.Features.hasDelegates)
2334+
{
2335+
MemberList delegates = new MemberList();
2336+
2337+
foreach (MemberModel field in ASContext.Context.CurrentClass.Members)
2338+
if ((field.Flags & FlagType.Delegate) > 0)
2339+
delegates.Add(field);
2340+
2341+
if (delegates.Count > 0)
2342+
{
2343+
delegates.Sort();
2344+
delegates.Merge(known);
2345+
known = delegates;
2346+
}
2347+
}
2348+
2349+
if (ASContext.Context.Features.hasGenerics)
2350+
{
2351+
var typeParams = GetVisibleTypeParameters();
2352+
2353+
if (typeParams != null && typeParams.Items.Count > 0)
2354+
{
2355+
typeParams.Sort();
2356+
typeParams.Merge(known);
2357+
known = typeParams;
2358+
}
2359+
}
23232360
}
23242361

23252362
List<ICompletionListItem> list = new List<ICompletionListItem>();
@@ -3505,6 +3542,21 @@ private static ComaExpression DisambiguateComa(ScintillaControl Sci, int positio
35053542
{
35063543
position--;
35073544
string word1 = GetWordLeft(Sci, ref position);
3545+
if (word1 == "" && Sci.CharAt(position) == '>' && features.hasGenerics)
3546+
{
3547+
int groupCount = 1;
3548+
position--;
3549+
while (position >= 0 && groupCount > 0)
3550+
{
3551+
c = (char)Sci.CharAt(position);
3552+
if ("({[<".IndexOf(c) > -1)
3553+
groupCount--;
3554+
else if (")}]>".IndexOf(c) > -1)
3555+
groupCount++;
3556+
position--;
3557+
}
3558+
word1 = GetWordLeft(Sci, ref position);
3559+
}
35083560
if (word1 == features.functionKey) return ComaExpression.FunctionDeclaration; // anonymous function
35093561
string word2 = GetWordLeft(Sci, ref position);
35103562
if (word2 == features.functionKey || word2 == features.setKey || word2 == features.getKey)
@@ -3726,6 +3778,107 @@ static public ASResult GetExpressionType(ScintillaControl sci, int position, boo
37263778
}
37273779
}
37283780

3781+
static private MemberList GetTypeParameters(MemberModel model)
3782+
{
3783+
MemberList retVal = null;
3784+
string template = model.Template;
3785+
if (template != null && template.StartsWith("<"))
3786+
{
3787+
var sb = new StringBuilder();
3788+
int groupCount = 0;
3789+
bool inConstraint = false;
3790+
MemberModel genType = null;
3791+
for (int i = 1, count = template.Length - 1; i < count; i++)
3792+
{
3793+
char c = template[i];
3794+
if (!inConstraint)
3795+
{
3796+
if (c == ':' || c == ',')
3797+
{
3798+
genType = new MemberModel();
3799+
genType.Name = sb.ToString();
3800+
genType.Type = sb.ToString();
3801+
genType.Flags = FlagType.TypeDef;
3802+
inConstraint = c == ':';
3803+
if (retVal == null) retVal = new MemberList();
3804+
retVal.Add(genType);
3805+
sb.Length = 0;
3806+
3807+
continue;
3808+
}
3809+
else if (char.IsWhiteSpace(c)) continue;
3810+
sb.Append(c);
3811+
}
3812+
else
3813+
{
3814+
if (c == ',')
3815+
{
3816+
if (groupCount == 0)
3817+
{
3818+
genType.Type += ":" + sb.ToString();
3819+
genType = null;
3820+
inConstraint = false;
3821+
sb.Length = 0;
3822+
continue;
3823+
}
3824+
}
3825+
else if ("({[<".IndexOf(c) > -1)
3826+
groupCount++;
3827+
else if (")}]>".IndexOf(c) > -1)
3828+
groupCount--;
3829+
sb.Append(c);
3830+
}
3831+
}
3832+
if (sb.Length > 0)
3833+
{
3834+
if (retVal == null) retVal = new MemberList();
3835+
if (!inConstraint)
3836+
retVal.Add(new MemberModel { Name = sb.ToString(), Type = sb.ToString(), Flags = FlagType.TypeDef });
3837+
else
3838+
genType.Type += ":" + sb.ToString();
3839+
}
3840+
}
3841+
3842+
return retVal;
3843+
}
3844+
3845+
static private MemberList GetVisibleElements()
3846+
{
3847+
MemberList known = ASContext.Context.GetVisibleExternalElements();
3848+
3849+
if (ASContext.Context.Features.hasGenerics && !ASContext.Context.CurrentClass.IsVoid())
3850+
{
3851+
var typeParams = GetVisibleTypeParameters();
3852+
3853+
if (typeParams != null && typeParams.Count > 0)
3854+
{
3855+
typeParams.Sort();
3856+
typeParams.Merge(known);
3857+
3858+
known = typeParams;
3859+
}
3860+
}
3861+
3862+
return known;
3863+
}
3864+
3865+
static private MemberList GetVisibleTypeParameters()
3866+
{
3867+
var typeParams = GetTypeParameters(ASContext.Context.CurrentClass);
3868+
3869+
var curMember = ASContext.Context.CurrentMember;
3870+
if (curMember != null && (curMember.Flags & FlagType.Function) > 0)
3871+
{
3872+
var memberTypeParams = GetTypeParameters(curMember);
3873+
if (typeParams != null && memberTypeParams != null)
3874+
typeParams.Add(memberTypeParams);
3875+
else if (typeParams == null)
3876+
typeParams = memberTypeParams;
3877+
}
3878+
3879+
return typeParams;
3880+
}
3881+
37293882
/// <summary>
37303883
/// Returns whether or not position is insidse of an expression
37313884
/// block in Haxe String interpolation ('${expr}')

0 commit comments

Comments
 (0)