@@ -62,7 +62,7 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
6262 innerType,
6363 searchContext,
6464 content.value
65- )?. let { prefixType ->
65+ ).forEach { prefixType ->
6666 addInnerClass(
6767 prefixType,
6868 getPrefix(content.value),
@@ -108,7 +108,11 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
108108 MemberCompletionMode .Dot ,
109109 project,
110110 object : HandlerProcessor () {
111- override fun process (element : LuaLookupElement , member : LuaClassMember , memberTy : ITy ? ): LookupElement {
111+ override fun process (
112+ element : LuaLookupElement ,
113+ member : LuaClassMember ,
114+ memberTy : ITy ?
115+ ): LookupElement {
112116 element.lookupString = prefix + element.lookupString
113117 return PrioritizedLookupElement .withPriority(element, 10.0 )
114118 }
@@ -118,7 +122,7 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
118122 }
119123 }
120124
121- private fun getPrefix (content : String ): String {
125+ private fun getPrefix (content : String ): String {
122126 if (! content.contains(' .' )) {
123127 return " "
124128 }
@@ -128,23 +132,41 @@ class StringInnerTypeCompletionProvider : ClassMemberCompletionProvider() {
128132 return indexFields.joinToString(" ." )
129133 }
130134
131- private fun guessPrefixType (baseType : ITyClass , context : SearchContext , content : String ): ITyClass ? {
132- if (! content.contains(' .' )) {
133- return baseType
135+ private fun guessPrefixType (baseType : ITy , context : SearchContext , content : String ): MutableList < ITyClass > {
136+ if (content.contains(' .' )) {
137+ return mutableListOf ()
134138 }
135139
136- var type = baseType
137- val indexFields = content.split(' .' )
138- for (i in 0 until indexFields.size - 1 ) {
139- val indexField = indexFields[i]
140- val member = type.findMember(indexField, context) ? : return null
141- val guessType = member.guessType(context)
142- if (guessType !is ITyClass ) {
143- return null
144- }
140+ val fields = content.split(' .' );
141+ val result = mutableListOf<ITyClass >()
142+ innerGuessPrefixType(baseType, context, fields, 0 , result)
143+ return result
144+ }
145+
146+ private fun innerGuessPrefixType (type : ITy , context : SearchContext , fields : List <String >, i : Int , result : MutableList <ITyClass >){
147+ when (type){
148+ is TyClass -> {
149+ val member = type.findMember(fields[i], context) ? : return ;
150+ val guessType = member.guessType(context)
151+ if (i == fields.size - 2 ){
152+ when (guessType){
153+ is ITyClass -> {
154+ result.add(guessType)
155+ }
156+ is TyUnion -> {
157+ guessType.eachTopClass(Processor {
158+ result.add(it)
159+ })
160+ }
161+ }
162+ }
163+ else {
164+ innerGuessPrefixType(guessType, context, fields, i + 1 , result)
165+ }
145166
146- type = guessType
167+ }
147168 }
148- return type
169+
170+
149171 }
150172}
0 commit comments