diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 279bf7ef194..4afb69675d7 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,58 +6,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -136,9 +112,36 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -151,86 +154,53 @@ - + - - + + - - - - - - - - - - - - + - - + + - + - - + + - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -239,30 +209,46 @@ - - + + - + - - + + - - - - + + - - + + - + + + + + + + + + + + + + + + + + + + @@ -277,26 +263,8 @@ - - - - - - - - - - - - - - - - - - - - + + @@ -304,8 +272,8 @@ - - + + @@ -313,19 +281,19 @@ - - + + - + - - + + - + @@ -341,28 +309,33 @@ + @@ -405,6 +378,22 @@ + + + + + + + + + + + + @@ -454,6 +443,10 @@ @@ -521,24 +514,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -690,9 +649,9 @@ - - + + @@ -707,6 +666,54 @@ + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + localhost @@ -944,23 +903,23 @@ - - + - + - + - + + @@ -971,8 +930,8 @@ @@ -1028,122 +989,114 @@ - + - - - - - - - - - - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + - + - + - + - - - - - - - - - - + - + - + + + + + + + + diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslator.java b/translator/src/org/jetbrains/k2js/K2JSTranslator.java index c3c9b4db882..537706a44d4 100644 --- a/translator/src/org/jetbrains/k2js/K2JSTranslator.java +++ b/translator/src/org/jetbrains/k2js/K2JSTranslator.java @@ -12,8 +12,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.sampullara.cli.Argument; -import org.jetbrains.k2js.generate.CodeGenerator; -import org.jetbrains.k2js.translate.GenerationState; import org.jetbrains.jet.JetCoreEnvironment; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; import org.jetbrains.jet.lang.diagnostics.Diagnostic; @@ -25,6 +23,8 @@ import org.jetbrains.jet.lang.psi.JetNamespace; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.java.JavaDefaultImports; +import org.jetbrains.k2js.generate.CodeGenerator; +import org.jetbrains.k2js.translate.GenerationState; import java.io.File; import java.io.IOException; @@ -75,16 +75,16 @@ public class K2JSTranslator { Project project = environment.getProject(); GenerationState generationState = new GenerationState(); List namespaces = Lists.newArrayList(); - if(vFile.isDirectory()) { + if (vFile.isDirectory()) { File dir = new File(vFile.getPath()); addFiles(environment, project, namespaces, dir); - } - else { + } else { PsiFile psiFile = PsiManager.getInstance(project).findFile(vFile); if (psiFile instanceof JetFile) { - namespaces.add(((JetFile) psiFile).getRootNamespace()); - } - else { + JetNamespace rootNamespace = ((JetFile) psiFile).getRootNamespace(); + AnalyzingUtils.checkForSyntacticErrors(rootNamespace); + namespaces.add(rootNamespace); + } else { System.out.print("Not a Kotlin file: " + vFile.getPath()); return; } @@ -93,6 +93,8 @@ public class K2JSTranslator { BindingContext bindingContext = AnalyzingUtils.getInstance(JavaDefaultImports.JAVA_DEFAULT_IMPORTS) .analyzeNamespaces(project, namespaces, Predicates.alwaysTrue(), JetControlFlowDataTraceFactory.EMPTY); + AnalyzingUtils.throwExceptionOnErrors(bindingContext); + ErrorCollector errorCollector = new ErrorCollector(bindingContext); errorCollector.report(); @@ -106,8 +108,7 @@ public class K2JSTranslator { File outputFile = new File(arguments.outputDir); try { generator.generateToFile(program, outputFile); - } - catch (IOException e) { + } catch (IOException e) { System.out.println("Failed to write to specified file"); } } @@ -116,7 +117,7 @@ public class K2JSTranslator { } private static class ErrorCollector { - Multimap maps = LinkedHashMultimap.create(); + Multimap maps = LinkedHashMultimap.create(); boolean hasErrors; @@ -128,17 +129,16 @@ public class K2JSTranslator { private void report(Diagnostic diagnostic) { hasErrors |= diagnostic.getSeverity() == Severity.ERROR; - if(diagnostic instanceof DiagnosticWithTextRange) { + if (diagnostic instanceof DiagnosticWithTextRange) { DiagnosticWithTextRange diagnosticWithTextRange = (DiagnosticWithTextRange) diagnostic; maps.put(diagnosticWithTextRange.getPsiFile(), diagnosticWithTextRange); - } - else { + } else { System.out.println(diagnostic.getSeverity().toString() + ": " + diagnostic.getMessage()); } } void report() { - if(!maps.isEmpty()) { + if (!maps.isEmpty()) { for (PsiFile psiFile : maps.keySet()) { System.out.println(psiFile.getVirtualFile().getPath()); Collection diagnosticWithTextRanges = maps.get(psiFile); @@ -152,15 +152,14 @@ public class K2JSTranslator { } private static void addFiles(JavaCoreEnvironment environment, Project project, List namespaces, File dir) { - for(File file : dir.listFiles()) { - if(!file.isDirectory()) { + for (File file : dir.listFiles()) { + if (!file.isDirectory()) { VirtualFile virtualFile = environment.getLocalFileSystem().findFileByPath(file.getAbsolutePath()); PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile); if (psiFile instanceof JetFile) { namespaces.add(((JetFile) psiFile).getRootNamespace()); } - } - else { + } else { addFiles(environment, project, namespaces, file); } } @@ -171,15 +170,15 @@ public class K2JSTranslator { File rtJar = null; if (javaHome == null) { ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); - if(systemClassLoader instanceof URLClassLoader) { + if (systemClassLoader instanceof URLClassLoader) { URLClassLoader loader = (URLClassLoader) systemClassLoader; - for(URL url: loader.getURLs()) { - if("file".equals(url.getProtocol())) { - if(url.getFile().endsWith("/lib/rt.jar")) { + for (URL url : loader.getURLs()) { + if ("file".equals(url.getProtocol())) { + if (url.getFile().endsWith("/lib/rt.jar")) { rtJar = new File(url.getFile()); break; } - if(url.getFile().endsWith("/Classes/classes.jar")) { + if (url.getFile().endsWith("/Classes/classes.jar")) { rtJar = new File(url.getFile()).getAbsoluteFile(); break; } @@ -187,12 +186,11 @@ public class K2JSTranslator { } } - if(rtJar == null) { + if (rtJar == null) { System.out.println("JAVA_HOME environment variable needs to be defined"); return null; } - } - else { + } else { rtJar = findRtJar(javaHome); } diff --git a/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java b/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java index 492f80c6fd2..c9d9dd2c13c 100644 --- a/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java +++ b/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java @@ -45,6 +45,6 @@ public final class DeclarationExtractor { } /*package*/ void putName(@NotNull DeclarationDescriptor descriptor, @NotNull JsName name) { - descriptorToNameMap.put(descriptor, name); + descriptorToNameMap.put(descriptor, name); } } diff --git a/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java b/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java index 4c6fce68b65..02880fa7949 100644 --- a/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java +++ b/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java @@ -2,7 +2,6 @@ package org.jetbrains.k2js.declarations; import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsScope; -import com.intellij.util.xml.PropertyAccessor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -13,7 +12,8 @@ import org.jetbrains.k2js.translate.Namer; */ public final class ExtractionVisitor extends DeclarationDescriptorVisitor { - @NotNull private final DeclarationExtractor extractor; + @NotNull + private final DeclarationExtractor extractor; /*package*/ ExtractionVisitor(@NotNull DeclarationExtractor extractor) { this.extractor = extractor; diff --git a/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java b/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java index c85b2e2f915..c950ae8b234 100644 --- a/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java +++ b/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java @@ -34,7 +34,7 @@ public final class CodeGenerator { private void generateCode(JsProgram program) { JsSourceGenerationVisitor sourceGenerator = - new JsSourceGenerationVisitor(output); + new JsSourceGenerationVisitor(output); program.traverse(sourceGenerator, null); } } diff --git a/translator/src/org/jetbrains/k2js/translate/AbstractTranslator.java b/translator/src/org/jetbrains/k2js/translate/AbstractTranslator.java index b04d9830938..6072b4c4b23 100644 --- a/translator/src/org/jetbrains/k2js/translate/AbstractTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/AbstractTranslator.java @@ -10,7 +10,8 @@ import org.jetbrains.jet.lang.resolve.BindingContext; */ public abstract class AbstractTranslator { - @NotNull private final TranslationContext context; + @NotNull + private final TranslationContext context; public AbstractTranslator(@NotNull TranslationContext context) { this.context = context; diff --git a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java index 3721fe9d336..0933e7f2c2e 100644 --- a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java @@ -13,11 +13,12 @@ import java.util.List; /** * @author Talanov Pavel - * - * This class contains some code related to BindingContext use. Intention is not to pollute other classes. + *

+ * This class contains some code related to BindingContext use. Intention is not to pollute other classes. */ public final class BindingUtils { - private BindingUtils() {} + private BindingUtils() { + } @NotNull @@ -27,7 +28,7 @@ public final class BindingUtils { assert descriptor != null; assert descriptorClass.isInstance(descriptor) : expression.toString() + " expected to have of type" + descriptorClass.toString(); - return (D)descriptor; + return (D) descriptor; } @NotNull @@ -68,7 +69,7 @@ public final class BindingUtils { @NotNull static public PropertySetterDescriptor getPropertySetterDescriptorForProperty(@NotNull BindingContext context, - @NotNull JetProperty property) { + @NotNull JetProperty property) { PropertySetterDescriptor result = getPropertyDescriptor(context, property).getSetter(); assert result != null : "Property should have a setter descriptor"; return result; @@ -76,7 +77,7 @@ public final class BindingUtils { @NotNull static public PropertyGetterDescriptor getPropertyGetterDescriptorForProperty(@NotNull BindingContext context, - @NotNull JetProperty property) { + @NotNull JetProperty property) { PropertyGetterDescriptor result = getPropertyDescriptor(context, property).getGetter(); assert result != null : "Property should have a getter descriptor"; return result; @@ -84,17 +85,17 @@ public final class BindingUtils { @NotNull static public List getSuperclassDescriptors(@NotNull BindingContext context, - @NotNull JetClass classDeclaration) { + @NotNull JetClass classDeclaration) { ClassDescriptor classDescriptor = getClassDescriptor(context, classDeclaration); Collection superclassTypes = classDescriptor.getTypeConstructor().getSupertypes(); List superClassDescriptors = new ArrayList(); for (JetType type : superclassTypes) { DeclarationDescriptor superClassDescriptor = - type.getConstructor().getDeclarationDescriptor(); + type.getConstructor().getDeclarationDescriptor(); assert superClassDescriptor instanceof ClassDescriptor - : "Superclass descriptor of a type should be of type ClassDescriptor"; + : "Superclass descriptor of a type should be of type ClassDescriptor"; if (isNotAny(superClassDescriptor)) { - superClassDescriptors.add((ClassDescriptor)superClassDescriptor); + superClassDescriptors.add((ClassDescriptor) superClassDescriptor); } } return superClassDescriptors; @@ -102,7 +103,7 @@ public final class BindingUtils { //TODO better implementation? private static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) { - return superClassDescriptor.getName() != "Any"; + return !superClassDescriptor.getName().equals("Any"); } } diff --git a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java index 4f7fa13970e..34062c741b9 100644 --- a/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java @@ -82,7 +82,7 @@ public final class ClassBodyVisitor extends TranslatorVisitor(), AstUtil.convertToBlock(returnExpression)); + (context.enclosingScope(), null, new ArrayList(), AstUtil.convertToBlock(returnExpression)); } @NotNull @@ -91,7 +91,7 @@ public final class ClassBodyVisitor extends TranslatorVisitor getSuperclassNameReferences(@NotNull JetClass classDeclaration) { List superclassReferences = new ArrayList(); for (ClassDescriptor superClassDescriptor : - BindingUtils.getSuperclassDescriptors(translationContext().bindingContext(), classDeclaration)) { + BindingUtils.getSuperclassDescriptors(translationContext().bindingContext(), classDeclaration)) { //TODO should get a full class name here superclassReferences.add(translationContext().getNamespaceQualifiedReference (translationContext().getNameForDescriptor(superClassDescriptor))); diff --git a/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java index 908464413bd..9d3b20e114f 100644 --- a/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java @@ -21,6 +21,4 @@ public final class DeclarationTranslator extends AbstractTranslator { } - - } diff --git a/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java b/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java index 56f18f43bcf..74d647db902 100644 --- a/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java @@ -6,9 +6,7 @@ import com.google.dart.compiler.backend.js.ast.JsNameRef; import com.google.dart.compiler.backend.js.ast.JsStatement; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetProperty; @@ -27,25 +25,12 @@ public class DeclarationVisitor extends TranslatorVisitor { JsExpression result; if (jsInitExpression != null) { result = AstUtil.newAssignment(jsPropertyNameReference, jsInitExpression); - } - else { + } else { result = jsPropertyNameReference; } return AstUtil.convertToStatement(result); } - //TODO duplicate code translateInitializer 1 - @Nullable - private JsExpression translateInitializer(@NotNull JetProperty declaration, @NotNull TranslationContext context) { - JsExpression jsInitExpression = null; - JetExpression initializer = declaration.getInitializer(); - if (initializer != null) { - jsInitExpression = AstUtil.convertToExpression( - (new ExpressionTranslator(context)).translate(initializer)); - } - return jsInitExpression; - } - @NotNull @Override public JsStatement visitClass(@NotNull JetClass expression, @NotNull TranslationContext context) { diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java b/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java index 934f33ebce6..6bbf698f72a 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java @@ -9,7 +9,7 @@ import org.jetbrains.jet.lang.psi.JetExpression; */ public final class ExpressionTranslator extends AbstractTranslator { - final private ExpressionVisitor visitor = new ExpressionVisitor(translationContext()); + final private ExpressionVisitor visitor = new ExpressionVisitor(); public ExpressionTranslator(@NotNull TranslationContext context) { super(context); diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java index 758f82c2103..345ed389dee 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java @@ -1,21 +1,15 @@ package org.jetbrains.k2js.translate; -import com.google.dart.compiler.backend.js.ast.JsBlock; -import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.*; -import com.google.dart.compiler.backend.js.ast.JsReturn; import com.google.dart.compiler.util.AstUtil; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor; -import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; -import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils; import org.jetbrains.jet.lexer.JetToken; import org.jetbrains.jet.lexer.JetTokens; @@ -28,39 +22,33 @@ import java.util.List; */ public final class ExpressionVisitor extends TranslatorVisitor { - public ExpressionVisitor(TranslationContext context) { - } - - //TODO method too long @Override @NotNull - public JsNode visitConstantExpression(@NotNull JetConstantExpression expression, @NotNull TranslationContext context) { - JsExpression result = null; - Object value; + public JsNode visitConstantExpression(@NotNull JetConstantExpression expression, + @NotNull TranslationContext context) { CompileTimeConstant compileTimeValue = context.bindingContext().get(BindingContext.COMPILE_TIME_VALUE, expression); assert compileTimeValue != null; - value = compileTimeValue.getValue(); + Object value = compileTimeValue.getValue(); if (value instanceof Integer) { - result = context.program().getNumberLiteral((Integer) value); + return context.program().getNumberLiteral((Integer) value); } if (value instanceof Boolean) { return context.program().getBooleanLiteral((Boolean) value); } - assert result != null; - return result; + throw new AssertionError("Unsupported constant expression" + expression.toString()); } @Override @NotNull public JsNode visitBlockExpression(@NotNull JetBlockExpression jetBlock, @NotNull TranslationContext context) { - List jetElements = jetBlock.getStatements(); + List statements = jetBlock.getStatements(); JsBlock jsBlock = new JsBlock(); TranslationContext newContext = context.newBlock(); - for (JetElement jetElement : jetElements) { - //TODO hack alert - JetExpression jetExpression = (JetExpression) jetElement; - JsNode jsNode = jetExpression.accept(this, newContext); + for (JetElement statement : statements) { + assert statement instanceof JetExpression : "Elements in JetBlockExpression " + + "should be of type JetExpression"; + JsNode jsNode = statement.accept(this, newContext); jsBlock.addStatement(AstUtil.convertToStatement(jsNode)); } return jsBlock; @@ -100,10 +88,11 @@ public final class ExpressionVisitor extends TranslatorVisitor { return translateAsBinaryOperation(expression, context); } + //TODO method too long @Nullable public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { - JetToken jetOperationToken = (JetToken)expression.getOperationToken(); + JetToken jetOperationToken = (JetToken) expression.getOperationToken(); if (!OperationTranslator.isAssignment(jetOperationToken)) { return null; } @@ -124,16 +113,17 @@ public final class ExpressionVisitor extends TranslatorVisitor { private JsNode translateAsBinaryOperation(@NotNull JetBinaryExpression expression, @NotNull TranslationContext context) { JsExpression left = AstUtil.convertToExpression(expression.getLeft().accept(this, context)); JetExpression rightExpression = expression.getRight(); - assert rightExpression != null : "Selector should not be null"; + assert rightExpression != null : "Binary expression should have a right exprssion"; JsExpression right = AstUtil.convertToExpression(rightExpression.accept(this, context)); - JetToken jetOperationToken = (JetToken)expression.getOperationToken(); + JetToken jetOperationToken = (JetToken) expression.getOperationToken(); return new JsBinaryOperation(OperationTranslator.getBinaryOperator(jetOperationToken), left, right); } - //TODO clearify code + //TODO support other cases @Override @NotNull - public JsNode visitSimpleNameExpression(JetSimpleNameExpression expression, TranslationContext context) { + public JsNode visitSimpleNameExpression(@NotNull JetSimpleNameExpression expression, + @NotNull TranslationContext context) { String referencedName = expression.getReferencedName(); JsName jsName = context.enclosingScope().findExistingName(referencedName); assert jsName != null : "Undeclared name: " + referencedName; @@ -150,31 +140,17 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Override @NotNull // assume it is a local variable declaration - public JsNode visitProperty(JetProperty expression, TranslationContext context) { - JsName jsPropertyName = context.declareLocalName(getPropertyName(expression)); - JsExpression jsInitExpression = translateInitializer(expression, context); - return AstUtil.newVar(jsPropertyName, jsInitExpression); + public JsNode visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) { + JsName jsPropertyName = context.declareLocalName(getPropertyName(expression)); + JsExpression jsInitExpression = translateInitializer(expression, context); + return AstUtil.newVar(jsPropertyName, jsInitExpression); } - //TODO duplicate code translateInitializer 2 - @Nullable - private JsExpression translateInitializer(JetProperty declaration, TranslationContext context) { - JsExpression jsInitExpression = null; - JetExpression initializer = declaration.getInitializer(); - if (initializer != null) { - jsInitExpression = AstUtil.convertToExpression( - (new ExpressionTranslator(context)).translate(initializer)); - } - return jsInitExpression; - } - - @Override @NotNull public JsNode visitCallExpression(JetCallExpression expression, TranslationContext context) { JsExpression callee = getCallee(expression, context); List arguments = generateArgumentList(expression.getValueArguments(), context); - if (isConstructorInvocation(expression, context)) { JsNew constructorCall = new JsNew(callee); constructorCall.setArguments(arguments); @@ -288,7 +264,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Override @NotNull public JsNode visitStringTemplateExpression(@NotNull JetStringTemplateExpression expression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { JsStringLiteral stringLiteral = resolveAsStringConstant(expression, context); if (stringLiteral != null) { return stringLiteral; @@ -298,13 +274,13 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Nullable private JsStringLiteral resolveAsStringConstant(@NotNull JetStringTemplateExpression expression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { CompileTimeConstant compileTimeValue = context.bindingContext().get(BindingContext.COMPILE_TIME_VALUE, expression); if (compileTimeValue != null) { Object value = compileTimeValue.getValue(); assert value instanceof String : "Compile time constant template should be a String constant."; - String constantString = (String)value; + String constantString = (String) value; return context.program().getStringLiteral(constantString); } return null; @@ -314,7 +290,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @Override @NotNull public JsNode visitDotQualifiedExpression(@NotNull JetDotQualifiedExpression expression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { JsInvocation getterCall = translateAsGetterCall(expression, context); if (getterCall != null) { return getterCall; @@ -349,18 +325,16 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull private JsNode translateAsQualifiedNameReference(@NotNull JsExpression receiver, @NotNull JsNameRef selector) { - JsNameRef result = (JsNameRef)selector; - result.setQualifier(receiver); - return result; + selector.setQualifier(receiver); + return selector; } @NotNull private JsNode translateAsQualifiedInvocation(@NotNull JsExpression receiver, @NotNull JsInvocation selector) { - JsInvocation result = (JsInvocation)selector; - JsExpression qualifier = result.getQualifier(); - JsNameRef nameRef = (JsNameRef)qualifier; + JsExpression qualifier = selector.getQualifier(); + JsNameRef nameRef = (JsNameRef) qualifier; nameRef.setQualifier(receiver); - return result; + return selector; } diff --git a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java index afd83519cc1..9a5d76c6d12 100644 --- a/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java @@ -3,14 +3,11 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.*; import com.google.dart.compiler.util.AstUtil; import com.sun.istack.internal.NotNull; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.psi.JetParameter; -import org.jetbrains.jet.lang.resolve.BindingContext; -import javax.xml.ws.Binding; import java.util.ArrayList; import java.util.List; diff --git a/translator/src/org/jetbrains/k2js/translate/GenerationState.java b/translator/src/org/jetbrains/k2js/translate/GenerationState.java index 1e7d89bc9a3..3d6ddf0fc34 100644 --- a/translator/src/org/jetbrains/k2js/translate/GenerationState.java +++ b/translator/src/org/jetbrains/k2js/translate/GenerationState.java @@ -4,21 +4,11 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.JsProgram; -import com.intellij.openapi.project.Project; -import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory; -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.psi.JetNamespace; -import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.java.JavaDefaultImports; import org.jetbrains.k2js.declarations.DeclarationExtractor; -import javax.print.attribute.standard.MediaSize; -import javax.xml.ws.Binding; -import java.beans.beancontext.BeanContext; -import java.util.Collections; import java.util.List; public final class GenerationState { @@ -41,5 +31,4 @@ public final class GenerationState { } - } diff --git a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java index 6a0d125d675..c68778b1026 100644 --- a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java @@ -11,15 +11,18 @@ import java.util.List; /** * @author Talanov Pavel - * - * This visitor collects all initializers from a given class into JsFunction object. - * Note: we do use visitor pattern to preserve the order in which initializers are executed. + *

+ * This visitor collects all initializers from a given class into JsFunction object. + * Note: we do use visitor pattern to preserve the order in which initializers are executed. */ public class InitializerVisitor extends TranslatorVisitor> { - @NotNull private final JsScope initializerMethodScope; - @NotNull private final JetClass classDeclaration; - @NotNull private final TranslationContext initializerMethodContext; + @NotNull + private final JsScope initializerMethodScope; + @NotNull + private final JetClass classDeclaration; + @NotNull + private final TranslationContext initializerMethodContext; public InitializerVisitor(@NotNull JetClass classDeclaration, @NotNull TranslationContext context) { this.initializerMethodScope = new JsScope(context.getScopeForElement(classDeclaration), @@ -81,7 +84,7 @@ public class InitializerVisitor extends TranslatorVisitor> { @NotNull JsStatement assignmentToBackingField(@NotNull JetProperty property, @NotNull JsExpression initExpression, - @NotNull TranslationContext context) { + @NotNull TranslationContext context) { String propertyName = property.getName(); assert propertyName != null : "Named property expected."; JsName backingFieldName = getBackingFieldName(propertyName, context); diff --git a/translator/src/org/jetbrains/k2js/translate/Namer.java b/translator/src/org/jetbrains/k2js/translate/Namer.java index cee2c5eb0f7..f2e1ce99d50 100644 --- a/translator/src/org/jetbrains/k2js/translate/Namer.java +++ b/translator/src/org/jetbrains/k2js/translate/Namer.java @@ -2,7 +2,6 @@ package org.jetbrains.k2js.translate; import com.google.dart.compiler.backend.js.ast.JsNameRef; import com.google.dart.compiler.util.AstUtil; -import org.jetbrains.jet.lang.psi.JetPropertyAccessor; /** * @author Talanov Pavel @@ -23,7 +22,7 @@ public final class Namer { private static final String SETTER_PREFIX = "set_"; private static final String GETTER_PREFIX = "get_"; private static final String BACKING_FIELD_PREFIX = "$"; - // public static final String DEFAULT_SETTER_PARAM_NAME = "val"; + // public static final String DEFAULT_SETTER_PARAM_NAME = "val"; public static String getClassObjectName() { //TODO dummy representation @@ -33,8 +32,7 @@ public final class Namer { public static String getNameForAccessor(String propertyName, boolean isGetter) { if (isGetter) { return getNameForGetter(propertyName); - } - else { + } else { return getNameForSetter(propertyName); } } @@ -69,5 +67,4 @@ public final class Namer { } - } diff --git a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java index e8c79d15cf6..43d846e8468 100644 --- a/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/NamespaceTranslator.java @@ -55,7 +55,7 @@ public final class NamespaceTranslator extends AbstractTranslator { @NotNull private JsInvocation newNamespace(@NotNull JsName name, @NotNull JsBlock namespaceDeclarations, - @NotNull JsFunction dummyFunction) { + @NotNull JsFunction dummyFunction) { List params = new ArrayList(); params.add(new JsParameter(name)); dummyFunction.setParameters(params); diff --git a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java index 5251729f9e2..64c20676240 100644 --- a/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java @@ -35,7 +35,7 @@ public final class OperationTranslator { assert JetTokens.OPERATIONS.contains(token) : "Token should represent a binary operation!"; JsOperator result = map.get(token); if (result instanceof JsBinaryOperator) { - return (JsBinaryOperator)result; + return (JsBinaryOperator) result; } throw new AssertionError("Invalid map: should contain token: " + token.toString()); } diff --git a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java index bf8049a1457..5371702c124 100644 --- a/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java @@ -1,6 +1,9 @@ package org.jetbrains.k2js.translate; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.backend.js.ast.JsInvocation; +import com.google.dart.compiler.backend.js.ast.JsName; +import com.google.dart.compiler.backend.js.ast.JsNameRef; +import com.google.dart.compiler.backend.js.ast.JsNode; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,7 +32,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator { assert selectorExpression != null : "Selector should not be null."; JsName getterName = getPropertyGetterName(selectorExpression); if (getterName == null) { - return null; + return null; } return translateReceiverAndReturnAccessorInvocation(expression, getterName); } @@ -49,12 +52,12 @@ public final class PropertyAccessTranslator extends AbstractTranslator { if (!(expression instanceof JetDotQualifiedExpression)) { return null; } - JetDotQualifiedExpression dotQualifiedExpression = (JetDotQualifiedExpression)expression; + JetDotQualifiedExpression dotQualifiedExpression = (JetDotQualifiedExpression) expression; JetExpression selectorExpression = dotQualifiedExpression.getSelectorExpression(); assert selectorExpression != null : "Selector should not be null."; JsName getterName = getPropertySetterName(selectorExpression); if (getterName == null) { - return null; + return null; } return translateReceiverAndReturnAccessorInvocation(dotQualifiedExpression, getterName); } @@ -92,7 +95,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator { if (resolvedCall != null) { DeclarationDescriptor descriptor = resolvedCall.getCandidateDescriptor(); if (descriptor instanceof PropertyDescriptor) { - return (PropertyDescriptor)descriptor; + return (PropertyDescriptor) descriptor; } } return null; diff --git a/translator/src/org/jetbrains/k2js/translate/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/TranslationContext.java index cb6be7beac3..7ae20bc999b 100644 --- a/translator/src/org/jetbrains/k2js/translate/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/TranslationContext.java @@ -1,6 +1,9 @@ package org.jetbrains.k2js.translate; -import com.google.dart.compiler.backend.js.ast.*; +import com.google.dart.compiler.backend.js.ast.JsName; +import com.google.dart.compiler.backend.js.ast.JsNameRef; +import com.google.dart.compiler.backend.js.ast.JsProgram; +import com.google.dart.compiler.backend.js.ast.JsScope; import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -22,9 +25,12 @@ public final class TranslationContext { this.namespaceScope = namespaceScope; } - @NotNull public final JsScope enclosingScope; - @NotNull public final JsScope classScope; - @NotNull public final JsScope namespaceScope; + @NotNull + public final JsScope enclosingScope; + @NotNull + public final JsScope classScope; + @NotNull + public final JsScope namespaceScope; } @NotNull @@ -35,12 +41,16 @@ public final class TranslationContext { return new TranslationContext(null, program, bindingContext, scopes, extractor); } - @NotNull private final JsProgram program; - @NotNull private final BindingContext bindingContext; - @NotNull private final Scopes scopes; - @Nullable private final JsName namespaceName; - @NotNull private final DeclarationExtractor extractor; - + @NotNull + private final JsProgram program; + @NotNull + private final BindingContext bindingContext; + @NotNull + private final Scopes scopes; + @Nullable + private final JsName namespaceName; + @NotNull + private final DeclarationExtractor extractor; private TranslationContext(@Nullable JsName namespaceName, @NotNull JsProgram program, @@ -115,7 +125,6 @@ public final class TranslationContext { } - @NotNull public JsNameRef getNamespaceQualifiedReference(JsName name) { if (namespaceName != null) { @@ -170,7 +179,8 @@ public final class TranslationContext { return extractor.getName(descriptor); } - @NotNull JsName getNameForElement(@NotNull JetElement element) { + @NotNull + JsName getNameForElement(@NotNull JetElement element) { DeclarationDescriptor descriptor = getDescriptorForElement(element); return getNameForDescriptor(descriptor); } diff --git a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java index 18c98ddcff7..37d10b76a15 100644 --- a/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java @@ -1,15 +1,19 @@ package org.jetbrains.k2js.translate; +import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsName; +import com.google.dart.compiler.util.AstUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.psi.JetVisitor; /** * @author Talanov Pavel - * - * This class is a base class for all visitors. It contains code that is shared among them. + *

+ * This class is a base class for all visitors. It contains code that is shared among them. */ public class TranslatorVisitor extends JetVisitor { @@ -33,4 +37,16 @@ public class TranslatorVisitor extends JetVisitor { String backingFieldName = Namer.getKotlinBackingFieldName(propertyName); return context.enclosingScope().findExistingName(backingFieldName); } + + + @Nullable + protected JsExpression translateInitializer(@NotNull JetProperty declaration, @NotNull TranslationContext context) { + JsExpression jsInitExpression = null; + JetExpression initializer = declaration.getInitializer(); + if (initializer != null) { + jsInitExpression = AstUtil.convertToExpression( + (new ExpressionTranslator(context)).translate(initializer)); + } + return jsInitExpression; + } } diff --git a/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java b/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java index a5820a0a674..046bd0460b4 100644 --- a/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java +++ b/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java @@ -1,8 +1,5 @@ package org.jetbrains.k2js.test; -import org.jetbrains.k2js.translate.TranslationContext; -import org.junit.BeforeClass; -import org.junit.Test; import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; @@ -17,7 +14,7 @@ public abstract class AbstractClassTest extends TranslationTest { private final String KOTLIN_JS_LIB = TEST_FILES + "kotlin_lib.js"; - protected String kotlinLibrartyPath() { + protected String kotlinLibraryPath() { return KOTLIN_JS_LIB; } @@ -29,13 +26,13 @@ public abstract class AbstractClassTest extends TranslationTest { @Override protected void runWithRhino(String inputFile, String namespaceName, - String functionName, Object expectedResult) throws Exception { + String functionName, Object expectedResult) throws Exception { Context cx = Context.enter(); Scriptable scope = cx.initStandardObjects(); - runFileWithRhino(kotlinLibrartyPath(), cx, scope); + runFileWithRhino(kotlinLibraryPath(), cx, scope); runFileWithRhino(inputFile, cx, scope); Object result = extractAndCallFunctionObject(namespaceName, functionName, cx, scope); - assertTrue("Result is not what expected!",result.equals(expectedResult)); + assertTrue("Result is not what expected!", result.equals(expectedResult)); String report = namespaceName + "." + functionName + "() = " + Context.toString(result); System.out.println(report); Context.exit(); diff --git a/translator/test/org/jetbrains/k2js/test/BasicClassTest.java b/translator/test/org/jetbrains/k2js/test/BasicClassTest.java index 28a8fd4ef98..aa6f71a6617 100644 --- a/translator/test/org/jetbrains/k2js/test/BasicClassTest.java +++ b/translator/test/org/jetbrains/k2js/test/BasicClassTest.java @@ -20,7 +20,7 @@ public class BasicClassTest extends AbstractClassTest { public void kotlinJsLibRunsWithRhino() throws Exception { Context context = Context.enter(); Scriptable scope = context.initStandardObjects(); - runFileWithRhino(kotlinLibrartyPath(), context, scope); + runFileWithRhino(kotlinLibraryPath(), context, scope); Context.exit(); } diff --git a/translator/test/org/jetbrains/k2js/test/FunctionTest.java b/translator/test/org/jetbrains/k2js/test/FunctionTest.java index 88b2a6e56e3..0b63cd8ef8e 100644 --- a/translator/test/org/jetbrains/k2js/test/FunctionTest.java +++ b/translator/test/org/jetbrains/k2js/test/FunctionTest.java @@ -1,14 +1,12 @@ package org.jetbrains.k2js.test; -import org.junit.BeforeClass; import org.junit.Test; -import org.kohsuke.rngom.digested.Main; /** * @author Talanov Pavel - * - * This class tests basic language features and constructs such as constants, local variables, simple loops, - * conditional clauses etc. + *

+ * This class tests basic language features and constructs such as constants, local variables, simple loops, + * conditional clauses etc. */ public final class FunctionTest extends TranslationTest { diff --git a/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java b/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java index 5691ff42d20..fb5f56c4341 100644 --- a/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java +++ b/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java @@ -39,4 +39,10 @@ public final class PropertyAccessorTest extends AbstractClassTest { testFooBoxIsTrue("customSetter.kt"); } + //TODO test +// @Test +// public void namespaceCustomAccessors() throws Exception { +// testFooBoxIsTrue("namespaceCustomAccessors.kt"); +// } + } diff --git a/translator/test/org/jetbrains/k2js/test/TranslationTest.java b/translator/test/org/jetbrains/k2js/test/TranslationTest.java index db6c22c973b..aef48ffbac1 100644 --- a/translator/test/org/jetbrains/k2js/test/TranslationTest.java +++ b/translator/test/org/jetbrains/k2js/test/TranslationTest.java @@ -2,14 +2,14 @@ package org.jetbrains.k2js.test; import org.jetbrains.k2js.K2JSTranslator; import org.junit.Before; -import org.junit.BeforeClass; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.NativeObject; import org.mozilla.javascript.Scriptable; import java.io.FileReader; -import static org.junit.Assert.*; + +import static org.junit.Assert.assertTrue; /** @@ -43,7 +43,7 @@ public abstract class TranslationTest { } protected void performTest(String filename, String namespaceName, - String functionName, Object expectedResult) throws Exception { + String functionName, Object expectedResult) throws Exception { K2JSTranslator.Arguments args = new K2JSTranslator.Arguments(); args.src = getInputFilePath(filename); args.outputDir = getOutputFilePath(filename); @@ -64,7 +64,7 @@ public abstract class TranslationTest { } protected void runWithRhino(String inputFile, String namespaceName, - String functionName, Object expectedResult) throws Exception { + String functionName, Object expectedResult) throws Exception { Context cx = Context.enter(); FileReader reader = new FileReader(inputFile); try { @@ -82,14 +82,14 @@ public abstract class TranslationTest { } protected Object extractAndCallFunctionObject(String namespaceName, String functionName, - Context cx, Scriptable scope) { + Context cx, Scriptable scope) { Object foo = scope.get(namespaceName, scope); assertTrue(foo instanceof NativeObject); - NativeObject namespaceObject = (NativeObject)foo; + NativeObject namespaceObject = (NativeObject) foo; Object box = namespaceObject.get(functionName, namespaceObject); assertTrue(box instanceof Function); Object functionArgs[] = {}; - Function function = (Function)box; + Function function = (Function) box; return function.call(cx, scope, scope, functionArgs); } diff --git a/translator/testFiles/propertyAccess/cases/namespaceCustomAccessors.kt b/translator/testFiles/propertyAccess/cases/namespaceCustomAccessors.kt new file mode 100644 index 00000000000..2804b0773fb --- /dev/null +++ b/translator/testFiles/propertyAccess/cases/namespaceCustomAccessors.kt @@ -0,0 +1,17 @@ +namespace foo + +var a : Int +get() { + return 5 +} +set(b) { + +} + +{ + $a = 3; +} + +fun box() : Boolean { + return (a == 5) +} \ No newline at end of file diff --git a/translator/testFiles/propertyAccess/cases/twoClassesWithProperties.kt b/translator/testFiles/propertyAccess/cases/twoClassesWithProperties.kt index 7c6a8f57da0..e5f56b95528 100644 --- a/translator/testFiles/propertyAccess/cases/twoClassesWithProperties.kt +++ b/translator/testFiles/propertyAccess/cases/twoClassesWithProperties.kt @@ -9,5 +9,5 @@ class B() { } fun box() : Boolean { - return ((A().a == 1) && (B().b == 2); + return ((A().a == 1) && (B().b == 2)); } \ No newline at end of file