@@ -2150,18 +2150,18 @@ static private bool HandleNewCompletion(ScintillaControl Sci, string tail, bool
2150
2150
// show all project classes
2151
2151
HandleAllClassesCompletion ( Sci , tail , true , true ) ;
2152
2152
SelectTypedNewMember ( Sci ) ;
2153
- return true ;
2154
2153
}
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
+ }
2165
2165
return true ;
2166
2166
}
2167
2167
@@ -2178,8 +2178,7 @@ static private bool HandleImportCompletion(ScintillaControl Sci, string tail, bo
2178
2178
else
2179
2179
{
2180
2180
// list visible classes
2181
- MemberList known = new MemberList ( ) ;
2182
- known . Merge ( ASContext . Context . GetVisibleExternalElements ( ) ) ;
2181
+ MemberList known = GetVisibleElements ( ) ;
2183
2182
2184
2183
// show
2185
2184
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
@@ -2210,8 +2209,7 @@ static private bool HandleColonCompletion(ScintillaControl Sci, string tail, boo
2210
2209
bool outOfDate = ASContext . Context . UnsetOutOfDate ( ) ;
2211
2210
2212
2211
// list visible classes
2213
- MemberList known = new MemberList ( ) ;
2214
- known . Merge ( ASContext . Context . GetVisibleExternalElements ( ) ) ;
2212
+ MemberList known = GetVisibleElements ( ) ;
2215
2213
2216
2214
// show
2217
2215
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
@@ -2264,6 +2262,21 @@ private static ComaExpression GetFunctionContext(ScintillaControl Sci, bool auto
2264
2262
}
2265
2263
keyword = GetWordLeft ( Sci , ref position ) ;
2266
2264
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
+ }
2267
2280
if ( keyword == features . functionKey )
2268
2281
coma = ComaExpression . FunctionDeclaration ;
2269
2282
else
@@ -2318,14 +2331,26 @@ static public void HandleAllClassesCompletion(ScintillaControl Sci, string tail,
2318
2331
known = found ;
2319
2332
}
2320
2333
}
2321
-
2334
+
2322
2335
if ( ASContext . Context . Features . hasDelegates && ! ASContext . Context . CurrentClass . IsVoid ( ) )
2323
2336
{
2324
2337
foreach ( MemberModel field in ASContext . Context . CurrentClass . Members )
2325
2338
if ( ( field . Flags & FlagType . Delegate ) > 0 )
2326
2339
known . Add ( field ) ;
2327
2340
}
2328
2341
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
+
2329
2354
List < ICompletionListItem > list = new List < ICompletionListItem > ( ) ;
2330
2355
string prev = null ;
2331
2356
FlagType mask = ( classesOnly ) ?
@@ -3554,6 +3579,21 @@ private static ComaExpression DisambiguateComa(ScintillaControl Sci, int positio
3554
3579
{
3555
3580
position -- ;
3556
3581
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
+ }
3557
3597
if ( word1 == features . functionKey ) return ComaExpression . FunctionDeclaration ; // anonymous function
3558
3598
string word2 = GetWordLeft ( Sci , ref position ) ;
3559
3599
if ( word2 == features . functionKey || word2 == features . setKey || word2 == features . getKey )
@@ -3777,6 +3817,94 @@ static public ASResult GetExpressionType(ScintillaControl sci, int position, boo
3777
3817
}
3778
3818
}
3779
3819
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
+
3780
3908
/// <summary>
3781
3909
/// Returns whether or not position is insidse of an expression
3782
3910
/// block in Haxe String interpolation ('${expr}')
0 commit comments