K2: Fix Java enhancement when jsr305.jar is not in classpath
In that case, when loading Java, we just remember the name of `@Nonnull` argument (javax.annotation.meta.When), and then use it during enhancement ^KT-56656 Fixed
This commit is contained in:
committed by
Space Team
parent
955b8e1490
commit
644391a8e0
+13
-1
@@ -12,8 +12,11 @@ import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.convertAnnotationsToFir
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
|
||||
import org.jetbrains.kotlin.fir.references.FirFromMissingDependenciesNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.load.java.AbstractAnnotationTypeQualifierResolver
|
||||
import org.jetbrains.kotlin.load.java.JavaModuleAnnotationsProvider
|
||||
import org.jetbrains.kotlin.load.java.JavaTypeEnhancementState
|
||||
@@ -48,7 +51,16 @@ class FirAnnotationTypeQualifierResolver(
|
||||
when (this) {
|
||||
is FirArrayOfCall -> arguments.flatMap { it.toEnumNames() }
|
||||
is FirVarargArgumentsExpression -> arguments.flatMap { it.toEnumNames() }
|
||||
else -> listOfNotNull(toResolvedCallableSymbol()?.callableId?.callableName?.asString())
|
||||
else -> {
|
||||
val name = when (val reference = toReference()) {
|
||||
is FirResolvedNamedReference ->
|
||||
(reference.resolvedSymbol as? FirCallableSymbol<*>)?.callableId?.callableName?.asString()
|
||||
is FirFromMissingDependenciesNamedReference -> reference.name.asString()
|
||||
else -> null
|
||||
}
|
||||
|
||||
listOfNotNull(name)
|
||||
}
|
||||
}
|
||||
|
||||
fun extractDefaultQualifiers(firClass: FirRegularClass): JavaTypeQualifiersByElementType? {
|
||||
|
||||
@@ -13,10 +13,15 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.buildUnaryArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.builder.*
|
||||
import org.jetbrains.kotlin.fir.java.declarations.buildJavaValueParameter
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildFromMissingDependenciesNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference
|
||||
import org.jetbrains.kotlin.fir.resolve.bindSymbolToLookupTag
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError
|
||||
@@ -133,7 +138,7 @@ private val JAVA_TARGETS_TO_KOTLIN = mapOf(
|
||||
|
||||
private fun buildEnumCall(session: FirSession, classId: ClassId?, entryName: Name?): FirPropertyAccessExpression {
|
||||
return buildPropertyAccessExpression {
|
||||
val calleeReference = if (classId != null && entryName != null) {
|
||||
val resolvedCalleeReference: FirResolvedNamedReference? = if (classId != null && entryName != null) {
|
||||
session.symbolProvider.getClassDeclaredPropertySymbols(classId, entryName)
|
||||
.firstOrNull()?.let { propertySymbol ->
|
||||
buildResolvedNamedReference {
|
||||
@@ -144,9 +149,18 @@ private fun buildEnumCall(session: FirSession, classId: ClassId?, entryName: Nam
|
||||
} else {
|
||||
null
|
||||
}
|
||||
this.calleeReference = calleeReference ?: buildErrorNamedReference {
|
||||
diagnostic = ConeSimpleDiagnostic("Strange Java enum value: $classId.$entryName", DiagnosticKind.Java)
|
||||
}
|
||||
|
||||
this.calleeReference =
|
||||
resolvedCalleeReference
|
||||
// if we haven't found the containing class for the entry in the classpath, let's just remember its name, so we could use it,
|
||||
// e.g. during Java enhancement
|
||||
?: entryName?.let {
|
||||
buildFromMissingDependenciesNamedReference {
|
||||
name = entryName
|
||||
}
|
||||
} ?: buildErrorNamedReference {
|
||||
diagnostic = ConeSimpleDiagnostic("Enum entry name is null in Java for $classId", DiagnosticKind.Java)
|
||||
}
|
||||
|
||||
if (classId != null) {
|
||||
this.typeRef = buildResolvedTypeRef {
|
||||
|
||||
Reference in New Issue
Block a user