@@ -1779,10 +1779,28 @@ private void ShowStructMemberAutoComplete()
17791779
17801780 if ( foundType != null )
17811781 {
1782- ShowAutoComplete ( charactersAfterDot . Length , ConstructScintillaAutocompleteList ( GetAllStructsWithMatchingName ( foundType . Name ) , staticAccess , isThis , null ) ) ;
1782+ // NOTE: we display members not just for 1 struct, but for all registered structs
1783+ // with the matching names, because of how local script's extender functions are registered:
1784+ // they are gathered separately into a locally declared struct, which may duplicate existing global struct.
1785+ var allStructs = GetAllStructs ( ) ;
1786+ var forStructs = GetAllStructsWithMatchingName ( foundType . Name ) ;
1787+ ShowAutoComplete ( charactersAfterDot . Length , ConstructScintillaAutocompleteList ( forStructs , allStructs , staticAccess , isThis , null ) ) ;
17831788 }
17841789 }
17851790
1791+ private List < ScriptStruct > GetAllStructs ( )
1792+ {
1793+ List < ScriptStruct > allTypes = new List < ScriptStruct > ( ) ;
1794+ foreach ( IScript script in GetAutoCompleteScriptList ( ) )
1795+ {
1796+ foreach ( ScriptStruct structDef in script . AutoCompleteData . Structs )
1797+ {
1798+ allTypes . Add ( structDef ) ;
1799+ }
1800+ }
1801+ return allTypes ;
1802+ }
1803+
17861804 private List < ScriptStruct > GetAllStructsWithMatchingName ( string structName )
17871805 {
17881806 List < ScriptStruct > matchingTypes = new List < ScriptStruct > ( ) ;
@@ -1972,7 +1990,7 @@ private void ShowAutoCompleteIfAppropriate(int minimumLength)
19721990 {
19731991 needMatch = null ;
19741992 }
1975- ShowAutoComplete ( previousWord . Length , ConstructScintillaAutocompleteList ( null , false , false , needMatch ) ) ;
1993+ ShowAutoComplete ( previousWord . Length , ConstructScintillaAutocompleteList ( null , null , false , false , needMatch ) ) ;
19761994 }
19771995 }
19781996 }
@@ -2388,17 +2406,22 @@ private void AddGlobalsFromScript(List<string> globalsList, IScript script, Dict
23882406 }
23892407 }
23902408
2391- private void AddMembersOfStruct ( List < string > autoCompleteList , List < ScriptStruct > scriptStructs , bool staticOnly , bool isThis )
2409+ private void AddMembersOfStruct ( List < string > autoCompleteList , List < ScriptStruct > scriptStructs , List < ScriptStruct > allStructsRef , bool addStatic , bool extenderOnly , bool isThis )
23922410 {
23932411 Dictionary < string , object > alreadyAdded = new Dictionary < string , object > ( ) ;
2412+ AddMembersOfStruct ( autoCompleteList , alreadyAdded , scriptStructs , allStructsRef , addStatic , extenderOnly , isThis ) ;
2413+ }
23942414
2415+ private void AddMembersOfStruct ( List < string > autoCompleteList , Dictionary < string , object > alreadyAdded ,
2416+ List < ScriptStruct > scriptStructs , List < ScriptStruct > allStructsRef , bool addStatic , bool extenderOnly , bool isThis )
2417+ {
23952418 foreach ( ScriptStruct scriptStruct in scriptStructs )
23962419 {
23972420 foreach ( ScriptFunction sf in scriptStruct . Functions )
23982421 {
2399- if ( ( ( sf . IsStatic ) || ( ! staticOnly ) ) &&
2400- ( ( ! sf . IsStaticOnly ) || ( staticOnly ) ) &&
2401- ( ( ! sf . IsProtected ) || ( isThis ) ) &&
2422+ if ( ( ( addStatic && sf . IsStatic ) || ( ! addStatic && ! sf . IsStatic ) ) &&
2423+ ( ! extenderOnly || sf . IsExtenderMethod ) &&
2424+ ( isThis || ! sf . IsProtected ) &&
24022425 ShouldShowThis ( sf , null ) &&
24032426 ! alreadyAdded . ContainsKey ( sf . FunctionName ) )
24042427 {
@@ -2417,14 +2440,26 @@ private void AddMembersOfStruct(List<string> autoCompleteList, List<ScriptStruct
24172440 }
24182441 foreach ( ScriptVariable sv in scriptStruct . Variables )
24192442 {
2420- if ( ( ( sv . IsStatic ) || ( ! staticOnly ) ) &&
2421- ( ( ! sv . IsStaticOnly ) || ( staticOnly ) ) &&
2422- ( ( ! sv . IsProtected ) || ( isThis ) ) &&
2443+ if ( ( ( addStatic && sv . IsStatic ) || ( ! addStatic && ! sv . IsStatic ) ) &&
2444+ // TODO: support extender attributes here
2445+ ( ! extenderOnly ) && // variables cannot be extenders
2446+ ( isThis || ! sv . IsProtected ) &&
24232447 ShouldShowThis ( sv , null ) )
24242448 {
24252449 autoCompleteList . Add ( sv . VariableName + "?" + ( sv . IsStatic ? IMAGE_INDEX_STATIC_PROPERTY : IMAGE_INDEX_PROPERTY ) ) ;
24262450 }
24272451 }
2452+
2453+ // Add extenders of parent types separately, because they are not listed
2454+ // as child type members when parsing the script.
2455+ if ( ! string . IsNullOrEmpty ( scriptStruct . ParentType ) )
2456+ {
2457+ var parentStructs = allStructsRef . FindAll ( ( s ) => { return s . Name == scriptStruct . ParentType ; } ) ;
2458+ if ( parentStructs . Count > 0 )
2459+ {
2460+ AddMembersOfStruct ( autoCompleteList , alreadyAdded , parentStructs , allStructsRef , addStatic , true , isThis ) ;
2461+ }
2462+ }
24282463 }
24292464 }
24302465
@@ -2512,13 +2547,13 @@ private List<ScriptVariable> CheckFunctionForLocalVariables(int currentPos, Scri
25122547 return null ;
25132548 }
25142549
2515- private string ConstructScintillaAutocompleteList ( List < ScriptStruct > onlyMembersOf , bool staticOnly , bool isThis , string onlyIfMatchForThis )
2550+ private string ConstructScintillaAutocompleteList ( List < ScriptStruct > onlyMembersOf , List < ScriptStruct > allStructsRef , bool staticOnly , bool isThis , string onlyIfMatchForThis )
25162551 {
25172552 List < string > globalsList = new List < string > ( ) ;
25182553
25192554 if ( onlyMembersOf != null )
25202555 {
2521- AddMembersOfStruct ( globalsList , onlyMembersOf , staticOnly , isThis ) ;
2556+ AddMembersOfStruct ( globalsList , onlyMembersOf , allStructsRef , staticOnly , false , isThis ) ;
25222557 }
25232558 else
25242559 {
0 commit comments