001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.js.translate.initializer; 018 019 import com.google.dart.compiler.backend.js.ast.*; 020 import org.jetbrains.annotations.NotNull; 021 import org.jetbrains.annotations.Nullable; 022 import org.jetbrains.kotlin.descriptors.ClassDescriptor; 023 import org.jetbrains.kotlin.descriptors.PropertyDescriptor; 024 import org.jetbrains.kotlin.js.translate.context.Namer; 025 import org.jetbrains.kotlin.js.translate.context.TranslationContext; 026 import org.jetbrains.kotlin.js.translate.declaration.ClassTranslator; 027 import org.jetbrains.kotlin.js.translate.general.Translation; 028 import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; 029 import org.jetbrains.kotlin.psi.KtExpression; 030 import org.jetbrains.kotlin.psi.KtObjectDeclaration; 031 import org.jetbrains.kotlin.psi.KtProperty; 032 033 import java.util.List; 034 035 import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getClassDescriptor; 036 import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.assignment; 037 import static org.jetbrains.kotlin.js.translate.utils.TranslationUtils.assignmentToBackingField; 038 039 public final class InitializerUtils { 040 private InitializerUtils() { 041 } 042 043 @NotNull 044 public static JsStatement generateInitializerForProperty(@NotNull TranslationContext context, 045 @NotNull PropertyDescriptor descriptor, 046 @NotNull JsExpression value) { 047 return assignmentToBackingField(context, descriptor, value).makeStmt(); 048 } 049 050 @Nullable 051 public static JsStatement generateInitializerForDelegate(@NotNull TranslationContext context, @NotNull KtProperty property) { 052 KtExpression delegate = property.getDelegateExpression(); 053 if (delegate != null) { 054 JsExpression value = Translation.translateAsExpression(delegate, context); 055 String name = property.getName(); 056 assert name != null: "Delegate property must have name"; 057 return JsAstUtils.defineSimpleProperty(Namer.getDelegateName(name), value); 058 } 059 return null; 060 } 061 062 public static void generateObjectInitializer( 063 @NotNull KtObjectDeclaration declaration, 064 @NotNull List<JsStatement> initializers, 065 @NotNull TranslationContext context 066 ) { 067 JsExpression value = ClassTranslator.generateObjectLiteral(declaration, context); 068 ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration); 069 JsExpression expression = assignment(new JsNameRef(descriptor.getName().asString(), JsLiteral.THIS), value); 070 initializers.add(expression.makeStmt()); 071 } 072 073 public static JsPropertyInitializer createCompanionObjectInitializer(JsExpression value, TranslationContext context) { 074 JsStringLiteral companionObjectInitStr = context.program().getStringLiteral(Namer.getNameForCompanionObjectInitializer()); 075 return new JsPropertyInitializer(companionObjectInitStr, value); 076 } 077 }