Do not try to create a light class for classes in unexpected positions
Example of such class declaration would be `10 < class A` expression The expression is uncompilable, but parsable. Unfortunately, the FIR compiler does not save `class A` reference in it (because it is not an expression, and only an expression can be a LHS or RHS of binary expression `10 < ...`) When we try to build light classes, we will try to find/build FIR declaration for this class, but we won't be able to, and this will throw an error Adding this check should fix few `FirKotlinHighlightingPassTestGenerated$Regression` tests
This commit is contained in:
+18
@@ -570,6 +570,7 @@ fun KtClassOrObject.shouldNotBeVisibleAsLightClass(): Boolean {
|
|||||||
if (isLocal) {
|
if (isLocal) {
|
||||||
if (containingFile.virtualFile == null) return true
|
if (containingFile.virtualFile == null) return true
|
||||||
if (hasParseErrorsAround(this) || PsiUtilCore.hasErrorElementChild(this)) return true
|
if (hasParseErrorsAround(this) || PsiUtilCore.hasErrorElementChild(this)) return true
|
||||||
|
if (classDeclaredInUnexpectedPosition(this)) return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isEnumEntryWithoutBody(this)) {
|
if (isEnumEntryWithoutBody(this)) {
|
||||||
@@ -579,6 +580,23 @@ fun KtClassOrObject.shouldNotBeVisibleAsLightClass(): Boolean {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If class is declared in some strange context (for example, in expression like `10 < class A`),
|
||||||
|
* we don't want to try to build a light class for it.
|
||||||
|
*
|
||||||
|
* The expression itself is incorrect and won't compile, but the parser is able the parse the class nonetheless.
|
||||||
|
*
|
||||||
|
* This does not concern objects, since object literals are expressions and can be used almost anywhere.
|
||||||
|
*/
|
||||||
|
private fun classDeclaredInUnexpectedPosition(classOrObject: KtClassOrObject): Boolean {
|
||||||
|
if (classOrObject is KtObjectDeclaration) return false
|
||||||
|
|
||||||
|
val classParent = classOrObject.parent
|
||||||
|
|
||||||
|
return classParent !is KtBlockExpression &&
|
||||||
|
classParent !is KtDeclarationContainer
|
||||||
|
}
|
||||||
|
|
||||||
private fun isEnumEntryWithoutBody(classOrObject: KtClassOrObject): Boolean {
|
private fun isEnumEntryWithoutBody(classOrObject: KtClassOrObject): Boolean {
|
||||||
if (classOrObject !is KtEnumEntry) {
|
if (classOrObject !is KtEnumEntry) {
|
||||||
return false
|
return false
|
||||||
|
|||||||
Reference in New Issue
Block a user