JS: equals, hashCode, toString support in inline classes

This commit is contained in:
Anton Bannykh
2018-08-16 13:34:38 +03:00
committed by Ilya Gorbunov
parent a8596a9cd6
commit a11c4871ea
4 changed files with 13 additions and 5 deletions
@@ -1,5 +1,5 @@
// !LANGUAGE: +InlineClasses // !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR, JS_IR, JS // IGNORE_BACKEND: JVM_IR, JS_IR
inline class InlineFloat(val data: Float) inline class InlineFloat(val data: Float)
@@ -1,5 +1,5 @@
// !LANGUAGE: +InlineClasses // !LANGUAGE: +InlineClasses
// IGNORE_BACKEND: JVM_IR, JS // IGNORE_BACKEND: JVM_IR
inline class Z(val value: Int) inline class Z(val value: Int)
@@ -126,8 +126,9 @@ class ClassTranslator private constructor(
addSuperclassReferences() addSuperclassReferences()
classDeclaration.secondaryConstructors.forEach { generateSecondaryConstructor(context, it) } classDeclaration.secondaryConstructors.forEach { generateSecondaryConstructor(context, it) }
if (descriptor.isData && classDeclaration is KtClassOrObject) { if ((descriptor.isData || descriptor.isInline) && classDeclaration is KtClassOrObject) {
JsDataClassGenerator(classDeclaration, context).generate() // TODO is `inline data class` a bug or a feature?
JsDataClassGenerator(classDeclaration, context, !descriptor.isData).generate()
} }
emitConstructors(nonConstructorContext, nonConstructorContext.endDeclaration()) emitConstructors(nonConstructorContext, nonConstructorContext.endDeclaration())
@@ -41,13 +41,18 @@ import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.or;
class JsDataClassGenerator extends DataClassMethodGenerator { class JsDataClassGenerator extends DataClassMethodGenerator {
private final TranslationContext context; private final TranslationContext context;
JsDataClassGenerator(KtClassOrObject klass, TranslationContext context) { private final boolean isInline;
JsDataClassGenerator(KtClassOrObject klass, TranslationContext context, boolean isInline) {
super(klass, context.bindingContext()); super(klass, context.bindingContext());
this.context = context; this.context = context;
this.isInline = isInline;
} }
@Override @Override
public void generateComponentFunction(@NotNull FunctionDescriptor function, @NotNull ValueParameterDescriptor parameter) { public void generateComponentFunction(@NotNull FunctionDescriptor function, @NotNull ValueParameterDescriptor parameter) {
if (isInline) return;
PropertyDescriptor propertyDescriptor = context.bindingContext().get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameter); PropertyDescriptor propertyDescriptor = context.bindingContext().get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameter);
assert propertyDescriptor != null : "Property descriptor is expected to be non-null"; assert propertyDescriptor != null : "Property descriptor is expected to be non-null";
@@ -60,6 +65,8 @@ class JsDataClassGenerator extends DataClassMethodGenerator {
@Override @Override
public void generateCopyFunction(@NotNull FunctionDescriptor function, @NotNull List<? extends KtParameter> constructorParameters) { public void generateCopyFunction(@NotNull FunctionDescriptor function, @NotNull List<? extends KtParameter> constructorParameters) {
if (isInline) return;
JsFunction functionObj = generateJsMethod(function); JsFunction functionObj = generateJsMethod(function);
assert function.getValueParameters().size() == constructorParameters.size(); assert function.getValueParameters().size() == constructorParameters.size();