FIR: Check relativeClassName of found class in JavaSymbolProvider

`ClassId` denotes how class is nested; however, you can find
`foo/bar/Outer.Nested` class by `ClassId(foo/bar/Outer/Nested)`. This
will lead to inconsistencies when working with class symbol later

This is also important to `FirQualifierResolverImpl::resolveSymbol`
which detects correct `ClassId` by traversing all symbol qualifiers

We check only `relativeClassName`, because we want to be able to find
classes without package specified

Also, fix test data of resolve tests that have been passing because of
check absence
This commit is contained in:
Roman Golyshev
2020-12-24 15:03:54 +03:00
parent 2ce51a4c11
commit f00e5b1992
2 changed files with 17 additions and 7 deletions
@@ -134,9 +134,9 @@ class JavaSymbolProvider(
classId, classId,
{ {
val foundClass = findClass(classId, content) val foundClass = findClass(classId, content)
if (foundClass == null || foundClass.annotations.any { if (foundClass == null ||
it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME foundClass.hasDifferentRelativeClassName(classId) ||
} foundClass.hasMetadataAnnotation()
) { ) {
null to null null to null
} else { } else {
@@ -148,6 +148,16 @@ class JavaSymbolProvider(
} }
} }
/**
* We do not check the package because we can look for the class in the same package by class name without package specified.
* In this case, found [JavaClass] may have different `packageFqName`, but not `relativeClassName`.
*/
private fun JavaClass.hasDifferentRelativeClassName(lookupClassId: ClassId): Boolean =
classId?.relativeClassName != lookupClassId.relativeClassName
private fun JavaClass.hasMetadataAnnotation(): Boolean =
annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }
private class ValueParametersForAnnotationConstructor { private class ValueParametersForAnnotationConstructor {
val valueParameters: MutableList<FirJavaValueParameter> = mutableListOf() val valueParameters: MutableList<FirJavaValueParameter> = mutableListOf()
var valueParameterForValue: FirJavaValueParameter? = null var valueParameterForValue: FirJavaValueParameter? = null
@@ -1,19 +1,19 @@
// RUNTIME // RUNTIME
class: java.lang.String class: java/lang/String
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirClassOrObjectSymbol:
annotations: [] annotations: []
classIdIfNonLocal: java.lang.String classIdIfNonLocal: java/lang/String
classKind: CLASS classKind: CLASS
companionObject: null companionObject: null
isInner: true isInner: false
modality: FINAL modality: FINAL
name: String name: String
origin: JAVA origin: JAVA
primaryConstructor: null primaryConstructor: null
superTypes: [[] kotlin/Any, [] java/io/Serializable, [] kotlin/Comparable<ft<@FlexibleNullability kotlin/String, kotlin/String?>!>, [] kotlin/CharSequence] superTypes: [[] kotlin/Any, [] java/io/Serializable, [] kotlin/Comparable<ft<@FlexibleNullability kotlin/String, kotlin/String?>!>, [] kotlin/CharSequence]
symbolKind: MEMBER symbolKind: TOP_LEVEL
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC