@@ -94,10 +94,9 @@ fun IFunSignature.hasVarArgs(): Boolean {
9494
9595fun 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
170176interface 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