Remove obsolete InlineStrategy

Replace corresponding metadata property in js.ast with Boolean. This
allows to get rid of dependency of 'js.ast' on 'frontend'.
This commit is contained in:
Alexander Udalov
2020-03-15 13:57:03 +01:00
committed by Alexander Udalov
parent 4156a9c80b
commit 8dd04789ad
12 changed files with 44 additions and 101 deletions
@@ -1,27 +0,0 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.resolve.inline;
public enum InlineStrategy {
AS_FUNCTION,
IN_PLACE,
NOT_INLINE;
public boolean isInline() {
return this != NOT_INLINE;
}
}
@@ -45,7 +45,7 @@ public class InlineUtil {
} }
public static boolean isInline(@Nullable DeclarationDescriptor descriptor) { public static boolean isInline(@Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof FunctionDescriptor && getInlineStrategy((FunctionDescriptor) descriptor).isInline(); return descriptor instanceof FunctionDescriptor && ((FunctionDescriptor) descriptor).isInline();
} }
public static boolean hasInlineAccessors(@NotNull PropertyDescriptor propertyDescriptor) { public static boolean hasInlineAccessors(@NotNull PropertyDescriptor propertyDescriptor) {
@@ -74,15 +74,6 @@ public class InlineUtil {
return isInlineOrContainingInline(descriptor.getContainingDeclaration()); return isInlineOrContainingInline(descriptor.getContainingDeclaration());
} }
@NotNull
private static InlineStrategy getInlineStrategy(@NotNull FunctionDescriptor descriptor) {
if (descriptor.isInline()) {
return InlineStrategy.AS_FUNCTION;
}
return InlineStrategy.NOT_INLINE;
}
public static boolean checkNonLocalReturnUsage( public static boolean checkNonLocalReturnUsage(
@NotNull DeclarationDescriptor fromFunction, @NotNull DeclarationDescriptor fromFunction,
@NotNull KtExpression startExpression, @NotNull KtExpression startExpression,
+1 -4
View File
@@ -1,12 +1,10 @@
plugins { plugins {
kotlin("jvm") kotlin("jvm")
id("jps-compatible") id("jps-compatible")
} }
dependencies { dependencies {
compile(project(":compiler:util")) compile(project(":core:descriptors"))
compile(project(":compiler:frontend"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core") } compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
compileOnly(intellijDep()) { includeJars("trove4j") } compileOnly(intellijDep()) { includeJars("trove4j") }
} }
@@ -15,4 +13,3 @@ sourceSets {
"main" { projectDefault() } "main" { projectDefault() }
"test" {} "test" {}
} }
@@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
var JsName.staticRef: JsNode? by MetadataProperty(default = null) var JsName.staticRef: JsNode? by MetadataProperty(default = null)
@@ -38,8 +37,7 @@ var JsName.specialFunction: SpecialFunction? by MetadataProperty(default = null)
var JsExpression.localAlias: JsImportedModule? by MetadataProperty(default = null) var JsExpression.localAlias: JsImportedModule? by MetadataProperty(default = null)
// TODO: move this to module 'js.inliner' and change dependency on 'frontend' to dependency on 'descriptors' var JsInvocation.isInline: Boolean? by MetadataProperty(default = null)
var JsInvocation.inlineStrategy: InlineStrategy? by MetadataProperty(default = null)
var JsInvocation.isCallableReference by MetadataProperty(default = false) var JsInvocation.isCallableReference by MetadataProperty(default = false)
@@ -51,7 +49,7 @@ var JsInvocation.psiElement: PsiElement? by MetadataProperty(default = null)
var JsNameRef.isJsCall: Boolean by MetadataProperty(default = false) var JsNameRef.isJsCall: Boolean by MetadataProperty(default = false)
var JsNameRef.inlineStrategy: InlineStrategy? by MetadataProperty(default = null) var JsNameRef.isInline: Boolean? by MetadataProperty(default = null)
var JsNameRef.descriptor: CallableDescriptor? by MetadataProperty(default = null) var JsNameRef.descriptor: CallableDescriptor? by MetadataProperty(default = null)
@@ -34,10 +34,8 @@ import org.jetbrains.kotlin.js.translate.expression.InlineMetadata
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getModuleName import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getModuleName
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
import org.jetbrains.kotlin.utils.JsLibraryUtils import org.jetbrains.kotlin.utils.JsLibraryUtils
import java.io.File import java.io.File
import java.io.StringReader
// TODO: add hash checksum to defineModule? // TODO: add hash checksum to defineModule?
/** /**
@@ -401,7 +399,7 @@ private fun JsFunction.markInlineArguments(descriptor: CallableDescriptor) {
(qualifier as? JsNameRef)?.name?.let { name -> (qualifier as? JsNameRef)?.name?.let { name ->
if (name in inlineFuns) { if (name in inlineFuns) {
x.inlineStrategy = InlineStrategy.IN_PLACE x.isInline = true
} }
} }
} }
@@ -434,4 +432,4 @@ private class ShallowSubSequence(private val underlying: CharSequence, private v
override fun subSequence(startIndex: Int, endIndex: Int): CharSequence = override fun subSequence(startIndex: Int, endIndex: Int): CharSequence =
ShallowSubSequence(underlying, start + startIndex, start + endIndex) ShallowSubSequence(underlying, start + startIndex, start + endIndex)
} }
@@ -10,12 +10,11 @@ import org.jetbrains.kotlin.descriptors.PropertySetterDescriptor
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
import org.jetbrains.kotlin.js.backend.ast.metadata.forcedReturnVariable import org.jetbrains.kotlin.js.backend.ast.metadata.forcedReturnVariable
import org.jetbrains.kotlin.js.backend.ast.metadata.inlineStrategy import org.jetbrains.kotlin.js.backend.ast.metadata.isInline
import org.jetbrains.kotlin.js.backend.ast.metadata.psiElement import org.jetbrains.kotlin.js.backend.ast.metadata.psiElement
import org.jetbrains.kotlin.js.inline.clean.FunctionPostProcessor import org.jetbrains.kotlin.js.inline.clean.FunctionPostProcessor
import org.jetbrains.kotlin.js.inline.clean.removeUnusedLocalFunctionDeclarations import org.jetbrains.kotlin.js.inline.clean.removeUnusedLocalFunctionDeclarations
import org.jetbrains.kotlin.js.inline.clean.substituteKTypes import org.jetbrains.kotlin.js.inline.clean.substituteKTypes
import org.jetbrains.kotlin.js.inline.util.extractFunction
import org.jetbrains.kotlin.js.inline.util.refreshLabelNames import org.jetbrains.kotlin.js.inline.util.refreshLabelNames
import org.jetbrains.kotlin.js.translate.expression.InlineMetadata import org.jetbrains.kotlin.js.translate.expression.InlineMetadata
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
@@ -99,18 +98,16 @@ class InlineAstVisitor(
private fun hasToBeInlined(node: JsNode): Boolean { private fun hasToBeInlined(node: JsNode): Boolean {
return when (node) { return when (node) {
is JsInvocation -> hasToBeInlined(node) is JsInvocation -> hasToBeInlined(node)
is JsNameRef -> node.inlineStrategy != null && tryCreatePropertyGetterInvocation(node)?.let { hasToBeInlined(it) } ?: false is JsNameRef -> node.isInline != null && tryCreatePropertyGetterInvocation(node)?.let { hasToBeInlined(it) } ?: false
is JsBinaryOperation -> node.operator.isAssignment && node.arg1?.let { left -> is JsBinaryOperation -> node.operator.isAssignment && node.arg1?.let { left ->
left is JsNameRef && left.inlineStrategy != null && tryCreatePropertySetterInvocation(node)?.let { hasToBeInlined(it) } ?: false left is JsNameRef && left.isInline != null && tryCreatePropertySetterInvocation(node)?.let { hasToBeInlined(it) } ?: false
} ?: false } ?: false
else -> false else -> false
} }
} }
private fun hasToBeInlined(call: JsInvocation): Boolean { private fun hasToBeInlined(call: JsInvocation): Boolean =
val strategy = call.inlineStrategy call.isInline == true && jsInliner.functionDefinitionLoader.hasFunctionDefinition(call, scope)
return if (strategy == null || !strategy.isInline) false else jsInliner.functionDefinitionLoader.hasFunctionDefinition(call, scope)
}
private fun patchReturnsFromSecondaryConstructor(function: JsFunction) { private fun patchReturnsFromSecondaryConstructor(function: JsFunction) {
// Support non-local return from secondary constructor // Support non-local return from secondary constructor
@@ -125,7 +122,7 @@ class InlineAstVisitor(
} }
private fun tryCreatePropertyGetterInvocation(x: JsNameRef): JsInvocation? { private fun tryCreatePropertyGetterInvocation(x: JsNameRef): JsInvocation? {
if (x.inlineStrategy != null && x.descriptor is PropertyGetterDescriptor) { if (x.isInline != null && x.descriptor is PropertyGetterDescriptor) {
val dummyInvocation = JsInvocation(x) val dummyInvocation = JsInvocation(x)
copyInlineMetadata(x, dummyInvocation) copyInlineMetadata(x, dummyInvocation)
return dummyInvocation return dummyInvocation
@@ -136,7 +133,7 @@ class InlineAstVisitor(
private fun tryCreatePropertySetterInvocation(x: JsBinaryOperation): JsInvocation? { private fun tryCreatePropertySetterInvocation(x: JsBinaryOperation): JsInvocation? {
if (!x.operator.isAssignment || x.arg1 !is JsNameRef) return null if (!x.operator.isAssignment || x.arg1 !is JsNameRef) return null
val name = x.arg1 as JsNameRef val name = x.arg1 as JsNameRef
if (name.inlineStrategy != null && name.descriptor is PropertySetterDescriptor) { if (name.isInline != null && name.descriptor is PropertySetterDescriptor) {
val dummyInvocation = JsInvocation(name, x.arg2) val dummyInvocation = JsInvocation(name, x.arg2)
copyInlineMetadata(name, dummyInvocation) copyInlineMetadata(name, dummyInvocation)
return dummyInvocation return dummyInvocation
@@ -145,8 +142,8 @@ class InlineAstVisitor(
} }
private fun copyInlineMetadata(from: JsNameRef, to: JsInvocation) { private fun copyInlineMetadata(from: JsNameRef, to: JsInvocation) {
to.inlineStrategy = from.inlineStrategy to.isInline = from.isInline
to.descriptor = from.descriptor to.descriptor = from.descriptor
to.psiElement = from.psiElement to.psiElement = from.psiElement
} }
} }
@@ -10,11 +10,10 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.js.backend.ast.JsFunction import org.jetbrains.kotlin.js.backend.ast.JsFunction
import org.jetbrains.kotlin.js.backend.ast.JsInvocation import org.jetbrains.kotlin.js.backend.ast.JsInvocation
import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
import org.jetbrains.kotlin.js.backend.ast.metadata.inlineStrategy import org.jetbrains.kotlin.js.backend.ast.metadata.isInline
import org.jetbrains.kotlin.js.backend.ast.metadata.psiElement import org.jetbrains.kotlin.js.backend.ast.metadata.psiElement
import org.jetbrains.kotlin.js.inline.context.FunctionDefinitionLoader import org.jetbrains.kotlin.js.inline.context.FunctionDefinitionLoader
import org.jetbrains.kotlin.js.inline.util.FunctionWithWrapper import org.jetbrains.kotlin.js.inline.util.FunctionWithWrapper
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
import java.util.* import java.util.*
/** /**
@@ -90,7 +89,7 @@ class InlinerCycleReporter(
} }
private fun reportInlineCycle(call: JsInvocation?, calledFunction: JsFunction) { private fun reportInlineCycle(call: JsInvocation?, calledFunction: JsFunction) {
call?.inlineStrategy = InlineStrategy.NOT_INLINE call?.isInline = false
val it = inlineCallInfos.descendingIterator() val it = inlineCallInfos.descendingIterator()
while (it.hasNext()) { while (it.hasNext()) {
@@ -109,4 +108,4 @@ class InlinerCycleReporter(
} }
} }
private class JsCallInfo(val call: JsInvocation, val containingFunction: JsFunction) private class JsCallInfo(val call: JsInvocation, val containingFunction: JsFunction)
@@ -30,7 +30,6 @@ import java.io.FileInputStream
import java.io.InputStream import java.io.InputStream
import java.io.InputStreamReader import java.io.InputStreamReader
import java.util.* import java.util.*
import org.jetbrains.kotlin.resolve.inline.InlineStrategy as KotlinInlineStrategy
class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<File>) { class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<File>) {
private val scope = JsRootScope(program) private val scope = JsRootScope(program)
@@ -386,7 +385,7 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
val qualifier = if (nameRefProto.hasQualifier()) deserialize(nameRefProto.qualifier) else null val qualifier = if (nameRefProto.hasQualifier()) deserialize(nameRefProto.qualifier) else null
JsNameRef(deserializeName(nameRefProto.nameId), qualifier).apply { JsNameRef(deserializeName(nameRefProto.nameId), qualifier).apply {
if (nameRefProto.hasInlineStrategy()) { if (nameRefProto.hasInlineStrategy()) {
inlineStrategy = map(nameRefProto.inlineStrategy) isInline = map(nameRefProto.inlineStrategy)
} }
} }
} }
@@ -396,7 +395,7 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
val qualifier = if (propertyRefProto.hasQualifier()) deserialize(propertyRefProto.qualifier) else null val qualifier = if (propertyRefProto.hasQualifier()) deserialize(propertyRefProto.qualifier) else null
JsNameRef(deserializeString(propertyRefProto.stringId), qualifier).apply { JsNameRef(deserializeString(propertyRefProto.stringId), qualifier).apply {
if (propertyRefProto.hasInlineStrategy()) { if (propertyRefProto.hasInlineStrategy()) {
inlineStrategy = map(propertyRefProto.inlineStrategy) isInline = map(propertyRefProto.inlineStrategy)
} }
} }
} }
@@ -408,7 +407,7 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
invocationProto.argumentList.map { deserialize(it) } invocationProto.argumentList.map { deserialize(it) }
).apply { ).apply {
if (invocationProto.hasInlineStrategy()) { if (invocationProto.hasInlineStrategy()) {
inlineStrategy = map(invocationProto.inlineStrategy) isInline = map(invocationProto.inlineStrategy)
} }
} }
} }
@@ -541,11 +540,8 @@ class JsAstDeserializer(program: JsProgram, private val sourceRoots: Iterable<Fi
SideEffects.PURE -> SideEffectKind.PURE SideEffects.PURE -> SideEffectKind.PURE
} }
private fun map(inlineStrategy: InlineStrategy) = when(inlineStrategy) { private fun map(inlineStrategy: InlineStrategy) =
InlineStrategy.AS_FUNCTION -> KotlinInlineStrategy.AS_FUNCTION inlineStrategy == InlineStrategy.AS_FUNCTION || inlineStrategy == InlineStrategy.IN_PLACE
InlineStrategy.IN_PLACE -> KotlinInlineStrategy.IN_PLACE
InlineStrategy.NOT_INLINE -> KotlinInlineStrategy.NOT_INLINE
}
private fun map(specialFunction: JsAstProtoBuf.SpecialFunction) = when(specialFunction) { private fun map(specialFunction: JsAstProtoBuf.SpecialFunction) = when(specialFunction) {
JsAstProtoBuf.SpecialFunction.DEFINE_INLINE_FUNCTION -> SpecialFunction.DEFINE_INLINE_FUNCTION JsAstProtoBuf.SpecialFunction.DEFINE_INLINE_FUNCTION -> SpecialFunction.DEFINE_INLINE_FUNCTION
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.serialization.js.ast.JsAstProtoBuf.UnaryOperation.Ty
import java.io.File import java.io.File
import java.io.OutputStream import java.io.OutputStream
import java.util.* import java.util.*
import org.jetbrains.kotlin.resolve.inline.InlineStrategy as KotlinInlineStrategy
class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsName>) -> Unit)?, class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsName>) -> Unit)?,
private val pathResolver: (File) -> String) { private val pathResolver: (File) -> String) {
@@ -418,13 +417,15 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsNam
val name = nameRef.name val name = nameRef.name
val qualifier = nameRef.qualifier val qualifier = nameRef.qualifier
if (name != null) { if (name != null) {
if (qualifier != null || nameRef.inlineStrategy?.isInline == true) { if (qualifier != null || nameRef.isInline == true) {
val nameRefBuilder = NameReference.newBuilder() val nameRefBuilder = NameReference.newBuilder()
nameRefBuilder.nameId = serialize(name) nameRefBuilder.nameId = serialize(name)
if (qualifier != null) { if (qualifier != null) {
nameRefBuilder.qualifier = serialize(qualifier) nameRefBuilder.qualifier = serialize(qualifier)
} }
nameRef.inlineStrategy?.let { nameRefBuilder.inlineStrategy = map(it) } nameRef.isInline?.let {
nameRefBuilder.inlineStrategy = if (it) InlineStrategy.IN_PLACE else InlineStrategy.NOT_INLINE
}
builder.nameReference = nameRefBuilder.build() builder.nameReference = nameRefBuilder.build()
} }
else { else {
@@ -435,7 +436,9 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsNam
val propertyRefBuilder = PropertyReference.newBuilder() val propertyRefBuilder = PropertyReference.newBuilder()
propertyRefBuilder.stringId = serialize(nameRef.ident) propertyRefBuilder.stringId = serialize(nameRef.ident)
qualifier?.let { propertyRefBuilder.qualifier = serialize(it) } qualifier?.let { propertyRefBuilder.qualifier = serialize(it) }
nameRef.inlineStrategy?.let { propertyRefBuilder.inlineStrategy = map(it) } nameRef.isInline?.let {
propertyRefBuilder.inlineStrategy = if (it) InlineStrategy.IN_PLACE else InlineStrategy.NOT_INLINE
}
builder.propertyReference = propertyRefBuilder.build() builder.propertyReference = propertyRefBuilder.build()
} }
} }
@@ -444,10 +447,8 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsNam
val invocationBuilder = Invocation.newBuilder() val invocationBuilder = Invocation.newBuilder()
invocationBuilder.qualifier = serialize(invocation.qualifier) invocationBuilder.qualifier = serialize(invocation.qualifier)
invocation.arguments.forEach { invocationBuilder.addArgument(serialize(it)) } invocation.arguments.forEach { invocationBuilder.addArgument(serialize(it)) }
invocation.inlineStrategy?.let { inlineStrategy -> if (invocation.isInline == true) {
if (inlineStrategy != KotlinInlineStrategy.NOT_INLINE) { invocationBuilder.inlineStrategy = InlineStrategy.IN_PLACE
invocationBuilder.inlineStrategy = map(inlineStrategy)
}
} }
builder.invocation = invocationBuilder.build() builder.invocation = invocationBuilder.build()
} }
@@ -584,12 +585,6 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsNam
SideEffectKind.PURE -> SideEffects.PURE SideEffectKind.PURE -> SideEffects.PURE
} }
private fun map(inlineStrategy: KotlinInlineStrategy) = when (inlineStrategy) {
KotlinInlineStrategy.AS_FUNCTION -> InlineStrategy.AS_FUNCTION
KotlinInlineStrategy.IN_PLACE -> InlineStrategy.IN_PLACE
KotlinInlineStrategy.NOT_INLINE -> InlineStrategy.NOT_INLINE
}
private fun map(specialFunction: SpecialFunction) = when (specialFunction) { private fun map(specialFunction: SpecialFunction) = when (specialFunction) {
SpecialFunction.DEFINE_INLINE_FUNCTION -> JsAstProtoBuf.SpecialFunction.DEFINE_INLINE_FUNCTION SpecialFunction.DEFINE_INLINE_FUNCTION -> JsAstProtoBuf.SpecialFunction.DEFINE_INLINE_FUNCTION
SpecialFunction.WRAP_FUNCTION -> JsAstProtoBuf.SpecialFunction.WRAP_FUNCTION SpecialFunction.WRAP_FUNCTION -> JsAstProtoBuf.SpecialFunction.WRAP_FUNCTION
@@ -685,4 +680,4 @@ class JsAstSerializer(private val jsAstValidator: ((JsProgramFragment, Set<JsNam
return JsLocation(path, startLine, startChar) return JsLocation(path, startLine, startChar)
} }
} }
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
import org.jetbrains.kotlin.js.backend.ast.metadata.inlineStrategy import org.jetbrains.kotlin.js.backend.ast.metadata.isInline
import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.JsConfig import org.jetbrains.kotlin.js.config.JsConfig
import org.jetbrains.kotlin.js.patterns.NamePredicate import org.jetbrains.kotlin.js.patterns.NamePredicate
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.BuiltInProper
import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
import org.jetbrains.kotlin.resolve.isInlineClassType import org.jetbrains.kotlin.resolve.isInlineClassType
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import java.util.* import java.util.*
@@ -217,7 +216,7 @@ object ArrayFIF : CompositeFIF() {
else { else {
JsAstUtils.invokeKotlinFunction(if (type == CHAR) "untypedCharArrayF" else "newArrayF", size, fn) JsAstUtils.invokeKotlinFunction(if (type == CHAR) "untypedCharArrayF" else "newArrayF", size, fn)
} }
invocation.inlineStrategy = InlineStrategy.IN_PLACE invocation.isInline = true
val descriptor = callInfo.resolvedCall.resultingDescriptor.original val descriptor = callInfo.resolvedCall.resultingDescriptor.original
val resolvedDescriptor = when (descriptor) { val resolvedDescriptor = when (descriptor) {
is TypeAliasConstructorDescriptor -> descriptor.underlyingConstructorDescriptor is TypeAliasConstructorDescriptor -> descriptor.underlyingConstructorDescriptor
@@ -235,4 +234,4 @@ object ArrayFIF : CompositeFIF() {
return f(callInfo, arguments, context) return f(callInfo, arguments, context)
} }
} }
} }
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.js.backend.ast.JsExpression import org.jetbrains.kotlin.js.backend.ast.JsExpression
import org.jetbrains.kotlin.js.backend.ast.JsNameRef import org.jetbrains.kotlin.js.backend.ast.JsNameRef
import org.jetbrains.kotlin.js.backend.ast.metadata.inlineStrategy import org.jetbrains.kotlin.js.backend.ast.metadata.isInline
import org.jetbrains.kotlin.js.descriptorUtils.isCoroutineLambda import org.jetbrains.kotlin.js.descriptorUtils.isCoroutineLambda
import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo import org.jetbrains.kotlin.js.translate.callTranslator.CallInfo
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.js.translate.utils.TranslationUtils
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
object CoroutineContextFIF : FunctionIntrinsicFactory { object CoroutineContextFIF : FunctionIntrinsicFactory {
override fun getIntrinsic(descriptor: FunctionDescriptor, context: TranslationContext): FunctionIntrinsic? { override fun getIntrinsic(descriptor: FunctionDescriptor, context: TranslationContext): FunctionIntrinsic? {
@@ -48,7 +47,7 @@ object CoroutineContextFIF : FunctionIntrinsicFactory {
if (context.declarationDescriptor?.isCoroutineLambda == true) JsAstUtils.stateMachineReceiver() if (context.declarationDescriptor?.isCoroutineLambda == true) JsAstUtils.stateMachineReceiver()
else TranslationUtils.translateContinuationArgument(context) else TranslationUtils.translateContinuationArgument(context)
) )
res.inlineStrategy = InlineStrategy.NOT_INLINE res.isInline = false
return res return res
} }
} }
@@ -20,13 +20,14 @@ package org.jetbrains.kotlin.js.translate.utils
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.js.backend.ast.metadata.* import org.jetbrains.kotlin.js.backend.ast.metadata.descriptor
import org.jetbrains.kotlin.js.backend.ast.metadata.isInline
import org.jetbrains.kotlin.js.backend.ast.metadata.psiElement
import org.jetbrains.kotlin.js.inline.util.isCallInvocation import org.jetbrains.kotlin.js.inline.util.isCallInvocation
import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.inline.InlineStrategy
/** /**
* Recursively walks expression and sets metadata for all invocations of descriptor. * Recursively walks expression and sets metadata for all invocations of descriptor.
@@ -57,7 +58,7 @@ fun setInlineCallMetadata(
if (invocation.name in candidateNames || invocation.name?.descriptor?.original == descriptor.original) { if (invocation.name in candidateNames || invocation.name?.descriptor?.original == descriptor.original) {
invocation.descriptor = descriptor invocation.descriptor = descriptor
invocation.inlineStrategy = InlineStrategy.IN_PLACE invocation.isInline = true
invocation.psiElement = psiElement invocation.psiElement = psiElement
} }
} }
@@ -81,9 +82,9 @@ fun setInlineCallMetadata(
descriptor: CallableDescriptor, descriptor: CallableDescriptor,
context: TranslationContext context: TranslationContext
) { ) {
if (nameRef.inlineStrategy != null) return if (nameRef.isInline != null) return
nameRef.descriptor = descriptor nameRef.descriptor = descriptor
nameRef.inlineStrategy = InlineStrategy.IN_PLACE nameRef.isInline = true
nameRef.psiElement = psiElement nameRef.psiElement = psiElement
context.addInlineCall(descriptor) context.addInlineCall(descriptor)