migrating code

This commit is contained in:
Pavel Talanov
2012-01-29 00:12:31 +04:00
parent 04b902a0de
commit d63de3b152
17 changed files with 520 additions and 1326 deletions
+373 -1239
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
package js
package js;
fun println()
fun println(s : Any?)
+10 -9
View File
@@ -1,10 +1,11 @@
package jquery;
fun fail() : Nothing = throw RuntimeException();
import js.annotations.*;
fun JQuery.toString() = ""
class JQuery() {
fun addClass(className : String) : JQuery = fail();
JavascriptNativeClass class JQuery() {
fun addClass(className : String) : JQuery = this;
fun attr(attrName : String) = ""
fun attr(attrName : String, value : String) = this
fun hasClass(className : String) = true
@@ -28,9 +29,9 @@ open class DomElement() {
//val document = object : DomElement() {}
fun jq(selector : String) = JQuery();
fun jq(selector : String, context : DomElement) = JQuery();
fun jq(callback : () -> Unit) = JQuery();
fun jq(obj : JQuery) = JQuery();
fun jq(el : DomElement) = JQuery();
fun jq() = JQuery();
JavascriptNativeFunction("$") fun jq(selector : String) = JQuery();
JavascriptNativeFunction("$") fun jq(selector : String, context : DomElement) = JQuery();
JavascriptNativeFunction("$") fun jq(callback : () -> Unit) = JQuery();
JavascriptNativeFunction("$") fun jq(obj : JQuery) = JQuery();
JavascriptNativeFunction("$") fun jq(el : DomElement) = JQuery();
JavascriptNativeFunction("$") fun jq() = JQuery();
@@ -1,13 +0,0 @@
package org.jetbrains.k2js;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
/**
* @author Pavel Talanov
*/
public interface Config {
@NotNull
Project getProject();
}
@@ -1,4 +1,4 @@
package org.jetbrains.k2js;
package org.jetbrains.k2js.analyze;
import com.google.common.base.Predicate;
import com.intellij.openapi.project.Project;
@@ -12,10 +12,9 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiFactory;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
import org.jetbrains.k2js.utils.JetFileUtils;
import org.jetbrains.k2js.config.Config;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@@ -23,43 +22,32 @@ import java.util.List;
*/
public final class Analyzer {
//TODO: provide some generic way to access
private static final List<String> LIB_FILE_NAMES = Arrays.asList(
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\jquery\\common.kt",
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\javautil.kt",
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\core.kt"
);
@NotNull
public static List<JetFile> getJsSupportStdLib(@Nullable Project project) {
List<JetFile> libFiles = new ArrayList<JetFile>();
for (String libFileName : LIB_FILE_NAMES) {
libFiles.add(JetFileUtils.loadPsiFile(libFileName, project));
}
return libFiles;
}
@NotNull
public static BindingContext analyzeFiles(@NotNull List<JetFile> files,
@NotNull Project project) {
final List<JetFile> jsLibFiles = getJsSupportStdLib(project);
List<JetFile> allFiles = allFiles(files, jsLibFiles);
return AnalyzingUtils.analyzeFiles(project, JsConfiguration.jsLibConfiguration(project),
public static BindingContext analyzeFilesAndCheckErrors(@NotNull List<JetFile> files,
@NotNull Config config) {
final List<JetFile> jsLibFiles = config.getLibFiles();
List<JetFile> allFiles = withJsLibAdded(files, config);
BindingContext bindingContext = AnalyzingUtils.analyzeFiles(config.getProject(),
JsConfiguration.jsLibConfiguration(config.getProject()),
allFiles, notLibFiles(jsLibFiles), JetControlFlowDataTraceFactory.EMPTY);
checkForErrors(allFiles, bindingContext);
return bindingContext;
}
@NotNull
private static Project getProject(@NotNull List<JetFile> files) {
assert !files.isEmpty();
return files.iterator().next().getProject();
private static void checkForErrors(@NotNull List<JetFile> allFiles, @NotNull BindingContext bindingContext) {
for (JetFile file : allFiles) {
AnalyzingUtils.checkForSyntacticErrors(file);
AnalyzingUtils.throwExceptionOnErrors(bindingContext);
}
}
//TODO: use some mechanism to avoid this
//TODO: move method somewhere
@NotNull
private static List<JetFile> allFiles(@NotNull List<JetFile> files,
@NotNull List<JetFile> jsLibFiles) {
public static List<JetFile> withJsLibAdded(@NotNull List<JetFile> files, @NotNull Config config) {
List<JetFile> allFiles = new ArrayList<JetFile>();
allFiles.addAll(files);
allFiles.addAll(jsLibFiles);
allFiles.addAll(config.getLibFiles());
return allFiles;
}
@@ -69,7 +57,8 @@ public final class Analyzer {
@Override
public boolean apply(@Nullable PsiFile file) {
assert file instanceof JetFile;
return (!jsLibFiles.contains(file));
boolean notLibFile = !jsLibFiles.contains(file);
return notLibFile;
}
};
}
@@ -0,0 +1,50 @@
package org.jetbrains.k2js.config;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.k2js.utils.JetFileUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Pavel Talanov
*/
public abstract class Config {
//TODO: provide some generic way to access
private static final List<String> LIB_FILE_NAMES = Arrays.asList(
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\annotations.kt",
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\jquery\\common.kt",
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\javautil.kt",
"C:\\Dev\\Projects\\jet-contrib\\k2js\\jslib\\src\\core\\core.kt"
);
@NotNull
private static List<JetFile> initLibFiles(@NotNull Project project) {
List<JetFile> libFiles = new ArrayList<JetFile>();
for (String libFileName : LIB_FILE_NAMES) {
libFiles.add(JetFileUtils.loadPsiFile(libFileName, project));
}
return libFiles;
}
@Nullable
private /*var*/ List<JetFile> jsLibFiles = null;
@NotNull
public abstract Project getProject();
@NotNull
public List<JetFile> getLibFiles() {
if (jsLibFiles == null) {
jsLibFiles = initLibFiles(getProject());
}
return jsLibFiles;
}
}
@@ -1,4 +1,4 @@
package org.jetbrains.k2js;
package org.jetbrains.k2js.config;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.NotNull;
/**
* @author Pavel Talanov
*/
public final class IDEAConfig implements Config {
public final class IDEAConfig extends Config {
@NotNull
private final Project project;
@@ -1,4 +1,4 @@
package org.jetbrains.k2js;
package org.jetbrains.k2js.config;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
@@ -9,7 +9,7 @@ import org.jetbrains.jet.compiler.JetCoreEnvironment;
/**
* @author Pavel Talanov
*/
public final class TestConfig implements Config {
public final class TestConfig extends Config {
@NotNull
private static JetCoreEnvironment getTestEnvironment() {
@@ -1,14 +1,19 @@
package org.jetbrains.k2js;
package org.jetbrains.k2js.facade;
import com.google.dart.compiler.backend.js.ast.JsProgram;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.analyze.Analyzer;
import org.jetbrains.k2js.config.Config;
import org.jetbrains.k2js.config.IDEAConfig;
import org.jetbrains.k2js.config.TestConfig;
import org.jetbrains.k2js.generate.CodeGenerator;
import org.jetbrains.k2js.translate.general.Translation;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import org.jetbrains.k2js.utils.GenerationUtils;
import org.jetbrains.k2js.utils.JetFileUtils;
@@ -88,17 +93,15 @@ public final class K2JSTranslator {
}
@NotNull
private JsProgram generateProgram(@NotNull List<JetFile> files) {
BindingContext bindingContext = Analyzer.analyzeFiles(files, config.getProject());
for (JetFile file : files) {
AnalyzingUtils.checkForSyntacticErrors(file);
AnalyzingUtils.throwExceptionOnErrors(bindingContext);
}
JetFile file = files.iterator().next();
return Translation.generateAst(bindingContext, file, file.getProject());
private JsProgram generateProgram(@NotNull List<JetFile> filesToTranslate) {
BindingContext bindingContext = Analyzer.analyzeFilesAndCheckErrors(filesToTranslate, config);
JetFile file = filesToTranslate.iterator().next();
NamespaceDescriptor namespaceDescriptor = BindingUtils.getNamespaceDescriptor(bindingContext, file);
return Translation.generateAst(bindingContext, namespaceDescriptor,
Analyzer.withJsLibAdded(filesToTranslate, config), getProject());
}
@NotNull
public String generateCallToMain(@NotNull JetFile file, @NotNull String argumentString) {
String namespaceName = getRootNamespaceName(file);
@@ -122,7 +125,7 @@ public final class K2JSTranslator {
JetNamespaceHeader namespaceHeader = psiFile.getNamespaceHeader();
String name = namespaceHeader.getName();
assert name != null : "NamespaceHeader must have a name";
//TODO: ensapsulate anonymous logic somewhere
//TODO: encapsulate anonymous logic somewhere
if (name.equals("")) {
return "Anonymous";
}
@@ -1,7 +1,8 @@
package org.jetbrains.k2js;
package org.jetbrains.k2js.facade;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.k2js.config.TestConfig;
import org.jetbrains.k2js.utils.ErrorSender;
import java.applet.Applet;
@@ -132,9 +132,13 @@ public final class DeclarationVisitor extends DeclarationDescriptorVisitor<Void,
@Override
public Void visitNamespaceDescriptor(@NotNull NamespaceDescriptor descriptor, @NotNull DeclarationContext context) {
/* do not traverse inner namespaces */
return null;
}
public void traverseNamespace(NamespaceDescriptor descriptor, DeclarationContext context) {
DeclarationContext namespaceContext = extractNamespaceDeclaration(descriptor, context);
declareMembers(descriptor, namespaceContext);
return null;
}
@NotNull
@@ -1,14 +1,21 @@
package org.jetbrains.k2js.translate.context;
import com.google.common.collect.Sets;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetStandardLibrary;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author Pavel Talanov
@@ -33,9 +40,19 @@ public final class Declarations {
this.rootScope = scope;
}
public void extractDeclarations(@NotNull DeclarationDescriptor descriptor) {
public void extractDeclarationsFromNamespace(@NotNull NamespaceDescriptor descriptor) {
DeclarationVisitor visitor = new DeclarationVisitor(this, true);
descriptor.accept(visitor, DeclarationContext.rootContext(rootScope, null));
visitor.traverseNamespace(descriptor, DeclarationContext.rootContext(rootScope, null));
}
public void extractDeclarationsFromFiles(@NotNull List<JetFile> files, @NotNull BindingContext context) {
Set<NamespaceDescriptor> namespaces = Sets.newHashSet();
for (JetFile file : files) {
namespaces.add(BindingUtils.getNamespaceDescriptor(context, file));
}
for (NamespaceDescriptor namespace : namespaces) {
extractDeclarationsFromNamespace(namespace);
}
}
public void extractStandardLibrary(@NotNull JetStandardLibrary standardLibrary,
@@ -78,17 +95,20 @@ public final class Declarations {
}
/*package*/ void putScope(@NotNull DeclarationDescriptor descriptor, @NotNull NamingScope scope) {
assert !descriptorToScopeMap.containsKey(descriptor) : "Already contains that key!";
assert !descriptorToScopeMap.containsKey(descriptor)
: "Already contains that key!\n" + descriptor;
descriptorToScopeMap.put(descriptor, scope);
}
/*package*/ void putName(@NotNull DeclarationDescriptor descriptor, @NotNull JsName name) {
assert !descriptorToNameMap.containsKey(descriptor) : "Already contains that key!";
assert !descriptorToNameMap.containsKey(descriptor)
: "Already contains that key!\n" + descriptor;
descriptorToNameMap.put(descriptor, name);
}
/*package*/ void putQualifier(@NotNull DeclarationDescriptor descriptor, @Nullable JsNameRef qualifier) {
assert !descriptorToQualifierMap.containsKey(descriptor) : "Already contains that key!";
assert !descriptorToQualifierMap.containsKey(descriptor)
: "Already contains that key!";
descriptorToQualifierMap.put(descriptor, qualifier);
}
}
@@ -20,7 +20,8 @@ import org.jetbrains.k2js.translate.expression.PatternTranslator;
import org.jetbrains.k2js.translate.expression.WhenTranslator;
import org.jetbrains.k2js.translate.initializer.ClassInitializerTranslator;
import org.jetbrains.k2js.translate.initializer.NamespaceInitializerTranslator;
import org.jetbrains.k2js.translate.utils.BindingUtils;
import java.util.List;
/**
* @author Pavel Talanov
@@ -90,17 +91,18 @@ public final class Translation {
}
public static JsProgram generateAst(@NotNull BindingContext bindingContext,
@NotNull JetFile namespace, @NotNull Project project) {
@NotNull NamespaceDescriptor namespaceToTranslate,
@NotNull List<JetFile> files,
@NotNull Project project) {
//TODO: move some of the code somewhere
JetStandardLibrary standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
NamespaceDescriptor descriptor = BindingUtils.getNamespaceDescriptor(bindingContext, namespace);
StaticContext staticContext = StaticContext.generateStaticContext(standardLibrary, bindingContext);
staticContext.getDeclarations().
extractStandardLibrary(standardLibrary, staticContext.getNamer().kotlinObject());
staticContext.getDeclarations().extractDeclarations(descriptor);
staticContext.getDeclarations().extractDeclarationsFromFiles(files, bindingContext);
JsBlock block = staticContext.getProgram().getFragmentBlock(0);
TranslationContext context = TranslationContext.rootContext(staticContext);
block.addStatement(Translation.translateNamespace(descriptor, context));
block.addStatement(Translation.translateNamespace(namespaceToTranslate, context));
JsNamer namer = new JsPrettyNamer();
namer.exec(context.program());
@@ -49,7 +49,10 @@ public final class BindingUtils {
@NotNull
public static NamespaceDescriptor getNamespaceDescriptor(@NotNull BindingContext context,
@NotNull JetFile declaration) {
return getDescriptorForExpression(context, declaration, NamespaceDescriptor.class);
NamespaceDescriptor namespaceDescriptor =
context.get(BindingContext.FQNAME_TO_NAMESPACE_DESCRIPTOR, JetPsiUtil.getFQName(declaration));
assert namespaceDescriptor != null : "File should have a namespace descriptor.";
return namespaceDescriptor;
}
@NotNull
@@ -1,7 +1,7 @@
package org.jetbrains.k2js.utils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.k2js.K2JSTranslatorApplet;
import org.jetbrains.k2js.facade.K2JSTranslatorApplet;
import java.io.BufferedReader;
import java.io.InputStreamReader;
@@ -1,6 +1,6 @@
package org.jetbrains.k2js.test;
import org.jetbrains.k2js.K2JSTranslatorApplet;
import org.jetbrains.k2js.facade.K2JSTranslatorApplet;
import org.junit.Assert;
import org.junit.Test;
import org.mozilla.javascript.Context;
@@ -1,6 +1,6 @@
package org.jetbrains.k2js.test;
import org.jetbrains.k2js.K2JSTranslator;
import org.jetbrains.k2js.facade.K2JSTranslator;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;