Refactoring operation translator code.

This commit is contained in:
Pavel Talanov
2011-11-23 20:13:23 +04:00
parent af7d79e4bd
commit 66b3790798
9 changed files with 495 additions and 354 deletions
+273 -219
View File
@@ -7,17 +7,16 @@
<bookmark url="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/safeCallReturnsNullIfFails.kt" line="3" />
</component>
<component name="ChangeListManager">
<list default="true" id="f02ef53d-47a4-4f5e-a1aa-3df68aae9b20" name="Default" comment="Push.">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/postfixIncOverload.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/prefixDecOverload.kt" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/misc.xml" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
<list default="true" id="f02ef53d-47a4-4f5e-a1aa-3df68aae9b20" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BinaryOperationTranslator.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/UnaryOperationTranslator.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/kotlinLib/cases/commaExpression.js" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationContext.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationContext.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java" />
</list>
<ignored path="k2js.iws" />
<ignored path=".idea/workspace.xml" />
@@ -102,94 +101,94 @@
<favorites_list name="k2js" />
</component>
<component name="FileEditorManager">
<splitter split-orientation="horizontal" split-proportion="0.66961414">
<splitter split-orientation="horizontal" split-proportion="0.42956766">
<split-first>
<leaf>
<file leaf-file-name="PatternTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="67" selection-start="1807" selection-end="1807" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TranslationContext.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationContext.java">
<provider selected="true" editor-type-id="text-editor">
<state line="37" column="93" selection-start="1438" selection-end="1438" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ExpressionVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="64" selection-start="1960" selection-end="1960" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Translation.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java">
<provider selected="true" editor-type-id="text-editor">
<state line="91" column="111" selection-start="3872" selection-end="3872" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="postfixIncOverload.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/postfixIncOverload.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="55" selection-start="162" selection-end="162" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="prefixDecOverload.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/prefixDecOverload.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="6" selection-start="135" selection-end="135" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="OperatorOverloadingTest.java" pinned="false" current="false" current-in-tab="false">
<file leaf-file-name="OperatorOverloadingTest.java" pinned="false" current="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="16" selection-start="554" selection-end="554" vertical-scroll-proportion="0.0">
<state line="22" column="16" selection-start="438" selection-end="438" vertical-scroll-proportion="0.6130653">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="postfixInc.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/operatorOverloading/out/postfixInc.js">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="39" selection-start="420" selection-end="420" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="OperationTranslator.java" pinned="false" current="true" current-in-tab="true">
<file leaf-file-name="OperationTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="106" selection-start="1912" selection-end="1912" vertical-scroll-proportion="0.74835527">
<state line="43" column="46" selection-start="1632" selection-end="1632" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="AbstractInitializerVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/AbstractInitializerVisitor.java">
<file leaf-file-name="BinaryOperationTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BinaryOperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="39" column="0" selection-start="1376" selection-end="1376" vertical-scroll-proportion="0.0">
<state line="22" column="41" selection-start="833" selection-end="833" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="UnaryOperationTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/UnaryOperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="49" column="0" selection-start="1924" selection-end="1924" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TranslationUtils.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="41" column="1" selection-start="1625" selection-end="1625" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="JsVars.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsVars.java">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="22" selection-start="630" selection-end="630" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BindingUtils.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="178" column="21" selection-start="8380" selection-end="8380" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BindingContext.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java">
<provider selected="true" editor-type-id="text-editor">
<state line="45" column="58" selection-start="2746" selection-end="2746" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BasicExpressionTypingVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="582" column="69" selection-start="31363" selection-end="31376" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ExpressionTypingVisitorForStatements.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java">
<provider selected="true" editor-type-id="text-editor">
<state line="139" column="110" selection-start="7255" selection-end="7255" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -199,46 +198,91 @@
</split-first>
<split-second>
<leaf>
<file leaf-file-name="namespacePropertyInitializer.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/out/namespacePropertyInitializer.js">
<file leaf-file-name="JsNode.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsNode.java">
<provider selected="true" editor-type-id="text-editor">
<state line="7" column="25" selection-start="119" selection-end="119" vertical-scroll-proportion="0.0">
<state line="14" column="22" selection-start="638" selection-end="638" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="loopClosure.js" pinned="false" current="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/testFiles/expression/function/out/loopClosure.js">
<file leaf-file-name="JsValueLiteral.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java">
<provider selected="true" editor-type-id="text-editor">
<state line="30" column="0" selection-start="487" selection-end="487" vertical-scroll-proportion="0.82125604">
<state line="9" column="22" selection-start="340" selection-end="340" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Declarations.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/Declarations.java">
<file leaf-file-name="JsEmpty.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="19" selection-start="362" selection-end="362" vertical-scroll-proportion="0.0">
<state line="9" column="13" selection-start="336" selection-end="336" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ExtractionVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java">
<file leaf-file-name="JsDoWhile.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="19" selection-start="379" selection-end="379" vertical-scroll-proportion="0.0">
<state line="9" column="13" selection-start="336" selection-end="336" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="PropertyAccessorTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java">
<file leaf-file-name="JsCatchScope.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java">
<provider selected="true" editor-type-id="text-editor">
<state line="52" column="16" selection-start="1184" selection-end="1184" vertical-scroll-proportion="0.0">
<state line="13" column="13" selection-start="465" selection-end="465" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="JsBinaryOperator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="12" selection-start="348" selection-end="348" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="commaExpression.js" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/testFiles/kotlinLib/cases/commaExpression.js">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="28" selection-start="34" selection-end="34" vertical-scroll-proportion="0.026356589">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="KotlinLibTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="110" column="16" selection-start="3936" selection-end="3936" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ExpressionVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="330" column="71" selection-start="14725" selection-end="14725" vertical-scroll-proportion="-18.423077">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Translation.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java">
<provider selected="true" editor-type-id="text-editor">
<state line="60" column="4" selection-start="2241" selection-end="2241" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -265,22 +309,22 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/translator/testFiles/trait/cases/definitionOrder.kt" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/IncludeLibraryTest.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TranslationTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/expression/function/out/loopClosure.js" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationContext.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java" />
<option value="$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/postfixInc.kt" />
<option value="$PROJECT_DIR$/translator/testFiles/operatorOverloading/out/postfixInc.js" />
<option value="$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/postfixIncOverload.kt" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/operatorOverloading/cases/prefixDecOverload.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BinaryOperationTranslator.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/UnaryOperationTranslator.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationUtils.java" />
<option value="$PROJECT_DIR$/translator/testFiles/kotlinLib/cases/commaExpression.js" />
</list>
</option>
</component>
@@ -323,21 +367,6 @@
<sortByType />
</navigator>
<panes>
<pane id="Scope" />
<pane id="PackagesPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="ProjectPane">
<subPane>
<PATH>
@@ -384,11 +413,7 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="operatorOverloading" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="out" />
<option name="myItemId" value="kotlinLib" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -406,7 +431,7 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="operatorOverloading" />
<option name="myItemId" value="kotlinLib" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
@@ -414,24 +439,6 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="translator" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="test" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="test" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
@@ -456,19 +463,7 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="translator" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="utils" />
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -478,19 +473,63 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="translator" />
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="compiler" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="translate" />
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="compiler" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="compiler" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ast" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -538,6 +577,21 @@
</PATH>
</subPane>
</pane>
<pane id="PackagesPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Scope" />
<pane id="Favorites" />
</panes>
</component>
@@ -555,9 +609,9 @@
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="MemberChooser.showClasses" value="true" />
<property name="GoToClass.includeLibraries" value="false" />
<property name="dynamic.classpath" value="false" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="options.searchVisible" value="true" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="dynamic.classpath" value="false" />
</component>
<component name="RecentsManager">
<key name="CopyClassDialog.RECENTS_KEY">
@@ -813,17 +867,6 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="JavascriptDebugSession" factoryName="Local">
<JSDebuggerConfigurationSettings>
<option name="engineId" />
<option name="fileUrl" />
</JSDebuggerConfigurationSettings>
<method>
<option name="AntTarget" enabled="false" />
<option name="BuildArtifacts" enabled="false" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="JUnit" factoryName="JUnit">
<extension name="coverage" enabled="false" merge="false" sample_coverage="true" />
<module name="" />
@@ -850,6 +893,17 @@
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<configuration default="true" type="JavascriptDebugSession" factoryName="Local">
<JSDebuggerConfigurationSettings>
<option name="engineId" value="embedded" />
<option name="fileUrl" />
</JSDebuggerConfigurationSettings>
<method>
<option name="AntTarget" enabled="false" />
<option name="BuildArtifacts" enabled="false" />
<option name="Maven.BeforeRunTask" enabled="false" />
</method>
</configuration>
<list size="5">
<item index="0" class="java.lang.String" itemvalue="JUnit.PropertyAccessorTest.accessToInstanceProperty" />
<item index="1" class="java.lang.String" itemvalue="JUnit.All in translator" />
@@ -891,7 +945,7 @@
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1176" extended-state="6" />
<editor active="true" />
<editor active="false" />
<layout>
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32853025" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
@@ -908,8 +962,8 @@
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3997862" sideWeight="0.6705998" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="true" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.33511493" sideWeight="0.6666667" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.33333334" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.23356494" sideWeight="0.6666667" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.33333334" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Metrics" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3275862" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
@@ -953,7 +1007,7 @@
<option name="INCLUDE_TEXT_INTO_SHELF" value="false" />
<option name="CREATE_PATCH_EXPAND_DETAILS_DEFAULT" value="true" />
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
<option name="LAST_COMMIT_MESSAGE" value="Added test. Refactored test code: got rid of obsolete IncludeLibraryTest class." />
<option name="LAST_COMMIT_MESSAGE" value="Operator overloading: simple cases with ++ and --." />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="true" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
@@ -966,7 +1020,6 @@
<option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
<option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
<option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
<MESSAGE value="Supported negated is operation." />
<MESSAGE value="Added support for simple case of safe qualified access." />
<MESSAGE value="Added support for returning value from safe qualified expression." />
<MESSAGE value="Added support for simple case of when expression." />
@@ -991,6 +1044,7 @@
<MESSAGE value="Refactoring." />
<MESSAGE value="Fixed design flaw which prevented base class from being inherited if it was defined after the derived class." />
<MESSAGE value="Added test. Refactored test code: got rid of obsolete IncludeLibraryTest class." />
<MESSAGE value="Operator overloading: simple cases with ++ and --." />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
@@ -1000,86 +1054,58 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassInitializerVisitor.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsValueLiteral.java">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="19" selection-start="319" selection-end="319" vertical-scroll-proportion="0.0">
<state line="9" column="22" selection-start="340" selection-end="340" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/InitializerGenerator.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsEmpty.java">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="13" selection-start="415" selection-end="415" vertical-scroll-proportion="0.0">
<state line="9" column="13" selection-start="336" selection-end="336" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/util/AstUtil.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsDoWhile.java">
<provider selected="true" editor-type-id="text-editor">
<state line="294" column="0" selection-start="10283" selection-end="10283" vertical-scroll-proportion="0.0">
<state line="9" column="13" selection-start="336" selection-end="336" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/RhinoPropertyTypesChecker.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsCatchScope.java">
<provider selected="true" editor-type-id="text-editor">
<state line="32" column="0" selection-start="1171" selection-end="1171" vertical-scroll-proportion="0.0">
<state line="13" column="13" selection-start="465" selection-end="465" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBinaryOperator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="21" column="4" selection-start="679" selection-end="679" vertical-scroll-proportion="0.0">
<state line="9" column="12" selection-start="348" selection-end="348" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperatorTable.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BinaryOperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="19" selection-start="560" selection-end="560" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="47" column="67" selection-start="1807" selection-end="1807" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationContext.java">
<provider selected="true" editor-type-id="text-editor">
<state line="37" column="93" selection-start="1438" selection-end="1438" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="64" selection-start="1960" selection-end="1960" vertical-scroll-proportion="0.0">
<state line="22" column="41" selection-start="833" selection-end="833" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Translation.java">
<provider selected="true" editor-type-id="text-editor">
<state line="91" column="111" selection-start="3872" selection-end="3872" vertical-scroll-proportion="0.0">
<state line="60" column="4" selection-start="2241" selection-end="2241" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/AbstractInitializerVisitor.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/UnaryOperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="39" column="0" selection-start="1376" selection-end="1376" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/operatorOverloading/out/postfixInc.js">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="39" selection-start="420" selection-end="420" vertical-scroll-proportion="0.0">
<state line="49" column="0" selection-start="1924" selection-end="1924" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -1098,16 +1124,44 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsVars.java">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="16" selection-start="554" selection-end="554" vertical-scroll-proportion="0.0">
<state line="20" column="22" selection-start="630" selection-end="630" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslationUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="46" column="106" selection-start="1912" selection-end="1912" vertical-scroll-proportion="0.74835527">
<state line="41" column="1" selection-start="1625" selection-end="1625" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/OperatorOverloadingTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="16" selection-start="438" selection-end="438" vertical-scroll-proportion="0.6130653">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="330" column="71" selection-start="14725" selection-end="14725" vertical-scroll-proportion="-18.423077">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/KotlinLibTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="110" column="16" selection-start="3936" selection-end="3936" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/kotlinLib/cases/commaExpression.js">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="28" selection-start="34" selection-end="34" vertical-scroll-proportion="0.026356589">
<folding />
</state>
</provider>
@@ -0,0 +1,105 @@
package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.JsBinaryOperation;
import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsInvocation;
import com.google.dart.compiler.backend.js.ast.JsNameRef;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lexer.JetToken;
import java.util.Arrays;
/**
* @author Talanov Pavel
*/
public final class BinaryOperationTranslator extends OperationTranslator {
@NotNull
static public JsExpression translate(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
return (new BinaryOperationTranslator(expression, context)).translate();
}
@NotNull
private final JetBinaryExpression expression;
private BinaryOperationTranslator(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
super(context);
this.expression = expression;
}
@NotNull
JsExpression translate() {
JsInvocation setterCall = translateAsSetterCall();
if (setterCall != null) {
return setterCall;
}
return translateAsBinaryOperation();
}
//TODO: think about the ways to improve logic here
@Nullable
public JsInvocation translateAsSetterCall() {
JetToken jetOperationToken = getOperationToken();
if (!OperatorTable.isAssignment(jetOperationToken)) {
return null;
}
JetExpression leftExpression = expression.getLeft();
JsInvocation setterCall = Translation.propertyAccessTranslator(translationContext()).
translateAsPropertySetterCall(leftExpression);
if (setterCall == null) {
return null;
}
JsExpression right = translateRightExpression();
setterCall.setArguments(Arrays.asList(right));
return setterCall;
}
@NotNull
private JsExpression translateAsBinaryOperation() {
JsExpression left = Translation.translateAsExpression(expression.getLeft(), translationContext());
JsExpression right = translateRightExpression();
JsNameRef operationReference = getOverloadedOperationReference(expression);
if (operationReference != null) {
return overloadedMethodInvocation(left, right, operationReference);
}
JetToken token = getOperationToken();
if (OperatorTable.hasCorrespondingBinaryOperator(token)) {
return new JsBinaryOperation(OperatorTable.getBinaryOperator(token), left, right);
}
if (OperatorTable.hasCorrespondingFunctionInvocation(token)) {
JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token);
functionInvocation.setArguments(Arrays.asList(left, right));
return functionInvocation;
}
throw new AssertionError("Unsupported token encountered: " + token.toString());
}
@NotNull
private JsExpression overloadedMethodInvocation(@NotNull JsExpression left, @NotNull JsExpression right,
@NotNull JsNameRef operationReference) {
AstUtil.setQualifier(operationReference, left);
return AstUtil.newInvocation(operationReference, right);
}
@NotNull
private JsExpression translateRightExpression() {
JetExpression rightExpression = expression.getRight();
assert rightExpression != null : "Binary expression should have a right expression";
return Translation.translateAsExpression(rightExpression, translationContext());
}
@NotNull
private JetToken getOperationToken() {
return (JetToken) expression.getOperationToken();
}
}
@@ -172,4 +172,10 @@ public final class BindingUtils {
@NotNull JetExpression expression) {
return (context.get(BindingContext.RESOLVED_CALL, expression));
}
static public boolean isVariableReassignment(@NotNull BindingContext context, @NotNull JetExpression expression) {
Boolean result = context.get(BindingContext.VARIABLE_REASSIGNMENT, expression);
assert result != null;
return result;
}
}
@@ -81,7 +81,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
@NotNull
public JsNode visitBinaryExpression(@NotNull JetBinaryExpression expression,
@NotNull TranslationContext context) {
return Translation.operationTranslator(context).translate(expression);
return BinaryOperationTranslator.translate(expression, context);
}
@Override
@@ -320,7 +320,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
@NotNull
public JsNode visitPrefixExpression(@NotNull JetPrefixExpression expression,
@NotNull TranslationContext context) {
return Translation.operationTranslator(context).translatePrefixOperation(expression);
return UnaryOperationTranslator.translate(expression, context);
}
@@ -328,7 +328,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
@NotNull
public JsNode visitPostfixExpression(@NotNull JetPostfixExpression expression,
@NotNull TranslationContext context) {
return Translation.operationTranslator(context).translatePostfixOperation(expression);
return UnaryOperationTranslator.translate(expression, context);
}
@Override
@@ -1,129 +1,25 @@
package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import com.intellij.psi.tree.IElementType;
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.psi.*;
import org.jetbrains.jet.lexer.JetToken;
import java.util.Arrays;
import org.jetbrains.jet.lang.psi.JetBinaryExpression;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression;
import org.jetbrains.jet.lang.psi.JetUnaryExpression;
/**
* @author Talanov Pavel
*/
public final class OperationTranslator extends AbstractTranslator {
public class OperationTranslator extends AbstractTranslator {
@NotNull
static public OperationTranslator newInstance(@NotNull TranslationContext context) {
return new OperationTranslator(context);
}
private OperationTranslator(@NotNull TranslationContext context) {
protected OperationTranslator(@NotNull TranslationContext context) {
super(context);
}
@NotNull
JsExpression translatePostfixOperation(@NotNull JetPostfixExpression expression) {
JsExpression baseExpression = translateBaseExpression(expression);
JsNameRef operationReference = getOverloadedOperationReference(expression);
if (operationReference != null) {
return overloadedMethodInvocation(baseExpression, operationReference);
}
JsUnaryOperator operator = OperatorTable.getUnaryOperator(getOperationToken(expression));
return new JsPostfixOperation(operator, baseExpression);
}
@NotNull
JsExpression translatePrefixOperation(@NotNull JetPrefixExpression expression) {
JsExpression baseExpression = translateBaseExpression(expression);
JsNameRef operationReference = getOverloadedOperationReference(expression);
if (operationReference != null) {
return overloadedMethodInvocation(baseExpression, operationReference);
}
JsUnaryOperator operator = OperatorTable.getUnaryOperator(getOperationToken(expression));
return new JsPrefixOperation(operator, baseExpression);
}
@NotNull
private JsExpression translateBaseExpression(@NotNull JetUnaryExpression expression) {
JetExpression baseExpression = expression.getBaseExpression();
assert baseExpression != null : "Unary operation should have a base expression";
return Translation.translateAsExpression(baseExpression, translationContext());
}
@NotNull
private JsExpression overloadedMethodInvocation(@NotNull JsExpression base, @NotNull JsNameRef operationReference) {
AstUtil.setQualifier(operationReference, base);
return AstUtil.newInvocation(operationReference);
}
@NotNull
private JetToken getOperationToken(@NotNull JetUnaryExpression expression) {
JetSimpleNameExpression operationExpression = expression.getOperationSign();
IElementType elementType = operationExpression.getReferencedNameElementType();
assert elementType instanceof JetToken : "Unary operation should have IElementType of type JetToken";
return (JetToken) elementType;
}
@NotNull
JsExpression translate(@NotNull JetBinaryExpression expression) {
JsInvocation setterCall = translateAsSetterCall(expression);
if (setterCall != null) {
return setterCall;
}
return translateAsBinaryOperation(expression);
}
//TODO: think about the ways to improve logic here
@Nullable
public JsInvocation translateAsSetterCall(@NotNull JetBinaryExpression expression) {
JetToken jetOperationToken = getOperationToken(expression);
if (!OperatorTable.isAssignment(jetOperationToken)) {
return null;
}
JetExpression leftExpression = expression.getLeft();
JsInvocation setterCall = Translation.propertyAccessTranslator(translationContext()).
translateAsPropertySetterCall(leftExpression);
if (setterCall == null) {
return null;
}
JsExpression right = translateRightExpression(expression);
setterCall.setArguments(Arrays.asList(right));
return setterCall;
}
@NotNull
private JsExpression translateAsBinaryOperation(@NotNull JetBinaryExpression expression) {
JsExpression left = Translation.translateAsExpression(expression.getLeft(), translationContext());
JsExpression right = translateRightExpression(expression);
JsNameRef operationReference = getOverloadedOperationReference(expression);
if (operationReference != null) {
return overloadedMethodInvocation(left, right, operationReference);
}
JetToken token = getOperationToken(expression);
if (OperatorTable.hasCorrespondingBinaryOperator(token)) {
return new JsBinaryOperation(OperatorTable.getBinaryOperator(token), left, right);
}
if (OperatorTable.hasCorrespondingFunctionInvocation(token)) {
JsInvocation functionInvocation = OperatorTable.getCorrespondingFunctionInvocation(token);
functionInvocation.setArguments(Arrays.asList(left, right));
return functionInvocation;
}
throw new AssertionError("Unsupported token encountered: " + token.toString());
}
private JsExpression overloadedMethodInvocation(JsExpression left, JsExpression right, JsNameRef operationReference) {
AstUtil.setQualifier(operationReference, left);
return AstUtil.newInvocation(operationReference, right);
}
@Nullable
private JsNameRef getOverloadedOperationReference(@NotNull JetExpression expression) {
protected JsNameRef getOverloadedOperationReference(@NotNull JetExpression expression) {
DeclarationDescriptor operationDescriptor = getOperationDescriptor(expression);
if (operationDescriptor == null) {
return null;
@@ -143,22 +39,8 @@ public final class OperationTranslator extends AbstractTranslator {
if (expression instanceof JetUnaryExpression) {
operationReference = ((JetUnaryExpression) expression).getOperationSign();
}
assert operationReference != null : "should be applied only to unary or binary operations";
assert operationReference != null : "Should be applied only to unary or binary operations";
return BindingUtils.getDescriptorForReferenceExpression
(translationContext().bindingContext(), operationReference);
}
@NotNull
private JsExpression translateRightExpression(@NotNull JetBinaryExpression expression) {
JetExpression rightExpression = expression.getRight();
assert rightExpression != null : "Binary expression should have a right expression";
return Translation.translateAsExpression(rightExpression, translationContext());
}
@NotNull
private JetToken getOperationToken(@NotNull JetBinaryExpression expression) {
return (JetToken) expression.getOperationToken();
}
}
@@ -44,11 +44,6 @@ public final class Translation {
return ClassTranslator.newInstance(context);
}
@NotNull
static public OperationTranslator operationTranslator(@NotNull TranslationContext context) {
return OperationTranslator.newInstance(context);
}
@NotNull
static public PatternTranslator patternTranslator(@NotNull TranslationContext context) {
return PatternTranslator.newInstance(context);
@@ -0,0 +1,87 @@
package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lexer.JetToken;
/**
* @author Talanov Pavel
*/
public final class UnaryOperationTranslator extends OperationTranslator {
@NotNull
static public JsExpression translate(@NotNull JetPrefixExpression expression,
@NotNull TranslationContext context) {
return (new UnaryOperationTranslator(context, expression, true)).translate();
}
@NotNull
static public JsExpression translate(@NotNull JetPostfixExpression expression,
@NotNull TranslationContext context) {
return (new UnaryOperationTranslator(context, expression, false)).translate();
}
@NotNull
private final JetUnaryExpression expression;
private final boolean isPrefix;
private final boolean isVariableReassignment;
private UnaryOperationTranslator(@NotNull TranslationContext context, @NotNull JetUnaryExpression expression,
boolean isPrefix) {
super(context);
this.expression = expression;
this.isPrefix = isPrefix;
this.isVariableReassignment = BindingUtils.isVariableReassignment
(translationContext().bindingContext(), expression);
}
@NotNull
JsExpression translate() {
JsExpression baseExpression = translateBaseExpression();
JsNameRef operationReference = getOverloadedOperationReference(expression);
if (operationReference != null) {
if (isPrefix && !isVariableReassignment) {
return overloadedMethodInvocation(baseExpression, operationReference);
} else if (isPrefix) {
}
}
return jsUnaryExpression(baseExpression);
}
@NotNull
private JsExpression jsUnaryExpression(@NotNull JsExpression baseExpression) {
JsUnaryOperator operator = OperatorTable.getUnaryOperator(getOperationToken());
if (isPrefix) {
return new JsPrefixOperation(operator, baseExpression);
} else {
return new JsPostfixOperation(operator, baseExpression);
}
}
@NotNull
private JsExpression translateBaseExpression() {
JetExpression baseExpression = expression.getBaseExpression();
assert baseExpression != null : "Unary expression should have a base expression";
return Translation.translateAsExpression(baseExpression, translationContext());
}
@NotNull
private JsExpression overloadedMethodInvocation(@NotNull JsExpression receiver,
@NotNull JsNameRef operationReference) {
AstUtil.setQualifier(operationReference, receiver);
return AstUtil.newInvocation(operationReference);
}
@NotNull
private JetToken getOperationToken() {
JetSimpleNameExpression operationExpression = expression.getOperationSign();
IElementType elementType = operationExpression.getReferencedNameElementType();
assert elementType instanceof JetToken : "Unary expression should have IElementType of type JetToken";
return (JetToken) elementType;
}
}
@@ -107,5 +107,11 @@ public class KotlinLibTest extends TranslationTest {
new RhinoFunctionResultChecker("test", true));
}
@Test
public void commaExpression() throws Exception {
runRhinoTest(Arrays.asList(kotlinLibraryPath(), cases("commaExpression.js")),
new RhinoFunctionResultChecker("test", true));
}
}
@@ -0,0 +1,6 @@
a = 0
f = (t = a, t1 = t, a = ++t1, t)
test = function () {
return (f == 0) && (a == 1)
}