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}