FIR LC: create inline methods

unless the functions (or accessors) have reified type parameters
or inline-only annotations
This commit is contained in:
Jinseong Jeon
2021-12-28 15:08:22 -08:00
committed by Ilya Kirillov
parent 2954769296
commit a153a1fefb
4 changed files with 15 additions and 10 deletions
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.analysis.api.scopes.KtScope
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclarations
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
import org.jetbrains.kotlin.light.classes.symbol.classes.analyseForLightClasses
import org.jetbrains.kotlin.light.classes.symbol.classes.createField
@@ -92,6 +92,7 @@ class FirLightClassForFacade(
for (callableSymbol in fileSymbol.getFileScope().getCallableSymbols()) {
if (callableSymbol !is KtFunctionSymbol && callableSymbol !is KtKotlinPropertySymbol) continue
if (callableSymbol !is KtSymbolWithVisibility) continue
if ((callableSymbol as? KtAnnotatedSymbol)?.hasInlineOnlyAnnotation() == true) continue
val isPrivate = callableSymbol.toPsiVisibilityForMember(isTopLevel = true) == PsiModifier.PRIVATE
if (isPrivate && multiFileClass) continue
yield(callableSymbol)
@@ -13,6 +13,7 @@ import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.analysis.providers.createProjectWideOutOfBlockModificationTracker
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithTypeParameters
import org.jetbrains.kotlin.analysis.api.symbols.markers.isPrivateOrPrivateToThis
import org.jetbrains.kotlin.analysis.api.tokens.HackToForceAllowRunningAnalyzeOnEDT
import org.jetbrains.kotlin.analysis.api.tokens.hackyAllowRunningOnEdt
@@ -192,7 +193,10 @@ internal fun FirLightClassBase.createMethods(
fun handleDeclaration(declaration: KtCallableSymbol) {
when (declaration) {
is KtFunctionSymbol -> {
if (declaration.isInline || declaration.isHiddenOrSynthetic(project)) return
// TODO: check if it has expect modifier
if (declaration.hasReifiedParameters ||
declaration.isHiddenOrSynthetic(project)
) return
var methodIndex = METHOD_INDEX_BASE
result.add(
@@ -259,7 +263,7 @@ internal fun FirLightClassBase.createPropertyAccessors(
if (declaration.hasJvmFieldAnnotation()) return
fun KtPropertyAccessorSymbol.needToCreateAccessor(siteTarget: AnnotationUseSiteTarget): Boolean {
if (isInline) return false
if (declaration.hasReifiedParameters) return false
if (!hasBody && visibility.isPrivateOrPrivateToThis()) return false
if (declaration.isHiddenOrSynthetic(project, siteTarget)) return false
if (isHiddenOrSynthetic(project)) return false
@@ -443,3 +447,6 @@ internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject,
}
}
}
private val KtSymbolWithTypeParameters.hasReifiedParameters: Boolean
get() = typeParameters.any { it.isReified }
@@ -1,7 +0,0 @@
public final class A /* A*/ {
@kotlin.PublishedApi()
public final int access$test(int);// access$test(int)
public A();// .ctor()
}
@@ -1,4 +1,8 @@
public final class A /* A*/ {
@kotlin.Suppress(names = "INVISIBLE_REFERENCE")
@kotlin.internal.InlineOnly()
private final void foo();// foo()
public A();// .ctor()
}