@@ -2146,18 +2146,18 @@ static private bool HandleNewCompletion(ScintillaControl Sci, string tail, bool
2146
2146
// show all project classes
2147
2147
HandleAllClassesCompletion ( Sci , tail , true , true ) ;
2148
2148
SelectTypedNewMember ( Sci ) ;
2149
- return true ;
2150
2149
}
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
+ }
2161
2161
return true ;
2162
2162
}
2163
2163
@@ -2174,8 +2174,7 @@ static private bool HandleImportCompletion(ScintillaControl Sci, string tail, bo
2174
2174
else
2175
2175
{
2176
2176
// list visible classes
2177
- MemberList known = new MemberList ( ) ;
2178
- known . Merge ( ASContext . Context . GetVisibleExternalElements ( ) ) ;
2177
+ MemberList known = GetVisibleElements ( ) ;
2179
2178
2180
2179
// show
2181
2180
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
@@ -2206,8 +2205,7 @@ static private bool HandleColonCompletion(ScintillaControl Sci, string tail, boo
2206
2205
bool outOfDate = ASContext . Context . UnsetOutOfDate ( ) ;
2207
2206
2208
2207
// list visible classes
2209
- MemberList known = new MemberList ( ) ;
2210
- known . Merge ( ASContext . Context . GetVisibleExternalElements ( ) ) ;
2208
+ MemberList known = GetVisibleElements ( ) ;
2211
2209
2212
2210
// show
2213
2211
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
@@ -2260,6 +2258,21 @@ private static ComaExpression GetFunctionContext(ScintillaControl Sci, bool auto
2260
2258
}
2261
2259
keyword = GetWordLeft ( Sci , ref position ) ;
2262
2260
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
+ }
2263
2276
if ( keyword == features . functionKey )
2264
2277
coma = ComaExpression . FunctionDeclaration ;
2265
2278
else
@@ -2315,11 +2328,35 @@ static public void HandleAllClassesCompletion(ScintillaControl Sci, string tail,
2315
2328
}
2316
2329
}
2317
2330
2318
- if ( ASContext . Context . Features . hasDelegates && ! ASContext . Context . CurrentClass . IsVoid ( ) )
2331
+ if ( ! ASContext . Context . CurrentClass . IsVoid ( ) )
2319
2332
{
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
+ }
2323
2360
}
2324
2361
2325
2362
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
@@ -3505,6 +3542,21 @@ private static ComaExpression DisambiguateComa(ScintillaControl Sci, int positio
3505
3542
{
3506
3543
position -- ;
3507
3544
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
+ }
3508
3560
if ( word1 == features . functionKey ) return ComaExpression . FunctionDeclaration ; // anonymous function
3509
3561
string word2 = GetWordLeft ( Sci , ref position ) ;
3510
3562
if ( word2 == features . functionKey || word2 == features . setKey || word2 == features . getKey )
@@ -3726,6 +3778,107 @@ static public ASResult GetExpressionType(ScintillaControl sci, int position, boo
3726
3778
}
3727
3779
}
3728
3780
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
+
3729
3882
/// <summary>
3730
3883
/// Returns whether or not position is insidse of an expression
3731
3884
/// block in Haxe String interpolation ('${expr}')
0 commit comments