@@ -21,16 +21,19 @@ import org.jacodb.api.ext.findClass
2121import org.jacodb.api.ext.packageName
2222import org.jacodb.api.ext.toType
2323import org.jacodb.impl.bytecode.TypeDelegatingLookup
24- import org.jacodb.impl.types.signature.*
25- import org.jacodb.impl.types.substition.JcSubstitutor
26- import org.jacodb.impl.types.substition.substitute
24+ import org.jacodb.impl.types.signature.JvmClassRefType
25+ import org.jacodb.impl.types.signature.JvmParameterizedType
26+ import org.jacodb.impl.types.signature.TypeResolutionImpl
27+ import org.jacodb.impl.types.signature.TypeSignature
28+ import org.jacodb.impl.types.substition.JcSubstitutorImpl
29+ import org.jacodb.impl.types.substition.SafeSubstitution
2730import kotlin.LazyThreadSafetyMode.PUBLICATION
2831
2932class JcClassTypeImpl (
3033 override val classpath : JcClasspath ,
3134 val name : String ,
3235 override val outerType : JcClassTypeImpl ? = null ,
33- private val substitutor : JcSubstitutor = JcSubstitutor .empty,
36+ private val substitutor : JcSubstitutor = JcSubstitutorImpl .empty,
3437 override val nullable : Boolean? ,
3538 override val annotations : List <JcAnnotation >
3639) : JcClassType {
@@ -133,7 +136,7 @@ class JcClassTypeImpl(
133136 outerMethod?.allVisibleTypeParameters() ? : outerClass?.allVisibleTypeParameters()
134137 )?.values?.toList().orEmpty()
135138 val innerSubstitutor = when {
136- it.isStatic -> JcSubstitutor .empty.newScope(innerParameters)
139+ it.isStatic -> JcSubstitutorImpl .empty.newScope(innerParameters)
137140 else -> substitutor.newScope(innerParameters)
138141 }
139142 JcClassTypeImpl (classpath, it.name, this , innerSubstitutor, true , annotations)
@@ -247,7 +250,7 @@ class JcClassTypeImpl(
247250 val superParameters = superClass.directTypeParameters()
248251 val substitutions = (superType as ? JvmParameterizedType )?.parameterTypes
249252 if (substitutions == null || superParameters.size != substitutions.size) {
250- return JcSubstitutor .empty
253+ return JcSubstitutorImpl .empty
251254 }
252255 return substitutor.fork(superParameters.mapIndexed { index, declaration -> declaration to substitutions[index] }
253256 .toMap())
@@ -256,6 +259,15 @@ class JcClassTypeImpl(
256259
257260}
258261
262+ private fun JcClasspath.substitute (
263+ name : String ,
264+ parameters : List <JvmType >,
265+ substitutor : JcSubstitutor ?
266+ ): JcSubstitutor {
267+ val genericsSubstitutor = features?.firstNotNullOfOrNull { it as ? JcGenericsSubstitutionFeature } ? : SafeSubstitution
268+ return genericsSubstitutor.substitute(findClass(name), parameters, substitutor)
269+ }
270+
259271fun JvmType.isReferencesClass (name : String ): Boolean {
260272 return when (val type = this ) {
261273 is JvmClassRefType -> type.name == name
0 commit comments