From 969956a20d9612bd9233c49cc516b304b1779d36 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Mon, 23 Jan 2012 20:14:33 +0400 Subject: [PATCH] lots of minore refactorings --- .idea/workspace.xml | 731 ++++++++++++------ .../org/jetbrains/k2js/K2JSTranslator.java | 2 - .../k2js/translate/context/Aliaser.java | 7 +- .../translate/context/TranslationContext.java | 23 - .../expression/ExpressionVisitor.java | 3 - .../expression/FunctionTranslator.java | 12 +- .../expression/PatternTranslator.java | 1 + .../translate/general/AbstractTranslator.java | 6 + .../translate/general/TranslatorVisitor.java | 2 +- .../AbstractInitializerTranslator.java | 1 - .../initializer/InitializerVisitor.java | 1 - .../translate/reference/AccessTranslator.java | 2 +- .../translate/reference/CallTranslator.java | 29 +- .../reference/PropertyAccessTranslator.java | 8 - .../reference/ReferenceTranslator.java | 3 +- .../k2js/translate/utils/BindingUtils.java | 13 - .../translate/utils/TranslationUtils.java | 32 +- .../k2js/test/WebDemoExamples2Test.java | 2 + .../webDemoExamples2/expected/builder1.out | 40 + 19 files changed, 605 insertions(+), 313 deletions(-) create mode 100644 translator/testFiles/webDemoExamples2/expected/builder1.out diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b0d2c0318d3..e2a3868f8ed 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -14,11 +14,26 @@ - + + - - - + + + + + + + + + + + + + + + + + @@ -154,7 +169,7 @@ - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - - - - - - - - - - - - - - - - - + @@ -290,25 +263,74 @@ - + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -318,93 +340,91 @@ - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - - - - - - - - - - - - + - - + + - + - - + + - + - - + + - + + + + + + + + + + @@ -434,22 +454,22 @@ @@ -610,6 +630,10 @@ - - - - - - - - - - - - - - - + @@ -1258,6 +1522,29 @@ + + + + + + + + + + @@ -1586,114 +1873,118 @@ - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/translator/src/org/jetbrains/k2js/K2JSTranslator.java b/translator/src/org/jetbrains/k2js/K2JSTranslator.java index dae603da67a..ad6b216cba6 100644 --- a/translator/src/org/jetbrains/k2js/K2JSTranslator.java +++ b/translator/src/org/jetbrains/k2js/K2JSTranslator.java @@ -99,8 +99,6 @@ public final class K2JSTranslator { @NotNull private JsProgram generateProgram(@NotNull JetFile psiFile) { -// bindingContext = analyzeNamespace(psiFile, -// JetControlFlowDataTraceFactory.EMPTY); List files = getJsSupportStdLib(); files.add(psiFile); bindingContext = AnalyzerFacade.analyzeFilesWithJavaIntegration(psiFile.getProject(), files, new Predicate() { diff --git a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java index a3810e0ba7a..ff52a0f087b 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java +++ b/translator/src/org/jetbrains/k2js/translate/context/Aliaser.java @@ -9,14 +9,12 @@ import java.util.HashMap; import java.util.Map; import java.util.Stack; -//TODO: code gets duplicated public class Aliaser { public static Aliaser newInstance() { return new Aliaser(); } - //TODO: rename @NotNull private final Map aliasesForDescriptors = new HashMap(); @NotNull @@ -26,7 +24,6 @@ public class Aliaser { private Aliaser() { } - //TODO: refactor @NotNull public JsNameRef getAliasForThis(@NotNull DeclarationDescriptor descriptor) { Stack aliasStack = aliasesForThis.get(descriptor.getOriginal()); @@ -45,11 +42,13 @@ public class Aliaser { aliasStack.push(alias); } - //TODO: make the reference null public void removeAliasForThis(@NotNull DeclarationDescriptor descriptor) { Stack aliasStack = aliasesForThis.get(descriptor.getOriginal()); assert !aliasStack.empty(); aliasStack.pop(); + if (aliasStack.empty()) { + aliasesForThis.put(descriptor, null); + } } public boolean hasAliasForThis(@NotNull DeclarationDescriptor descriptor) { diff --git a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index fcee52116c6..8be00c74e2c 100644 --- a/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -12,7 +12,6 @@ import org.jetbrains.jet.lang.psi.JetPropertyAccessor; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.translate.intrinsic.Intrinsics; import org.jetbrains.k2js.translate.utils.BindingUtils; -import org.jetbrains.k2js.translate.utils.TranslationUtils; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getFQName; @@ -139,15 +138,6 @@ public final class TranslationContext { return getNameForDescriptor(descriptor); } - public boolean isStandardObject(@NotNull DeclarationDescriptor descriptor) { - return standardClasses().isStandardObject(descriptor); - } - - @NotNull - public JsName getNameForStandardObject(@NotNull DeclarationDescriptor descriptor) { - return standardClasses().getStandardObjectName(descriptor); - } - @NotNull public TemporaryVariable declareTemporary(@NotNull JsExpression initExpression) { return dynamicContext.declareTemporary(initExpression); @@ -165,19 +155,6 @@ public final class TranslationContext { return dynamicContext.declareLocalVariable(declarationDescriptor); } - //TODO: consider moving somewhere - @NotNull - public TemporaryVariable newAliasForThis(@NotNull DeclarationDescriptor descriptor) { - JsExpression thisQualifier = TranslationUtils.getThisObject(this, descriptor); - TemporaryVariable aliasForThis = dynamicContext.declareTemporary(thisQualifier); - aliaser().setAliasForThis(descriptor, aliasForThis.name()); - return aliasForThis; - } - - public void removeAliasForThis(@NotNull DeclarationDescriptor descriptor) { - aliaser().removeAliasForThis(descriptor); - } - @NotNull public Aliaser aliaser() { return staticContext.getAliaser(); diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 6e3547c79b3..cb62ce510a5 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -314,9 +314,6 @@ public final class ExpressionVisitor extends TranslatorVisitor { return Translation.functionTranslator(expression, context).translateAsLiteral(); } - - //TODO: refactor - //TODO: strange logic. look where it should be applied @Override @NotNull public JsNode visitThisExpression(@NotNull JetThisExpression expression, diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index fcb5162d970..1760c73ffaf 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -18,7 +18,7 @@ import java.util.List; import static org.jetbrains.k2js.translate.utils.BindingUtils.getFunctionDescriptor; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; -import static org.jetbrains.k2js.translate.utils.TranslationUtils.functionWithScope; +import static org.jetbrains.k2js.translate.utils.TranslationUtils.*; /** @@ -66,7 +66,6 @@ public final class FunctionTranslator extends AbstractTranslator { return new JsPropertyInitializer(functionName.makeRef(), function); } - //TODO: refactor @NotNull public JsExpression translateAsLiteral() { assert getExpectedThisDescriptor(descriptor) == null; @@ -74,9 +73,14 @@ public final class FunctionTranslator extends AbstractTranslator { if (containingClass == null) { return generateFunctionObject(); } - TemporaryVariable aliasForThis = context().newAliasForThis(containingClass); + return generateFunctionObjectWithAliasedThisReference(containingClass); + } + + @NotNull + private JsExpression generateFunctionObjectWithAliasedThisReference(@NotNull ClassDescriptor containingClass) { + TemporaryVariable aliasForThis = newAliasForThis(context(), containingClass); JsFunction function = generateFunctionObject(); - context().removeAliasForThis(containingClass); + removeAliasForThis(context(), containingClass); return AstUtil.newSequence(aliasForThis.assignmentExpression(), function); } diff --git a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java index 723e98d3470..29280cdc1fc 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/PatternTranslator.java @@ -61,6 +61,7 @@ public final class PatternTranslator extends AbstractTranslator { private JsExpression translateTypePattern(@NotNull JsExpression expressionToMatch, @NotNull JetTypePattern pattern) { //TODO: HACK to make some examples work + //TODO: look into using intrinsics or other mechanisms to implement this logic JsName className = getClassReference(pattern).getName(); if (className.getIdent().equals("String")) { return AstUtil.typeof(expressionToMatch, program().getStringLiteral("string")); diff --git a/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java b/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java index 4e98cfaf767..e5f7a5277df 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/general/AbstractTranslator.java @@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate.general; import com.google.dart.compiler.backend.js.ast.JsProgram; import org.jetbrains.annotations.NotNull; +import org.jetbrains.k2js.translate.context.Aliaser; import org.jetbrains.k2js.translate.context.TranslationContext; /** @@ -26,4 +27,9 @@ public abstract class AbstractTranslator { protected TranslationContext context() { return context; } + + @NotNull + protected Aliaser aliaser() { + return context.aliaser(); + } } diff --git a/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java b/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java index 04a1a4e0679..a44ae34e795 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/general/TranslatorVisitor.java @@ -8,7 +8,7 @@ import org.jetbrains.k2js.translate.context.TranslationContext; /** * @author Pavel Talanov *

- * 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. */ public class TranslatorVisitor extends JetVisitor { diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java b/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java index 3db9fd2feb5..df2f734cc5a 100644 --- a/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/initializer/AbstractInitializerTranslator.java @@ -31,7 +31,6 @@ public abstract class AbstractInitializerTranslator extends AbstractTranslator { abstract protected JsFunction generateInitializerFunction(); - @NotNull public JsPropertyInitializer generateInitializeMethod() { JsPropertyInitializer initializer = new JsPropertyInitializer(); diff --git a/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index b36f8957a68..02a72ede5bc 100644 --- a/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -22,7 +22,6 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getDeclarationsFor */ public final class InitializerVisitor extends TranslatorVisitor> { - /*package*/ InitializerVisitor() { } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java index 6e78c8ed50f..d05e3413751 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java @@ -12,12 +12,12 @@ import org.jetbrains.k2js.translate.general.AbstractTranslator; */ public abstract class AccessTranslator extends AbstractTranslator { + //TODO: this piece of code represents dangerously convoluted logic, think of the ways it can be improved @NotNull public static AccessTranslator getAccessTranslator(@NotNull JetExpression referenceExpression, @NotNull TranslationContext context) { assert ((referenceExpression instanceof JetReferenceExpression) || (referenceExpression instanceof JetDotQualifiedExpression)); - //TODO: if (PropertyAccessTranslator.canBePropertyAccess(referenceExpression, context)) { if (referenceExpression instanceof JetQualifiedExpression) { return QualifiedExpressionTranslator.getAccessTranslator((JetQualifiedExpression) referenceExpression, context); diff --git a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java index 511029590b7..2365a589bf5 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/CallTranslator.java @@ -212,22 +212,33 @@ public final class CallTranslator extends AbstractTranslator { return methodCall(); } - //TODO: refactor @NotNull private JsExpression extensionFunctionCall() { - List argumentList = new ArrayList(); - if (receiver == null) { - DeclarationDescriptor expectedReceiverDescriptor = getExpectedReceiverDescriptor(descriptor); - assert expectedReceiverDescriptor != null; - receiver = getThisObject(context(), expectedReceiverDescriptor); - } - argumentList.add(receiver); - argumentList.addAll(arguments); + receiver = getExtensionFunctionCallReceiver(); + List argumentList = generateExtensionCallArgumentList(); //Now the rest of the code can work as if it was simple method invocation receiver = null; return AstUtil.newInvocation(calleeReference(), argumentList); } + @NotNull + private List generateExtensionCallArgumentList() { + List argumentList = new ArrayList(); + argumentList.add(receiver); + argumentList.addAll(arguments); + return argumentList; + } + + @NotNull + private JsExpression getExtensionFunctionCallReceiver() { + if (receiver != null) { + return receiver; + } + DeclarationDescriptor expectedReceiverDescriptor = getExpectedReceiverDescriptor(descriptor); + assert expectedReceiverDescriptor != null; + return getThisObject(context(), expectedReceiverDescriptor); + } + private boolean isExtensionFunction() { return resolvedCall.getReceiverArgument().exists(); } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java index d7e2814da37..1e202ac2720 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/PropertyAccessTranslator.java @@ -87,7 +87,6 @@ public final class PropertyAccessTranslator extends AccessTranslator { (context.bindingContext(), expression) instanceof PropertyDescriptor); } - //TODO: make this method more specific public static boolean canBePropertyGetterCall(@NotNull JetExpression expression, @NotNull TranslationContext context) { if (expression instanceof JetQualifiedExpression) { @@ -165,11 +164,4 @@ public final class PropertyAccessTranslator extends AccessTranslator { JsNameRef backingFieldReference = backingFieldReference(context(), propertyDescriptor); return AstUtil.newAssignment(backingFieldReference, toSetTo); } - - @NotNull - private static JetSimpleNameExpression getNotNullSelector(@NotNull JetQualifiedExpression qualifiedExpression) { - JetSimpleNameExpression selectorExpression = getSelectorAsSimpleName(qualifiedExpression); - assert selectorExpression != null : MESSAGE; - return selectorExpression; - } } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index d45b7b8d52d..0e174eea76b 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -14,13 +14,12 @@ import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForRe /** * @author Pavel Talanov */ -//TODO: get rid of the class, move to util public final class ReferenceTranslator { @NotNull public static JsExpression translateSimpleName(@NotNull JetSimpleNameExpression expression, @NotNull TranslationContext context) { - if (PropertyAccessTranslator.canBePropertyAccess(expression, context)) { + if (PropertyAccessTranslator.canBePropertyGetterCall(expression, context)) { return PropertyAccessTranslator.translateAsPropertyGetterCall(expression, null, context); } DeclarationDescriptor referencedDescriptor = diff --git a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java index a71ab66f68f..ed737f70a81 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java @@ -236,11 +236,6 @@ public final class BindingUtils { return getResolvedCall(context, calleeExpression); } - @NotNull - private static CallableDescriptor getDescriptorForResolvedCall(@NotNull ResolvedCall resolvedCall) { - return resolvedCall.getCandidateDescriptor(); - } - public static boolean isVariableReassignment(@NotNull BindingContext context, @NotNull JetExpression expression) { Boolean result = context.get(BindingContext.VARIABLE_REASSIGNMENT, expression); assert result != null; @@ -288,14 +283,6 @@ public final class BindingUtils { return defaultValue; } - @NotNull - public static JetType getTypeForExpression(@NotNull BindingContext context, - @NotNull JetExpression expression) { - JetType jetType = context.get(BindingContext.EXPRESSION_TYPE, expression); - assert jetType != null : "Expression must have a type."; - return jetType; - } - @NotNull public static FunctionDescriptor getIteratorFunction(@NotNull BindingContext context, @NotNull JetExpression rangeExpression) { diff --git a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java index 8acfc2eb227..6f66c4c71d3 100644 --- a/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/utils/TranslationUtils.java @@ -9,8 +9,8 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; -import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.k2js.translate.context.NamingScope; +import org.jetbrains.k2js.translate.context.TemporaryVariable; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.Translation; @@ -203,28 +203,18 @@ public final class TranslationUtils { return context.program().getNumberLiteral(0); } - @Nullable - public static JsExpression getImplicitReceiver(@NotNull TranslationContext context, - @NotNull ReceiverDescriptor receiverDescriptor) { - DeclarationDescriptor correspondingDescriptor = - receiverDescriptor.getType().getConstructor().getDeclarationDescriptor(); - assert correspondingDescriptor != null; - return context.aliaser().getAliasForThis(correspondingDescriptor); + @NotNull + public static TemporaryVariable newAliasForThis(@NotNull TranslationContext context, + @NotNull DeclarationDescriptor descriptor) { + JsExpression thisQualifier = getThisObject(context, descriptor); + TemporaryVariable aliasForThis = context.declareTemporary(thisQualifier); + context.aliaser().setAliasForThis(descriptor, aliasForThis.name()); + return aliasForThis; } - @Nullable - public static JsExpression getImplicitThis(@NotNull TranslationContext context, - @NotNull ReceiverDescriptor receiverDescriptor) { - if (!receiverDescriptor.exists()) { - return new JsThisRef(); - } - DeclarationDescriptor correspondingDescriptor = - receiverDescriptor.getType().getConstructor().getDeclarationDescriptor(); - assert correspondingDescriptor != null; - if (!context.aliaser().hasAliasForThis(correspondingDescriptor)) { - return new JsThisRef(); - } - return context.aliaser().getAliasForThis(correspondingDescriptor); + public static void removeAliasForThis(@NotNull TranslationContext context, + @NotNull DeclarationDescriptor descriptor) { + context.aliaser().removeAliasForThis(descriptor); } } diff --git a/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java b/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java index 072c27afaa0..27be1739a55 100644 --- a/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java +++ b/translator/test/org/jetbrains/k2js/test/WebDemoExamples2Test.java @@ -28,5 +28,7 @@ public final class WebDemoExamples2Test extends TranslationTest { @Test public void builder() throws Exception { testWithMain("builder", ""); + testWithMain("builder", "1", "over9000" + + ""); } } diff --git a/translator/testFiles/webDemoExamples2/expected/builder1.out b/translator/testFiles/webDemoExamples2/expected/builder1.out new file mode 100644 index 00000000000..d2630d49409 --- /dev/null +++ b/translator/testFiles/webDemoExamples2/expected/builder1.out @@ -0,0 +1,40 @@ + + + +XML encoding with Kotlin + + + +

+XML encoding with Kotlin +

+

+this format can be used as an alternative markup to XML +

+ +Kotlin + +

+This is some + +mixed + +text. For more see the + +Kotlin + +project +

+

+some text +

+

+Command line arguments were: +

    +
  • +over9000 +
  • +
+

+ +