diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java index 18b1da16738..89b2ac83ef0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -55,7 +55,6 @@ public final class Namer { private static final String DELEGATE_POSTFIX = "$delegate"; - private static final String PROPERTY_METADATA = "PropertyMetadata"; @NotNull public static String getReceiverParameterName() { @@ -231,11 +230,6 @@ public final class Namer { return new JsNameRef(THROW_NPE_FUN_NAME, kotlinObject()); } - @NotNull - public JsNameRef propertyMetadataRef() { - return new JsNameRef(PROPERTY_METADATA, kotlinObject()); - } - @NotNull private JsNameRef kotlin(@NotNull JsName name) { return new JsNameRef(name, kotlinObject()); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index beed6e17621..e75f9421fb5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -129,7 +129,7 @@ public class TranslationContext { } @NotNull - public TranslationContext innerContextWithThisAliased(@NotNull DeclarationDescriptor correspondingDescriptor, @NotNull JsNameRef alias) { + public TranslationContext innerContextWithAliased(@NotNull DeclarationDescriptor correspondingDescriptor, @NotNull JsNameRef alias) { return new TranslationContext(this, aliasingContext.inner(correspondingDescriptor, alias)); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java index 22e27098b41..1028481afa2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/PropertyTranslator.java @@ -29,13 +29,10 @@ import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.expression.FunctionTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; -import org.jetbrains.k2js.translate.reference.CallBuilder; -import org.jetbrains.k2js.translate.reference.CallType; +import org.jetbrains.k2js.translate.reference.ReferencePackage; import org.jetbrains.k2js.translate.utils.JsDescriptorUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.context.Namer.getDelegateNameRef; @@ -135,21 +132,6 @@ public final class PropertyTranslator extends AbstractTranslator { return generateDefaultAccessor(getterDescriptor, generateDefaultGetterFunction(getterDescriptor)); } - private JsExpression createPropertyMetadata() { - JsNameRef propertyMetadataRef = context().namer().propertyMetadataRef(); - JsExpression argument = context().program().getStringLiteral(getPropertyName()); - return new JsNew(propertyMetadataRef, Collections.singletonList(argument)); - } - - private JsExpression getDelegateCall(ResolvedCall call, List args) { - return CallBuilder.build(context()) - .receiver(getDelegateNameRef(getPropertyName())) - .args(args) - .resolvedCall(call) - .type(CallType.NORMAL) - .translate(); - } - private String getPropertyName() { return descriptor.getName().asString(); } @@ -159,24 +141,13 @@ public final class PropertyTranslator extends AbstractTranslator { JsExpression value; ResolvedCall delegatedCall = bindingContext().get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, getterDescriptor); if (delegatedCall != null) { - value = getDelegateCall(delegatedCall, getDelegateCallArgs(null)); + value = ReferencePackage.buildCall(context(), delegatedCall, getDelegateNameRef(getPropertyName())); } else { value = backingFieldReference(context(), this.descriptor); } return simpleReturnFunction(context().getScopeForDescriptor(getterDescriptor.getContainingDeclaration()), value); } - @NotNull - private List getDelegateCallArgs(@Nullable JsExpression valueExpression) { - List args = new ArrayList(); - args.add(JsLiteral.THIS); - args.add(createPropertyMetadata()); - if (valueExpression != null) { - args.add(valueExpression); - } - return args; - } - @NotNull private JsPropertyInitializer generateDefaultSetter() { PropertySetterDescriptor setterDescriptor = descriptor.getSetter(); @@ -187,16 +158,22 @@ public final class PropertyTranslator extends AbstractTranslator { @NotNull private JsFunction generateDefaultSetterFunction(@NotNull PropertySetterDescriptor setterDescriptor) { JsFunction fun = new JsFunction(context().getScopeForDescriptor(setterDescriptor.getContainingDeclaration())); - JsParameter defaultParameter = new JsParameter(fun.getScope().declareTemporary()); - fun.getParameters().add(defaultParameter); - JsExpression setExpression; - ResolvedCall delegatedCall = bindingContext().get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, setterDescriptor); + assert setterDescriptor.getValueParameters().size() == 1 : "Setter must have 1 parameter"; + ValueParameterDescriptor valueParameterDescriptor = setterDescriptor.getValueParameters().get(0); + JsParameter defaultParameter = new JsParameter(fun.getScope().declareTemporary()); JsNameRef defaultParameterRef = defaultParameter.getName().makeRef(); + + fun.getParameters().add(defaultParameter); + TranslationContext contextWithAliased = context().innerContextWithAliased(valueParameterDescriptor, defaultParameterRef); + + JsExpression setExpression; + ResolvedCall delegatedCall = bindingContext().get(BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, + setterDescriptor); if (delegatedCall != null) { - setExpression = getDelegateCall(delegatedCall, getDelegateCallArgs(defaultParameterRef)); + setExpression = ReferencePackage.buildCall(contextWithAliased, delegatedCall, getDelegateNameRef(getPropertyName())); } else { - setExpression = assignmentToBackingField(context(), descriptor, defaultParameterRef); + setExpression = assignmentToBackingField(contextWithAliased, descriptor, defaultParameterRef); } fun.setBody(new JsBlock(setExpression.makeStmt())); return fun; diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java index 90e3c665de8..3f336d0c792 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.lang.PrimitiveType; +import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.intrinsic.functions.basic.FunctionIntrinsic; import org.jetbrains.k2js.translate.intrinsic.functions.patterns.NamePredicate; @@ -119,6 +120,17 @@ public final class TopLevelFIF extends CompositeFIF { } }; + private static final FunctionIntrinsic PROPERTY_METADATA_IMPL = new FunctionIntrinsic() { + @NotNull + @Override + public JsExpression apply( + @Nullable JsExpression receiver, @NotNull List arguments, @NotNull TranslationContext context + ) { + JsNameRef functionRef = new JsNameRef("PropertyMetadata", Namer.KOTLIN_NAME); + return new JsNew(functionRef, arguments); + } + }; + @NotNull public static final KotlinFunctionIntrinsic TO_STRING = new KotlinFunctionIntrinsic("toString"); @@ -132,6 +144,7 @@ public final class TopLevelFIF extends CompositeFIF { add(pattern(NamePredicate.PRIMITIVE_NUMBERS, "equals"), EQUALS); add(pattern("String|Boolean|Char|Number.equals"), EQUALS); add(pattern("jet", "arrayOfNulls"), new KotlinFunctionIntrinsic("nullArray")); + add(pattern("jet", "PropertyMetadataImpl", ""), PROPERTY_METADATA_IMPL); add(pattern("jet", "iterator").receiverExists(), RETURN_RECEIVER_INTRINSIC); add(pattern("jet", "Map", "get").checkOverridden(), NATIVE_MAP_GET); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java index 449b9a69530..f81cd480da4 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/InlinedCallExpressionTranslator.java @@ -137,7 +137,7 @@ public final class InlinedCallExpressionTranslator extends AbstractCallExpressio TemporaryVariable aliasForReceiver = context().declareTemporary(aliasExpression); assert descriptorToAlias != null; TranslationContext newContext = - contextWithAliasForThisExpression.innerContextWithThisAliased(descriptorToAlias, aliasForReceiver.reference()); + contextWithAliasForThisExpression.innerContextWithAliased(descriptorToAlias, aliasForReceiver.reference()); newContext.addStatementToCurrentBlock(aliasForReceiver.assignmentExpression().makeStmt()); return newContext; }