Skip to content

Commit 44c85cd

Browse files
committed
多重继承下的补全和引用
1 parent 565f2f7 commit 44c85cd

File tree

5 files changed

+127
-50
lines changed

5 files changed

+127
-50
lines changed

EmmyLua-Common/src/main/ext/com/tang/intellij/lua/editor/completion/LuaCompletionContributor.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,11 +184,19 @@ class LuaCompletionContributor : CompletionContributor() {
184184
psiElement(LuaTypes.ID).withParent(LuaTableField::class.java)
185185
)
186186

187-
private val SHOW_CONST_EXPR = psiElement(LuaTypes.ID)
188-
.withParent(
189-
psiElement(LuaNameExpr::class.java)
187+
private val SHOW_CONST_EXPR = psiElement().andOr(
188+
psiElement(LuaTypes.STRING)
189+
.withParent(
190+
psiElement(LuaTypes.LITERAL_EXPR).withParent(
191+
psiElement(LuaArgs::class.java)
192+
)
193+
),
194+
psiElement(LuaTypes.ID).withParent(
195+
psiElement(LuaTypes.NAME_EXPR)
190196
.withParent(psiElement(LuaArgs::class.java))
191197
)
198+
)
199+
192200

193201
private val IN_TABLE_STRING_INDEX = psiElement().andOr(
194202
// psiElement(LuaTypes.LITERAL_EXPR).withParent(

EmmyLua-Common/src/main/ext/com/tang/intellij/lua/stubs/index/LuaClassMemberIndex.kt

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.tang.intellij.lua.psi.LuaTableField
2525
import com.tang.intellij.lua.search.SearchContext
2626
import com.tang.intellij.lua.stubs.StubKeys
2727
import com.tang.intellij.lua.ty.ITyClass
28+
import com.tang.intellij.lua.ty.TyClass
2829
import com.tang.intellij.lua.ty.TyParameter
2930

3031
class LuaClassMemberIndex : StubIndex<Int, LuaClassMember>() {
@@ -40,7 +41,13 @@ class LuaClassMemberIndex : StubIndex<Int, LuaClassMember>() {
4041
return ContainerUtil.process(all, processor)
4142
}
4243

43-
fun process(className: String, fieldName: String, context: SearchContext, processor: Processor<LuaClassMember>, deep: Boolean = true): Boolean {
44+
fun process(
45+
className: String,
46+
fieldName: String,
47+
context: SearchContext,
48+
processor: Processor<LuaClassMember>,
49+
deep: Boolean = true
50+
): Boolean {
4451
val key = "$className*$fieldName"
4552
if (!process(key, context, processor))
4653
return false
@@ -57,11 +64,20 @@ class LuaClassMemberIndex : StubIndex<Int, LuaClassMember>() {
5764
if (!notFound)
5865
return false
5966

60-
// from supper
61-
val superClassName = type.superClassName
62-
if (superClassName != null && superClassName != className) {
63-
return process(superClassName, fieldName, context, processor)
67+
var founded = false
68+
TyClass.processSuperClass(type, context) { superType ->
69+
if(process(superType.className, fieldName, context, processor, false)){
70+
founded = true
71+
}
72+
true
6473
}
74+
return founded
75+
// from supper
76+
// val superClassName = type.superClassName
77+
// if (superClassName != null && superClassName != className) {
78+
// return process(superClassName, fieldName, context, processor)
79+
// }
80+
6581
}
6682
}
6783
return true
@@ -93,7 +109,12 @@ class LuaClassMemberIndex : StubIndex<Int, LuaClassMember>() {
93109
return perfect
94110
}
95111

96-
fun processAll(type: ITyClass, fieldName: String, context: SearchContext, processor: Processor<LuaClassMember>) {
112+
fun processAll(
113+
type: ITyClass,
114+
fieldName: String,
115+
context: SearchContext,
116+
processor: Processor<LuaClassMember>
117+
) {
97118
if (type is TyParameter)
98119
type.superClassName?.let { process(it, fieldName, context, processor) }
99120
else process(type.className, fieldName, context, processor)
@@ -108,7 +129,12 @@ class LuaClassMemberIndex : StubIndex<Int, LuaClassMember>() {
108129
}
109130
}
110131

111-
fun findMethod(className: String, memberName: String, context: SearchContext, deep: Boolean = true): LuaClassMethod? {
132+
fun findMethod(
133+
className: String,
134+
memberName: String,
135+
context: SearchContext,
136+
deep: Boolean = true
137+
): LuaClassMethod? {
112138
var target: LuaClassMethod? = null
113139
process(className, memberName, context, Processor {
114140
if (it is LuaClassMethod) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ open class ClassMemberCompletionProvider : LuaCompletionProvider() {
7070
7171
val matcher = completionResultSet.prefixMatcher.cloneWithPrefix(prefixName)
7272
LuaDeclarationTree.get(indexExpr.containingFile).walkUpLocal(indexExpr) { d ->
73-
val it = d.firstDeclaration.psi
73+
val it = d.firstDeclaration.psi0
7474
val txt = it.name
7575
if (it is LuaTypeGuessable && txt != null && prefixName != txt && matcher.prefixMatches(txt)) {
7676
val type = it.guessType(context)

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

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -66,37 +66,37 @@ class ConstExprProvider : LuaCompletionProvider() {
6666
}
6767
}
6868

69-
private fun addEnum(
70-
luaType: ITyClass,
71-
searchContext: SearchContext,
72-
completionResultSet: CompletionResultSet
73-
) {
74-
luaType.lazyInit(searchContext)
75-
luaType.processMembers(searchContext) { curType, member ->
76-
ProgressManager.checkCanceled()
77-
member.name?.let {
78-
val name = "${luaType.className}.${member.name}"
79-
if (completionResultSet.prefixMatcher.prefixMatches(name)) {
80-
addEnumField(completionResultSet, member, name, curType)
81-
}
82-
}
83-
84-
}
85-
}
86-
87-
private fun addEnumField(
88-
completionResultSet: CompletionResultSet,
89-
member: LuaClassMember,
90-
name: String,
91-
fieldType: ITyClass
92-
) {
93-
94-
if (member is LuaClassField) {
95-
val element =
96-
LookupElementFactory.createFieldLookupElement(fieldType.className, name, member, fieldType, true)
97-
element.kind = CompletionItemKind.Enum
98-
completionResultSet.addElement(element)
99-
}
100-
}
69+
// private fun addEnum(
70+
// luaType: ITyClass,
71+
// searchContext: SearchContext,
72+
// completionResultSet: CompletionResultSet
73+
// ) {
74+
// luaType.lazyInit(searchContext)
75+
// luaType.processMembers(searchContext) { curType, member ->
76+
// ProgressManager.checkCanceled()
77+
// member.name?.let {
78+
// val name = "${luaType.className}.${member.name}"
79+
// if (completionResultSet.prefixMatcher.prefixMatches(name)) {
80+
// addEnumField(completionResultSet, member, name, curType)
81+
// }
82+
// }
83+
//
84+
// }
85+
// }
86+
//
87+
// private fun addEnumField(
88+
// completionResultSet: CompletionResultSet,
89+
// member: LuaClassMember,
90+
// name: String,
91+
// fieldType: ITyClass
92+
// ) {
93+
//
94+
// if (member is LuaClassField) {
95+
// val element =
96+
// LookupElementFactory.createFieldLookupElement(fieldType.className, name, member, fieldType, true)
97+
// element.kind = CompletionItemKind.Enum
98+
// completionResultSet.addElement(element)
99+
// }
100+
// }
101101

102102
}

EmmyLua-Common/src/main/java/com/tang/intellij/lua/ty/TyClass.kt

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ interface ITyClass : ITy {
3939
var superClassName: String?
4040
var interfaceNames: List<String>?
4141
var aliasName: String?
42+
var isInterface: Boolean
4243
fun processAlias(processor: Processor<String>): Boolean
4344
fun lazyInit(searchContext: SearchContext)
4445
fun processMembers(context: SearchContext, processor: (ITyClass, LuaClassMember) -> Unit, deep: Boolean = true)
@@ -108,10 +109,10 @@ abstract class TyClass(
108109
override val className: String,
109110
override val varName: String = "",
110111
override var superClassName: String? = null,
111-
override var interfaceNames: List<String>? = null
112+
override var interfaceNames: List<String>? = null,
113+
override var isInterface: Boolean = false
112114
) : Ty(TyKind.Class), ITyClass {
113115
final override var aliasName: String? = null
114-
115116
private var _lazyInitialized: Boolean = false
116117

117118
override fun equals(other: Any?): Boolean {
@@ -210,16 +211,18 @@ abstract class TyClass(
210211
}
211212

212213
override fun getInterfaces(context: SearchContext): List<ITy>? {
213-
if(interfaceNames == null) {
214+
if (interfaceNames == null) {
214215
return null
215216
}
216217

217218
val result = mutableListOf<ITy>()
218219
interfaceNames!!.forEach {
219-
val ty = Ty.getBuiltin(it) ?: LuaShortNamesManager.getInstance(context.project)
220-
.findClass(it, context)?.type
221-
if(ty != null){
222-
result.add(ty)
220+
if (it != superClassName) {
221+
val ty = Ty.getBuiltin(it) ?: LuaShortNamesManager.getInstance(context.project)
222+
.findClass(it, context)?.type
223+
if (ty != null) {
224+
result.add(ty)
225+
}
223226
}
224227
}
225228
return result
@@ -289,6 +292,43 @@ abstract class TyClass(
289292
}
290293
cur = cls
291294
}
295+
return processInterface(start, searchContext, processor)
296+
}
297+
298+
fun processInterface(
299+
cls: ITyClass,
300+
searchContext: SearchContext,
301+
processor: (ITyClass) -> Boolean
302+
): Boolean {
303+
val processedName = mutableSetOf<String>()
304+
return innerProcessorInterface(cls, searchContext, processedName, processor)
305+
}
306+
307+
private fun innerProcessorInterface(
308+
cls: ITyClass,
309+
searchContext: SearchContext,
310+
processName: MutableSet<String>,
311+
processor: (ITyClass) -> Boolean
312+
): Boolean {
313+
val interfaces = cls.getInterfaces(searchContext)
314+
if (interfaces != null) {
315+
for (tyInterface in interfaces) {
316+
if (tyInterface is ITyClass) {
317+
if (!processName.add(tyInterface.className)) {
318+
continue
319+
}
320+
321+
if (!processor(tyInterface)) {
322+
return false
323+
}
324+
325+
if (!innerProcessorInterface(tyInterface, searchContext, processName, processor)) {
326+
return false
327+
}
328+
}
329+
}
330+
}
331+
292332
return true
293333
}
294334
}
@@ -305,6 +345,9 @@ class TyPsiDocClass(tagClass: LuaDocTagClass) : TyClass(tagClass.name) {
305345
interfaceNames = classList.map { it.text }
306346
}
307347
}
348+
if(tagClass.`interface` != null){
349+
isInterface = true
350+
}
308351

309352
aliasName = tagClass.aliasName
310353
}

0 commit comments

Comments
 (0)