Skip to content

Commit 67988b3

Browse files
committed
修改实现
1 parent c0c9782 commit 67988b3

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

EmmyLua-Common/src/main/java/com/tang/intellij/lua/editor/completion/StringInnerTypeCompletionProvider.kt

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)