001    /*
002     * Copyright 2010-2013 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.k2js.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.jet.lang.descriptors.ClassDescriptor;
023    import org.jetbrains.jet.lang.descriptors.Named;
024    import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
025    import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
026    import org.jetbrains.k2js.translate.context.TranslationContext;
027    import org.jetbrains.k2js.translate.declaration.ClassTranslator;
028    import org.jetbrains.k2js.translate.utils.JsAstUtils;
029    
030    import java.util.List;
031    
032    import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor;
033    import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment;
034    import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField;
035    
036    public final class InitializerUtils {
037        private InitializerUtils() {
038        }
039    
040        @NotNull
041        public static JsStatement generateInitializerForProperty(@NotNull TranslationContext context,
042                @NotNull PropertyDescriptor descriptor,
043                @NotNull JsExpression value) {
044            if (context.isEcma5()) {
045                return JsAstUtils.definePropertyDataDescriptor(descriptor, value, context).makeStmt();
046            }
047            else {
048                return assignmentToBackingField(context, descriptor, value).makeStmt();
049            }
050        }
051    
052        public static void generate(@NotNull JetObjectDeclaration declaration,
053                @NotNull List<JsStatement> initializers,
054                @Nullable List<JsPropertyInitializer> definitions,
055                @NotNull TranslationContext context) {
056            ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration);
057            JsExpression value = ClassTranslator.generateClassCreation(declaration, descriptor, context);
058            if (definitions != null && value instanceof JsLiteral) {
059                definitions.add(createPropertyInitializer(descriptor, value, context));
060            }
061            else {
062                initializers.add(create(descriptor, value, context));
063            }
064        }
065    
066        public static JsStatement create(Named named, JsExpression value, TranslationContext context) {
067            JsExpression expression;
068            if (context.isEcma5()) {
069                expression = JsAstUtils.defineProperty(named.getName().asString(), JsAstUtils.createDataDescriptor(value), context);
070            }
071            else {
072                expression = assignment(new JsNameRef(named.getName().asString(), JsLiteral.THIS), value);
073            }
074            return expression.makeStmt();
075        }
076    
077    
078        public static JsExpression toDataDescriptor(JsExpression value, TranslationContext context) {
079            return context.isEcma5() ? JsAstUtils.createDataDescriptor(value) : value;
080        }
081    
082        public static JsPropertyInitializer createPropertyInitializer(Named named, JsExpression value, TranslationContext context) {
083            return new JsPropertyInitializer(context.nameToLiteral(named), toDataDescriptor(value, context));
084        }
085    }