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; package org.jetbrains.kotlin.js.translate.context;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
@@ -629,19 +627,6 @@ public class TranslationContext {
staticContext.getDeclarationStatements().add(statement); 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) { public void addTopLevelStatement(@NotNull JsStatement statement) {
staticContext.getTopLevelStatements().add(statement); staticContext.getTopLevelStatements().add(statement);
} }
@@ -192,9 +192,7 @@ class ClassModelGenerator(val context: StaticContext) {
val sourceName = context.getNameForDescriptor(key).ident val sourceName = context.getNameForDescriptor(key).ident
val targetName = context.getNameForDescriptor(value).ident val targetName = context.getNameForDescriptor(value).ident
if (sourceName != targetName) { if (sourceName != targetName) {
generateDelegateCall(descriptor, key, value, JsLiteral.THIS, translationContext) { model.postDeclarationBlock.statements += generateDelegateCall(descriptor, key, value, JsLiteral.THIS, translationContext)
model.postDeclarationBlock.statements += it
}
} }
} }
} }
@@ -229,9 +227,8 @@ class ClassModelGenerator(val context: StaticContext) {
} }
val translationContext = TranslationContext.rootContext(context) val translationContext = TranslationContext.rootContext(context)
generateDelegateCall(descriptor, fromDescriptor, toDescriptor, JsLiteral.THIS, translationContext) { model.postDeclarationBlock.statements += generateDelegateCall(descriptor, fromDescriptor, toDescriptor, JsLiteral.THIS,
model.postDeclarationBlock.statements += it translationContext)
}
} }
private fun copyMethod( private fun copyMethod(
@@ -99,7 +99,7 @@ class DeclarationBodyVisitor(
override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?) { override fun addFunction(descriptor: FunctionDescriptor, expression: JsExpression?) {
if (!descriptor.hasOrInheritsParametersWithDefaultValue() || !descriptor.isOverridableOrOverrides) { if (!descriptor.hasOrInheritsParametersWithDefaultValue() || !descriptor.isOverridableOrOverrides) {
if (expression != null) { if (expression != null) {
context.addFunctionToPrototype(containingClass, descriptor, expression, context.declarationStatementConsumer) context.addDeclarationStatement(context.addFunctionToPrototype(containingClass, descriptor, expression))
} }
} }
else { else {
@@ -139,7 +139,7 @@ class DeclarationBodyVisitor(
} }
caller.body.statements += statement 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 // TODO: same logic as in AbstractDeclarationVisitor
if (descriptor.isExtensionProperty || TranslationUtils.shouldAccessViaFunctions(descriptor)) { if (descriptor.isExtensionProperty || TranslationUtils.shouldAccessViaFunctions(descriptor)) {
val getter = descriptor.getter!! val getter = descriptor.getter!!
context().addFunctionToPrototype(classDescriptor, getter, generateDelegateGetterFunction(getter), context().addDeclarationStatement(context().addFunctionToPrototype(
context().declarationStatementConsumer) classDescriptor, getter, generateDelegateGetterFunction(getter)))
if (descriptor.isVar) { if (descriptor.isVar) {
val setter = descriptor.setter!! val setter = descriptor.setter!!
context().addFunctionToPrototype(classDescriptor, setter, generateDelegateSetterFunction(setter), context().addDeclarationStatement(
context().declarationStatementConsumer) context().addFunctionToPrototype(classDescriptor, setter, generateDelegateSetterFunction(setter)))
} }
} }
else { else {
@@ -196,7 +196,6 @@ class DelegationTranslator(
delegateName: JsName delegateName: JsName
) { ) {
val delegateRef = JsNameRef(delegateName, JsLiteral.THIS) val delegateRef = JsNameRef(delegateName, JsLiteral.THIS)
generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context(), context().addDeclarationStatement(generateDelegateCall(classDescriptor, descriptor, overriddenDescriptor, delegateRef, context()))
context().declarationStatementConsumer)
} }
} }
@@ -192,8 +192,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator {
private JsFunction generateJsMethod(@NotNull FunctionDescriptor functionDescriptor) { private JsFunction generateJsMethod(@NotNull FunctionDescriptor functionDescriptor) {
JsFunction functionObject = context.createRootScopedFunction(functionDescriptor); JsFunction functionObject = context.createRootScopedFunction(functionDescriptor);
ClassDescriptor containingClass = (ClassDescriptor) functionDescriptor.getContainingDeclaration(); ClassDescriptor containingClass = (ClassDescriptor) functionDescriptor.getContainingDeclaration();
UtilsKt.addFunctionToPrototype(context, containingClass, functionDescriptor, functionObject, context.addDeclarationStatement(UtilsKt.addFunctionToPrototype(context, containingClass, functionDescriptor, functionObject));
context.getDeclarationStatementConsumer());
return functionObject; return functionObject;
} }
} }
@@ -42,9 +42,8 @@ fun generateDelegateCall(
fromDescriptor: FunctionDescriptor, fromDescriptor: FunctionDescriptor,
toDescriptor: FunctionDescriptor, toDescriptor: FunctionDescriptor,
thisObject: JsExpression, thisObject: JsExpression,
context: TranslationContext, context: TranslationContext
consumer: (JsStatement) -> Unit ): JsStatement {
) {
val overriddenMemberFunctionName = context.getNameForDescriptor(toDescriptor) val overriddenMemberFunctionName = context.getNameForDescriptor(toDescriptor)
val overriddenMemberFunctionRef = JsNameRef(overriddenMemberFunctionName, thisObject) val overriddenMemberFunctionRef = JsNameRef(overriddenMemberFunctionName, thisObject)
@@ -75,7 +74,7 @@ fun generateDelegateCall(
val functionObject = simpleReturnFunction(context.getScopeForDescriptor(fromDescriptor), invocation) val functionObject = simpleReturnFunction(context.getScopeForDescriptor(fromDescriptor), invocation)
functionObject.parameters.addAll(parameters) 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>> { 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( fun TranslationContext.addFunctionToPrototype(
classDescriptor: ClassDescriptor, classDescriptor: ClassDescriptor,
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
function: JsExpression, function: JsExpression
consumer: (JsStatement) -> Unit ): JsStatement {
) {
val prototypeRef = JsAstUtils.prototypeOf(getInnerReference(classDescriptor)) val prototypeRef = JsAstUtils.prototypeOf(getInnerReference(classDescriptor))
val functionRef = JsNameRef(getNameForDescriptor(descriptor), prototypeRef) val functionRef = JsNameRef(getNameForDescriptor(descriptor), prototypeRef)
consumer(JsAstUtils.assignment(functionRef, function).makeStmt()) return JsAstUtils.assignment(functionRef, function).makeStmt()
} }
fun TranslationContext.addAccessorsToPrototype( fun TranslationContext.addAccessorsToPrototype(