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