Refactored ClassTranslator code a bit. Added support for different order of inherited classes.

This commit is contained in:
Pavel Talanov
2011-11-16 14:21:14 +04:00
parent ec1b226453
commit b9a60c8675
6 changed files with 217 additions and 126 deletions
+110 -112
View File
@@ -6,14 +6,12 @@
</component>
<component name="ChangeListManager">
<list default="true" id="f02ef53d-47a4-4f5e-a1aa-3df68aae9b20" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/trait/cases/traitAddsFunctionsToClass.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/trait/cases/traitCompiles.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromClassAndTrait.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromTraitAndClass.kt" />
<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/ClassTranslator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassTranslator.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/InitializerVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" />
</list>
<ignored path="k2js.iws" />
<ignored path=".idea/workspace.xml" />
@@ -117,47 +115,29 @@
<favorites_list name="k2js" />
</component>
<component name="FileEditorManager">
<splitter split-orientation="horizontal" split-proportion="0.2874818">
<splitter split-orientation="horizontal" split-proportion="0.5164286">
<split-first>
<leaf>
<file leaf-file-name="initializersOfBasicClassExecute.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/out/initializersOfBasicClassExecute.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="FrameworkMethod.class" pinned="false" current="false" current-in-tab="false">
<entry file="jar://$PROJECT_DIR$/translator/lib/junit-4.10.jar!/org/junit/runners/model/FrameworkMethod.class">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="112" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="traitAddsFunctionsToClass.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/traitAddsFunctionsToClass.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<state line="11" column="69" selection-start="228" selection-end="228" 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="ClassTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="37" column="16" selection-start="823" selection-end="823" vertical-scroll-proportion="0.0">
<state line="88" column="0" selection-start="3512" selection-end="3512" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="customSetter.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/customSetter.kt">
<file leaf-file-name="classDerivesFromClassAndTrait.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/classDerivesFromClassAndTrait.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
@@ -165,10 +145,28 @@
</provider>
</entry>
</file>
<file leaf-file-name="customSetter.js" pinned="false" current="false" current-in-tab="true">
<file leaf-file-name="classDerivesFromTraitAndClass.js" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/classDerivesFromTraitAndClass.js">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="87" selection-start="195" selection-end="195" vertical-scroll-proportion="0.24440895">
<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="106" column="66" selection-start="5266" selection-end="5266" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="customSetter.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/out/customSetter.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<state line="1" column="0" selection-start="10" selection-end="10" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -214,19 +212,37 @@
</split-first>
<split-second>
<leaf>
<file leaf-file-name="ExpressionVisitor.java" pinned="false" current="true" current-in-tab="true">
<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="95" column="16" selection-start="3980" selection-end="3980" vertical-scroll-proportion="0.63709676">
<state line="95" column="16" selection-start="3980" selection-end="3980" vertical-scroll-proportion="-15.192307">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="BasicClassTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/BasicClassTest.java">
<file leaf-file-name="classDerivesFromClassAndTrait.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromClassAndTrait.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="48" column="16" selection-start="1257" selection-end="1257" vertical-scroll-proportion="0.0">
<state line="3" column="5" selection-start="21" selection-end="21" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="classDerivesFromTraitAndClass.kt" pinned="false" current="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromTraitAndClass.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="7" column="0" selection-start="58" selection-end="58" vertical-scroll-proportion="0.19636963">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TraitTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="33" column="55" selection-start="810" selection-end="810" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -235,7 +251,7 @@
<file leaf-file-name="simpleInitializer.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/class/out/simpleInitializer.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<state line="1" column="0" selection-start="10" selection-end="10" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -277,28 +293,10 @@
</provider>
</entry>
</file>
<file leaf-file-name="traitCompiles.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/traitCompiles.js">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="0" selection-start="150" selection-end="150" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="traitAddsFunctionsToClass.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/traitAddsFunctionsToClass.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="23" selection-start="306" selection-end="306" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="JsBlock.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBlock.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="13" selection-start="384" selection-end="384" vertical-scroll-proportion="0.0">
<state line="20" column="23" selection-start="0" selection-end="322" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -325,7 +323,6 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/translator/testFiles/inheritance/cases/initializationOrder.kt" />
<option value="$PROJECT_DIR$/translator/testFiles/inheritance/out/initializationOrder.js" />
<option value="$PROJECT_DIR$/translator/testFiles/inheritance/out/complexInitializationOrder.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java" />
@@ -335,12 +332,13 @@
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/trait/cases/traitCompliles.kt" />
<option value="$PROJECT_DIR$/translator/testFiles/trait/cases/traitCompiles.kt" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/trait/cases/traitAddsFunctionsToClass.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java" />
<option value="$PROJECT_DIR$/translator/testFiles/trait/out/traitCompiles.js" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromTraitAndClass.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java" />
</list>
</option>
</component>
@@ -795,11 +793,11 @@
<recent name="org.jetbrains.k2js.backend" />
</key>
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Dev\Projects\jet-contrib\k2js\translator\testFiles\trait\cases" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\translator\testFiles\class\cases" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\translator\testFiles\inheritance" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\propertyAccess" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\inheritance" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\test_files\test_cases" />
</key>
</component>
<component name="RunManager" selected="JUnit.All in translator">
@@ -1044,7 +1042,7 @@
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1176" extended-state="6" />
<editor active="false" />
<editor active="true" />
<layout>
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32907662" 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" />
@@ -1058,9 +1056,9 @@
<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="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.26524064" sideWeight="0.66570884" order="0" 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.2513369" sideWeight="0.66570884" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="11" 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.3342912" sideWeight="0.5" order="2" 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.3342912" 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="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="10" side_tool="true" content_ui="tabs" />
@@ -1098,7 +1096,7 @@
<option name="CHECK_COMMIT_MESSAGE_SPELLING" value="true" />
<option name="DEFAULT_PATCH_EXTENSION" value="patch" />
<option name="FORCE_NON_EMPTY_COMMENT" value="false" />
<option name="LAST_COMMIT_MESSAGE" value="Added support for passing parameters to ancestor constructor. Added a test." />
<option name="LAST_COMMIT_MESSAGE" value="Added basic trait support. Added a couple of tests." />
<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" />
@@ -1111,7 +1109,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="Finished reorganising project structure." />
<MESSAGE value="Fixed JDK hack" />
<MESSAGE value="Added if else support" />
<MESSAGE value="Added while/do while support" />
@@ -1136,6 +1133,7 @@
<MESSAGE value="Found and solved a problem which caused only one ancestor's constructor to be called. Added &quot;super_init&quot; method generation to InitializerVisitor. Worked on KotlinJsLib to solve this issue. This solution should evolve in the future." />
<MESSAGE value="Added one more test for initialization order." />
<MESSAGE value="Added support for passing parameters to ancestor constructor. Added a test." />
<MESSAGE value="Added basic trait support. Added a couple of tests." />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
@@ -1145,23 +1143,16 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/cases/complexInitializationOrder.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="35" column="76" selection-start="442" selection-end="442" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/customSetter.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/out/customSetter.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<state line="1" column="0" selection-start="10" selection-end="10" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/traitAddsFunctionsToClass.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="23" selection-start="0" selection-end="322" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
@@ -1173,6 +1164,13 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromClassAndTrait.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="3" column="5" selection-start="21" selection-end="21" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/BasicClassTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="48" column="16" selection-start="1257" selection-end="1257" vertical-scroll-proportion="0.0">
@@ -1182,77 +1180,77 @@
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TraitTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="16" selection-start="420" selection-end="420" vertical-scroll-proportion="0.0">
<state line="33" column="55" selection-start="810" selection-end="810" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/class/out/simpleInitializer.js">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/classDerivesFromTraitAndClass.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="7" column="0" selection-start="58" selection-end="58" vertical-scroll-proportion="0.19636963">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/traitAddsFunctionsToClass.js">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="69" selection-start="228" selection-end="228" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/out/initializersOfBasicClassExecute.js">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/traitAddsFunctionsToClass.kt">
<entry file="jar://$PROJECT_DIR$/translator/lib/junit-4.10.jar!/org/junit/runners/model/FrameworkMethod.class">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="23" selection-start="306" selection-end="306" vertical-scroll-proportion="0.0">
<state line="0" column="0" selection-start="0" selection-end="112" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/BindingUtils.java">
<provider selected="true" editor-type-id="text-editor">
<state line="45" column="17" selection-start="1599" selection-end="1599" vertical-scroll-proportion="0.0">
<state line="106" column="66" selection-start="5266" selection-end="5266" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/cases/traitCompiles.kt">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="8" column="23" selection-start="113" selection-end="113" vertical-scroll-proportion="0.0">
<state line="88" column="0" selection-start="3512" selection-end="3512" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files (x86)/JetBrains/IntelliJ IDEA Community Edition 110.283/lib/openapi.jar!/com/intellij/psi/tree/IElementType.class">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="5" column="16" selection-start="162" selection-end="162" vertical-scroll-proportion="0.0">
<state line="37" column="16" selection-start="823" selection-end="823" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetReferenceExpression.java">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/classDerivesFromClassAndTrait.js">
<provider selected="true" editor-type-id="text-editor">
<state line="8" column="7" selection-start="149" selection-end="149" vertical-scroll-proportion="0.0">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/JetNodeType.java">
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/customSetter.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="14" column="13" selection-start="354" selection-end="354" vertical-scroll-proportion="0.0">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDelegatorByExpressionSpecifier.java">
<entry file="file://$PROJECT_DIR$/translator/testFiles/trait/out/classDerivesFromTraitAndClass.js">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="13" selection-start="193" selection-end="193" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lexer/JetToken.java">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="13" selection-start="241" selection-end="241" 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="95" column="16" selection-start="3980" selection-end="3980" vertical-scroll-proportion="0.63709676">
<state line="9" column="87" selection-start="195" selection-end="195" vertical-scroll-proportion="0.24440895">
<folding />
</state>
</provider>
@@ -2,6 +2,7 @@ package org.jetbrains.k2js.translate;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -103,12 +104,7 @@ public final class BindingUtils {
static public boolean hasAncestorClass(@NotNull BindingContext context, @NotNull JetClass classDeclaration) {
List<ClassDescriptor> superclassDescriptors = getSuperclassDescriptors(context, classDeclaration);
for (ClassDescriptor descriptor : superclassDescriptors) {
if (descriptor.getKind() == ClassKind.CLASS) {
return true;
}
}
return false;
return (findAncestorClass(superclassDescriptors) != null);
}
static public boolean isStatement(@NotNull BindingContext context, @NotNull JetExpression expression) {
@@ -122,4 +118,14 @@ public final class BindingUtils {
return !superClassDescriptor.getName().equals("Any");
}
//TODO move unrelated utils to other class
@Nullable
public static ClassDescriptor findAncestorClass(@NotNull List<ClassDescriptor> superclassDescriptors) {
for (ClassDescriptor descriptor : superclassDescriptors) {
if (descriptor.getKind() == ClassKind.CLASS) {
return descriptor;
}
}
return null;
}
}
@@ -3,7 +3,9 @@ package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.psi.JetClass;
import java.util.ArrayList;
@@ -37,13 +39,15 @@ public final class ClassTranslator extends AbstractTranslator {
}
}
@NotNull
private JsStatement translateAsStatelessTrait(@NotNull JetClass classDeclaration) {
JsObjectLiteral traitLiteral = translateClassDeclarations(classDeclaration);
return AstUtil.convertToStatement
(AstUtil.newAssignment(namespaceQualifiedClassNameReference(classDeclaration), traitLiteral));
}
private JsStatement translateAsClassWithState(JetClass jetClassDeclaration) {
@NotNull
private JsStatement translateAsClassWithState(@NotNull JetClass jetClassDeclaration) {
JsInvocation jsClassDeclaration = createMethodInvocation();
addSuperclassReferences(jetClassDeclaration, jsClassDeclaration);
addClassOwnDeclarations(jetClassDeclaration, jsClassDeclaration);
@@ -64,7 +68,8 @@ public final class ClassTranslator extends AbstractTranslator {
(namespaceQualifiedClassNameReference(classDeclaration), jsClassDeclaration));
}
private JsNameRef namespaceQualifiedClassNameReference(JetClass classDeclaration) {
@NotNull
private JsNameRef namespaceQualifiedClassNameReference(@NotNull JetClass classDeclaration) {
return translationContext().getNamespaceQualifiedReference
(translationContext().getNameForElement(classDeclaration));
}
@@ -85,15 +90,45 @@ public final class ClassTranslator extends AbstractTranslator {
@NotNull
private List<JsNameRef> getSuperclassNameReferences(@NotNull JetClass classDeclaration) {
List<JsNameRef> superclassReferences = new ArrayList<JsNameRef>();
for (ClassDescriptor superClassDescriptor :
BindingUtils.getSuperclassDescriptors(translationContext().bindingContext(), classDeclaration)) {
//TODO should get a full class name here
superclassReferences.add(translationContext().getNamespaceQualifiedReference
(translationContext().getNameForDescriptor(superClassDescriptor)));
}
List<ClassDescriptor> superclassDescriptors =
BindingUtils.getSuperclassDescriptors(translationContext().bindingContext(), classDeclaration);
addAncestorClass(superclassReferences, superclassDescriptors);
addTraits(superclassReferences, superclassDescriptors);
return superclassReferences;
}
private void addTraits(@NotNull List<JsNameRef> superclassReferences,
@NotNull List<ClassDescriptor> superclassDescriptors) {
for (ClassDescriptor superClassDescriptor :
superclassDescriptors) {
assert (superClassDescriptor.getKind() == ClassKind.TRAIT) : "Only traits are expected here";
superclassReferences.add(getClassReference(superClassDescriptor));
}
}
private void addAncestorClass(@NotNull List<JsNameRef> superclassReferences,
@NotNull List<ClassDescriptor> superclassDescriptors) {
//here we remove ancestor class from the list
ClassDescriptor ancestorClass = findAndRemoveAncestorClass(superclassDescriptors);
if (ancestorClass != null) {
superclassReferences.add(getClassReference(ancestorClass));
}
}
@NotNull
private JsNameRef getClassReference(@NotNull ClassDescriptor superClassDescriptor) {
//TODO should get a full class name here
return translationContext().getNamespaceQualifiedReference
(translationContext().getNameForDescriptor(superClassDescriptor));
}
@Nullable
private ClassDescriptor findAndRemoveAncestorClass(@NotNull List<ClassDescriptor> superclassDescriptors) {
ClassDescriptor ancestorClass = BindingUtils.findAncestorClass(superclassDescriptors);
superclassDescriptors.remove(ancestorClass);
return ancestorClass;
}
@NotNull
private JsObjectLiteral translateClassDeclarations(@NotNull JetClass classDeclaration) {
List<JsPropertyInitializer> propertyList = new ArrayList<JsPropertyInitializer>();
@@ -23,4 +23,14 @@ public final class TraitTest extends AbstractClassTest {
public void traitAddsFunctionsToClass() throws Exception {
testFooBoxIsTrue("traitAddsFunctionsToClass.kt");
}
@Test
public void classDerivesFromClassAndTrait() throws Exception {
testFooBoxIsTrue("classDerivesFromClassAndTrait.kt");
}
@Test
public void classDerivesFromTraitAndClass() throws Exception {
testFooBoxIsTrue("classDerivesFromTraitAndClass.kt");
}
}
@@ -0,0 +1,21 @@
namespace foo
open class A() {
val value = "BAR"
}
trait Test {
fun addFoo(s:String) : String {
return s + "FOO"
}
}
class B() : A(), Test {
fun eval() : String {
return addFoo(value);
}
}
fun box() = B().eval() == "BARFOO"
@@ -0,0 +1,21 @@
namespace foo
open class A() {
val value = "BAR"
}
trait Test {
fun addFoo(s:String) : String {
return s + "FOO"
}
}
class B() : Test, A() {
fun eval() : String {
return addFoo(value);
}
}
fun box() = B().eval() == "BARFOO"