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
017package org.jetbrains.k2js.config;
018
019import com.google.common.collect.Lists;
020import com.intellij.openapi.project.Project;
021import org.jetbrains.annotations.NotNull;
022import org.jetbrains.annotations.Nullable;
023import org.jetbrains.jet.lang.psi.JetFile;
024import org.jetbrains.jet.lang.resolve.BindingContext;
025import org.jetbrains.k2js.translate.test.JSTester;
026import org.jetbrains.k2js.translate.test.QUnitTester;
027
028import java.util.Arrays;
029import java.util.Collection;
030import java.util.Collections;
031import java.util.List;
032
033/**
034 * Base class representing a configuration of translator.
035 */
036public abstract class Config {
037    //NOTE: a hacky solution to be able to rerun code samples with lib loaded only once: used by tests and web demo
038    @NotNull
039    public static final String REWRITABLE_MODULE_NAME = "JS_TESTS";
040
041    @NotNull
042    public static Config getEmptyConfig(@NotNull Project project, @NotNull EcmaVersion ecmaVersion) {
043        return new Config(project, "main", ecmaVersion) {
044            @NotNull
045            @Override
046            protected List<JetFile> generateLibFiles() {
047                return Collections.emptyList();
048            }
049        };
050    }
051
052    //NOTE: used by mvn build
053    @SuppressWarnings("UnusedDeclaration")
054    @NotNull
055    public static Config getEmptyConfig(@NotNull Project project) {
056        return getEmptyConfig(project, EcmaVersion.defaultVersion());
057    }
058
059    @NotNull
060    public static final List<String> LIB_FILES_WITH_DECLARATIONS = Arrays.asList(
061            "/core/annotations.kt",
062            "/core/core.kt",
063            "/core/date.kt",
064            "/core/dom.kt",
065            "/core/javaio.kt",
066            "/core/javalang.kt",
067            "/core/javautil.kt",
068            "/core/javautilCollections.kt",
069            "/core/json.kt",
070            "/core/kotlin.kt",
071            "/core/math.kt",
072            "/core/string.kt",
073            "/dom/domcore.kt",
074            "/dom/html/htmlcore.kt",
075            "/dom/html5/canvas.kt",
076            "/dom/html/window.kt",
077            "/jquery/common.kt",
078            "/jquery/ui.kt",
079            "/junit/core.kt",
080            "/qunit/core.kt",
081            "/stdlib/browser.kt"
082    );
083
084    @NotNull
085    public static final List<String> LIB_FILES_WITH_CODE = Arrays.asList(
086            "/stdlib/TuplesCode.kt",
087            "/core/javautilCollectionsCode.kt"
088    );
089
090    @NotNull
091    public static final List<String> LIB_FILE_NAMES = Lists.newArrayList();
092
093    static {
094        LIB_FILE_NAMES.addAll(LIB_FILES_WITH_DECLARATIONS);
095        LIB_FILE_NAMES.addAll(LIB_FILES_WITH_CODE);
096    }
097
098    /**
099     * the library files which depend on the STDLIB files to be able to compile
100     */
101    @NotNull
102    public static final List<String> LIB_FILE_NAMES_DEPENDENT_ON_STDLIB = Arrays.asList(
103            "/core/stringsCode.kt",
104            "/stdlib/domCode.kt",
105            "/stdlib/jutilCode.kt",
106            "/stdlib/JUMapsCode.kt",
107            "/stdlib/testCode.kt"
108    );
109
110    public static final String LIBRARIES_LOCATION = "js/js.libraries/src";
111
112    /**
113     * The file names in the standard library to compile
114     */
115    @NotNull
116    public static final List<String> STDLIB_FILE_NAMES = Arrays.asList(
117            "/kotlin/Preconditions.kt",
118            "/kotlin/Iterators.kt",
119            "/kotlin/JUtil.kt",
120            "/kotlin/Arrays.kt",
121            "/kotlin/Lists.kt",
122            "/kotlin/Maps.kt",
123            "/kotlin/Exceptions.kt",
124            "/kotlin/IterablesSpecial.kt",
125            "/generated/_Arrays.kt",
126            "/generated/_Collections.kt",
127            "/generated/_Iterables.kt",
128            "/generated/_Iterators.kt",
129            "/generated/_IteratorsCommon.kt",
130            "/kotlin/support/AbstractIterator.kt",
131            "/kotlin/Standard.kt",
132            "/kotlin/Strings.kt",
133            "/kotlin/dom/Dom.kt",
134            "/kotlin/test/Test.kt"
135    );
136
137    /**
138     * The location of the stdlib sources
139     */
140    public static final String STDLIB_LOCATION = "libraries/stdlib/src";
141
142    @NotNull
143    private final Project project;
144    @Nullable
145    private List<JetFile> libFiles = null;
146    @NotNull
147    private final EcmaVersion target;
148
149    @NotNull
150    private final String moduleId;
151
152    public Config(@NotNull Project project, @NotNull String moduleId, @NotNull EcmaVersion ecmaVersion) {
153        this.project = project;
154        this.target = ecmaVersion;
155        this.moduleId = moduleId;
156    }
157
158    @NotNull
159    public Project getProject() {
160        return project;
161    }
162
163    @NotNull
164    public EcmaVersion getTarget() {
165        return target;
166    }
167
168    @NotNull
169    public String getModuleId() {
170        return moduleId;
171    }
172
173    @NotNull
174    protected abstract List<JetFile> generateLibFiles();
175
176    @NotNull
177    public final List<JetFile> getLibFiles() {
178        if (libFiles == null) {
179            libFiles = generateLibFiles();
180        }
181        return libFiles;
182    }
183
184    @Nullable
185    public BindingContext getLibraryBindingContext() {
186        return null;
187    }
188
189    @NotNull
190    public static Collection<JetFile> withJsLibAdded(@NotNull Collection<JetFile> files, @NotNull Config config) {
191        Collection<JetFile> allFiles = Lists.newArrayList();
192        allFiles.addAll(files);
193        allFiles.addAll(config.getLibFiles());
194        return allFiles;
195    }
196
197    //TODO: should be null by default I suppose but we can't communicate it to K2JSCompiler atm
198    @Nullable
199    public JSTester getTester() {
200        return new QUnitTester();
201    }
202}