JS: replace consumer in with returning value

Refactor some utility functions that take consumer of JsStatement
to return actual statements, so that caller now responsible
for putting these statements to corresponding lists.
This commit is contained in:
Alexey Andreev
2017-03-29 16:40:07 +03:00
parent a055a038a8
commit f916d83978
6 changed files with 17 additions and 39 deletions
@@ -17,8 +17,6 @@
package org.jetbrains.kotlin.js.translate.context;
import com.intellij.psi.PsiElement;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
@@ -629,19 +627,6 @@ public class TranslationContext {
staticContext.getDeclarationStatements().add(statement);
}
private final Function1<JsStatement, Unit> declarationStatementConsumer = new Function1<JsStatement, Unit>() {
@Override
public Unit invoke(JsStatement statement) {
addDeclarationStatement(statement);
return Unit.INSTANCE;
}
};
@NotNull
public Function1<JsStatement, Unit> getDeclarationStatementConsumer() {
return declarationStatementConsumer;
}
public void addTopLevelStatement(@NotNull JsStatement statement) {
staticContext.getTopLevelStatements().add(statement);
}
@@ -192,9 +192,7 @@ class ClassModelGenerator(val context: StaticContext) {
val sourceName = context.getNameForDescriptor(key).ident
val targetName = context.getNameForDescriptor(value).ident
if (sourceName != targetName) {
generateDelegateCall(descriptor, key, value, JsLiteral.THIS, translationContext) {
model.postDeclarationBlock.statements += it
}
model.postDeclarationBlock.statements += generateDelegateCall(descriptor, key, value, JsLiteral.THIS, translationContext)
}
}
}
@@ -229,9 +227,8 @@ class ClassModelGenerator(val context: StaticContext) {
}
val translationContext = TranslationContext.rootContext(context)
generateDelegateCall(descriptor, fromDescriptor, toDescriptor, JsLiteral.THIS, translationContext) {
model.postDeclarationBlock.statements += it
}
model.postDeclarationBlock.statements += generateDelegateCall(descriptor, fromDescriptor, toDescriptor, JsLiteral.THIS,
translationContext)
}
private fun copyMethod(
@@ -99,7 +99,7 @@ class DeclarationBodyVisitor(
override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?) {
if (!descriptor.hasOrInheritsParametersWithDefaultValue() || !descriptor.isOverridableOrOverrides) {
if (expression != null) {
context.addFunctionToPrototype(containingClass, descriptor, expression, context.declarationStatementConsumer)
context.addDeclarationStatement(context.addFunctionToPrototype(containingClass, descriptor, expression))
}
}
else {
@@ -139,7 +139,7 @@ class DeclarationBodyVisitor(
}
caller.body.statements += statement
context.addFunctionToPrototype(containingClass, descriptor, caller, context.declarationStatementConsumer)
context.addDeclarationStatement(context.addFunctionToPrototype(containingClass, descriptor, caller))
}
}
}
@@ -174,12 +174,12 @@ class DelegationTranslator(
// TODO: same logic as in AbstractDeclarationVisitor
if (descriptor.isExtensionProperty || TranslationUtils.shouldAccessViaFunctions(descriptor)) {
val getter = descriptor.getter!!
context().addFunctionToPrototype(classDescriptor, getter, generateDelegateGetterFunction(getter),
context().declarationStatementConsumer)
context().addDeclarationStatement(context().addFunctionToPrototype(
classDescriptor, getter, generateDelegateGetterFunction(getter)))
if (descriptor.isVar) {
val setter = descriptor.setter!!
context().addFunctionToPrototype(classDescriptor, setter, generateDelegateSetterFunction(setter),
context().declarationStatementConsumer)
context().addDeclarationStatement(
context().addFunctionToPrototype(classDescriptor, setter, generateDelegateSetterFunction(setter)))
}
}
else {
@@ -196,7 +196,6 @@ class DelegationTranslator(
delegateName: JsName
) {
val delegateRef = JsNameRef(delegateName, JsLiteral.THIS)
generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context(),
context().declarationStatementConsumer)
context().addDeclarationStatement(generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context()))
}
}
@@ -192,8 +192,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator {
private JsFunction generateJsMethod(@NotNull FunctionDescriptor functionDescriptor) {
JsFunction functionObject = context.createRootScopedFunction(functionDescriptor);
ClassDescriptor containingClass = (ClassDescriptor) functionDescriptor.getContainingDeclaration();
UtilsKt.addFunctionToPrototype(context, containingClass, functionDescriptor, functionObject,
context.getDeclarationStatementConsumer());
context.addDeclarationStatement(UtilsKt.addFunctionToPrototype(context, containingClass, functionDescriptor, functionObject));
return functionObject;
}
}
@@ -42,9 +42,8 @@ fun generateDelegateCall(
fromDescriptor: FunctionDescriptor,
toDescriptor: FunctionDescriptor,
thisObject: JsExpression,
context: TranslationContext,
consumer: (JsStatement) -> Unit
) {
context: TranslationContext
): JsStatement {
val overriddenMemberFunctionName = context.getNameForDescriptor(toDescriptor)
val overriddenMemberFunctionRef = JsNameRef(overriddenMemberFunctionName, thisObject)
@@ -75,7 +74,7 @@ fun generateDelegateCall(
val functionObject = simpleReturnFunction(context.getScopeForDescriptor(fromDescriptor), invocation)
functionObject.parameters.addAll(parameters)
context.addFunctionToPrototype(classDescriptor, fromDescriptor, functionObject, consumer)
return context.addFunctionToPrototype(classDescriptor, fromDescriptor, functionObject)
}
fun <T, S> List<T>.splitToRanges(classifier: (T) -> S): List<Pair<List<T>, S>> {
@@ -123,12 +122,11 @@ fun getReferenceToJsClass(type: KotlinType, context: TranslationContext): JsExpr
fun TranslationContext.addFunctionToPrototype(
classDescriptor: ClassDescriptor,
descriptor: FunctionDescriptor,
function: JsExpression,
consumer: (JsStatement) -> Unit
) {
function: JsExpression
): JsStatement {
val prototypeRef = JsAstUtils.prototypeOf(getInnerReference(classDescriptor))
val functionRef = JsNameRef(getNameForDescriptor(descriptor), prototypeRef)
consumer(JsAstUtils.assignment(functionRef, function).makeStmt())
return JsAstUtils.assignment(functionRef, function).makeStmt()
}
fun TranslationContext.addAccessorsToPrototype(