@@ -1780,10 +1780,28 @@ private void ShowStructMemberAutoComplete()
17801780
17811781 if ( foundType != null )
17821782 {
1783- ShowAutoComplete ( charactersAfterDot . Length , ConstructScintillaAutocompleteList ( GetAllStructsWithMatchingName ( foundType . Name ) , staticAccess , isThis , null ) ) ;
1783+ // NOTE: we display members not just for 1 struct, but for all registered structs
1784+ // with the matching names, because of how local script's extender functions are registered:
1785+ // they are gathered separately into a locally declared struct, which may duplicate existing global struct.
1786+ var allStructs = GetAllStructs ( ) ;
1787+ var forStructs = GetAllStructsWithMatchingName ( foundType . Name ) ;
1788+ ShowAutoComplete ( charactersAfterDot . Length , ConstructScintillaAutocompleteList ( forStructs , allStructs , staticAccess , isThis , null ) ) ;
17841789 }
17851790 }
17861791
1792+ private List < ScriptStruct > GetAllStructs ( )
1793+ {
1794+ List < ScriptStruct > allTypes = new List < ScriptStruct > ( ) ;
1795+ foreach ( IScript script in GetAutoCompleteScriptList ( ) )
1796+ {
1797+ foreach ( ScriptStruct structDef in script . AutoCompleteData . Structs )
1798+ {
1799+ allTypes . Add ( structDef ) ;
1800+ }
1801+ }
1802+ return allTypes ;
1803+ }
1804+
17871805 private List < ScriptStruct > GetAllStructsWithMatchingName ( string structName )
17881806 {
17891807 List < ScriptStruct > matchingTypes = new List < ScriptStruct > ( ) ;
@@ -1973,7 +1991,7 @@ private void ShowAutoCompleteIfAppropriate(int minimumLength)
19731991 {
19741992 needMatch = null ;
19751993 }
1976- ShowAutoComplete ( previousWord . Length , ConstructScintillaAutocompleteList ( null , false , false , needMatch ) ) ;
1994+ ShowAutoComplete ( previousWord . Length , ConstructScintillaAutocompleteList ( null , null , false , false , needMatch ) ) ;
19771995 }
19781996 }
19791997 }
@@ -2380,17 +2398,22 @@ private void AddGlobalsFromScript(List<string> globalsList, IScript script, Dict
23802398 }
23812399 }
23822400
2383- private void AddMembersOfStruct ( List < string > autoCompleteList , List < ScriptStruct > scriptStructs , bool staticOnly , bool isThis )
2401+ private void AddMembersOfStruct ( List < string > autoCompleteList , List < ScriptStruct > scriptStructs , List < ScriptStruct > allStructsRef , bool addStatic , bool extenderOnly , bool isThis )
23842402 {
23852403 Dictionary < string , object > alreadyAdded = new Dictionary < string , object > ( ) ;
2404+ AddMembersOfStruct ( autoCompleteList , alreadyAdded , scriptStructs , allStructsRef , addStatic , extenderOnly , isThis ) ;
2405+ }
23862406
2407+ private void AddMembersOfStruct ( List < string > autoCompleteList , Dictionary < string , object > alreadyAdded ,
2408+ List < ScriptStruct > scriptStructs , List < ScriptStruct > allStructsRef , bool addStatic , bool extenderOnly , bool isThis )
2409+ {
23872410 foreach ( ScriptStruct scriptStruct in scriptStructs )
23882411 {
23892412 foreach ( ScriptFunction sf in scriptStruct . Functions )
23902413 {
2391- if ( ( ( sf . IsStatic ) || ( ! staticOnly ) ) &&
2392- ( ( ! sf . IsStaticOnly ) || ( staticOnly ) ) &&
2393- ( ( ! sf . IsProtected ) || ( isThis ) ) &&
2414+ if ( ( ( addStatic && sf . IsStatic ) || ( ! addStatic && ! sf . IsStatic ) ) &&
2415+ ( ! extenderOnly || sf . IsExtenderMethod ) &&
2416+ ( isThis || ! sf . IsProtected ) &&
23942417 ShouldShowThis ( sf , null ) &&
23952418 ! alreadyAdded . ContainsKey ( sf . FunctionName ) )
23962419 {
@@ -2409,14 +2432,26 @@ private void AddMembersOfStruct(List<string> autoCompleteList, List<ScriptStruct
24092432 }
24102433 foreach ( ScriptVariable sv in scriptStruct . Variables )
24112434 {
2412- if ( ( ( sv . IsStatic ) || ( ! staticOnly ) ) &&
2413- ( ( ! sv . IsStaticOnly ) || ( staticOnly ) ) &&
2414- ( ( ! sv . IsProtected ) || ( isThis ) ) &&
2435+ if ( ( ( addStatic && sv . IsStatic ) || ( ! addStatic && ! sv . IsStatic ) ) &&
2436+ // TODO: support extender attributes here
2437+ ( ! extenderOnly ) && // variables cannot be extenders
2438+ ( isThis || ! sv . IsProtected ) &&
24152439 ShouldShowThis ( sv , null ) )
24162440 {
24172441 autoCompleteList . Add ( sv . VariableName + "?" + ( sv . IsStatic ? IMAGE_INDEX_STATIC_PROPERTY : IMAGE_INDEX_PROPERTY ) ) ;
24182442 }
24192443 }
2444+
2445+ // Add extenders of parent types separately, because they are not listed
2446+ // as child type members when parsing the script.
2447+ if ( ! string . IsNullOrEmpty ( scriptStruct . ParentType ) )
2448+ {
2449+ var parentStructs = allStructsRef . FindAll ( ( s ) => { return s . Name == scriptStruct . ParentType ; } ) ;
2450+ if ( parentStructs . Count > 0 )
2451+ {
2452+ AddMembersOfStruct ( autoCompleteList , alreadyAdded , parentStructs , allStructsRef , addStatic , true , isThis ) ;
2453+ }
2454+ }
24202455 }
24212456 }
24222457
@@ -2504,13 +2539,13 @@ private List<ScriptVariable> CheckFunctionForLocalVariables(int currentPos, Scri
25042539 return null ;
25052540 }
25062541
2507- private string ConstructScintillaAutocompleteList ( List < ScriptStruct > onlyMembersOf , bool staticOnly , bool isThis , string onlyIfMatchForThis )
2542+ private string ConstructScintillaAutocompleteList ( List < ScriptStruct > onlyMembersOf , List < ScriptStruct > allStructsRef , bool staticOnly , bool isThis , string onlyIfMatchForThis )
25082543 {
25092544 List < string > globalsList = new List < string > ( ) ;
25102545
25112546 if ( onlyMembersOf != null )
25122547 {
2513- AddMembersOfStruct ( globalsList , onlyMembersOf , staticOnly , isThis ) ;
2548+ AddMembersOfStruct ( globalsList , onlyMembersOf , allStructsRef , staticOnly , false , isThis ) ;
25142549 }
25152550 else
25162551 {
0 commit comments