Skip to content

Commit da0aa69

Browse files
committed
performance! lazy guess ty of function
1 parent 576ac4c commit da0aa69

File tree

2 files changed

+66
-40
lines changed

2 files changed

+66
-40
lines changed

src/main/java/com/tang/intellij/lua/editor/completion/LookupElement.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,31 @@ class TyFunctionLookupElement(name: String,
108108
val ty: ITyFunction,
109109
icon: Icon
110110
) : LuaLookupElement(name, bold, icon) {
111-
init {
111+
/*init {
112112
val list = mutableListOf<String>()
113113
signature.processArgs(null, colonStyle) { _, param ->
114114
list.add(param.name)
115115
true
116116
}
117117
itemText = lookupString + "(${list.joinToString(", ")})"
118118
typeText = signature.returnTy.displayName
119+
}*/
120+
121+
private val lazyTypeText by lazy { signature.returnTy.displayName }
122+
123+
override fun getTypeText() = lazyTypeText
124+
125+
private val lazyItemText by lazy {
126+
val list = mutableListOf<String>()
127+
signature.processArgs(null, colonStyle) { _, param ->
128+
list.add(param.name)
129+
true
130+
}
131+
"$lookupString(${list.joinToString(", ")})"
119132
}
120133

134+
override fun getItemText() = lazyItemText
135+
121136
/**
122137
* https://github.com/tangzx/IntelliJ-EmmyLua/issues/54
123138
*/

src/main/java/com/tang/intellij/lua/ty/TyFunction.kt

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,9 @@ fun IFunSignature.hasVarArgs(): Boolean {
9494

9595
fun IFunSignature.isGeneric() = tyParameters.isNotEmpty()
9696

97-
class FunSignature(override val selfCall: Boolean,
98-
override val returnTy: ITy,
99-
override val params: Array<LuaParamInfo>,
100-
override val tyParameters: List<TyParameter> = emptyList()
97+
abstract class FunSignatureBase(override val selfCall: Boolean,
98+
override val params: Array<LuaParamInfo>,
99+
override val tyParameters: List<TyParameter> = emptyList()
101100
) : IFunSignature {
102101
override fun equals(other: Any?): Boolean {
103102
if (other is IFunSignature) {
@@ -107,13 +106,42 @@ class FunSignature(override val selfCall: Boolean,
107106
}
108107

109108
override fun hashCode(): Int {
110-
var code = returnTy.hashCode()
109+
var code = 0//returnTy.hashCode()
111110
params.forEach {
112111
code += it.ty.hashCode() * 31
113112
}
114113
return code
115114
}
116115

116+
override val displayName: String by lazy {
117+
val paramSB = mutableListOf<String>()
118+
params.forEach {
119+
paramSB.add(it.name + ":" + it.ty.displayName)
120+
}
121+
"fun(${paramSB.joinToString(", ")}):${returnTy.displayName}"
122+
}
123+
124+
override val paramSignature: String get() {
125+
val list = arrayOfNulls<String>(params.size)
126+
for (i in params.indices) {
127+
val lpi = params[i]
128+
list[i] = lpi.name
129+
}
130+
return "(" + list.joinToString(", ") + ")"
131+
}
132+
133+
override fun substitute(substitutor: ITySubstitutor): IFunSignature {
134+
val list = params.map { it.substitute(substitutor) }
135+
return FunSignature(selfCall, returnTy.substitute(substitutor), list.toTypedArray())
136+
}
137+
}
138+
139+
class FunSignature(selfCall: Boolean,
140+
override val returnTy: ITy,
141+
params: Array<LuaParamInfo>,
142+
tyParameters: List<TyParameter> = emptyList()
143+
) : FunSignatureBase(selfCall, params, tyParameters) {
144+
117145
companion object {
118146
private fun initParams(func: LuaDocFunctionTy): Array<LuaParamInfo> {
119147
val list = mutableListOf<LuaParamInfo>()
@@ -143,28 +171,6 @@ class FunSignature(override val selfCall: Boolean,
143171
return FunSignature(selfCall, ret, params)
144172
}
145173
}
146-
147-
override val displayName: String by lazy {
148-
val paramSB = mutableListOf<String>()
149-
params.forEach {
150-
paramSB.add(it.name + ":" + it.ty.displayName)
151-
}
152-
"fun(${paramSB.joinToString(", ")}):${returnTy.displayName}"
153-
}
154-
155-
override val paramSignature: String get() {
156-
val list = arrayOfNulls<String>(params.size)
157-
for (i in params.indices) {
158-
val lpi = params[i]
159-
list[i] = lpi.name
160-
}
161-
return "(" + list.joinToString(", ") + ")"
162-
}
163-
164-
override fun substitute(substitutor: ITySubstitutor): IFunSignature {
165-
val list = params.map { it.substitute(substitutor) }
166-
return FunSignature(selfCall, returnTy.substitute(substitutor), list.toTypedArray())
167-
}
168174
}
169175

170176
interface ITyFunction : ITy {
@@ -244,17 +250,6 @@ class TyPsiFunction(private val selfCall: Boolean, val psi: LuaFuncBodyOwner, se
244250
}
245251

246252
override val mainSignature: IFunSignature by lazy {
247-
var returnTy = psi.guessReturnType(searchContext)
248-
/**
249-
* todo optimize this bug solution
250-
* local function test()
251-
* return test
252-
* end
253-
* -- will crash after type `test`
254-
*/
255-
if (returnTy is TyPsiFunction && returnTy.psi == psi) {
256-
returnTy = Ty.UNKNOWN
257-
}
258253

259254
//TODO: cause reparse psi !
260255
if (LuaSettings.instance.enableGeneric) {
@@ -263,7 +258,23 @@ class TyPsiFunction(private val selfCall: Boolean, val psi: LuaFuncBodyOwner, se
263258
genericDefList?.forEach { it.name?.let { name -> list.add(TyParameter(name, it.classNameRef?.resolveType())) } }
264259
}
265260

266-
FunSignature(selfCall, returnTy, psi.params)
261+
object : FunSignatureBase(selfCall, psi.params) {
262+
override val returnTy: ITy by lazy {
263+
var returnTy = psi.guessReturnType(searchContext)
264+
/**
265+
* todo optimize this bug solution
266+
* local function test()
267+
* return test
268+
* end
269+
* -- will crash after type `test`
270+
*/
271+
if (returnTy is TyPsiFunction && returnTy.psi == psi) {
272+
returnTy = Ty.UNKNOWN
273+
}
274+
275+
returnTy
276+
}
277+
}
267278
}
268279

269280
override val signatures: Array<IFunSignature> by lazy {

0 commit comments

Comments
 (0)