Skip to content

Commit 6b044e0

Browse files
committed
When displaying classes check for type parameters and display them if existing.
When autocompleting after : check in functions for the existance of type parameters. Previously this case was breaking completion completely.
1 parent 6669655 commit 6b044e0

File tree

1 file changed

+144
-16
lines changed

1 file changed

+144
-16
lines changed

External/Plugins/ASCompletion/Completion/ASComplete.cs

Lines changed: 144 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2150,18 +2150,18 @@ static private bool HandleNewCompletion(ScintillaControl Sci, string tail, bool
21502150
// show all project classes
21512151
HandleAllClassesCompletion(Sci, tail, true, true);
21522152
SelectTypedNewMember(Sci);
2153-
return true;
21542153
}
2155-
2156-
// Consolidate known classes
2157-
MemberList known = new MemberList();
2158-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2159-
// show
2160-
List<ICompletionListItem> list = new List<ICompletionListItem>();
2161-
foreach(MemberModel member in known)
2162-
list.Add(new MemberItem(new MemberModel(member.Type, member.Type, member.Flags, member.Access)));
2163-
CompletionList.Show(list, autoHide, tail);
2164-
SelectTypedNewMember(Sci);
2154+
else
2155+
{
2156+
// Consolidate known classes
2157+
MemberList known = GetVisibleElements();
2158+
// show
2159+
List<ICompletionListItem> list = new List<ICompletionListItem>();
2160+
foreach (MemberModel member in known)
2161+
list.Add(new MemberItem(new MemberModel(member.Type, member.Type, member.Flags, member.Access)));
2162+
CompletionList.Show(list, autoHide, tail);
2163+
SelectTypedNewMember(Sci);
2164+
}
21652165
return true;
21662166
}
21672167

@@ -2178,8 +2178,7 @@ static private bool HandleImportCompletion(ScintillaControl Sci, string tail, bo
21782178
else
21792179
{
21802180
// list visible classes
2181-
MemberList known = new MemberList();
2182-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2181+
MemberList known = GetVisibleElements();
21832182

21842183
// show
21852184
List<ICompletionListItem> list = new List<ICompletionListItem>();
@@ -2210,8 +2209,7 @@ static private bool HandleColonCompletion(ScintillaControl Sci, string tail, boo
22102209
bool outOfDate = ASContext.Context.UnsetOutOfDate();
22112210

22122211
// list visible classes
2213-
MemberList known = new MemberList();
2214-
known.Merge(ASContext.Context.GetVisibleExternalElements());
2212+
MemberList known = GetVisibleElements();
22152213

22162214
// show
22172215
List<ICompletionListItem> list = new List<ICompletionListItem>();
@@ -2264,6 +2262,21 @@ private static ComaExpression GetFunctionContext(ScintillaControl Sci, bool auto
22642262
}
22652263
keyword = GetWordLeft(Sci, ref position);
22662264
ContextFeatures features = ASContext.Context.Features;
2265+
if (keyword == "" && Sci.CharAt(position) == '>' && features.hasGenerics)
2266+
{
2267+
int groupCount = 1;
2268+
position--;
2269+
while (position >= 0 && groupCount > 0)
2270+
{
2271+
c = (char)Sci.CharAt(position);
2272+
if ("({[<".IndexOf(c) > -1)
2273+
groupCount--;
2274+
else if (")}]>".IndexOf(c) > -1)
2275+
groupCount++;
2276+
position--;
2277+
}
2278+
keyword = GetWordLeft(Sci, ref position);
2279+
}
22672280
if (keyword == features.functionKey)
22682281
coma = ComaExpression.FunctionDeclaration;
22692282
else
@@ -2318,14 +2331,26 @@ static public void HandleAllClassesCompletion(ScintillaControl Sci, string tail,
23182331
known = found;
23192332
}
23202333
}
2321-
2334+
23222335
if (ASContext.Context.Features.hasDelegates && !ASContext.Context.CurrentClass.IsVoid())
23232336
{
23242337
foreach (MemberModel field in ASContext.Context.CurrentClass.Members)
23252338
if ((field.Flags & FlagType.Delegate) > 0)
23262339
known.Add(field);
23272340
}
23282341

2342+
if (ASContext.Context.Features.hasGenerics && !ASContext.Context.CurrentClass.IsVoid())
2343+
{
2344+
var typeParams = GetVisibleTypeParameters();
2345+
2346+
if (typeParams.Items.Count > 0)
2347+
{
2348+
typeParams.Add(known);
2349+
typeParams.Sort();
2350+
known = typeParams;
2351+
}
2352+
}
2353+
23292354
List<ICompletionListItem> list = new List<ICompletionListItem>();
23302355
string prev = null;
23312356
FlagType mask = (classesOnly) ?
@@ -3554,6 +3579,21 @@ private static ComaExpression DisambiguateComa(ScintillaControl Sci, int positio
35543579
{
35553580
position--;
35563581
string word1 = GetWordLeft(Sci, ref position);
3582+
if (word1 == "" && Sci.CharAt(position) == '>' && features.hasGenerics)
3583+
{
3584+
int groupCount = 1;
3585+
position--;
3586+
while (position >= 0 && groupCount > 0)
3587+
{
3588+
c = (char)Sci.CharAt(position);
3589+
if ("({[<".IndexOf(c) > -1)
3590+
groupCount--;
3591+
else if (")}]>".IndexOf(c) > -1)
3592+
groupCount++;
3593+
position--;
3594+
}
3595+
word1 = GetWordLeft(Sci, ref position);
3596+
}
35573597
if (word1 == features.functionKey) return ComaExpression.FunctionDeclaration; // anonymous function
35583598
string word2 = GetWordLeft(Sci, ref position);
35593599
if (word2 == features.functionKey || word2 == features.setKey || word2 == features.getKey)
@@ -3777,6 +3817,94 @@ static public ASResult GetExpressionType(ScintillaControl sci, int position, boo
37773817
}
37783818
}
37793819

3820+
static private MemberList GetTypeParameters(MemberModel model)
3821+
{
3822+
var retVal = new MemberList();
3823+
var template = model.Template;
3824+
if (template != null && template.StartsWith("<"))
3825+
{
3826+
var sb = new StringBuilder();
3827+
int groupCount = 0;
3828+
bool inConstraint = false;
3829+
MemberModel genType = null;
3830+
for (int i = 1, count = template.Length - 1; i < count; i++)
3831+
{
3832+
char c = template[i];
3833+
if (!inConstraint)
3834+
{
3835+
if (c == ':' || c == ',')
3836+
{
3837+
genType = new MemberModel();
3838+
genType.Name = sb.ToString();
3839+
genType.Type = sb.ToString();
3840+
genType.Flags = FlagType.TypeDef;
3841+
inConstraint = c == ':';
3842+
retVal.Add(genType);
3843+
sb.Length = 0;
3844+
3845+
continue;
3846+
}
3847+
else if (char.IsWhiteSpace(c)) continue;
3848+
sb.Append(c);
3849+
}
3850+
else
3851+
{
3852+
if (c == ',')
3853+
{
3854+
if (groupCount == 0)
3855+
{
3856+
genType.Type += ":" + sb.ToString();
3857+
genType = null;
3858+
inConstraint = false;
3859+
sb.Length = 0;
3860+
continue;
3861+
}
3862+
}
3863+
else if ("({[<".IndexOf(c) > -1)
3864+
groupCount++;
3865+
else if (")}]>".IndexOf(c) > -1)
3866+
groupCount--;
3867+
sb.Append(c);
3868+
}
3869+
}
3870+
if (sb.Length > 0)
3871+
{
3872+
if (!inConstraint)
3873+
retVal.Add(new MemberModel { Name = sb.ToString(), Type = sb.ToString(), Flags = FlagType.TypeDef });
3874+
else
3875+
genType.Type += ":" + sb.ToString();
3876+
}
3877+
}
3878+
3879+
return retVal;
3880+
}
3881+
3882+
static private MemberList GetVisibleElements()
3883+
{
3884+
MemberList known = new MemberList();
3885+
known.Merge(ASContext.Context.GetVisibleExternalElements());
3886+
3887+
if (ASContext.Context.Features.hasGenerics && !ASContext.Context.CurrentClass.IsVoid())
3888+
{
3889+
known.Merge(GetVisibleTypeParameters());
3890+
}
3891+
3892+
return known;
3893+
}
3894+
3895+
static private MemberList GetVisibleTypeParameters()
3896+
{
3897+
var typeParams = GetTypeParameters(ASContext.Context.CurrentClass);
3898+
3899+
var curMember = ASContext.Context.CurrentMember;
3900+
if (curMember != null && (curMember.Flags & FlagType.Function) > 0)
3901+
{
3902+
typeParams.Add(GetTypeParameters(curMember));
3903+
}
3904+
3905+
return typeParams;
3906+
}
3907+
37803908
/// <summary>
37813909
/// Returns whether or not position is insidse of an expression
37823910
/// block in Haxe String interpolation ('${expr}')

0 commit comments

Comments
 (0)