Added class inheritance support and reorganised test classes.

Minor impovements include:
1. Support for functions with no body
2. Not equals operator
3. Refactorings.
This commit is contained in:
Pavel Talanov
2011-11-12 18:09:46 +04:00
parent 8e147b26a7
commit 85b1c1d3d7
53 changed files with 1073 additions and 6653 deletions
+401 -313
View File
@@ -6,25 +6,59 @@
</component>
<component name="ChangeListManager">
<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/InitializerVisitor.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test_files/test_cases/constructorWithParameter.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test_files/test_cases/setter.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/inheritance/cases/initializersOfBasicClassExecute.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/inheritance/cases/methodOverride.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/customGetter.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/customSetter.kt" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/BasicClassTest.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test\org\jetbrains\k2js\test\ClassTest.java" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\assign.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\classInstantiation.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\comparison.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\incrementProperty.jet" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\localProperty.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\prototype.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\test.js" afterPath="" />
<change type="DELETED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\testKotlinLib.js" afterPath="" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\accessToInstanceProperty.kt" afterPath="$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/accessToInstanceProperty.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\assign.jet" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/assign.jet" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\classInstantiation.kt" afterPath="$PROJECT_DIR$/translator/testFiles/class/cases/classInstantiation.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\comparison.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/comparison.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\constructorWithParameter.kt" afterPath="$PROJECT_DIR$/translator/testFiles/class/cases/constructorWithParameter.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\doWhile.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/doWhile.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\doWhile2.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/doWhile2.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\elseif.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/elseif.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\functionUsedBeforeDeclaration.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/functionUsedBeforeDeclaration.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\if.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/if.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\kotlin_lib.js" afterPath="$PROJECT_DIR$/translator/testFiles/kotlin_lib.js" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\localProperty.jet" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/localProperty.jet" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\methodDeclarationAndCall.kt" afterPath="$PROJECT_DIR$/translator/testFiles/class/cases/methodDeclarationAndCall.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\setter.kt" afterPath="$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/setter.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\stringAssignment.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/stringAssignment.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\stringConstant.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/stringConstant.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\test.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/test.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\twoClassesWithProperties.kt" afterPath="$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/twoClassesWithProperties.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\while.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/while.kt" />
<change type="MOVED" beforePath="C:\Dev\Projects\jet-contrib\k2js\translator\test_files\test_cases\while2.kt" afterPath="$PROJECT_DIR$/translator/testFiles/function/cases/while2.kt" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBlock.java" afterPath="$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBlock.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java" afterPath="$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsInvocation.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/generate/CodeGenerator.java" />
<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/ClassBodyVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.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/ExpressionTranslator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.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/FunctionTranslator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.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/src/org/jetbrains/k2js/translate/Namer.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Namer.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/PropertyAccessTranslator.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.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/ClassTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test_files/test_cases/accessToInstanceProperty.kt" afterPath="$PROJECT_DIR$/translator/test_files/test_cases/accessToInstanceProperty.kt" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java" afterPath="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/TranslatorVisitor.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TranslationTest.java" afterPath="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TranslationTest.java" />
</list>
<ignored path="k2js.iws" />
<ignored path=".idea/workspace.xml" />
@@ -62,19 +96,6 @@
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassTest.java" line="28" class="org.jetbrains.k2js.test.ClassTest" package="org.jetbrains.k2js.test">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
</line_breakpoints>
<breakpoint_any>
<breakpoint>
@@ -115,31 +136,31 @@
<favorites_list name="k2js" />
</component>
<component name="FileEditorManager">
<splitter split-orientation="horizontal" split-proportion="0.27544528">
<splitter split-orientation="horizontal" split-proportion="0.577426">
<split-first>
<leaf>
<file leaf-file-name="DeclarationDescriptorVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/DeclarationDescriptorVisitor.java">
<file leaf-file-name="DeclarationTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/DeclarationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="5" column="21" selection-start="94" selection-end="94" vertical-scroll-proportion="0.0">
<state line="9" column="19" selection-start="244" selection-end="244" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="DescriptorUtils.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorUtils.java">
<file leaf-file-name="DeclarationVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/DeclarationVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="13" selection-start="504" selection-end="504" vertical-scroll-proportion="0.0">
<state line="17" column="13" selection-start="643" selection-end="643" 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">
<file leaf-file-name="ExpressionTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="23" column="30" selection-start="864" selection-end="864" vertical-scroll-proportion="0.0">
<state line="9" column="19" selection-start="238" selection-end="238" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -147,46 +168,55 @@
</provider>
</entry>
</file>
<file leaf-file-name="twoClassesWithProperties.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.kt">
<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="11" column="39" selection-start="146" selection-end="146" vertical-scroll-proportion="0.0">
<state line="182" column="5" selection-start="6802" selection-end="6802" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="twoClassesWithProperties.js" pinned="false" current="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.js">
<file leaf-file-name="methodOverride.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/cases/methodOverride.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="0" selection-start="363" selection-end="363" vertical-scroll-proportion="0.82560706">
<state line="14" column="50" selection-start="213" selection-end="213" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="JsNew.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsNew.java">
<file leaf-file-name="JetFunction.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunction.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="22" selection-start="394" selection-end="394" vertical-scroll-proportion="0.0">
<state line="16" column="22" selection-start="421" selection-end="421" vertical-scroll-proportion="8.76">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Cloner.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/Cloner.java">
<file leaf-file-name="FunctionDescriptor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="153" column="4" selection-start="5360" selection-end="5360" vertical-scroll-proportion="0.0">
<state line="19" column="55" selection-start="424" selection-end="424" 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">
<file leaf-file-name="JetNamedFunction.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java">
<provider selected="true" editor-type-id="text-editor">
<state line="172" column="40" selection-start="7413" selection-end="7413" vertical-scroll-proportion="0.0">
<state line="10" column="13" selection-start="228" selection-end="228" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="FunctionTranslator.java" pinned="false" current="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="63" selection-start="1748" selection-end="1748" vertical-scroll-proportion="0.20903225">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -194,20 +224,13 @@
</provider>
</entry>
</file>
<file leaf-file-name="constructorWithParameter.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/constructorWithParameter.kt">
<file leaf-file-name="FunctionTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="6" column="14" selection-start="80" selection-end="80" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="accessToInstanceProperty.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/accessToInstanceProperty.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="3" column="21" selection-start="51" selection-end="51" vertical-scroll-proportion="0.0">
<folding />
<state line="12" column="19" selection-start="320" selection-end="320" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
@@ -216,77 +239,19 @@
</split-first>
<split-second>
<leaf>
<file leaf-file-name="InitializerVisitor.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java">
<file leaf-file-name="AbstractClassTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="79" selection-start="2300" selection-end="2300" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="accessToInstanceProperty.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/accessToInstanceProperty.js">
<provider selected="true" editor-type-id="text-editor">
<state line="1" column="0" selection-start="10" selection-end="10" vertical-scroll-proportion="0.0">
<state line="37" column="48" selection-start="1330" selection-end="1330" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="setter.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/setter.kt">
<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">
<provider selected="true" editor-type-id="text-editor">
<state line="6" column="13" selection-start="66" selection-end="66" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ClassTest.java" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="70" column="16" selection-start="2199" selection-end="2199" vertical-scroll-proportion="0.65750915">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="PropertyAccessTranslator.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="19" column="19" selection-start="808" selection-end="808" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<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="29" column="56" selection-start="1070" selection-end="1070" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="setter.js" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/setter.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="AstUtil.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/util/AstUtil.java">
<provider selected="true" editor-type-id="text-editor">
<state line="18" column="0" selection-start="621" selection-end="621" vertical-scroll-proportion="0.0">
<state line="31" column="4" selection-start="756" selection-end="756" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -297,16 +262,70 @@
<file leaf-file-name="TranslationTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TranslationTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="39" column="28" selection-start="1478" selection-end="1478" vertical-scroll-proportion="0.0">
<state line="19" column="53" selection-start="487" selection-end="487" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="FunctionTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java">
<file leaf-file-name="accessToInstanceProperty.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/propertyAccess/cases/accessToInstanceProperty.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="19" selection-start="250" selection-end="250" 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>
</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">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="0" selection-start="299" selection-end="299" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="ClassInheritanceTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="16" selection-start="485" selection-end="485" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<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="methodOverride.js" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/out/methodOverride.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="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="30" column="56" selection-start="1127" selection-end="1127" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="initializersOfBasicClassExecute.kt" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/cases/initializersOfBasicClassExecute.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>
@@ -328,22 +347,22 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/twoClassesProperties.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java" />
<option value="$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsBlock.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java" />
<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/src/org/jetbrains/k2js/translate/Namer.java" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/setter.kt" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/accessToInstanceProperty.kt" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/constuctorWithParameter.kt" />
<option value="$PROJECT_DIR$/translator/test_files/class/out/customSetter.js" />
<option value="$PROJECT_DIR$/translator/test_files/class/cases/inheritance.kt" />
<option value="$PROJECT_DIR$/translator/test_files/class/out/inheritance.js" />
<option value="$PROJECT_DIR$/translator/test_files/kotlin_lib.js" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassTest.java" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/constructorWithParameter.kt" />
<option value="$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.js" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/TranslationTest.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/BasicClassTest.java" />
<option value="$PROJECT_DIR$/translator/testFiles/inheritance/cases/methodOverride.kt" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java" />
<option value="$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java" />
<option value="$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java" />
</list>
</option>
</component>
@@ -414,11 +433,127 @@
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="test_files" />
<option name="myItemId" value="testFiles" />
<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_cases" />
<option name="myItemId" value="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="propertyAccess" />
<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="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="propertyAccess" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="cases" />
<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="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="inheritance" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="out" />
<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="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="inheritance" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="cases" />
<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="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="function" />
<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="testFiles" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="class" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -480,50 +615,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="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="generate" />
<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="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="declarations" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="k2js" />
@@ -608,65 +699,21 @@
<recent name="org.jetbrains.k2js.backend" />
</key>
<key name="CopyFile.RECENT_KEYS">
<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" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\test_files" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\lib" />
<recent name="C:\Dev\Projects\jet-contrib\k2js\tests" />
<recent name="C:\Dev\Projects\k2js\src\org\jetbrains\k2js\translate" />
</key>
</component>
<component name="RunManager" selected="JUnit.All in translator">
<configuration default="false" name="ClassTest" type="JUnit" factoryName="JUnit" temporary="true">
<configuration default="false" name="AbstractClassTest.inheritance" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.ClassTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/translator" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="FunctionTest" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.FunctionTest" />
<option name="METHOD_NAME" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" />
<option name="PARAMETERS" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="ClassTest.twoClassesWithProperties" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.ClassTest" />
<option name="METHOD_NAME" value="twoClassesWithProperties" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.AbstractClassTest" />
<option name="METHOD_NAME" value="inheritance" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
@@ -679,7 +726,7 @@
<envs />
<patterns />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="53339" />
<option name="DEBUG_PORT" value="56929" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
@@ -708,13 +755,57 @@
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="ClassTest.setter" type="JUnit" factoryName="JUnit" temporary="true">
<configuration default="false" name="FunctionTest" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.ClassTest" />
<option name="METHOD_NAME" value="setter" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.FunctionTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/translator" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="AbstractClassTest.kotlinJsLibRunsWithRhino" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.AbstractClassTest" />
<option name="METHOD_NAME" value="kotlinJsLibRunsWithRhino" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$/translator" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<patterns />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method />
</configuration>
<configuration default="false" name="AbstractClassTest.twoClassesWithProperties" type="JUnit" factoryName="JUnit" temporary="true">
<module name="translator" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="org.jetbrains.k2js.test" />
<option name="MAIN_CLASS_NAME" value="org.jetbrains.k2js.test.AbstractClassTest" />
<option name="METHOD_NAME" value="twoClassesWithProperties" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="-ea" />
<option name="PARAMETERS" value="" />
@@ -727,7 +818,7 @@
<envs />
<patterns />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="53959" />
<option name="DEBUG_PORT" value="57297" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
@@ -809,11 +900,11 @@
</method>
</configuration>
<list size="5">
<item index="0" class="java.lang.String" itemvalue="JUnit.ClassTest" />
<item index="1" class="java.lang.String" itemvalue="JUnit.FunctionTest" />
<item index="2" class="java.lang.String" itemvalue="JUnit.ClassTest.twoClassesWithProperties" />
<item index="3" class="java.lang.String" itemvalue="JUnit.All in translator" />
<item index="4" class="java.lang.String" itemvalue="JUnit.ClassTest.setter" />
<item index="0" class="java.lang.String" itemvalue="JUnit.ClassTest.inheritance" />
<item index="1" class="java.lang.String" itemvalue="JUnit.All in translator" />
<item index="2" class="java.lang.String" itemvalue="JUnit.FunctionTest" />
<item index="3" class="java.lang.String" itemvalue="JUnit.ClassTest.kotlinJsLibRunsWithRhino" />
<item index="4" class="java.lang.String" itemvalue="JUnit.ClassTest.twoClassesWithProperties" />
</list>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host>
@@ -855,7 +946,7 @@
<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" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3275862" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24973261" sideWeight="0.7183908" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.2624521" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.28544062" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32907662" sideWeight="0.5" order="13" side_tool="false" content_ui="tabs" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32854405" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
@@ -863,9 +954,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.1593583" sideWeight="0.5699234" 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.22299466" sideWeight="0.82088125" 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="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.43007663" 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.17911877" 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" />
@@ -903,7 +994,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 a test for extractor." />
<option name="LAST_COMMIT_MESSAGE" value="Added default getter/setter support and initializer support." />
<option name="MAKE_NEW_CHANGELIST_ACTIVE" value="true" />
<option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
<option name="CHECK_FILES_UP_TO_DATE_BEFORE_COMMIT" value="false" />
@@ -927,6 +1018,7 @@
<MESSAGE value="Added simple method call support." />
<MESSAGE value="Added DeclarationExtractor logic." />
<MESSAGE value="Added a test for extractor." />
<MESSAGE value="Added default getter/setter support and initializer support." />
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
@@ -936,16 +1028,9 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/setter.js">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/BasicClassTest.java">
<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/src/org/jetbrains/k2js/translate/PropertyAccessTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="19" column="19" selection-start="808" selection-end="808" vertical-scroll-proportion="0.0">
<state line="31" column="4" selection-start="756" selection-end="756" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
@@ -954,108 +1039,111 @@
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/OperationTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="29" column="56" selection-start="1070" selection-end="1070" vertical-scroll-proportion="0.0">
<state line="30" column="56" selection-start="1127" selection-end="1127" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/DeclarationExtractor.java">
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/AbstractClassTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="40" column="39" selection-start="1371" selection-end="1371" vertical-scroll-proportion="0.0">
<state line="37" column="48" selection-start="1330" selection-end="1330" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/PropertyAccessorTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="0" selection-start="299" selection-end="299" 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/test/org/jetbrains/k2js/test/ClassInheritanceTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="16" selection-start="485" selection-end="485" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/FunctionTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="19" selection-start="320" selection-end="320" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/declarations/ExtractionVisitor.java">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/cases/methodOverride.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="54" column="23" selection-start="2277" selection-end="2277" vertical-scroll-proportion="-12.72">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/Namer.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="48" selection-start="297" selection-end="297" vertical-scroll-proportion="0.0">
<state line="14" column="50" selection-start="213" selection-end="213" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/ast/JsNew.java">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFunction.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="22" selection-start="394" selection-end="394" vertical-scroll-proportion="0.0">
<state line="16" column="22" selection-start="421" selection-end="421" vertical-scroll-proportion="8.76">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/ClassBodyVisitor.java">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="117" column="0" selection-start="5468" selection-end="5468" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/js/src/com/google/dart/compiler/backend/js/Cloner.java">
<provider selected="true" editor-type-id="text-editor">
<state line="153" column="4" selection-start="5360" selection-end="5360" vertical-scroll-proportion="0.0">
<state line="19" column="55" selection-start="424" selection-end="424" 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="172" column="40" selection-start="7413" selection-end="7413" vertical-scroll-proportion="0.0">
<state line="132" column="24" selection-start="5718" selection-end="5718" vertical-scroll-proportion="-6.1923075">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="jar://C:/Program Files/Java/jdk1.7.0_01/src.zip!/java/lang/Void.java">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamedFunction.java">
<provider selected="true" editor-type-id="text-editor">
<state line="36" column="6" selection-start="464" selection-end="464" vertical-scroll-proportion="0.0">
<state line="10" column="13" selection-start="228" selection-end="228" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/constructorWithParameter.kt">
<entry file="file://$PROJECT_DIR$/../../Kotlin/jet/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetReferenceExpression.java">
<provider selected="true" editor-type-id="text-editor">
<state line="6" column="14" selection-start="80" selection-end="80" vertical-scroll-proportion="0.0">
<state line="8" column="27" selection-start="169" selection-end="169" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.kt">
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/FunctionTranslator.java">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="39" selection-start="146" selection-end="146" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test_files/test_cases/twoClassesWithProperties.js">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="0" selection-start="363" selection-end="363" vertical-scroll-proportion="0.82560706">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java">
<provider selected="true" editor-type-id="text-editor">
<state line="50" column="79" selection-start="2300" selection-end="2300" vertical-scroll-proportion="0.0">
<state line="42" column="63" selection-start="1748" selection-end="1748" vertical-scroll-proportion="0.20903225">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/translator/test/org/jetbrains/k2js/test/ClassTest.java">
<entry file="file://$PROJECT_DIR$/translator/testFiles/inheritance/cases/initializersOfBasicClassExecute.kt">
<provider selected="true" editor-type-id="text-editor">
<state line="70" column="16" selection-start="2199" selection-end="2199" vertical-scroll-proportion="0.65750915">
<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/inheritance/out/methodOverride.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>
@@ -1,7 +1,10 @@
package org.jetbrains.k2js.declarations;
import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsScope;
import com.intellij.util.xml.PropertyAccessor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.k2js.translate.Namer;
@@ -41,32 +44,25 @@ public final class ExtractionVisitor extends DeclarationDescriptorVisitor<Void,
@Override
public Void visitPropertyDescriptor(@NotNull PropertyDescriptor descriptor, @NotNull JsScope enclosingScope) {
PropertySetterDescriptor setter = descriptor.getSetter();
if (setter != null) {
setter.accept(this, enclosingScope);
String propertyName = descriptor.getName();
extractAccessor(descriptor.getGetter(), true, propertyName, enclosingScope);
if (descriptor.isVar()) {
extractAccessor(descriptor.getSetter(), false, propertyName, enclosingScope);
}
PropertyGetterDescriptor getter = descriptor.getGetter();
if (getter != null) {
getter.accept(this, enclosingScope);
}
// We do not put this name into extractor because it can't be referenced from outside
// thus it doesn't have a descriptor.
enclosingScope.declareName(Namer.getBackingFieldNameForProperty(descriptor.getName()));
return null;
}
@Override
public Void visitPropertyGetterDescriptor(PropertyGetterDescriptor descriptor, JsScope enclosingScope) {
String getterName = Namer.getNameForGetter(descriptor.getCorrespondingProperty().getName());
extractor.putName(descriptor, enclosingScope.declareName(getterName));
return null;
}
@Override
public Void visitPropertySetterDescriptor(PropertySetterDescriptor descriptor, JsScope enclosingScope) {
String setterName = Namer.getNameForSetter(descriptor.getCorrespondingProperty().getName());
extractor.putName(descriptor, enclosingScope.declareName(setterName));
return null;
//Not using visitors here for convenience
public void extractAccessor(@Nullable PropertyAccessorDescriptor descriptor, boolean isGetter, String propertyName,
@NotNull JsScope enclosingScope) {
assert descriptor != null : "Accessor descriptor should not be null";
String accessorName = Namer.getNameForAccessor(propertyName, isGetter);
JsName jsName = enclosingScope.declareName(accessorName);
JsScope accessorScope = new JsScope(enclosingScope, (isGetter ? "getter " : "setter ") + propertyName);
extractor.putScope(descriptor, accessorScope);
extractor.putName(descriptor, jsName);
// Note : We do not put backing field name into extractor because it can't be referenced from outside
accessorScope.declareName(Namer.getKotlinBackingFieldName(descriptor.getCorrespondingProperty().getName()));
}
@Override
@@ -25,16 +25,16 @@ public final class CodeGenerator {
System.out.println(output.toString());
}
private void generateCode(JsProgram program) {
JsSourceGenerationVisitor sourceGenerator =
new JsSourceGenerationVisitor(output);
program.traverse(sourceGenerator, null);
}
public void generateToFile(JsProgram program, File file) throws IOException {
generateCode(program);
FileWriter writer = new FileWriter(file);
writer.write(output.toString());
writer.close();
}
private void generateCode(JsProgram program) {
JsSourceGenerationVisitor sourceGenerator =
new JsSourceGenerationVisitor(output);
program.traverse(sourceGenerator, null);
}
}
@@ -1,17 +1,15 @@
package org.jetbrains.k2js.translate;
import com.intellij.codeInsight.hint.ClassDeclarationRangeHandler;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetNamespace;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.JetType;
import javax.xml.ws.Binding;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author Talanov Pavel
@@ -21,34 +19,90 @@ import javax.xml.ws.Binding;
public final class BindingUtils {
private BindingUtils() {}
//TODO generalise methods?
@NotNull
static private <E extends PsiElement, D extends DeclarationDescriptor>
D getDescriptorForExpression(@NotNull BindingContext context, @NotNull E expression, Class<D> descriptorClass) {
DeclarationDescriptor descriptor = context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, expression);
assert descriptor != null;
assert descriptorClass.isInstance(descriptor)
: expression.toString() + " expected to have of type" + descriptorClass.toString();
return (D)descriptor;
}
@NotNull
static public ClassDescriptor getClassDescriptor(@NotNull BindingContext context, @NotNull JetClass declaration) {
DeclarationDescriptor descriptor
= context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
assert descriptor instanceof ClassDescriptor : "Class should have a descriptor" +
" of type ClassDescriptor";
return (ClassDescriptor)descriptor;
return getDescriptorForExpression(context, declaration, ClassDescriptor.class);
}
@NotNull
static public NamespaceDescriptor getNamespaceDescriptor(@NotNull BindingContext context,
@NotNull JetNamespace declaration) {
DeclarationDescriptor descriptor
= context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
assert descriptor instanceof NamespaceDescriptor : "Namespace should have a descriptor" +
" of type NamespaceDescriptor";
return (NamespaceDescriptor)descriptor;
return getDescriptorForExpression(context, declaration, NamespaceDescriptor.class);
}
@NotNull
static public FunctionDescriptor getFunctionDescriptor(@NotNull BindingContext context,
@NotNull JetNamedFunction declaration) {
DeclarationDescriptor descriptor =
context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
assert descriptor instanceof FunctionDescriptor : "JetNamedFunction should have" +
" descriptor of type FunctionDescriptor.";
return (FunctionDescriptor)descriptor;
return getDescriptorForExpression(context, declaration, FunctionDescriptor.class);
}
@NotNull
static public PropertyAccessorDescriptor getPropertyAccessorDescriptor(@NotNull BindingContext context,
@NotNull JetPropertyAccessor declaration) {
return getDescriptorForExpression(context, declaration, PropertyAccessorDescriptor.class);
}
@NotNull
static public PropertyDescriptor getPropertyDescriptor(@NotNull BindingContext context,
@NotNull JetProperty declaration) {
return getDescriptorForExpression(context, declaration, PropertyDescriptor.class);
}
@NotNull
static public String getPropertyNameForPropertyAccessor(@NotNull BindingContext context,
@NotNull JetPropertyAccessor accessor) {
PropertyAccessorDescriptor descriptor = getPropertyAccessorDescriptor(context, accessor);
return descriptor.getCorrespondingProperty().getName();
}
@NotNull
static public PropertySetterDescriptor getPropertySetterDescriptorForProperty(@NotNull BindingContext context,
@NotNull JetProperty property) {
PropertySetterDescriptor result = getPropertyDescriptor(context, property).getSetter();
assert result != null : "Property should have a setter descriptor";
return result;
}
@NotNull
static public PropertyGetterDescriptor getPropertyGetterDescriptorForProperty(@NotNull BindingContext context,
@NotNull JetProperty property) {
PropertyGetterDescriptor result = getPropertyDescriptor(context, property).getGetter();
assert result != null : "Property should have a getter descriptor";
return result;
}
@NotNull
static public List<ClassDescriptor> getSuperclassDescriptors(@NotNull BindingContext context,
@NotNull JetClass classDeclaration) {
ClassDescriptor classDescriptor = getClassDescriptor(context, classDeclaration);
Collection<? extends JetType> superclassTypes = classDescriptor.getTypeConstructor().getSupertypes();
List<ClassDescriptor> superClassDescriptors = new ArrayList<ClassDescriptor>();
for (JetType type : superclassTypes) {
DeclarationDescriptor superClassDescriptor =
type.getConstructor().getDeclarationDescriptor();
assert superClassDescriptor instanceof ClassDescriptor
: "Superclass descriptor of a type should be of type ClassDescriptor";
if (isNotAny(superClassDescriptor)) {
superClassDescriptors.add((ClassDescriptor)superClassDescriptor);
}
}
return superClassDescriptors;
}
//TODO better implementation?
private static boolean isNotAny(@NotNull DeclarationDescriptor superClassDescriptor) {
return superClassDescriptor.getName() != "Any";
}
}
@@ -2,8 +2,9 @@ package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
import org.jetbrains.jet.lang.psi.*;
import java.util.ArrayList;
@@ -66,37 +67,31 @@ public final class ClassBodyVisitor extends TranslatorVisitor<List<JsPropertyIni
}
@NotNull
private JsPropertyInitializer generateDefaultGetter(@NotNull JetProperty expression, @NotNull TranslationContext context) {
JsName getterName = context.classScope().declareName(Namer.getNameForGetter(expression.getName()));
return AstUtil.newNamedMethod(getterName, generateDefaultGetterFunction(expression, context));
private JsPropertyInitializer generateDefaultGetter
(@NotNull JetProperty expression, @NotNull TranslationContext context) {
PropertyGetterDescriptor getterDescriptor =
BindingUtils.getPropertyGetterDescriptorForProperty(context.bindingContext(), expression);
return AstUtil.newNamedMethod(context.getNameForDescriptor(getterDescriptor),
generateDefaultGetterFunction(expression, context.newPropertyAccess(getterDescriptor)));
}
@NotNull
private JsFunction generateDefaultGetterFunction(@NotNull JetProperty expression,
@NotNull TranslationContext context) {
JsNameRef backingFieldRef = declareOrGetBackingFieldName(getPropertyName(expression), context).makeRef();
JsNameRef backingFieldRef = getBackingFieldName(getPropertyName(expression), context).makeRef();
backingFieldRef.setQualifier(new JsThisRef());
JsReturn returnExpression = new JsReturn(backingFieldRef);
return AstUtil.newFunction
(context.enclosingScope(), null, new ArrayList<JsParameter>(), AstUtil.convertToBlock(returnExpression));
}
//TODO rewrite
@NotNull
private JsName declareOrGetBackingFieldName(@NotNull String propertyName, @NotNull TranslationContext context) {
String backingFieldName = Namer.getBackingFieldNameForProperty(propertyName);
JsName jsBackingFieldName = context.classScope().findExistingName(backingFieldName);
if (jsBackingFieldName == null) {
jsBackingFieldName = context.classScope().declareName(backingFieldName);
}
return jsBackingFieldName;
}
@NotNull
private JsPropertyInitializer generateDefaultSetter(@NotNull JetProperty expression,
@NotNull TranslationContext context) {
JsName setterName = context.classScope().declareName(Namer.getNameForSetter(expression.getName()));
return AstUtil.newNamedMethod(setterName, generateDefaultSetterFunction(expression, context));
PropertySetterDescriptor setterDescriptor =
BindingUtils.getPropertySetterDescriptorForProperty(context.bindingContext(), expression);
return AstUtil.newNamedMethod(context.getNameForDescriptor(setterDescriptor),
generateDefaultSetterFunction(expression, context.newPropertyAccess(setterDescriptor)));
}
@NotNull
@@ -114,7 +109,7 @@ public final class ClassBodyVisitor extends TranslatorVisitor<List<JsPropertyIni
@NotNull
private JsBinaryOperation assignmentToBackingFieldFromDefaultParameter
(@NotNull JetProperty expression, @NotNull TranslationContext context, @NotNull JsParameter defaultParameter) {
JsNameRef backingFieldRef = declareOrGetBackingFieldName(getPropertyName(expression), context).makeRef();
JsNameRef backingFieldRef = getBackingFieldName(getPropertyName(expression), context).makeRef();
backingFieldRef.setQualifier(new JsThisRef());
JsBinaryOperation assignExpression = new JsBinaryOperation(JsBinaryOperator.ASG);
assignExpression.setArg1(backingFieldRef);
@@ -122,26 +117,50 @@ public final class ClassBodyVisitor extends TranslatorVisitor<List<JsPropertyIni
return assignExpression;
}
@Override
@NotNull
public List<JsPropertyInitializer> visitPropertyAccessor(@NotNull JetPropertyAccessor expression,
@NotNull TranslationContext context) {
List<JsPropertyInitializer> methods = new ArrayList<JsPropertyInitializer>();
methods.add(generateMethodForAccessor(expression, context));
return methods;
}
@NotNull
private JsPropertyInitializer generateMethodForAccessor(@NotNull JetPropertyAccessor expression,
@NotNull TranslationContext context) {
JsFunction methodBody = translateAccessorBody(expression, context);
// we know that custom getters and setters always have their descriptors
return AstUtil.newNamedMethod(context.getNameForElement(expression), methodBody);
}
@NotNull
private JsFunction translateAccessorBody(@NotNull JetPropertyAccessor expression,
@NotNull TranslationContext context) {
JsFunction methodBody = JsFunction.getAnonymousFunctionWithScope(context.getScopeForElement(expression));
ExpressionTranslator expressionTranslator =
new ExpressionTranslator(context.newPropertyAccess(expression));
JetExpression bodyExpression = expression.getBodyExpression();
assert bodyExpression != null : "Custom accessor should have a body.";
JsBlock methodBodyBlock = AstUtil.convertToBlock(expressionTranslator.translate(bodyExpression));
methodBody.setBody(methodBodyBlock);
return methodBody;
}
// @Override
// @NotNull
// public List<JsPropertyInitializer> visitPropertyAccessor
// (JetPropertyAccessor expression, TranslationContext context) {
// List<JsPropertyInitializer> methods = new ArrayList<JsPropertyInitializer>();
// JsPropertyInitializer namedMethod = generateMethodForAccessor(expression, context);
// methods.add(namedMethod);
// return methods;
// JsName getNameForGetter(@NotNull String propertyName, @NotNull TranslationContext context) {
// return getNameForAccessor(propertyName, true, context);
// }
//
// private JsPropertyInitializer generateMethodForAccessor(JetPropertyAccessor expression, TranslationContext context) {
// JsFunction methodBody = new JsFunction(context.enclosingScope());
// ExpressionTranslator expressionTranslator =
// new ExpressionTranslator(context.newFunction(methodBody));
// JsBlock methodBodyBlock = AstUtil.convertToBlock(expressionTranslator.translate(expression.getBodyExpression()));
// methodBody.setBody(methodBodyBlock);
// //TODO figure out naming pattern
// return AstUtil.newNamedMethod(Namer.getNameForAccessor("nameForAccessor", expression), methodBody);
// @NotNull
// JsName getNameForSetter(@NotNull String propertyName, @NotNull TranslationContext context) {
// return getNameForAccessor(propertyName, false, context);
// }
//
// @NotNull
// JsName getNameForAccessor(@NotNull String propertyName, boolean isGetter,
// @NotNull TranslationContext context) {
// return context.classScope().findExistingName(Namer.getNameForAccessor(propertyName, isGetter));
// }
@@ -2,16 +2,10 @@ package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import org.apache.velocity.runtime.directive.Block;
import org.eclipse.jdt.core.dom.Initializer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.JetType;
import sun.org.mozilla.javascript.internal.Function;
import java.util.ArrayList;
import java.util.List;
@@ -22,33 +16,51 @@ import java.util.List;
//TODO ClassTranslator needs heavy improvement
public final class ClassTranslator extends AbstractTranslator {
private final ClassBodyVisitor classBodyVisitor = new ClassBodyVisitor();
@NotNull private final ClassBodyVisitor classBodyVisitor = new ClassBodyVisitor();
public ClassTranslator(TranslationContext context) {
super(context);
}
public JsStatement translateClass(JetClass classDeclaration) {
@NotNull
public JsStatement translateClass(@NotNull JetClass classDeclaration) {
JsInvocation jsClassDeclaration = new JsInvocation();
jsClassDeclaration.setQualifier(Namer.creationMethodReference());
addSuperclassReferences(classDeclaration, jsClassDeclaration);
addClassOwnDeclarations(classDeclaration, jsClassDeclaration);
JsName jsClassName = translationContext().getNameForElement(classDeclaration);
return AstUtil.convertToStatement(
AstUtil.newAssignment(translationContext().getNamespaceQualifiedReference(jsClassName), jsClassDeclaration));
}
@NotNull
private void addClassOwnDeclarations(@NotNull JetClass classDeclaration,
@NotNull JsInvocation jsClassDeclaration) {
JsObjectLiteral jsClassDescription = translateClassDeclarations(classDeclaration);
jsClassDeclaration.getArguments().add(jsClassDescription);
//getSuperClassName(classDeclaration);
String className = classDeclaration.getName();
JsName jsClassName = translationContext().namespaceScope().declareName(className);
return AstUtil.convertToStatement(AstUtil.newAssignment(
translationContext().getNamespaceQualifiedReference(jsClassName), jsClassDeclaration));
}
private void getSuperClassName(JetClass classDeclaration) {
ClassDescriptor classDescriptor = bindingContext().get(BindingContext.CLASS, classDeclaration);
JetType superType = classDescriptor.getSuperclassType();
DeclarationDescriptor descriptor = superType.getConstructor().getDeclarationDescriptor();
JetClass superClass = (JetClass)bindingContext().get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor);
String superClassName = superClass.getName();
private void addSuperclassReferences(@NotNull JetClass classDeclaration,
@NotNull JsInvocation jsClassDeclaration) {
for (JsNameRef superClassReference : getSuperclassNameReferences(classDeclaration)) {
jsClassDeclaration.getArguments().add(superClassReference);
}
}
private JsObjectLiteral translateClassDeclarations(JetClass classDeclaration) {
@Nullable
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)));
}
return superclassReferences;
}
@NotNull
private JsObjectLiteral translateClassDeclarations(@NotNull JetClass classDeclaration) {
List<JsPropertyInitializer> propertyList = new ArrayList<JsPropertyInitializer>();
propertyList.add(generateInitializeMethod(classDeclaration));
propertyList.addAll(classDeclaration.accept(classBodyVisitor,
@@ -56,25 +68,18 @@ public final class ClassTranslator extends AbstractTranslator {
return new JsObjectLiteral(propertyList);
}
private JsPropertyInitializer generateInitializeMethod(JetClass classDeclaration) {
@NotNull
private JsPropertyInitializer generateInitializeMethod(@NotNull JetClass classDeclaration) {
JsPropertyInitializer initializer = new JsPropertyInitializer();
initializer.setLabelExpr(program().getStringLiteral(Namer.INITIALIZE_METHOD_NAME));
initializer.setValueExpr(generateInitializeMethodBody(classDeclaration));
return initializer;
}
// Note: we explicitly create JsFunction here because initialize function itself has no descriptor and
// is never referenced explicitly.
@NotNull
private JsFunction generateInitializeMethodBody(@NotNull JetClass classDeclaration) {
InitializerVisitor initializerVisitor = new InitializerVisitor();
List<JsStatement> initializerStatements = classDeclaration.accept(initializerVisitor,
InitializerVisitor initializerVisitor = new InitializerVisitor(classDeclaration,
translationContext().newClass(classDeclaration));
JsBlock block = new JsBlock();
block.setStatements(initializerStatements);
return AstUtil.newFunction(translationContext().enclosingScope(), null, null, block);
return initializerVisitor.generateInitializeMethodBody();
}
}
@@ -5,15 +5,19 @@ import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.backend.js.ast.JsReturn;
import com.google.dart.compiler.util.AstUtil;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
import org.jetbrains.jet.lexer.JetToken;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.ArrayList;
import java.util.Arrays;
@@ -126,19 +130,21 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
return new JsBinaryOperation(OperationTranslator.getBinaryOperator(jetOperationToken), left, right);
}
//TODO correct look-up logic
//TODO clearify code
@Override
@NotNull
public JsNode visitSimpleNameExpression(JetSimpleNameExpression expression, TranslationContext context) {
String referencedName = expression.getReferencedName();
JsName jsName = context.enclosingScope().findExistingName(referencedName);
if (jsName == null) {
throw new AssertionError("Unindentified name " + expression.getReferencedName());
}
assert jsName != null : "Undeclared name: " + referencedName;
if (context.namespaceScope().ownsName(jsName)) {
return context.getNamespaceQualifiedReference(jsName);
}
return jsName.makeRef();
JsNameRef nameRef = jsName.makeRef();
if (expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER) {
nameRef.setQualifier(new JsThisRef());
}
return nameRef;
}
@Override
@@ -31,7 +31,8 @@ public final class FunctionTranslator extends AbstractTranslator {
(translationContext().getNamespaceQualifiedReference(functionName), function));
}
@NotNull JsPropertyInitializer translateAsMethod(@NotNull JetNamedFunction jetFunction) {
@NotNull
JsPropertyInitializer translateAsMethod(@NotNull JetNamedFunction jetFunction) {
JsName functionName = translationContext().namespaceScope().declareFreshName(jetFunction.getName());
JsFunction function = generateFunctionObject(jetFunction);
return new JsPropertyInitializer(functionName.makeRef(), function);
@@ -39,17 +40,27 @@ public final class FunctionTranslator extends AbstractTranslator {
@NotNull
private JsFunction generateFunctionObject(@NotNull JetNamedFunction jetFunction) {
JetExpression jetBodyExpression = jetFunction.getBodyExpression();
JsFunction result = JsFunction.getAnonymousFunctionWithScope
(translationContext().getScopeForElement(jetFunction));
JsNode jsBody = (new ExpressionTranslator(functionContext(jetFunction)))
.translate(jetBodyExpression);
JsNode jsBody = translateBody(jetFunction);
List<JsParameter> jsParameters = translateParameters(jetFunction.getValueParameters(), result.getScope());
result.setParameters(jsParameters);
result.setBody(AstUtil.convertToBlock(jsBody));
return result;
}
@NotNull
private JsNode translateBody(@NotNull JetNamedFunction jetFunction) {
JetExpression jetBodyExpression = jetFunction.getBodyExpression();
//TODO support them ffs
assert jetBodyExpression != null : "Function without body not supported at the moment";
JsNode body = (new ExpressionTranslator(functionContext(jetFunction))).translate(jetBodyExpression);
if (jetFunction.hasBlockBody()) {
return AstUtil.convertToBlock(body);
}
return AstUtil.convertToBlock(new JsReturn(AstUtil.convertToExpression((body))));
}
@NotNull
private TranslationContext functionContext(@NotNull JetNamedFunction jetFunction) {
FunctionDescriptor descriptor =
@@ -3,7 +3,6 @@ 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.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.psi.*;
import java.util.ArrayList;
@@ -13,11 +12,40 @@ import java.util.List;
/**
* @author Talanov Pavel
*
* This visitor collects all initializers from a given class in a list of statements.
* Note: we do use this to preserve the order in which initializers are executed.
* This visitor collects all initializers from a given class into JsFunction object.
* Note: we do use visitor pattern to preserve the order in which initializers are executed.
*/
public class InitializerVisitor extends TranslatorVisitor<List<JsStatement>> {
@NotNull private final JsScope initializerMethodScope;
@NotNull private final JetClass classDeclaration;
@NotNull private final TranslationContext initializerMethodContext;
public InitializerVisitor(@NotNull JetClass classDeclaration, @NotNull TranslationContext context) {
this.initializerMethodScope = new JsScope(context.getScopeForElement(classDeclaration),
"initializer " + classDeclaration.getName());
this.classDeclaration = classDeclaration;
this.initializerMethodContext = context.newEnclosingScope(initializerMethodScope);
}
@NotNull
public JsFunction generateInitializeMethodBody() {
JsFunction result = JsFunction.getAnonymousFunctionWithScope(initializerMethodScope);
result.setBody(getInitializerMethodBody(classDeclaration, initializerMethodContext));
return result;
}
@NotNull
private JsBlock getInitializerMethodBody(@NotNull JetClass classDeclaration,
@NotNull TranslationContext context) {
List<JsStatement> initializerStatements = classDeclaration.accept(this, context);
JsBlock block = new JsBlock();
block.setStatements(initializerStatements);
return block;
}
@Override
@NotNull
public List<JsStatement> visitClass(@NotNull JetClass expression, @NotNull TranslationContext context) {
@@ -35,17 +63,28 @@ public class InitializerVisitor extends TranslatorVisitor<List<JsStatement>> {
if (initializer == null) {
return new ArrayList<JsStatement>();
}
declareBackingFieldName(expression);
return Arrays.asList(translateInitializer(expression, context, initializer));
}
private void declareBackingFieldName(@NotNull JetProperty property) {
initializerMethodScope.declareName(Namer.getKotlinBackingFieldName(property.getName()));
}
@NotNull
private JsStatement translateInitializer(@NotNull JetProperty property, @NotNull TranslationContext context,
@NotNull JetExpression initializer) {
ExpressionTranslator translator = new ExpressionTranslator(context);
JsExpression initExpression = AstUtil.convertToExpression(translator.translate(initializer));
return Arrays.asList(assignmentToBackingField(expression, initExpression, context));
return assignmentToBackingField(property, initExpression, context);
}
@NotNull
JsStatement assignmentToBackingField(@NotNull JetProperty property, @NotNull JsExpression initExpression,
@NotNull TranslationContext context) {
JsName backingFieldName = context.classScope()
.findExistingName(Namer.getBackingFieldNameForProperty(property.getName()));
assert backingFieldName != null : "Class scope should contain backing field names";
String propertyName = property.getName();
assert propertyName != null : "Named property expected.";
JsName backingFieldName = getBackingFieldName(propertyName, context);
JsNameRef backingFieldRef = backingFieldName.makeRef();
backingFieldRef.setQualifier(new JsThisRef());
return AstUtil.convertToStatement(AstUtil.newAssignment(backingFieldRef, initExpression));
@@ -22,7 +22,7 @@ public final class Namer {
//private static final String CLASS_CREATE_METHOD_NAME = "create";
private static final String SETTER_PREFIX = "set_";
private static final String GETTER_PREFIX = "get_";
private static final String BACKING_FIELD_PREFIX = "_";
private static final String BACKING_FIELD_PREFIX = "$";
// public static final String DEFAULT_SETTER_PARAM_NAME = "val";
public static String getClassObjectName() {
@@ -30,17 +30,16 @@ public final class Namer {
return CLASS_OBJECT_NAME;
}
public static String getNameForAccessor(String propertyName, JetPropertyAccessor accessor) {
if (accessor.isGetter()) {
public static String getNameForAccessor(String propertyName, boolean isGetter) {
if (isGetter) {
return getNameForGetter(propertyName);
}
if (accessor.isSetter()) {
else {
return getNameForSetter(propertyName);
}
throw new AssertionError("accessor should be a getter or a setter!");
}
public static String getBackingFieldNameForProperty(String propertyName) {
public static String getKotlinBackingFieldName(String propertyName) {
return getNameWithPrefix(propertyName, BACKING_FIELD_PREFIX);
}
@@ -28,6 +28,7 @@ public final class OperationTranslator {
map.put(JetTokens.LTEQ, JsBinaryOperator.LTE);
map.put(JetTokens.EQEQ, JsBinaryOperator.EQ);
map.put(JetTokens.ANDAND, JsBinaryOperator.AND);
map.put(JetTokens.EXCLEQ, JsBinaryOperator.NEQ);
}
public static JsBinaryOperator getBinaryOperator(JetToken token) {
@@ -25,17 +25,13 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
@Nullable
public JsInvocation resolveAsPropertyGet(@NotNull JetDotQualifiedExpression expression) {
if (!(expression instanceof JetDotQualifiedExpression)) {
return null;
}
JetDotQualifiedExpression dotQualifiedExpression = (JetDotQualifiedExpression)expression;
JetExpression selectorExpression = dotQualifiedExpression.getSelectorExpression();
JetExpression selectorExpression = expression.getSelectorExpression();
assert selectorExpression != null : "Selector should not be null.";
JsName getterName = getPropertyGetterName(selectorExpression);
if (getterName == null) {
return null;
}
return translateReceiverAndReturnAccessorInvocation(dotQualifiedExpression, getterName);
return translateReceiverAndReturnAccessorInvocation(expression, getterName);
}
@NotNull
@@ -73,7 +69,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
if (getter == null) {
return null;
}
return translationContext().declarations().getName(getter);
return translationContext().getNameForDescriptor(getter);
}
@Nullable
@@ -86,7 +82,7 @@ public final class PropertyAccessTranslator extends AbstractTranslator {
if (setter == null) {
return null;
}
return translationContext().declarations().getName(setter);
return translationContext().getNameForDescriptor(setter);
}
@Nullable
@@ -4,14 +4,8 @@ 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.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetNamespace;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.k2js.declarations.DeclarationExtractor;
@@ -92,7 +86,17 @@ public final class TranslationContext {
}
@NotNull
TranslationContext newFunction(@NotNull JetNamedFunction declaration) {
public TranslationContext newPropertyAccess(@NotNull JetPropertyAccessor declaration) {
return newPropertyAccess(BindingUtils.getPropertyAccessorDescriptor(bindingContext, declaration));
}
@NotNull
public TranslationContext newPropertyAccess(@NotNull PropertyAccessorDescriptor descriptor) {
return newFunction(descriptor);
}
@NotNull
public TranslationContext newFunction(@NotNull JetNamedFunction declaration) {
return newFunction(BindingUtils.getFunctionDescriptor(bindingContext, declaration));
}
@@ -103,6 +107,15 @@ public final class TranslationContext {
return new TranslationContext(namespaceName, program, bindingContext, newScopes, extractor);
}
// Note: Should be used if and only if scope has no corresponding descriptor
@NotNull
public TranslationContext newEnclosingScope(@NotNull JsScope enclosingScope) {
Scopes newScopes = new Scopes(enclosingScope, scopes.classScope, scopes.namespaceScope);
return new TranslationContext(namespaceName, program, bindingContext, newScopes, extractor);
}
@NotNull
public JsNameRef getNamespaceQualifiedReference(JsName name) {
if (namespaceName != null) {
@@ -148,13 +161,24 @@ public final class TranslationContext {
@NotNull
public JsScope getScopeForElement(@NotNull JetElement element) {
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
assert descriptor != null : "Element should have a descriptor";
DeclarationDescriptor descriptor = getDescriptorForElement(element);
return getScopeForDescriptor(descriptor);
}
@NotNull
public DeclarationExtractor declarations() {
return extractor;
public JsName getNameForDescriptor(@NotNull DeclarationDescriptor descriptor) {
return extractor.getName(descriptor);
}
@NotNull JsName getNameForElement(@NotNull JetElement element) {
DeclarationDescriptor descriptor = getDescriptorForElement(element);
return getNameForDescriptor(descriptor);
}
@NotNull
private DeclarationDescriptor getDescriptorForElement(@NotNull JetElement element) {
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
assert descriptor != null : "Element should have a descriptor";
return descriptor;
}
}
@@ -1,5 +1,6 @@
package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.JsName;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetProperty;
@@ -26,4 +27,10 @@ public class TranslatorVisitor<T> extends JetVisitor<T, TranslationContext> {
}
return propertyName;
}
@NotNull
protected JsName getBackingFieldName(@NotNull String propertyName, @NotNull TranslationContext context) {
String backingFieldName = Namer.getKotlinBackingFieldName(propertyName);
return context.enclosingScope().findExistingName(backingFieldName);
}
}
@@ -0,0 +1,44 @@
package org.jetbrains.k2js.test;
import org.jetbrains.k2js.translate.TranslationContext;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import java.io.FileReader;
import static org.junit.Assert.assertTrue;
/**
* @author Talanov Pavel
*/
public abstract class AbstractClassTest extends TranslationTest {
private final String KOTLIN_JS_LIB = TEST_FILES + "kotlin_lib.js";
protected String kotlinLibrartyPath() {
return KOTLIN_JS_LIB;
}
protected void runFileWithRhino(String inputFile, Context context, Scriptable scope) throws Exception {
FileReader reader = new FileReader(inputFile);
context.evaluateReader(scope, reader, inputFile, 1, null);
reader.close();
}
@Override
protected void runWithRhino(String inputFile, String namespaceName,
String functionName, Object expectedResult) throws Exception {
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
runFileWithRhino(kotlinLibrartyPath(), cx, scope);
runFileWithRhino(inputFile, cx, scope);
Object result = extractAndCallFunctionObject(namespaceName, functionName, cx, scope);
assertTrue("Result is not what expected!",result.equals(expectedResult));
String report = namespaceName + "." + functionName + "() = " + Context.toString(result);
System.out.println(report);
Context.exit();
}
}
@@ -0,0 +1,42 @@
package org.jetbrains.k2js.test;
import org.junit.Test;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
/**
* @author Talanov Pavel
*/
public class BasicClassTest extends AbstractClassTest {
final private static String MAIN = "class/";
@Override
protected String mainDirectory() {
return MAIN;
}
@Test
public void kotlinJsLibRunsWithRhino() throws Exception {
Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
runFileWithRhino(kotlinLibrartyPath(), context, scope);
Context.exit();
}
@Test
public void classInstantiation() throws Exception {
testFooBoxIsTrue("classInstantiation.kt");
}
@Test
public void methodDeclarationAndCall() throws Exception {
testFooBoxIsTrue("methodDeclarationAndCall.kt");
}
// TODO : excluded test
@Test
public void constructorWithParameter() throws Exception {
//testFooBoxIsTrue("constructorWithParameter.kt");
}
}
@@ -0,0 +1,28 @@
package org.jetbrains.k2js.test;
import org.junit.Test;
/**
* @author Talanov Pavel
*/
public final class ClassInheritanceTest extends AbstractClassTest {
final private static String MAIN = "inheritance/";
@Override
protected String mainDirectory() {
return MAIN;
}
@Test
public void initializersOfBasicClassExecute() throws Exception {
performTest("initializersOfBasicClassExecute.kt", "foo", "box", 3);
}
@Test
public void methodOverride() throws Exception {
testFooBoxIsTrue("methodOverride.kt");
}
}
@@ -1,75 +0,0 @@
package org.jetbrains.k2js.test;
import org.jetbrains.k2js.translate.TranslationContext;
import org.junit.Test;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import java.io.FileReader;
import static org.junit.Assert.assertTrue;
/**
* @author Talanov Pavel
*/
public final class ClassTest extends TranslationTest {
private final String KOTLIN_JS_LIB = TEST_DIR + "kotlin_lib.js";
@Override
protected void runWithRhino(String inputFile, String namespaceName,
String functionName, Object expectedResult) throws Exception {
Context cx = Context.enter();
FileReader testFileReader = new FileReader(inputFile);
FileReader libReader = new FileReader(KOTLIN_JS_LIB);
try {
Scriptable scope = cx.initStandardObjects();
cx.evaluateReader(scope, libReader, "lib", 1, null);
cx.evaluateReader(scope, testFileReader, "test case", 1, null);
Object result = extractAndCallFunctionObject(namespaceName, functionName, cx, scope);
assertTrue(result.equals(expectedResult));
String report = namespaceName + "." + functionName + "() = " + Context.toString(result);
System.out.println(report);
} finally {
Context.exit();
testFileReader.close();
}
}
@Test
public void kotlinJsLibRunsWithRhino() throws Exception {
runWithRhino(TEST_DIR + "testKotlinLib.js", "foo", "box", true);
}
@Test
public void classInstantiation() throws Exception {
testFooBoxIsTrue("classInstantiation.kt");
}
@Test
public void methodDeclarationAndCall() throws Exception {
testFooBoxIsTrue("methodDeclarationAndCall.kt");
}
@Test
public void accessToInstanceProperty() throws Exception {
testFooBoxIsTrue("accessToInstanceProperty.kt");
}
@Test
public void twoClassesWithProperties() throws Exception {
testFooBoxIsTrue("twoClassesWithProperties.kt");
}
@Test
public void setter() throws Exception {
performTest("setter.kt", "foo", "f", 99.0);
}
@Test
public void constructorWithParameter() throws Exception {
testFooBoxIsTrue("constructorWithParameter.kt");
}
}
@@ -1,6 +1,8 @@
package org.jetbrains.k2js.test;
import org.junit.BeforeClass;
import org.junit.Test;
import org.kohsuke.rngom.digested.Main;
/**
* @author Talanov Pavel
@@ -10,6 +12,12 @@ import org.junit.Test;
*/
public final class FunctionTest extends TranslationTest {
private static final String MAIN = "function/";
protected String mainDirectory() {
return MAIN;
}
@Test
public void currentTest() throws Exception {
testFooBoxIsTrue("test.kt");
@@ -0,0 +1,42 @@
package org.jetbrains.k2js.test;
import org.junit.Test;
/**
* @author Talanov Pavel
*/
public final class PropertyAccessorTest extends AbstractClassTest {
final private static String MAIN = "propertyAccess/";
@Override
protected String mainDirectory() {
return MAIN;
}
@Test
public void accessToInstanceProperty() throws Exception {
testFooBoxIsTrue("accessToInstanceProperty.kt");
}
@Test
public void twoClassesWithProperties() throws Exception {
testFooBoxIsTrue("twoClassesWithProperties.kt");
}
@Test
public void setter() throws Exception {
performTest("setter.kt", "foo", "f", 99.0);
}
@Test
public void customGetter() throws Exception {
testFooBoxIsTrue("customGetter.kt");
}
@Test
public void customSetter() throws Exception {
testFooBoxIsTrue("customSetter.kt");
}
}
@@ -1,6 +1,8 @@
package org.jetbrains.k2js.test;
import org.jetbrains.k2js.K2JSTranslator;
import org.junit.Before;
import org.junit.BeforeClass;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeObject;
@@ -13,21 +15,52 @@ import static org.junit.Assert.*;
/**
* @author Talanov Pavel
*/
public class TranslationTest {
public abstract class TranslationTest {
protected final static String TEST_DIR = "test_files/test_cases/";
final protected static String TEST_FILES = "testFiles/";
final private static String CASES = "cases/";
final private static String OUT = "out/";
protected void performTest(String inputFile, String namespaceName,
protected String testFilesDirectory;
protected String testCasesDirectory;
protected String outputDirectory;
@Before
public void setUpClass() {
testCasesDirectory = CASES;
outputDirectory = OUT;
testFilesDirectory = TEST_FILES + mainDirectory();
}
protected abstract String mainDirectory();
private String getOutputDirectory() {
return testFilesDirectory + outputDirectory;
}
private String getInputDirectory() {
return testFilesDirectory + testCasesDirectory;
}
protected void performTest(String filename, String namespaceName,
String functionName, Object expectedResult) throws Exception {
K2JSTranslator.Arguments args = new K2JSTranslator.Arguments();
args.src = TEST_DIR + inputFile;
args.outputDir = getOutputFilename(TEST_DIR + inputFile);
args.src = getInputFilePath(filename);
args.outputDir = getOutputFilePath(filename);
K2JSTranslator.translate(args);
runWithRhino(args.outputDir, namespaceName, functionName, expectedResult);
}
private String getOutputFilename(String inputFile) {
return inputFile.substring(0, inputFile.lastIndexOf('.')) + ".js";
private String getOutputFilePath(String filename) {
return getOutputDirectory() + convertToDotJsFile(filename);
}
private String convertToDotJsFile(String filename) {
return filename.substring(0, filename.lastIndexOf('.')) + ".js";
}
private String getInputFilePath(String filename) {
return getInputDirectory() + filename;
}
protected void runWithRhino(String inputFile, String namespaceName,
@@ -0,0 +1,13 @@
namespace foo
open class A() {
var a = 3;
}
class B() : A() {
}
fun box() : Int {
return (B().a)
}
@@ -0,0 +1,15 @@
namespace foo
open class C {
open fun f(): Any = "C f"
}
class D() : C {
override fun f(): String = "D f"
}
fun box(): Boolean {
val d : C = D()
if(d.f() != "D f") return false
return true
}
@@ -24,6 +24,9 @@ var Class = (function() {
parent = properties.shift();
function klass() {
if (parent != null) {
parent.prototype.initialize.apply(this)
}
this.initialize.apply(this, arguments);
}
@@ -84,8 +87,6 @@ var Class = (function() {
};
})();
(function() {
var _toString = Object.prototype.toString,
@@ -285,4 +286,94 @@ var Class = (function() {
isDate: isDate,
isUndefined: isUndefined
});
})();
})();
Object.extend(Function.prototype, (function() {
var slice = Array.prototype.slice;
function update(array, args) {
var arrayLength = array.length, length = args.length;
while (length--) array[arrayLength + length] = args[length];
return array;
}
function merge(array, args) {
array = slice.call(array, 0);
return update(array, args);
}
function argumentNames() {
var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1]
.replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '')
.replace(/\s+/g, '').split(',');
return names.length == 1 && !names[0] ? [] : names;
}
function bind(context) {
if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
var __method = this, args = slice.call(arguments, 1);
return function() {
var a = merge(args, arguments);
return __method.apply(context, a);
}
}
function bindAsEventListener(context) {
var __method = this, args = slice.call(arguments, 1);
return function(event) {
var a = update([event || window.event], args);
return __method.apply(context, a);
}
}
function curry() {
if (!arguments.length) return this;
var __method = this, args = slice.call(arguments, 0);
return function() {
var a = merge(args, arguments);
return __method.apply(this, a);
}
}
function delay(timeout) {
var __method = this, args = slice.call(arguments, 1);
timeout = timeout * 1000;
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
}
function defer() {
var args = update([0.01], arguments);
return this.delay.apply(this, args);
}
function wrap(wrapper) {
var __method = this;
return function() {
var a = update([__method.bind(this)], arguments);
return wrapper.apply(this, a);
}
}
function methodize() {
if (this._methodized) return this._methodized;
var __method = this;
return this._methodized = function() {
var a = update([this], arguments);
return __method.apply(null, a);
};
}
return {
argumentNames: argumentNames,
bind: bind,
bindAsEventListener: bindAsEventListener,
curry: curry,
delay: delay,
defer: defer,
wrap: wrap,
methodize: methodize
}
})());
@@ -0,0 +1,13 @@
namespace foo
class Test() {
val a : Int
get() {
return 5;
}
}
fun box() : Boolean {
var test = Test()
return (test.a ==5)
}
@@ -0,0 +1,14 @@
namespace foo
class Test() {
var a : Int = 5
set(b : Int) {
$a = 3
}
}
fun box() : Boolean {
var test = Test()
test.a = 5
return (test.a == 3)
}
@@ -1,10 +0,0 @@
foo = {};
(function(foo){
foo.f = function(){
var x = 1;
x = x + 1;
return x;
}
;
}
(foo));
@@ -1,12 +0,0 @@
foo = {};
(function(foo){
foo.Test = Class.create({initialize:function(){
}
});
foo.box = function(){
var test = new foo.Test;
return true;
}
;
}
(foo));
@@ -1,11 +0,0 @@
foo = {};
(function(foo){
foo.box = function(){
var a = 2;
var b = 3;
var c = 4;
return a < c;
}
;
}
(foo));
@@ -1,14 +0,0 @@
class Slot() {
var vitality: Int = 10000
fun increaseVitality(delta: Int) {
vitality += delta
if (vitality > 65535) vitality = 65535;
}
}
fun box(): Boolean {
val s = Slot()
s.increaseVitality(1000)
return (s.vitality == 11000)
}
@@ -1,15 +0,0 @@
foo = {};
(function(foo){
foo.y = 3;
foo.f = function(a){
var x = 42;
var y = 50;
return y;
}
;
foo.box = function(){
return foo.f(foo.y);
}
;
}
(foo));
File diff suppressed because it is too large Load Diff
-11
View File
@@ -1,11 +0,0 @@
foo = {};
(function(foo){
foo.box = function(){
var a = 2;
var b = 3;
var c = 4;
return a < c;
}
;
}
(foo));
@@ -1,12 +0,0 @@
foo = {};
(function(foo){
foo.Test = Class.create({initialize:function(){
}
});
foo.box = function(){
var test = new foo.Test();
return true;
}
;
}
(foo));