All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlin.js.translate.declaration.PackageDeclarationTranslator Maven / Gradle / Ivy

/*
 * Copyright 2010-2015 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jetbrains.kotlin.js.translate.declaration;

import com.google.dart.compiler.backend.js.ast.*;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor;
import org.jetbrains.kotlin.js.translate.context.Namer;
import org.jetbrains.kotlin.js.translate.context.TranslationContext;
import org.jetbrains.kotlin.js.translate.general.AbstractTranslator;
import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.BindingContextUtils;

import java.util.*;

import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar;

public final class PackageDeclarationTranslator extends AbstractTranslator {
    private final Iterable files;
    private final Map packageFragmentToTranslator =
            new LinkedHashMap();

    public static List translateFiles(@NotNull Collection files, @NotNull TranslationContext context) {
        return new PackageDeclarationTranslator(files, context).translate();
    }

    private PackageDeclarationTranslator(@NotNull Iterable files, @NotNull TranslationContext context) {
        super(context);

        this.files = files;
    }

    @NotNull
    private List translate() {
        // predictable order
        Map packageFqNameToDefineInvocation = new THashMap();

        for (JetFile file : files) {
            PackageFragmentDescriptor packageFragment =
                    BindingContextUtils.getNotNull(context().bindingContext(), BindingContext.FILE_TO_PACKAGE_FRAGMENT, file);

            PackageTranslator translator = packageFragmentToTranslator.get(packageFragment);
            if (translator == null) {
                createRootPackageDefineInvocationIfNeeded(packageFqNameToDefineInvocation);
                translator = PackageTranslator.create(packageFragment, context());
                packageFragmentToTranslator.put(packageFragment, translator);
            }

            translator.translate(file);
        }

        for (PackageTranslator translator : packageFragmentToTranslator.values()) {
            translator.add(packageFqNameToDefineInvocation);
        }

        JsVars vars = new JsVars(true);
        vars.addIfHasInitializer(getRootPackageDeclaration(packageFqNameToDefineInvocation.get(FqName.ROOT)));

        return Collections.singletonList(vars);
    }

    private void createRootPackageDefineInvocationIfNeeded(@NotNull Map packageFqNameToDefineInvocation) {
        if (!packageFqNameToDefineInvocation.containsKey(FqName.ROOT)) {
            packageFqNameToDefineInvocation.put(
                    FqName.ROOT, DefineInvocation.create(FqName.ROOT, null, new JsObjectLiteral(true), context()));
        }
    }

    private JsVar getRootPackageDeclaration(@NotNull DefineInvocation defineInvocation) {
        JsExpression rootPackageVar = new JsInvocation(context().namer().rootPackageDefinitionMethodReference(), defineInvocation.asList());
        return new JsVar(context().scope().declareName(Namer.getRootPackageName()), rootPackageVar);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy