Compare commits

..

162 Commits

Author SHA1 Message Date
Andrey Breslav
322d884b62 Merge branch 'master' of git://github.com/jgl87/kotlin 2014-04-01 12:45:00 +04:00
Mikhael Bogdanov
e2f3a589e7 KT-3308 Support local generic functions in codegen
#KT-3308 Can'tReproduce
2014-04-01 11:18:16 +04:00
Mikhael Bogdanov
4269729b0a KT-3214: Verify error when get array convention is used with varargs
#KT-3214 Can'tReproduce
2014-04-01 11:18:16 +04:00
Mikhael Bogdanov
596dc68ea4 KT-4340: Jvm backend generates invalid synthetic accessor for private extension property 2014-04-01 11:18:15 +04:00
Natalia Ukhorskaya
33b1813dd7 Remove KT-4617 workaround 2014-04-01 11:12:23 +04:00
Natalia Ukhorskaya
32a6205d81 SmartStepInto in top level functions. Add test for debugger
#KT-4737 Fixed
2014-04-01 10:41:34 +04:00
Nikolay Krasko
4aa3dff2a2 Update to ASM5 2014-04-01 02:55:05 +04:00
Nikolay Krasko
95fd870988 Update to idea 135.666 EAP with asm5 library 2014-04-01 02:55:00 +04:00
JGL
a31d950877 Dot Operation: Use dotted call information in completion 2014-04-01 00:07:20 +04:00
JGL
96f314d4e4 Dot Operation: Codegen 2014-04-01 00:07:16 +04:00
JGL
76e74bae0a Dot Operation: Modify analysis rules 2014-04-01 00:07:12 +04:00
Evgeny Gerashchenko
04a6b10f7a Minor. Renamed annotationDeserializer → deserializers. 2014-03-31 22:39:59 +04:00
Evgeny Gerashchenko
dadc8351b6 Added tests for compiling Java against TraitImpl and extension members. 2014-03-31 22:39:58 +04:00
Evgeny Gerashchenko
93dfc00880 Minor. Renamed enum constants for clarification. 2014-03-31 22:39:58 +04:00
Natalia Ukhorskaya
4a79bfa16d Generate static accessors fro protected functions in different packages
#KT-4617 Fixed
2014-03-31 21:27:13 +04:00
Mikhael Bogdanov
5b5ecca12a Inline test: check that no any inline method is called directly 2014-03-31 20:04:23 +04:00
Mikhael Bogdanov
0d239a3e0e Moving local fun callee generation to CallReceiver 2014-03-31 20:04:10 +04:00
Mikhael Bogdanov
7dc662f613 Optimization for const closures: access it via GETSTATIC 2014-03-31 20:04:09 +04:00
Mikhael Bogdanov
c7c1e33655 Move local fun callee generation to pushArgumentsWithCallReceiver.
Local fun callee generation via resolvedCall.resultingDescriptor not call
2014-03-31 20:03:43 +04:00
Mikhael Bogdanov
94e4c2f0c1 Move call receiver wrapping and generation to pushArgumentsWithCallReceiver 2014-03-31 20:00:46 +04:00
Mikhael Bogdanov
e1e2855887 Removed obsolete pop operation 2014-03-31 19:59:24 +04:00
Mikhael Bogdanov
b3f4b79cdf Fixed misspelling in defaulCallGenerator 2014-03-31 19:59:24 +04:00
Mikhael Bogdanov
ff4ff29d28 CallReceiver calcType and put method identical simplification 2014-03-31 19:59:24 +04:00
Zalim Bashorov
fd165f055f Minor in JS backend:
- use constants from Namer in JsAstUtils#createPackage;
  - dropped extra JsInvoke node when create IIF;
  - create new JsName for Kotlin object in IIF scope.
2014-03-31 16:07:55 +04:00
Zalim Bashorov
0a546ebb40 Merge pull request #428 from alextkachman/kotlin-as-var
added Kotlin as parameter for module wrapping function
2014-03-31 15:58:18 +04:00
Zalim Bashorov
0d61fbb8f7 Merge pull request #427 from alextkachman/master
Avoid unnecessary null checks in'!!' and 'as'
2014-03-31 15:57:24 +04:00
gavinkeusch
a6a1bb2b7c KT-4574 New Intention: Split If - converts if statement containing one or more conjunction operators into two nested if statements 2014-03-31 14:40:00 +04:00
Nikolay Krasko
7c94e8a9af Rename kotlin properties with all usages
#KT-4317 Fixed
 #KT-4316 Fixed
2014-03-31 14:09:51 +04:00
Nikolay Krasko
b779141845 Refactoring: move methods about override to OverridingUtil 2014-03-31 14:09:50 +04:00
Nikolay Krasko
a39537f040 Update Kotlin icons 2014-03-31 14:09:49 +04:00
Alex Tkachman
82a25c8b07 added Kotlin as parameter for module wrapping function. this is for better obfuscation 2014-03-31 10:25:02 +03:00
Alex Tkachman
371dfc6ec4 avoid unnecessary null checks when receiver of '!!' or 'as' operator is not nullable 2014-03-29 21:28:00 +03:00
Alexander Udalov
09a8e284e5 Minor fix in kotlin-stdlib-gen
This change was forgotten in e3fffe2
2014-03-28 22:45:35 +04:00
Alexander Udalov
d75a20bd7c Minor, fix warning 2014-03-28 21:56:04 +04:00
Alexander Udalov
1e611f4df1 Minor refactoring in TypeUtils
Move out unneeded things in runtime, fix warnings
2014-03-28 21:56:04 +04:00
Alexander Udalov
d08da465d4 Module 'serialization' doesn't depend on intellij-core anymore 2014-03-28 21:44:07 +04:00
Alexander Udalov
59c04f5aff Module 'util.runtime' doesn't depend on intellij-core anymore 2014-03-28 21:44:07 +04:00
Alexander Udalov
d719222bc4 Delete CommonSuppliers, use Guava directly 2014-03-28 21:44:07 +04:00
Alexander Udalov
7c4079fd32 Tear down SubstitutionUtils and move to frontend 2014-03-28 21:44:00 +04:00
Alexander Udalov
e3fffe275b Fix implementation of Iterable<T>.take
#KT-4780 Fixed
2014-03-28 19:08:48 +04:00
Evgeny Gerashchenko
829cd95469 KT-4770 Javac fails against Kotlin inner class
#KT-4770 fixed
2014-03-28 16:46:26 +04:00
Andrey Breslav
bcc6843835 Render file name and position in errors from JS library stubs 2014-03-28 13:18:46 +04:00
Nikolay Krasko
c74542c72e Download idea for verify to non-default folder 2014-03-28 12:48:56 +04:00
Alexander Udalov
ea4daed0ac Use FqNameUnsafe instead of FqName in JVM intrinsics
#KT-4777 Fixed
2014-03-27 22:46:44 +04:00
Alexander Udalov
94084fb8e1 Regenerate tests 2014-03-27 22:43:55 +04:00
Valentin Kipyatkov
19bb3ca92a Fixed test (ran GenerateInjectors) 2014-03-27 16:11:36 +04:00
Nikolay Krasko
59137d61fd Remove verify directory before creating (make steps more independent) 2014-03-27 15:44:08 +04:00
Valentin Kipyatkov
50bb90a1e3 Smart completion: support for overloaded method calls 2014-03-27 15:21:57 +04:00
Alexey Sedunov
15364ceae6 Fix bug in test generation (as introduced by earlier commit) 2014-03-27 13:00:37 +04:00
Alexander Udalov
0deea6b83c Add test for obsolete issue
#KT-1936 Obsolete
2014-03-27 03:06:59 +04:00
Evgeny Gerashchenko
3962064bd2 Fixed compilation of KDoc 2014-03-26 23:55:12 +03:00
Andrey Breslav
708694a09d Resolve annotation arguments only once 2014-03-26 21:10:29 +04:00
Andrey Breslav
298ddcf0ad Do not resolve annotation arguments when only a type is requested
This replaces the logic that always did complete constructor call resolution by a request to typeResolver when only a type is needed
2014-03-26 21:10:29 +04:00
Andrey Breslav
1cdfab761a Lazy annotation resolution supported 2014-03-26 21:10:29 +04:00
Andrey Breslav
bb17adc8d7 LazyAnnotations implementation 2014-03-26 21:10:29 +04:00
Andrey Breslav
72b2fa77f7 Test for recursively annotated class object added 2014-03-26 21:10:29 +04:00
Andrey Breslav
b3fb2e2314 Register files in package in LAZY mode 2014-03-26 21:10:29 +04:00
Andrey Breslav
311e7ab5fe Make RecursiveDescriptorProcessorTest happy, it relies on the order of interfaces 2014-03-26 21:10:28 +04:00
Andrey Breslav
3560a9da73 Minor. Extract method 2014-03-26 21:10:28 +04:00
Andrey Breslav
cbb24a7d4e Multiple rewrites to the same key in a map replaced by one write 2014-03-26 21:10:28 +04:00
Andrey Breslav
27d4e583a8 Unneeded field removed 2014-03-26 21:10:28 +04:00
Andrey Breslav
368381a861 Minor. Rename method 2014-03-26 21:10:28 +04:00
Andrey Breslav
f6439ade55 Minor. Extract method 2014-03-26 21:10:28 +04:00
Andrey Breslav
df1f0886c5 Inject a project into TDA for proper lazy session initialization 2014-03-26 21:10:27 +04:00
Andrey Breslav
4b5a192e4c Don't add primary constructors parameters for properties 2014-03-26 21:10:27 +04:00
Andrey Breslav
bf2cc99109 Don't add delegated members from error types 2014-03-26 21:10:27 +04:00
Andrey Breslav
34c6eaec56 Correct scope for property accessors in lazy resolve 2014-03-26 21:10:27 +04:00
Andrey Breslav
4dfb6763b2 Alias importing fixed for the lazy case 2014-03-26 21:10:27 +04:00
Evgeny Gerashchenko
9ecd680fd4 Rewritten PackageFragmentDescriptor to Kotlin. 2014-03-26 00:41:54 +04:00
Evgeny Gerashchenko
00c0c1acd1 Introduced base PackageFragmentDescriptorImpl class, 2014-03-26 00:30:56 +04:00
Evgeny Gerashchenko
b736d1602e Got rid of conustructors zoo in value parameter and getter/setter descriptors. 2014-03-25 21:35:09 +04:00
Evgeny Gerashchenko
cf61446d69 Fixed order of containing and original in property descriptors. 2014-03-25 21:35:09 +04:00
Evgeny Gerashchenko
48f8aa279b Extracted "preserve original" flag. 2014-03-25 21:34:11 +04:00
Evgeny Gerashchenko
1aaea21f63 Got rid of constructors/initializers zoo in property descriptors 2014-03-25 21:33:15 +04:00
Evgeny Gerashchenko
eaad1f9f50 Got rid of constructors/initializers zoo in simple function descriptors 2014-03-25 21:33:14 +04:00
Evgeny Gerashchenko
8d38e74bd9 Got rid of constructors/initializers zoo in constructor descriptors 2014-03-25 21:33:09 +04:00
Nikolay Krasko
23e6ae02bd Update versions pattern in order to support several numbers in version 2014-03-25 19:02:49 +04:00
Nikolay Krasko
d577656815 Download latest android studio by default 2014-03-25 19:02:49 +04:00
Alexey Sedunov
cceb66d632 Implement structural grouping of Kotlin declaration usages
#KT-4742 Fixed
2014-03-25 18:01:06 +04:00
Alexey Sedunov
5d4527d7aa Parser: Fix recovery of constructor parameter list
#KT-4739 Fixed
2014-03-25 16:49:46 +04:00
Alexey Sedunov
028a71273c Fix test data of QuickFixTest 2014-03-25 16:49:44 +04:00
Alexey Sedunov
1bbec14cc0 Inspections: Explicit "get" 2014-03-25 16:49:43 +04:00
Alexey Sedunov
a0bc6a7b39 Base classes for Kotlin inspections 2014-03-25 16:49:40 +04:00
kuity
48b9dcf5ae Added KT-4549 SwapBinaryExpression Intention 2014-03-25 15:55:53 +04:00
Andrey Breslav
80737bdfcf Fix PSI behavior for "val x : ()?' case 2014-03-25 15:55:53 +04:00
Evgeny Gerashchenko
6725b4f1b0 Minor. Unified code. 2014-03-25 14:34:59 +04:00
Evgeny Gerashchenko
5360451022 Minor. Renamed methods. 2014-03-25 14:34:58 +04:00
Evgeny Gerashchenko
33e59103ec Fixed test when JDK 8 is system default. 2014-03-25 14:34:58 +04:00
Evgeny Gerashchenko
74ff77eca4 Added test case to K2JvmCliTest.
Test is already present.
2014-03-25 14:34:57 +04:00
Evgeny Gerashchenko
a502374a62 Added incremental compilation flag. For publishing intermediate implementation. 2014-03-25 14:34:53 +04:00
Evgeny Gerashchenko
3553f0701c Minor. Got rid of useless parameter. 2014-03-25 14:31:45 +04:00
Evgeny Gerashchenko
a44f0c2f2d Removed dependency on asm in descriptor.loader.java
Conflicts:
	compiler/backend/src/org/jetbrains/jet/codegen/JavaSerializerExtension.java
2014-03-25 14:31:45 +04:00
Evgeny Gerashchenko
9f8a16fb1a Unified copying of property and method proto data. 2014-03-25 14:31:44 +04:00
Evgeny Gerashchenko
733de56178 Supported properties in partial compilation of package. 2014-03-25 14:31:44 +04:00
Evgeny Gerashchenko
98401d109f Minor. Dictionary. 2014-03-25 14:31:43 +04:00
Evgeny Gerashchenko
9e815f8560 Extracted Java signature deserialization logic from BaseDescriptorDeserializer.
Java signature deserializer returns asm Method instead of MemberSignature
2014-03-25 14:31:42 +04:00
Evgeny Gerashchenko
5e9e0acc34 Introduced trait for deserialized callable and implementations. 2014-03-25 14:31:42 +04:00
Evgeny Gerashchenko
cb0a85bc50 Simplified code in functions hierarchy.
Minimized constructors variety and reduced code duplication.
2014-03-25 14:31:41 +04:00
Evgeny Gerashchenko
537c03fb1a Added test checking that initialization order in package part is not violated. 2014-03-25 14:31:41 +04:00
Evgeny Gerashchenko
d62bc07437 Partial compilation of package (only functions supported). 2014-03-25 14:31:38 +04:00
Evgeny Gerashchenko
00c2bd60e5 Code cleanup in PackageCodegen.
Converted set to one element (because it's always one element). Checking for all files to be in one package FQ name is redundant.
2014-03-25 14:26:49 +04:00
Evgeny Gerashchenko
5c8253c099 Rendering class or package proto when JPS test fails. 2014-03-25 14:26:48 +04:00
Evgeny Gerashchenko
5f77a4548e Extracted util method reading class header from bytes. 2014-03-25 14:26:48 +04:00
Evgeny Gerashchenko
e1a47deeae Checking class files contents after make and rebuild. 2014-03-25 14:26:47 +04:00
Evgeny Gerashchenko
5acd054c72 Baby steps for incremental compilation. 2014-03-25 14:26:47 +04:00
Evgeny Gerashchenko
9e22c29825 Moved general JPS test data to common directory. 2014-03-25 14:26:47 +04:00
Ross Hanson
55e888604e KT-4568: Created the ConvertNegatedExpressionWithDemorgansLaw intention. Converts an expression of the form !(a &&,|| b) to its expanded equivalent under DeMorgan's law. 2014-03-25 10:25:47 +04:00
Ross Hanson
2147a88ed8 KT-4568: Created the ConvertNegatedBooleanSequence intention. This intention takes an expression of the form !a &&,|| !b &&,|| ... and converts it to the DeMorgan equivalent !(a &&,|| b ...). 2014-03-25 10:25:47 +04:00
Nikita Skvortsov
4088f4a00e remove unneeded resources 2014-03-24 20:14:27 +04:00
Nikita Skvortsov
84314711c6 continue renaming tests 2014-03-24 20:14:26 +04:00
Nikita Skvortsov
d2de398d3e clearly rename test projects 2014-03-24 20:14:24 +04:00
Nikita Skvortsov
0ee97faca1 allow modifying test resources path 2014-03-24 20:14:23 +04:00
Zalim Bashorov
5825b0e9b3 Update to IDEA 13.1.1(135.480) 2014-03-24 18:38:25 +04:00
Tal Man
1c2082fd19 Don't create empty parentheses when lambda is the only argument 2014-03-24 18:20:01 +04:00
Ilya Ryzhenkov
796611702c Test indentation on new line in scripts. 2014-03-24 18:17:51 +04:00
Ilya Ryzhenkov
64b4c2d49b Fix scripting formatter to avoid extra indent in invisible block node. 2014-03-24 18:17:51 +04:00
Ilya Ryzhenkov
480dd6767c Convert module scripting to .ktm extension. 2014-03-24 18:17:51 +04:00
Ilya Ryzhenkov
98c54f39bb Unify script file extensions to "kts" so that IDEA, compiler and tests agree when to parse as SCRIPT.
Include kt* files into formatter test generation, to test scripting formatting
2014-03-24 18:17:50 +04:00
Ilya Ryzhenkov
4ba423ee16 Retain original file extension to test formatting in scripts 2014-03-24 18:17:50 +04:00
Ilya Ryzhenkov
9239fa2ece ScriptName now returns FqName, fully qualified with package name. Update usages and convert to internal format as needed. 2014-03-24 18:17:50 +04:00
Ilya Ryzhenkov
d08f2bc7ab Do not dispose classLoader so that dependent types can be loaded on demand, like closures. 2014-03-24 18:17:49 +04:00
Ilya Ryzhenkov
e49f4a0722 Marked scripting points with // SCRIPT: markers. 2014-03-24 18:17:49 +04:00
Pavel V. Talanov
618aea6218 Increase stub version before pushing into master 2014-03-24 17:51:55 +04:00
Pavel V. Talanov
5bc8cc1f9a Stub tests: test for parameters with fq name 2014-03-24 17:51:53 +04:00
Pavel V. Talanov
cbaa515a00 Minor: remove redundant toString override 2014-03-24 17:51:51 +04:00
Pavel V. Talanov
a1dbf221b3 Use instance methods instead of JetPsiUtil for getting fq names
Remove unnecessary usages of JetFile#getPackageDirective where only FqName is needed
Make JetFile#getPackageFqName not nullable to avoid confusion on call sites
Remove getPackageName usages
Move getFqName(JetNamedDeclaration) to a separate util class
2014-03-24 17:51:49 +04:00
Pavel V. Talanov
37538f9524 Delete JetStubResolveTest
This test does not seem meaningful anymore
Since DeclarationProvider based on stubs is used in IDE, it is covered by a vast number of tests(anything that uses lazy resolve)
2014-03-24 17:51:47 +04:00
Pavel V. Talanov
c4de1898ce Minor: remove unused method 2014-03-24 17:51:45 +04:00
Pavel V. Talanov
4a5d88c51d Refactor: extract duplicated logic to util class
Introduce PackageIndexUtil
2014-03-24 17:51:43 +04:00
Pavel V. Talanov
97b4c57f0e Minor: fix misleading method name 2014-03-24 17:51:41 +04:00
Pavel V. Talanov
ece6c8ebfe Stubs tests: treat NO_NAME_FOR_LAZY_RESOLVE specially 2014-03-24 17:51:40 +04:00
Pavel V. Talanov
246466bdc5 Implement stub based package declaration provider for lazy resolve
Implement StubPackageMemberDeclarationProvider
Introduce DeclarationProviderFactoryService to provide difference factories in CLI and Plugin
When indexing treat top level declarations without name specially so that they can be found in index
Implement PluginDeclarationProviderFactoryService which uses file based approach for non indexed files and stub based for others
2014-03-24 17:51:38 +04:00
Pavel V. Talanov
fd5aea7c14 Refactor: use generated approach for stubs test
Remove meaningless assertion
Add comment to NotStorePropertyFromDelegate test
2014-03-24 17:06:07 +04:00
Pavel V. Talanov
105949de53 Refactor: fix stubs and psi having redundant constructor parameters 2014-03-24 17:06:06 +04:00
Pavel V. Talanov
b2f2d43919 Stubs for JetClassBody 2014-03-24 17:06:05 +04:00
Pavel V. Talanov
c6484ab4c3 Use of getFqName instead of JetPsiUtils 2014-03-24 17:06:04 +04:00
Pavel V. Talanov
4ef86bdf9f Add getFqName() to JetNamedDeclaration interface
Use stubs to get fq name in stubbed implementations
2014-03-24 17:06:03 +04:00
Pavel V. Talanov
4c1c69a560 Prevent toString for PSI from mutating 2014-03-24 17:06:02 +04:00
Pavel V. Talanov
22b714cef8 Refactor: rename short name indices 2014-03-24 17:06:01 +04:00
Pavel V. Talanov
1859ce6124 Minor: fix misleading parameter name 2014-03-24 17:06:00 +04:00
Pavel V. Talanov
8d07bc60d0 Refactor: remove redundant getElementType overrides is PSI 2014-03-24 17:05:59 +04:00
Pavel V. Talanov
24364dd63b Get rid of JetNodeTypes#LOOP_PARAMETER 2014-03-24 17:05:58 +04:00
Pavel V. Talanov
8e264a1419 Test for formatting loop parameter with explicit type 2014-03-24 17:05:58 +04:00
Alexander Udalov
0b5e9527d1 Add a code conformance test against com.beust.jcommander.internal.* 2014-03-24 16:40:07 +04:00
Alexander Udalov
d704b37240 Minor, delete outdated suppressions, fix warnings 2014-03-24 16:40:07 +04:00
Alexander Udalov
a78509432e Don't build j2k on 'ant dist'
It was only used in kotlin-web-demo some time ago
2014-03-24 16:40:07 +04:00
Svetlana Isakova
8f1c7aa8f6 Refactoring: made 'resolveFunctionCall' return OverloadResolutionResults
not OverloadResolutionResultsImpl
2014-03-24 16:09:31 +04:00
Svetlana Isakova
9c21fb3b1f Minor: removed "? extends" 2014-03-24 16:09:31 +04:00
Svetlana Isakova
77880f667a Collect all resolved candidate calls if required 2014-03-24 16:09:31 +04:00
Svetlana Isakova
e6a71563ba Added collectAllCandidates flag to ResolutionContext 2014-03-24 16:09:31 +04:00
Svetlana Isakova
d2f70b772d refactoring: extracted method doResolveCallAndRecordDebugInfo 2014-03-24 16:09:31 +04:00
Nikolay Krasko
b05fb38dcd Fix ArrayIndexOutOfBoundsException in named parameters completion 2014-03-24 15:19:26 +04:00
Nikolay Krasko
de891ebc6e Use JB colors to avoid problems with different color schemes
- Fix KT-4725 Project wizard: bad font color
- Some warnings fixed

 #KT-4725 Fixed
2014-03-24 15:19:25 +04:00
Nikolay Krasko
287c1f4c71 Test for Complete class names in expression position (KT-2821, KT-3779)
#KT-2821 Fixed
 #KT-3779 Fixed
2014-03-24 15:19:24 +04:00
Natalia Ukhorskaya
8511c683c6 Fix SmartStepInto tests on ubuntu 2014-03-24 13:50:12 +04:00
Alexey Sedunov
46045a5538 Move top-level declarations to separate file: UI 2014-03-21 19:53:50 +04:00
Alexey Sedunov
5aa75ba3e1 Move top-level declarations to separate file: Refactoring processor and tests 2014-03-21 19:53:49 +04:00
Alexey Sedunov
6ddcd51af2 Rename test data directories 2014-03-21 19:53:47 +04:00
Pavel V. Talanov
6524adee0f KT-4735: Exception from type checker prevents copy/paste
#KT-4735 Fixed
2014-03-21 19:20:23 +04:00
Natalia Ukhorskaya
fdef0b03fe Fix compilation 2014-03-21 17:21:42 +04:00
Natalia Ukhorskaya
e8d2ba197e Debugger: implement Smart Step Into
#KT-4639 Fixed
2014-03-21 16:08:01 +04:00
Andrey Breslav
3bc35adf09 Respect versions in site generator 2014-03-20 20:12:57 +04:00
1479 changed files with 12710 additions and 3549 deletions

View File

@@ -3,6 +3,7 @@
<words>
<w>builtins</w>
<w>klass</w>
<w>proto</w>
<w>protoc</w>
<w>ubuntu</w>
</words>

View File

@@ -5,4 +5,8 @@
<item name='com.google.common.collect.SetMultimap java.util.Map&lt;K,java.util.Collection&lt;V&gt;&gt; asMap()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.google.common.collect.Sets com.google.common.collect.Sets.SetView&lt;E&gt; intersection(java.util.Set&lt;E&gt;, java.util.Set&lt;?&gt;)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,12 @@
<root>
<item
name='com.intellij.debugger.actions.JvmSmartStepIntoHandler java.util.List&lt;com.intellij.debugger.actions.SmartStepTarget&gt; findSmartStepTargets(com.intellij.debugger.SourcePosition)'>
<annotation name='kotlin.jvm.KotlinSignature'>
<val name="value" val="&quot;fun findSmartStepTargets(position: SourcePosition): List&lt;SmartStepTarget&gt;&quot;"/>
</annotation>
</item>
<item
name='com.intellij.debugger.actions.JvmSmartStepIntoHandler java.util.List&lt;com.intellij.debugger.actions.SmartStepTarget&gt; findSmartStepTargets(com.intellij.debugger.SourcePosition) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,6 @@
<root>
<item
name='com.intellij.debugger.ExecutionWithDebuggerToolsTestCase void onBreakpoint(com.intellij.debugger.engine.SuspendContextRunnable) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,16 @@
<root>
<item
name='com.intellij.debugger.engine.MethodFilter boolean locationMatches(com.intellij.debugger.engine.DebugProcessImpl, com.sun.jdi.Location) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.debugger.engine.MethodFilter boolean locationMatches(com.intellij.debugger.engine.DebugProcessImpl, com.sun.jdi.Location) 1'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='com.intellij.debugger.engine.SuspendContextImpl'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='com.intellij.debugger.engine.SuspendContextRunnable void run(com.intellij.debugger.engine.SuspendContextImpl) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,5 @@
<root>
<item name='com.intellij.debugger.impl.OutputChecker'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,5 @@
<root>
<item name='com.intellij.execution.ExecutionTestCase java.lang.String getTestAppPath()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -1,4 +1,11 @@
<root>
<item name='com.intellij.psi.stubs.AbstractStubIndex java.util.Collection&lt;Key&gt; getAllKeys(com.intellij.openapi.project.Project)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.psi.stubs.AbstractStubIndex java.util.Collection&lt;Psi&gt; get(Key, com.intellij.openapi.project.Project, com.intellij.psi.search.GlobalSearchScope)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.psi.stubs.AbstractStubIndex java.util.Collection&lt;Psi&gt; get(Key, com.intellij.openapi.project.Project, com.intellij.psi.search.GlobalSearchScope) 2'>
<annotation name='org.jetbrains.annotations.NotNull'/>

View File

@@ -14,4 +14,8 @@
name='com.intellij.refactoring.rename.RenamePsiElementProcessor void prepareRenaming(com.intellij.psi.PsiElement, java.lang.String, java.util.Map&lt;com.intellij.psi.PsiElement,java.lang.String&gt;, com.intellij.psi.search.SearchScope) 3'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.refactoring.rename.RenamePsiElementProcessor void renameElement(com.intellij.psi.PsiElement, java.lang.String, com.intellij.usageView.UsageInfo[], com.intellij.refactoring.listeners.RefactoringElementListener) 2'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,10 @@
<root>
<item
name='com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler boolean isAvailable(com.intellij.psi.PsiElement, com.intellij.openapi.editor.Editor, com.intellij.psi.PsiFile) 1'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler boolean isAvailable(com.intellij.psi.PsiElement, com.intellij.openapi.editor.Editor, com.intellij.psi.PsiFile) 2'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,6 @@
<root>
<item
name='com.intellij.usages.impl.FileStructureGroupRuleProvider com.intellij.usages.rules.UsageGroupingRule getUsageGroupingRule(com.intellij.openapi.project.Project) 0'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -8,4 +8,10 @@
<item name='com.intellij.util.QueryFactory com.intellij.util.Query&lt;Result&gt; createUniqueResultsQuery(Parameters)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='com.intellij.util.Range T getFrom()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='com.intellij.util.Range T getTo()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -0,0 +1,5 @@
<root>
<item name='com.sun.jdi.Location com.sun.jdi.Method method()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
</root>

View File

@@ -1,10 +1,29 @@
<root>
<item name='org.jetbrains.jps.builders.CompileScopeTestBuilder org.jetbrains.jps.builders.CompileScopeTestBuilder all()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.CompileScopeTestBuilder org.jetbrains.jps.builders.CompileScopeTestBuilder allModules()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.CompileScopeTestBuilder org.jetbrains.jps.builders.CompileScopeTestBuilder make()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.CompileScopeTestBuilder org.jetbrains.jps.builders.CompileScopeTestBuilder rebuild()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.JpsBuildTestCase java.lang.String createFile(java.lang.String, java.lang.String)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.JpsBuildTestCase java.lang.String getAbsolutePath(java.lang.String)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item name='org.jetbrains.jps.builders.JpsBuildTestCase org.jetbrains.jps.builders.BuildResult makeAll()'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='org.jetbrains.jps.builders.JpsBuildTestCase org.jetbrains.jps.cmdline.ProjectDescriptor createProjectDescriptor(org.jetbrains.jps.builders.logging.BuildLoggingManager)'>
<annotation name='org.jetbrains.annotations.NotNull'/>
</item>
<item
name='org.jetbrains.jps.builders.JpsBuildTestCase org.jetbrains.jps.model.module.JpsModule addModule(java.lang.String, java.lang.String...)'>
<annotation name='org.jetbrains.annotations.NotNull'/>

View File

@@ -611,38 +611,13 @@
</jar>
</target>
<target name="j2kConverter">
<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${dependencies.dir}/ant-contrib.jar"/>
<cleandir dir="${output}/classes/j2k"/>
<kotlinc output="${output}/classes/j2k">
<src path="${basedir}/j2k/src"/>
<classpath path="${kotlin-home}/lib/kotlin-compiler.jar"/>
</kotlinc>
<jar jarfile="${kotlin-home}/lib/tools/j2k.jar">
<fileset dir="${output}/classes/j2k" includes="org/jetbrains/jet/j2k/**"/>
<manifest>
<attribute name="Built-By" value="${manifest.impl.vendor}"/>
<attribute name="Implementation-Vendor" value="${manifest.impl.vendor}"/>
<attribute name="Implementation-Title" value="${manifest.impl.title.java2kotlin.converter}"/>
<attribute name="Implementation-Version" value="${build.number}"/>
<attribute name="Main-Class" value="org.jetbrains.jet.j2k.JavaToKotlinTranslator"/>
</manifest>
</jar>
</target>
<!-- builds redistributables from sources -->
<target name="dist"
depends="clean,init,prepareDist,preloader,builtins,compiler,compilerSources,antTools,jdkAnnotations,androidSdkAnnotations,runtime,runtime_sources,jslib,j2kConverter"/>
depends="clean,init,prepareDist,preloader,builtins,compiler,compilerSources,antTools,jdkAnnotations,androidSdkAnnotations,runtime,runtime_sources,jslib"/>
<!-- builds everything, but classes are reused from project out dir, doesn't run proguard and javadoc -->
<target name="dist_quick"
depends="clean,init,prepareDist,preloader,builtins,compiler_quick,antTools,jdkAnnotations,androidSdkAnnotations,runtime,runtime_sources,jslib,j2kConverter"/>
depends="clean,init,prepareDist,preloader,builtins,compiler_quick,antTools,jdkAnnotations,androidSdkAnnotations,runtime,runtime_sources,jslib"/>
<!-- builds compiler jar from project out dir -->
<target name="dist_quick_compiler_only"

View File

@@ -36,7 +36,7 @@ public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl
@NotNull DeclarationDescriptor containingDeclaration,
int index
) {
super(containingDeclaration, Annotations.EMPTY,
super(containingDeclaration, null, Annotations.EMPTY,
Name.identifier((descriptor instanceof ConstructorDescriptor ? "$init" : descriptor.getName()) + "$b$" + index),
Kind.DECLARATION);

View File

@@ -43,7 +43,7 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl {
@NotNull DeclarationDescriptor containingDeclaration,
int index
) {
super(containingDeclaration, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL,
super(containingDeclaration, null, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL,
original.isVar(), Name.identifier(original.getName() + "$b$" + index),
Kind.DECLARATION);
@@ -55,16 +55,14 @@ public class AccessorForPropertyDescriptor extends PropertyDescriptorImpl {
public Getter(AccessorForPropertyDescriptor property) {
super(property, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL,
false,
false, Kind.DECLARATION);
false, Kind.DECLARATION, null);
initialize(property.getType());
}
}
public static class Setter extends PropertySetterDescriptorImpl {
public Setter(AccessorForPropertyDescriptor property) {
super(property, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL,
false,
false, Kind.DECLARATION);
super(property, Annotations.EMPTY, Modality.FINAL, Visibilities.LOCAL, false, false, Kind.DECLARATION, null);
initializeDefault();
}
}

View File

@@ -108,17 +108,17 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
protected void generateDeclaration(PropertyCodegen propertyCodegen, JetDeclaration declaration) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
genFunctionOrProperty(context, (JetTypeParameterListOwner) declaration, v);
genFunctionOrProperty((JetTypeParameterListOwner) declaration, v);
}
else if (declaration instanceof JetClassOrObject) {
if (declaration instanceof JetEnumEntry && !enumEntryNeedSubclass(state.getBindingContext(), (JetEnumEntry) declaration)) {
return;
}
genClassOrObject(context, (JetClassOrObject) declaration);
genClassOrObject((JetClassOrObject) declaration);
}
else if (declaration instanceof JetClassObject) {
genClassOrObject(context, ((JetClassObject) declaration).getObjectDeclaration());
genClassOrObject(((JetClassObject) declaration).getObjectDeclaration());
}
}
@@ -174,9 +174,9 @@ public abstract class ClassBodyCodegen extends MemberCodegen {
MethodVisitor method = createOrGetClInitMethod();
method.visitCode();
SimpleFunctionDescriptorImpl clInit =
new SimpleFunctionDescriptorImpl(descriptor, Annotations.EMPTY,
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
SimpleFunctionDescriptorImpl.create(descriptor, Annotations.EMPTY,
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE);

View File

@@ -159,7 +159,7 @@ public class ClosureCodegen extends ParentCodegenAwareImpl {
v.anew(asmType);
v.dup();
codegen.pushClosureOnStack(closure, false, codegen.defaulCallGenerator);
codegen.pushClosureOnStack(closure, false, codegen.defaultCallGenerator);
v.invokespecial(asmType.getInternalName(), "<init>", constructor.getDescriptor());
}
return StackValue.onStack(asmType);

View File

@@ -30,6 +30,7 @@ import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.context.PackageContext;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
@@ -73,12 +74,13 @@ public class CodegenUtil {
public static SimpleFunctionDescriptor createInvoke(FunctionDescriptor fd) {
int arity = fd.getValueParameters().size();
SimpleFunctionDescriptorImpl invokeDescriptor = new SimpleFunctionDescriptorImpl(
SimpleFunctionDescriptorImpl invokeDescriptor = SimpleFunctionDescriptorImpl.create(
fd.getExpectedThisObject() != null
? KotlinBuiltIns.getInstance().getExtensionFunction(arity) : KotlinBuiltIns.getInstance().getFunction(arity),
Annotations.EMPTY,
Name.identifier("invoke"),
CallableMemberDescriptor.Kind.DECLARATION);
CallableMemberDescriptor.Kind.DECLARATION
);
invokeDescriptor.initialize(DescriptorUtils.getReceiverParameterType(fd.getReceiverParameter()),
fd.getExpectedThisObject(),
@@ -155,10 +157,30 @@ public class CodegenUtil {
return !isFakeOverride && !isDelegate &&
(((context.hasThisDescriptor() && containingDeclaration == context.getThisDescriptor()) ||
(context.getParentContext() instanceof PackageContext && context.getParentContext().getContextDescriptor() == containingDeclaration))
(context.getParentContext() instanceof PackageContext
&& isSamePackageInSameModule(context.getParentContext().getContextDescriptor(), containingDeclaration)))
&& context.getContextKind() != OwnerKind.TRAIT_IMPL);
}
private static boolean isSamePackageInSameModule(
@NotNull DeclarationDescriptor owner1,
@NotNull DeclarationDescriptor owner2
) {
if (owner1 instanceof PackageFragmentDescriptor && owner2 instanceof PackageFragmentDescriptor) {
PackageFragmentDescriptor fragment1 = (PackageFragmentDescriptor) owner1;
PackageFragmentDescriptor fragment2 = (PackageFragmentDescriptor) owner2;
if (!IncrementalCompilation.ENABLED) {
return fragment1 == fragment2;
}
// backing field should be used directly within same module of same package
// TODO calls from other modules/libraries should use facade: KT-4590
return fragment1.getFqName().equals(fragment2.getFqName()) && DescriptorUtils.areInSameModule(fragment1, fragment2);
}
return false;
}
public static boolean isCallInsideSameModuleAsDeclared(CallableMemberDescriptor declarationDescriptor, CodegenContext context) {
if (context == CodegenContext.STATIC) {
return true;

View File

@@ -109,7 +109,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
@NotNull
private final TailRecursionCodegen tailRecursionCodegen;
public final CallGenerator defaulCallGenerator;
public final CallGenerator defaultCallGenerator;
public CalculatedClosure generateObjectLiteral(GenerationState state, JetObjectLiteralExpression literal) {
JetObjectDeclaration objectDeclaration = literal.getObjectDeclaration();
@@ -180,7 +180,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
this.context = context;
this.statementVisitor = new CodegenStatementVisitor(this);
this.tailRecursionCodegen = new TailRecursionCodegen(context, this, this.v, state);
this.defaulCallGenerator = new CallGenerator.DefaultCallGenerator(this);
this.defaultCallGenerator = new CallGenerator.DefaultCallGenerator(this);
}
public GenerationState getState() {
@@ -1342,7 +1342,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
v.anew(type);
v.dup();
pushClosureOnStack(closure, false, defaulCallGenerator);
pushClosureOnStack(closure, false, defaultCallGenerator);
JetDelegatorToSuperCall superCall = closure.getSuperCall();
if (superCall != null) {
@@ -1356,7 +1356,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type[] argumentTypes = superCallable.getAsmMethod().getArgumentTypes();
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, superCall.getCalleeExpression());
assert resolvedCall != null;
pushMethodArguments(resolvedCall, Arrays.asList(argumentTypes), defaulCallGenerator);
pushMethodArgumentsWithoutCallReceiver(resolvedCall, Arrays.asList(argumentTypes), false, defaultCallGenerator);
}
v.invokespecial(type.getInternalName(), "<init>", constructor.getAsmMethod().getDescriptor());
@@ -1657,11 +1657,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
}
int index = lookupLocalIndex(descriptor);
if (index >= 0) {
return stackValueForLocal(descriptor, index);
}
if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
@@ -1708,26 +1703,9 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return StackValue.onStack(OBJECT_TYPE);
}
StackValue value = context.lookupInContext(descriptor, StackValue.local(0, OBJECT_TYPE), state, false);
if (value != null) {
if (context.isSpecialStackValue(value)) {
return value;
}
if (value instanceof StackValue.Composed) {
StackValue.Composed composed = (StackValue.Composed) value;
composed.prefix.put(OBJECT_TYPE, v);
value = composed.suffix;
}
if (value instanceof StackValue.FieldForSharedVar) {
StackValue.FieldForSharedVar fieldForSharedVar = (StackValue.FieldForSharedVar) value;
Type sharedType = StackValue.sharedTypeForType(value.type);
v.visitFieldInsn(GETFIELD, fieldForSharedVar.owner.getInternalName(), fieldForSharedVar.name,
sharedType.getDescriptor());
}
return value;
StackValue localOrCaptured = findLocalOrCapturedValue(descriptor);
if (localOrCaptured != null) {
return localOrCaptured;
}
if (descriptor instanceof ValueParameterDescriptor && descriptor.getContainingDeclaration() instanceof ScriptDescriptor) {
@@ -1744,6 +1722,37 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
throw new UnsupportedOperationException("don't know how to generate reference " + descriptor);
}
@Nullable
public StackValue findLocalOrCapturedValue(@NotNull DeclarationDescriptor descriptor) {
int index = lookupLocalIndex(descriptor);
if (index >= 0) {
return stackValueForLocal(descriptor, index);
}
StackValue value = context.lookupInContext(descriptor, StackValue.local(0, OBJECT_TYPE), state, false);
if (value == null) return null;
if (context.isSpecialStackValue(value)) {
return value;
}
if (value instanceof StackValue.Composed) {
StackValue.Composed composed = (StackValue.Composed) value;
composed.prefix.put(OBJECT_TYPE, v);
value = composed.suffix;
}
if (value instanceof StackValue.FieldForSharedVar) {
StackValue.FieldForSharedVar fieldForSharedVar = (StackValue.FieldForSharedVar) value;
Type sharedType = StackValue.sharedTypeForType(value.type);
v.visitFieldInsn(GETFIELD, fieldForSharedVar.owner.getInternalName(), fieldForSharedVar.name,
sharedType.getDescriptor());
}
return value;
}
private StackValue stackValueForLocal(DeclarationDescriptor descriptor, int index) {
if (descriptor instanceof VariableDescriptor) {
Type sharedVarType = typeMapper.getSharedVarType(descriptor);
@@ -1893,6 +1902,20 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
JetExpression callee = expression.getCalleeExpression();
assert callee != null;
DottedCallInfo dottedCallInfo = bindingContext.get(BindingContext.DOTTED_CALL_INFO, expression);
if (dottedCallInfo != null) {
ResolvedCall<? extends FunctionDescriptor> resolvedDotCall = dottedCallInfo.getResolvedCall();
FunctionDescriptor dotFunDescriptor = accessibleFunctionDescriptor(resolvedDotCall.getResultingDescriptor());
JetType dotType = dotFunDescriptor.getReturnType();
assert dotType != null : "can't resolve type of dot operation: " + dotFunDescriptor;
StackValue newReceiver = invokeFunction(dottedCallInfo.getCall(), receiver, resolvedDotCall);
if (!KotlinBuiltIns.getInstance().isUnit(dotType)) {
receiver = newReceiver;
}
}
ResolvedCall<?> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, callee);
if (resolvedCall == null) {
throw new CompilationException("Cannot resolve: " + callee.getText(), null, expression);
@@ -2010,25 +2033,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Callable callable = resolveToCallable(accessibleFunctionDescriptor(fd), superCall);
if (callable instanceof CallableMethod) {
CallableMethod callableMethod = (CallableMethod) callable;
Type calleeType = callableMethod.getGenerateCalleeType();
if (calleeType != null) {
assert !callableMethod.isNeedsThis() : "Method should have a receiver: " + resolvedCall.getResultingDescriptor();
gen(call.getCalleeExpression(), calleeType);
}
}
return invokeFunctionWithCalleeOnStack(call, receiver, resolvedCall, callable);
}
@NotNull
private StackValue invokeFunctionWithCalleeOnStack(
@NotNull Call call,
@NotNull StackValue receiver,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull Callable callable
) {
if (callable instanceof CallableMethod) {
CallableMethod callableMethod = (CallableMethod) callable;
invokeMethodWithArguments(call, callableMethod, resolvedCall, receiver);
@@ -2105,7 +2109,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
descriptor instanceof SimpleFunctionDescriptor &&
((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline();
CallGenerator callGenerator = !isInline ? defaulCallGenerator :
CallGenerator callGenerator = !isInline ? defaultCallGenerator :
new InlineCodegen(this, state, (SimpleFunctionDescriptor) DescriptorUtils.unwrapFakeOverride(
(CallableMemberDescriptor) descriptor.getOriginal()), call);
@@ -2113,33 +2117,17 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall();
}
if (!(descriptor instanceof ConstructorDescriptor)) { // otherwise already
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
}
assert callGenerator == defaulCallGenerator || !hasDefaultArguments(resolvedCall) && !tailRecursionCodegen.isTailRecursion(resolvedCall) :
assert callGenerator == defaultCallGenerator || !hasDefaultArguments(resolvedCall) && !tailRecursionCodegen.isTailRecursion(resolvedCall) :
"Method with defaults or tail recursive couldn't be inlined " + descriptor;
pushArgumentsAndInvoke(resolvedCall, callableMethod, callGenerator);
}
private void pushArgumentsAndInvoke(@NotNull ResolvedCall<?> resolvedCall, @NotNull CallableMethod callable, @NotNull CallGenerator callGenerator) {
callGenerator.putHiddenParams();
int mask = pushMethodArguments(resolvedCall, callable.getValueParameterTypes(), callGenerator);
int mask = pushMethodArgumentsWithCallReceiver(receiver, resolvedCall, callableMethod, false, callGenerator);
if (tailRecursionCodegen.isTailRecursion(resolvedCall)) {
tailRecursionCodegen.generateTailRecursion(resolvedCall);
return;
}
callGenerator.genCall(callable, resolvedCall, mask, this);
}
private void genThisAndReceiverFromResolvedCall(StackValue receiver, ResolvedCall<?> resolvedCall, CallableMethod callableMethod) {
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
callGenerator.genCall(callableMethod, resolvedCall, mask, this);
}
public void generateFromResolvedCall(@NotNull ReceiverValue descriptor, @NotNull Type type) {
@@ -2163,6 +2151,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
}
else if (descriptor instanceof ScriptReceiver) {
// SCRIPT: generate script
generateScript((ScriptReceiver) descriptor);
}
else if (descriptor instanceof ExtensionReceiver) {
@@ -2196,6 +2185,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return context.lookupInContext(provided, StackValue.local(0, OBJECT_TYPE), state, false);
}
// SCRIPT: generate script, move to ScriptingUtil
private void generateScript(@NotNull ScriptReceiver receiver) {
CodegenContext cur = context;
StackValue result = StackValue.local(0, OBJECT_TYPE);
@@ -2292,11 +2282,31 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
return false;
}
public int pushMethodArguments(@NotNull ResolvedCall<?> resolvedCall, List<Type> valueParameterTypes, @NotNull CallGenerator callGenerator) {
return pushMethodArguments(resolvedCall, valueParameterTypes, false, callGenerator);
public int pushMethodArgumentsWithCallReceiver(
@Nullable StackValue receiver,
@NotNull ResolvedCall<?> resolvedCall,
@NotNull CallableMethod callableMethod,
boolean skipLast,
@NotNull CallGenerator callGenerator
) {
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
if (!(descriptor instanceof ConstructorDescriptor)) { // otherwise already
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod);
receiver.put(receiver.type, v);
}
callGenerator.putHiddenParams();
return pushMethodArgumentsWithoutCallReceiver(resolvedCall, callableMethod.getValueParameterTypes(), skipLast, callGenerator);
}
private int pushMethodArguments(@NotNull ResolvedCall<?> resolvedCall, List<Type> valueParameterTypes, boolean skipLast, @NotNull CallGenerator callGenerator) {
public int pushMethodArgumentsWithoutCallReceiver(
@NotNull ResolvedCall<?> resolvedCall,
List<Type> valueParameterTypes,
boolean skipLast,
@NotNull CallGenerator callGenerator
) {
List<ResolvedValueArgument> valueArguments = resolvedCall.getValueArgumentsByIndex();
CallableDescriptor fd = resolvedCall.getResultingDescriptor();
if (valueArguments == null) {
@@ -2524,12 +2534,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
}
else {
Call call = CallMaker.makeCall(fakeExpression, NO_RECEIVER, null, fakeExpression, fakeArguments);
Callable callable = codegen.resolveToCallable(codegen.accessibleFunctionDescriptor(referencedFunction), false);
StackValue receiver = generateCallee(codegen, callable);
if (extensionReceiver.exists()) {
receiver = StackValue.composed(receiver, receiverParameterStackValue(signature));
}
result = codegen.invokeFunctionWithCalleeOnStack(call, receiver, fakeResolvedCall, callable);
result = codegen.invokeFunction(call, StackValue.none(), fakeResolvedCall);
}
InstructionAdapter v = codegen.v;
@@ -2537,33 +2542,6 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
v.areturn(returnType);
}
@NotNull
private StackValue generateCallee(@NotNull ExpressionCodegen codegen, @NotNull Callable callable) {
if (!(callable instanceof CallableMethod) || ((CallableMethod) callable).getGenerateCalleeType() == null) {
return StackValue.none();
}
// If referenced method is a CallableMethod with generateCalleeType != null, this means it's some kind of a closure
// (e.g. a local named function) and a non-trivial callee should be generated before calling invoke()
BindingContext bindingContext = codegen.bindingContext;
ClassDescriptor closureClassOfReferenced = bindingContext.get(CLASS_FOR_FUNCTION, referencedFunction);
MutableClosure closureOfReferenced = bindingContext.get(CLOSURE, closureClassOfReferenced);
assert closureOfReferenced != null :
"Function mapped to CallableMethod with generateCalleeType != null must be a closure: " + referencedFunction;
if (isConst(closureOfReferenced)) {
// This is an optimization: we can obtain an instance of a const closure simply by GETSTATIC ...$instance
// (instead of passing this instance to the constructor and storing as a field)
Type asmType = asmTypeForAnonymousClass(bindingContext, referencedFunction);
codegen.v.getstatic(asmType.getInternalName(), JvmAbi.INSTANCE_FIELD, asmType.getDescriptor());
return StackValue.onStack(asmType);
}
else {
Type asmCallRefType = asmTypeForAnonymousClass(bindingContext, callableDescriptor);
return codegen.context.lookupInContext(referencedFunction, StackValue.local(0, asmCallRefType), state, false);
}
}
@NotNull
private JetCallExpression constructFakeFunctionCall() {
StringBuilder fakeFunctionCall = new StringBuilder("callableReferenceFakeCall(");
@@ -3222,6 +3200,7 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type varType = asmType(variableDescriptor.getType());
// SCRIPT: Variable at the top of the script is generated as field
if (JetPsiUtil.isScriptDeclaration(variableDeclaration)) {
generateInitializer.fun(variableDescriptor);
JetScript scriptPsi = JetPsiUtil.getScript(variableDeclaration);
@@ -3267,15 +3246,11 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) resolvedCall.getResultingDescriptor();
MutableClosure closure = bindingContext.get(CLOSURE, constructorDescriptor.getContainingDeclaration());
ClassDescriptor descriptor = getExpectedThisObjectForConstructorCall(constructorDescriptor, closure);
if (receiver.type.getSort() != Type.VOID && descriptor == null) {
v.pop();
}
//Resolved call to local class constructor doesn't have resolvedCall.getThisObject() and resolvedCall.getReceiverArgument()
//so we need generate closure on stack
//See StackValue.receiver for more info
pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists(), defaulCallGenerator);
pushClosureOnStack(closure, resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists(),
defaultCallGenerator);
ConstructorDescriptor originalOfSamAdapter = (ConstructorDescriptor) SamCodegenUtil.getOriginalIfSamAdapter(constructorDescriptor);
CallableMethod method = typeMapper.mapToCallableMethod(originalOfSamAdapter == null ? constructorDescriptor : originalOfSamAdapter);
@@ -3390,9 +3365,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
Type[] argumentTypes = asmMethod.getArgumentTypes();
if (callable instanceof CallableMethod) {
genThisAndReceiverFromResolvedCall(receiver, resolvedCall, (CallableMethod) callable);
boolean skipLast = !isGetter;
pushMethodArguments(resolvedCall, ((CallableMethod) callable).getValueParameterTypes(), skipLast, defaulCallGenerator);
pushMethodArgumentsWithCallReceiver(receiver, resolvedCall, (CallableMethod) callable, skipLast, defaultCallGenerator);
}
else {
gen(array, arrayType); // intrinsic method

View File

@@ -157,8 +157,8 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
for (int i = 0; i < kotlinParameterTypes.size(); i++) {
JvmMethodParameterKind kind = kotlinParameterTypes.get(i).getKind();
if (kind == JvmMethodParameterKind.ENUM_NAME || kind == JvmMethodParameterKind.ENUM_ORDINAL) {
markEnumConstructorParameterAsSynthetic(mv, i);
if (kind.isSkippedInGenericSignature()) {
markEnumOrInnerConstructorParameterAsSynthetic(mv, i);
continue;
}
@@ -181,8 +181,8 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
for (int i = 0; i < kotlinParameterTypes.size(); i++) {
JvmMethodParameterKind kind = kotlinParameterTypes.get(i).getKind();
if (kind == JvmMethodParameterKind.ENUM_NAME || kind == JvmMethodParameterKind.ENUM_ORDINAL) {
markEnumConstructorParameterAsSynthetic(mv, i);
if (kind.isSkippedInGenericSignature()) {
markEnumOrInnerConstructorParameterAsSynthetic(mv, i);
continue;
}
@@ -223,7 +223,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
}
}
private void markEnumConstructorParameterAsSynthetic(MethodVisitor mv, int i) {
private void markEnumOrInnerConstructorParameterAsSynthetic(MethodVisitor mv, int i) {
// IDEA's ClsPsi builder fails to annotate synthetic parameters
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return;
@@ -367,7 +367,7 @@ public class FunctionCodegen extends ParentCodegenAwareImpl {
}
private static boolean needIndexForVar(JvmMethodParameterKind kind) {
return kind == JvmMethodParameterKind.SHARED_VAR || kind == JvmMethodParameterKind.SUPER_CALL_PARAM;
return kind == JvmMethodParameterKind.CAPTURED_LOCAL_VARIABLE || kind == JvmMethodParameterKind.SUPER_OF_ANONYMOUS_CALL_PARAM;
}
public static void endVisit(MethodVisitor mv, @Nullable String description, @Nullable PsiElement method) {

View File

@@ -21,6 +21,7 @@ import org.jetbrains.jet.OutputFile;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
public class GeneratedClassLoader extends URLClassLoader {
private ClassFileFactory state;
@@ -47,4 +48,9 @@ public class GeneratedClassLoader extends URLClassLoader {
public void dispose() {
state = null;
}
@NotNull
public List<OutputFile> getAllGeneratedFiles() {
return state.asList();
}
}

View File

@@ -1024,9 +1024,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
InstructionAdapter iv = codegen.v;
boolean forceField = AsmUtil.isPropertyWithBackingFieldInOuterClass(original) && !isClassObject(bridge.getContainingDeclaration());
StackValue property = codegen.intermediateValueForProperty(original, forceField, null, MethodKind.SYNTHETIC_ACCESSOR);
if (!forceField) {
iv.load(0, OBJECT_TYPE);
Type[] argTypes = signature.getAsmMethod().getArgumentTypes();
for (int i = 0, reg = 0; i < argTypes.length; i++) {
Type argType = argTypes[i];
iv.load(reg, argType);
//noinspection AssignmentToForLoopParameter
reg += argType.getSize();
}
property.put(property.type, iv);
iv.areturn(signature.getReturnType());
}
@@ -1577,7 +1583,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private static int findFirstSuperArgument(@NotNull CallableMethod method) {
int i = 0;
for (JvmMethodParameterSignature type : method.getValueParameters()) {
if (type.getKind() == JvmMethodParameterKind.SUPER_CALL_PARAM) {
if (type.getKind() == JvmMethodParameterKind.SUPER_OF_ANONYMOUS_CALL_PARAM) {
return i + 1; // because of this
}
i += type.getAsmType().getSize();

View File

@@ -22,7 +22,10 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.commons.Method;
import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.kotlin.SignatureDeserializer;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -64,10 +67,20 @@ public class JavaSerializerExtension extends SerializerExtension {
@NotNull ProtoBuf.Callable.Builder proto,
@NotNull NameTable nameTable
) {
SignatureSerializer signatureSerializer = new SignatureSerializer(nameTable);
if (callable instanceof FunctionDescriptor) {
Method method = bindings.get(METHOD_FOR_FUNCTION, (FunctionDescriptor) callable);
if (method != null) {
proto.setExtension(JavaProtoBuf.methodSignature, new SignatureSerializer(nameTable).methodSignature(method));
JavaProtoBuf.JavaMethodSignature signature;
if (callable instanceof DeserializedSimpleFunctionDescriptor) {
DeserializedSimpleFunctionDescriptor deserialized = (DeserializedSimpleFunctionDescriptor) callable;
signature = signatureSerializer.copyMethodSignature(
deserialized.getProto().getExtension(JavaProtoBuf.methodSignature), deserialized.getNameResolver());
}
else {
Method method = bindings.get(METHOD_FOR_FUNCTION, (FunctionDescriptor) callable);
signature = method != null ? signatureSerializer.methodSignature(method) : null;
}
if (signature != null) {
proto.setExtension(JavaProtoBuf.methodSignature, signature);
}
}
else if (callable instanceof PropertyDescriptor) {
@@ -96,8 +109,18 @@ public class JavaSerializerExtension extends SerializerExtension {
syntheticMethod = bindings.get(SYNTHETIC_METHOD_FOR_PROPERTY, property);
}
JavaProtoBuf.JavaPropertySignature signature = new SignatureSerializer(nameTable)
.propertySignature(fieldType, fieldName, isStaticInOuter, syntheticMethod, getterMethod, setterMethod);
JavaProtoBuf.JavaPropertySignature signature;
if (callable instanceof DeserializedPropertyDescriptor) {
DeserializedPropertyDescriptor deserializedCallable = (DeserializedPropertyDescriptor) callable;
signature = signatureSerializer.copyPropertySignature(
deserializedCallable.getProto().getExtension(JavaProtoBuf.propertySignature),
deserializedCallable.getNameResolver()
);
}
else {
signature = signatureSerializer
.propertySignature(fieldType, fieldName, isStaticInOuter, syntheticMethod, getterMethod, setterMethod);
}
proto.setExtension(JavaProtoBuf.propertySignature, signature);
}
}
@@ -120,6 +143,15 @@ public class JavaSerializerExtension extends SerializerExtension {
this.nameTable = nameTable;
}
@NotNull
public JavaProtoBuf.JavaMethodSignature copyMethodSignature(
@NotNull JavaProtoBuf.JavaMethodSignature signature,
@NotNull NameResolver nameResolver
) {
String method = new SignatureDeserializer(nameResolver).methodSignatureString(signature);
return methodSignature(getAsmMethod(method));
}
@NotNull
public JavaProtoBuf.JavaMethodSignature methodSignature(@NotNull Method method) {
JavaProtoBuf.JavaMethodSignature.Builder signature = JavaProtoBuf.JavaMethodSignature.newBuilder();
@@ -135,6 +167,37 @@ public class JavaSerializerExtension extends SerializerExtension {
return signature.build();
}
@NotNull
public JavaProtoBuf.JavaPropertySignature copyPropertySignature(
@NotNull JavaProtoBuf.JavaPropertySignature signature,
@NotNull NameResolver nameResolver
) {
Type fieldType;
String fieldName;
boolean isStaticInOuter;
SignatureDeserializer signatureDeserializer = new SignatureDeserializer(nameResolver);
if (signature.hasField()) {
JavaProtoBuf.JavaFieldSignature field = signature.getField();
fieldType = Type.getType(signatureDeserializer.typeDescriptor(field.getType()));
fieldName = nameResolver.getName(field.getName()).asString();
isStaticInOuter = field.getIsStaticInOuter();
}
else {
fieldType = null;
fieldName = null;
isStaticInOuter = false;
}
Method syntheticMethod = signature.hasSyntheticMethod()
? getAsmMethod(signatureDeserializer.methodSignatureString(signature.getSyntheticMethod()))
: null;
Method getter = signature.hasGetter() ? getAsmMethod(signatureDeserializer.methodSignatureString(signature.getGetter())) : null;
Method setter = signature.hasSetter() ? getAsmMethod(signatureDeserializer.methodSignatureString(signature.getSetter())) : null;
return propertySignature(fieldType, fieldName, isStaticInOuter, syntheticMethod, getter, setter);
}
@NotNull
public JavaProtoBuf.JavaPropertySignature propertySignature(
@Nullable Type fieldType,
@@ -206,4 +269,10 @@ public class JavaSerializerExtension extends SerializerExtension {
return FqName.fromSegments(Arrays.asList(internalName.split("/")));
}
}
@NotNull
private static Method getAsmMethod(@NotNull String nameAndDesc) {
int indexOf = nameAndDesc.indexOf('(');
return new Method(nameAndDesc.substring(0, indexOf), nameAndDesc.substring(indexOf));
}
}

View File

@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.JetScript;
import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -38,10 +37,12 @@ public class KotlinCodegenFacade {
) {
for (JetFile file : state.getFiles()) {
if (file.isScript()) {
String name = ScriptNameUtil.classNameForScript(file);
// SCRIPT: register class name for scripting from this file, move outside of this function
FqName name = ScriptNameUtil.classNameForScript(file);
JetScript script = file.getScript();
assert script != null;
registerClassNameForScript(state.getBindingTrace(), script, Type.getObjectType(name));
Type type = AsmUtil.asmTypeByFqNameWithoutInnerClasses(name);
registerClassNameForScript(state.getBindingTrace(), script, type);
}
}
@@ -50,7 +51,7 @@ public class KotlinCodegenFacade {
MultiMap<FqName, JetFile> packageFqNameToFiles = new MultiMap<FqName, JetFile>();
for (JetFile file : state.getFiles()) {
if (file == null) throw new IllegalArgumentException("A null file given for compilation");
packageFqNameToFiles.putValue(JetPsiUtil.getFQName(file), file);
packageFqNameToFiles.putValue(file.getPackageFqName(), file);
}
for (Map.Entry<FqName, Collection<JetFile>> entry : packageFqNameToFiles.entrySet()) {

View File

@@ -52,7 +52,6 @@ public class MemberCodegen extends ParentCodegenAwareImpl {
}
public void genFunctionOrProperty(
@NotNull FieldOwnerContext context,
@NotNull JetTypeParameterListOwner functionOrProperty,
@NotNull ClassBuilder classBuilder
) {
@@ -127,8 +126,8 @@ public class MemberCodegen extends ParentCodegenAwareImpl {
}
}
public void genClassOrObject(CodegenContext parentContext, JetClassOrObject aClass) {
genClassOrObject(parentContext, aClass, state, this);
public void genClassOrObject(JetClassOrObject aClass) {
genClassOrObject(context, aClass, state, this);
}
@NotNull

View File

@@ -16,7 +16,8 @@
package org.jetbrains.jet.codegen;
import com.google.common.collect.Sets;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.util.io.FileUtil;
@@ -24,26 +25,36 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtil;
import com.intellij.util.PathUtil;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.FieldOwnerContext;
import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.context.PackageContext;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.GenerationStateAware;
import org.jetbrains.jet.descriptors.serialization.BitEncoding;
import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer;
import org.jetbrains.jet.descriptors.serialization.PackageData;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.MemberComparator;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragmentScope;
import org.jetbrains.jet.lang.resolve.kotlin.BaseDescriptorDeserializer;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -59,12 +70,10 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull
private final ClassBuilderOnDemand v;
@NotNull
private final FqName name;
@NotNull
private final Collection<JetFile> files;
private final Set<PackageFragmentDescriptor> packageFragments;
private final PackageFragmentDescriptor packageFragment;
private final PackageFragmentDescriptor compiledPackageFragment;
public PackageCodegen(
@NotNull ClassBuilderOnDemand v,
@@ -73,18 +82,14 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull Collection<JetFile> packageFiles
) {
super(state);
checkAllFilesHaveSamePackage(packageFiles);
this.v = v;
name = fqName;
this.files = packageFiles;
this.packageFragment = getOnlyPackageFragment();
this.compiledPackageFragment = getCompiledPackageFragment();
packageFragments = Sets.newHashSet();
for (JetFile file : packageFiles) {
packageFragments.add(getPackageFragment(file));
}
final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null;
final PsiFile sourceFile = packageFiles.size() == 1 && getPreviouslyCompiledCallables().isEmpty()
? packageFiles.iterator().next().getContainingFile() : null;
v.addOptionalDeclaration(new ClassBuilderOnDemand.ClassBuilderCallback() {
@Override
@@ -104,6 +109,81 @@ public class PackageCodegen extends GenerationStateAware {
});
}
@Nullable
private PackageFragmentDescriptor getCompiledPackageFragment() {
if (!IncrementalCompilation.ENABLED) {
return null;
}
// TODO rewrite it to something more robust when module system is implemented
for (PackageFragmentDescriptor anotherFragment : packageFragment.getContainingDeclaration().getPackageFragmentProvider()
.getPackageFragments(packageFragment.getFqName())) {
if (anotherFragment.getMemberScope() instanceof LazyJavaPackageFragmentScope) {
return anotherFragment;
}
}
return null;
}
@NotNull
private List<DeserializedCallableMemberDescriptor> getPreviouslyCompiledCallables() {
List<DeserializedCallableMemberDescriptor> callables = Lists.newArrayList();
if (compiledPackageFragment != null) {
for (DeclarationDescriptor member : compiledPackageFragment.getMemberScope().getAllDescriptors()) {
if (member instanceof DeserializedCallableMemberDescriptor) {
callables.add((DeserializedCallableMemberDescriptor) member);
}
}
}
return callables;
}
private void generateDelegationsToPreviouslyCompiled(Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
for (final DeserializedCallableMemberDescriptor member : getPreviouslyCompiledCallables()) {
generateCallableMemberTasks.put(member, new Runnable() {
@Override
public void run() {
FieldOwnerContext context = CodegenContext.STATIC.intoPackageFacade(
Type.getObjectType(getPackagePartInternalName(member)),
compiledPackageFragment);
FunctionCodegen functionCodegen = new FunctionCodegen(
context,
v.getClassBuilder(),
state,
getMemberCodegen(context)
);
if (member instanceof DeserializedSimpleFunctionDescriptor) {
DeserializedSimpleFunctionDescriptor function = (DeserializedSimpleFunctionDescriptor) member;
JvmMethodSignature signature = typeMapper.mapSignature(function, OwnerKind.PACKAGE);
functionCodegen.generateMethod(null, signature, function,
new FunctionGenerationStrategy() {
@Override
public void generateBody(
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
) {
throw new IllegalStateException("shouldn't be called");
}
}
);
}
else if (member instanceof DeserializedPropertyDescriptor) {
PropertyCodegen propertyCodegen = new PropertyCodegen(
context, v.getClassBuilder(), functionCodegen, getMemberCodegen(context));
propertyCodegen.generateInPackageFacade((DeserializedPropertyDescriptor) member);
}
else {
throw new IllegalStateException("Unexpected member: " + member);
}
}
});
}
}
public void generate(@NotNull CompilationErrorHandler errorHandler) {
List<JvmSerializationBindings> bindings = new ArrayList<JvmSerializationBindings>(files.size() + 1);
boolean shouldGeneratePackageClass = shouldGeneratePackageClass(files);
@@ -111,9 +191,11 @@ public class PackageCodegen extends GenerationStateAware {
bindings.add(v.getClassBuilder().getSerializationBindings());
}
Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks = new HashMap<CallableMemberDescriptor, Runnable>();
for (JetFile file : files) {
try {
ClassBuilder builder = generate(file);
ClassBuilder builder = generate(file, generateCallableMemberTasks);
if (builder != null) {
bindings.add(builder.getSerializationBindings());
}
@@ -132,12 +214,21 @@ public class PackageCodegen extends GenerationStateAware {
}
}
if (shouldGeneratePackageClass) {
// Shouldn't generate delegations to previously compiled if we compile only "classes" part of a package.
generateDelegationsToPreviouslyCompiled(generateCallableMemberTasks);
}
for (CallableMemberDescriptor member : Ordering.from(MemberComparator.INSTANCE).sortedCopy(generateCallableMemberTasks.keySet())) {
generateCallableMemberTasks.get(member).run();
}
if (shouldGeneratePackageClass) {
writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings));
}
assert v.isActivated() == shouldGeneratePackageClass :
"Different algorithms for generating package class and for heuristics for: " + name.asString();
"Different algorithms for generating package class and for heuristics for: " + packageFragment;
}
private void writeKotlinPackageAnnotationIfNeeded(@NotNull JvmSerializationBindings bindings) {
@@ -145,11 +236,15 @@ public class PackageCodegen extends GenerationStateAware {
return;
}
// SCRIPT: Do not write annotations for scripts (if any is??)
for (JetFile file : files) {
if (file.isScript()) return;
}
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings));
Collection<PackageFragmentDescriptor> packageFragments = compiledPackageFragment == null
? Collections.singleton(packageFragment)
: Arrays.asList(packageFragment, compiledPackageFragment);
ProtoBuf.Package packageProto = serializer.packageProto(packageFragments).build();
if (packageProto.getMemberCount() == 0) return;
@@ -168,10 +263,10 @@ public class PackageCodegen extends GenerationStateAware {
}
@Nullable
private ClassBuilder generate(@NotNull JetFile file) {
private ClassBuilder generate(@NotNull JetFile file, @NotNull Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
boolean generateSrcClass = false;
Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile());
PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType);
Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile());
PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType);
for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
@@ -184,6 +279,7 @@ public class PackageCodegen extends GenerationStateAware {
}
}
else if (declaration instanceof JetScript) {
// SCRIPT: generate script code, should be separate execution branch
ScriptCodegen.createScriptCodegen((JetScript) declaration, state, packagePartContext).generate();
}
}
@@ -194,35 +290,63 @@ public class PackageCodegen extends GenerationStateAware {
new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate();
FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, getPackageFragment(file));
//TODO: FIX: Default method generated at facade without delegation
MemberCodegen memberCodegen = new MemberCodegen(state, null, packageFacade, null) {
@NotNull
@Override
public ClassBuilder getBuilder() {
return v.getClassBuilder();
}
};
for (JetDeclaration declaration : file.getDeclarations()) {
FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment);
final MemberCodegen memberCodegen = getMemberCodegen(packageFacade);
for (final JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
memberCodegen.genFunctionOrProperty(packageFacade, (JetTypeParameterListOwner) declaration, v.getClassBuilder());
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
assert descriptor instanceof CallableMemberDescriptor :
"Expected callable member, was " + descriptor + " for " + declaration.getText();
generateCallableMemberTasks.put(
(CallableMemberDescriptor) descriptor,
new Runnable() {
@Override
public void run() {
memberCodegen.genFunctionOrProperty(
(JetTypeParameterListOwner) declaration, v.getClassBuilder());
}
}
);
}
}
return builder;
}
//TODO: FIX: Default method generated at facade without delegation
private MemberCodegen getMemberCodegen(@NotNull FieldOwnerContext packageFacade) {
return new MemberCodegen(state, null, packageFacade, null) {
@NotNull
@Override
public ClassBuilder getBuilder() {
return v.getClassBuilder();
}
};
}
@NotNull
private PackageFragmentDescriptor getPackageFragment(@NotNull JetFile file) {
PackageFragmentDescriptor packageFragment = bindingContext.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file);
assert packageFragment != null : "package fragment is null for " + file;
return packageFragment;
private PackageFragmentDescriptor getOnlyPackageFragment() {
SmartList<PackageFragmentDescriptor> fragments = new SmartList<PackageFragmentDescriptor>();
for (JetFile file : files) {
PackageFragmentDescriptor fragment = bindingContext.get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, file);
assert fragment != null : "package fragment is null for " + file;
if (!fragments.contains(fragment)) {
fragments.add(fragment);
}
}
if (fragments.size() != 1) {
throw new IllegalStateException("More than one package fragment, files: " + files + " | fragments: " + fragments);
}
return fragments.get(0);
}
public void generateClassOrObject(@NotNull JetClassOrObject classOrObject) {
JetFile file = (JetFile) classOrObject.getContainingFile();
Type packagePartType = getPackagePartType(getPackageClassFqName(name), file.getVirtualFile());
CodegenContext context = CodegenContext.STATIC.intoPackagePart(getPackageFragment(file), packagePartType);
Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile());
CodegenContext context = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType);
MemberCodegen.genClassOrObject(context, classOrObject, state, null);
}
@@ -231,8 +355,6 @@ public class PackageCodegen extends GenerationStateAware {
* @return
*/
public static boolean shouldGeneratePackageClass(@NotNull Collection<JetFile> packageFiles) {
checkAllFilesHaveSamePackage(packageFiles);
for (JetFile file : packageFiles) {
for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetProperty || declaration instanceof JetNamedFunction) {
@@ -244,21 +366,6 @@ public class PackageCodegen extends GenerationStateAware {
return false;
}
private static void checkAllFilesHaveSamePackage(Collection<JetFile> packageFiles) {
FqName commonFqName = null;
for (JetFile file : packageFiles) {
FqName fqName = JetPsiUtil.getFQName(file);
if (commonFqName != null) {
if (!commonFqName.equals(fqName)) {
throw new IllegalArgumentException("All files should have same package name");
}
}
else {
commonFqName = JetPsiUtil.getFQName(file);
}
}
}
public void done() {
v.done();
}
@@ -271,9 +378,7 @@ public class PackageCodegen extends GenerationStateAware {
String srcName = facadeFqName.shortName().asString() + "-" + replaceSpecialSymbols(fileName) + "-" + Integer.toHexString(
CodegenUtil.getPathHashCode(file));
FqName srcFqName = facadeFqName.parent().child(Name.identifier(srcName));
return asmTypeByFqNameWithoutInnerClasses(srcFqName);
return asmTypeByFqNameWithoutInnerClasses(facadeFqName.parent().child(Name.identifier(srcName)));
}
@NotNull
@@ -283,7 +388,14 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull
public static String getPackagePartInternalName(@NotNull JetFile file) {
FqName packageFqName = JetPsiUtil.getFQName(file);
FqName packageFqName = file.getPackageFqName();
return getPackagePartType(getPackageClassFqName(packageFqName), file.getVirtualFile()).getInternalName();
}
@NotNull
public static String getPackagePartInternalName(@NotNull DeserializedCallableMemberDescriptor callable) {
FqName packageFqName = ((PackageFragmentDescriptor) callable.getContainingDeclaration()).getFqName();
FqName packagePartFqName = packageFqName.child(BaseDescriptorDeserializer.getPackagePartClassName(callable));
return JvmClassName.byFqNameWithoutInnerClasses(packagePartFqName).getInternalName();
}
}

View File

@@ -62,7 +62,7 @@ public class PackagePartCodegen extends MemberCodegen {
this.packagePartName = packagePartName;
this.context = context;
descriptor = state.getBindingContext().get(BindingContext.FILE_TO_PACKAGE_FRAGMENT, jetFile);
assert descriptor != null : "No package fragment found for jetFile " + jetFile + " declared package: " + jetFile.getPackageName();
assert descriptor != null : "No package fragment found for jetFile " + jetFile + " declared package: " + jetFile.getPackageFqName();
}
public void generate() {
@@ -79,7 +79,7 @@ public class PackagePartCodegen extends MemberCodegen {
for (JetDeclaration declaration : jetFile.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
genFunctionOrProperty(context, (JetTypeParameterListOwner) declaration, v);
genFunctionOrProperty((JetTypeParameterListOwner) declaration, v);
}
}
@@ -99,9 +99,9 @@ public class PackagePartCodegen extends MemberCodegen {
FrameMap frameMap = new FrameMap();
SimpleFunctionDescriptorImpl clInit =
new SimpleFunctionDescriptorImpl(this.descriptor, Annotations.EMPTY,
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
SimpleFunctionDescriptorImpl.create(this.descriptor, Annotations.EMPTY,
Name.special("<clinit>"),
CallableMemberDescriptor.Kind.SYNTHESIZED);
clInit.initialize(null, null, Collections.<TypeParameterDescriptor>emptyList(),
Collections.<ValueParameterDescriptor>emptyList(), null, null, Visibilities.PRIVATE);

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2013 JetBrains s.r.o.
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@ import org.jetbrains.jet.codegen.context.PackageFacadeContext;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.GenerationStateAware;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -80,27 +81,43 @@ public class PropertyCodegen extends GenerationStateAware {
this.kind = context.getContextKind();
}
public void gen(JetProperty p) {
VariableDescriptor variableDescriptor = bindingContext.get(BindingContext.VARIABLE, p);
public void gen(@NotNull JetProperty property) {
VariableDescriptor variableDescriptor = bindingContext.get(BindingContext.VARIABLE, property);
assert variableDescriptor instanceof PropertyDescriptor : "Property should have a property descriptor: " + variableDescriptor;
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor;
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL
: "Generating property with a wrong kind (" + kind + "): " + propertyDescriptor;
gen(property, propertyDescriptor, property.getGetter(), property.getSetter());
}
public void generateInPackageFacade(@NotNull DeserializedPropertyDescriptor deserializedProperty) {
assert context instanceof PackageFacadeContext : "should be called only for generating package facade: " + context;
gen(null, deserializedProperty, null, null);
}
private void gen(
@Nullable JetProperty declaration,
@NotNull PropertyDescriptor descriptor,
@Nullable JetPropertyAccessor getter,
@Nullable JetPropertyAccessor setter
) {
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL
: "Generating property with a wrong kind (" + kind + "): " + descriptor;
if (context instanceof PackageFacadeContext) {
Type ownerType = ((PackageFacadeContext) context).getDelegateToClassType();
v.getSerializationBindings().put(IMPL_CLASS_NAME_FOR_CALLABLE, propertyDescriptor, shortNameByAsmType(ownerType));
v.getSerializationBindings().put(IMPL_CLASS_NAME_FOR_CALLABLE, descriptor, shortNameByAsmType(ownerType));
}
else if (!generateBackingField(p, propertyDescriptor)) {
generateSyntheticMethodIfNeeded(propertyDescriptor);
else {
assert declaration != null : "Declaration is null for different context: " + context;
if (!generateBackingField(declaration, descriptor)) {
generateSyntheticMethodIfNeeded(descriptor);
}
}
generateGetter(p, propertyDescriptor, p.getGetter());
generateSetter(p, propertyDescriptor, p.getSetter());
generateGetter(declaration, descriptor, getter);
generateSetter(declaration, descriptor, setter);
context.recordSyntheticAccessorIfNeeded(propertyDescriptor, bindingContext);
context.recordSyntheticAccessorIfNeeded(descriptor, bindingContext);
}
public void generatePrimaryConstructorProperty(JetParameter p, PropertyDescriptor descriptor) {
@@ -151,16 +168,12 @@ public class PropertyCodegen extends GenerationStateAware {
if (descriptor.getAnnotations().isEmpty()) return;
ReceiverParameterDescriptor receiver = descriptor.getReceiverParameter();
Type receiverAsmType = receiver == null ? null : typeMapper.mapType(receiver.getType());
Method method = JvmAbi.getSyntheticMethodSignatureForAnnotatedProperty(descriptor.getName(), receiverAsmType);
String name = JvmAbi.getSyntheticMethodNameForAnnotatedProperty(descriptor.getName());
String desc = receiver == null ? "()V" : "(" + typeMapper.mapType(receiver.getType()) + ")V";
if (!isTrait(context.getContextDescriptor()) || kind == OwnerKind.TRAIT_IMPL) {
MethodVisitor mv = v.newMethod(null,
ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
method.getName(),
method.getDescriptor(),
null,
null);
int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC;
MethodVisitor mv = v.newMethod(null, flags, name, desc, null, null);
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(descriptor);
mv.visitCode();
mv.visitInsn(Opcodes.RETURN);
@@ -172,7 +185,7 @@ public class PropertyCodegen extends GenerationStateAware {
}
if (kind != OwnerKind.TRAIT_IMPL) {
v.getSerializationBindings().put(SYNTHETIC_METHOD_FOR_PROPERTY, descriptor, method);
v.getSerializationBindings().put(SYNTHETIC_METHOD_FOR_PROPERTY, descriptor, new Method(name, desc));
}
}
@@ -244,7 +257,7 @@ public class PropertyCodegen extends GenerationStateAware {
return generateBackingField(p, propertyDescriptor, false, propertyDescriptor.getType(), value);
}
private void generateGetter(JetNamedDeclaration p, PropertyDescriptor propertyDescriptor, JetPropertyAccessor getter) {
private void generateGetter(@Nullable JetNamedDeclaration p, @NotNull PropertyDescriptor propertyDescriptor, @Nullable JetPropertyAccessor getter) {
boolean defaultGetter = getter == null || getter.getBodyExpression() == null;
//TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter
@@ -274,7 +287,7 @@ public class PropertyCodegen extends GenerationStateAware {
//}
}
private void generateSetter(JetNamedDeclaration p, PropertyDescriptor propertyDescriptor, JetPropertyAccessor setter) {
private void generateSetter(@Nullable JetNamedDeclaration p, @NotNull PropertyDescriptor propertyDescriptor, @Nullable JetPropertyAccessor setter) {
boolean defaultSetter = setter == null || setter.getBodyExpression() == null;
//TODO: Now it's not enough information to properly resolve property from bytecode without generated getter and setter
@@ -374,10 +387,12 @@ public class PropertyCodegen extends GenerationStateAware {
}
}
@NotNull
public static String getterName(Name propertyName) {
return JvmAbi.GETTER_PREFIX + StringUtil.capitalizeWithJavaBeanConvention(propertyName.asString());
}
@NotNull
public static String setterName(Name propertyName) {
return JvmAbi.SETTER_PREFIX + StringUtil.capitalizeWithJavaBeanConvention(propertyName.asString());
}

View File

@@ -26,7 +26,6 @@ import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
@@ -136,7 +135,7 @@ public class SamWrapperCodegen extends ParentCodegenAwareImpl {
}
private String getWrapperName(@NotNull JetFile containingFile) {
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(JetPsiUtil.getFQName(containingFile));
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(containingFile.getPackageFqName());
String packageInternalName = JvmClassName.byFqNameWithoutInnerClasses(packageClassFqName).getInternalName();
return packageInternalName + "$sam$" + samInterface.getName().asString() + "$" +
Integer.toHexString(CodegenUtil.getPathHashCode(containingFile.getVirtualFile()) * 31 + DescriptorUtils.getFqNameSafe(

View File

@@ -40,6 +40,7 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE;
// SCRIPT: script code generator
public class ScriptCodegen extends MemberCodegen {
public static ScriptCodegen createScriptCodegen(
@@ -203,7 +204,7 @@ public class ScriptCodegen extends MemberCodegen {
private void genMembers(@NotNull FieldOwnerContext context, @NotNull ClassBuilder classBuilder) {
for (JetDeclaration decl : scriptDeclaration.getDeclarations()) {
genFunctionOrProperty(context, (JetTypeParameterListOwner) decl, classBuilder);
genFunctionOrProperty((JetTypeParameterListOwner) decl, classBuilder);
}
}

View File

@@ -330,12 +330,16 @@ public abstract class StackValue {
ExpressionCodegen codegen,
@Nullable CallableMethod callableMethod
) {
if (resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists()) {
if (resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists() || isLocalFunCall(callableMethod)) {
return new CallReceiver(resolvedCall, receiver, codegen, callableMethod, true);
}
return receiver;
}
private static boolean isLocalFunCall(@Nullable CallableMethod callableMethod) {
return callableMethod != null && callableMethod.getGenerateCalleeType() != null;
}
public static StackValue receiverWithoutReceiverArgument(StackValue receiverWithParameter) {
if (receiverWithParameter instanceof CallReceiver) {
CallReceiver callReceiver = (CallReceiver) receiverWithParameter;
@@ -1125,37 +1129,26 @@ public abstract class StackValue {
CallableDescriptor descriptor = resolvedCall.getResultingDescriptor();
if (thisObject.exists()) {
if (receiverArgument.exists()) {
if (callableMethod != null) {
if (receiverArgument.exists()) {
return callableMethod.getReceiverClass();
}
else {
//noinspection ConstantConditions
return callableMethod.getThisType();
}
return callableMethod.getReceiverClass();
}
else {
if (receiverArgument.exists()) {
return codegen.typeMapper.mapType(descriptor.getReceiverParameter().getType());
}
else {
return codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType());
}
return codegen.typeMapper.mapType(descriptor.getReceiverParameter().getType());
}
} else if (thisObject.exists()) {
if (callableMethod != null) {
return callableMethod.getThisType();
}
else {
return codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType());
}
}
else if (isLocalFunCall(callableMethod)) {
return callableMethod.getGenerateCalleeType();
}
else {
if (receiverArgument.exists()) {
if (callableMethod != null) {
return callableMethod.getReceiverClass();
}
else {
return codegen.typeMapper.mapType(descriptor.getReceiverParameter().getType());
}
}
else {
return Type.VOID_TYPE;
}
return Type.VOID_TYPE;
}
}
@@ -1165,27 +1158,33 @@ public abstract class StackValue {
ReceiverValue thisObject = resolvedCall.getThisObject();
ReceiverValue receiverArgument = resolvedCall.getReceiverArgument();
int depth;
if (thisObject.exists()) {
if (receiverArgument.exists()) {
if (callableMethod != null) {
codegen.generateFromResolvedCall(thisObject, callableMethod.getOwner());
}
else {
codegen.generateFromResolvedCall(thisObject, codegen.typeMapper
.mapType(descriptor.getExpectedThisObject().getType()));
}
if (putReceiverArgumentOnStack) {
genReceiver(v, receiverArgument, type, descriptor.getReceiverParameter(), 1);
}
Type resultType = callableMethod != null ? callableMethod.getOwner() : codegen.typeMapper
.mapType(descriptor.getExpectedThisObject().getType());
codegen.generateFromResolvedCall(thisObject, resultType);
}
else {
genReceiver(v, thisObject, type, null, 0);
}
depth = 1;
} else if (isLocalFunCall(callableMethod)) {
assert receiver == none() || receiverArgument.exists(): "Receiver should be present only for local extension function: " + callableMethod;
StackValue value = codegen.findLocalOrCapturedValue(descriptor.getOriginal());
assert value != null : "Local fun should be found in locals or in captured params: " + resolvedCall;
value.put(callableMethod.getGenerateCalleeType(), v);
depth = 1;
}
else {
if (putReceiverArgumentOnStack && receiverArgument.exists()) {
genReceiver(v, receiverArgument, type, descriptor.getReceiverParameter(), 0);
}
depth = 0;
}
if (putReceiverArgumentOnStack && receiverArgument.exists()) {
genReceiver(v, receiverArgument, type, descriptor.getReceiverParameter(), depth);
}
}
@@ -1211,7 +1210,7 @@ public abstract class StackValue {
public abstract static class StackValueWithSimpleReceiver extends StackValue {
protected final boolean isStatic;
public final boolean isStatic;
public StackValueWithSimpleReceiver(@NotNull Type type, boolean isStatic) {
super(type);

View File

@@ -141,6 +141,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
@Override
public void visitJetFile(@NotNull JetFile file) {
if (file.isScript()) {
// SCRIPT: should be replaced with VisitScript override
//noinspection ConstantConditions
ClassDescriptor classDescriptor = bindingContext.get(CLASS_FOR_SCRIPT, bindingContext.get(SCRIPT, file.getScript()));
pushClassDescriptor(classDescriptor);
@@ -148,7 +149,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid {
nameStack.push(asmTypeForScriptPsi(bindingContext, file.getScript()).getInternalName());
}
else {
nameStack.push(JvmClassName.byFqNameWithoutInnerClasses(JetPsiUtil.getFQName(file)).getInternalName());
nameStack.push(JvmClassName.byFqNameWithoutInnerClasses(file.getPackageFqName()).getInternalName());
}
file.acceptChildren(this);
nameStack.pop();

View File

@@ -79,6 +79,7 @@ public class CodegenBinding {
return Boolean.TRUE.equals(bindingContext.get(ENUM_ENTRY_CLASS_NEED_SUBCLASS, classDescriptor));
}
// SCRIPT: Generate asmType for script, move to ScriptingUtil
@NotNull
public static Type asmTypeForScriptDescriptor(BindingContext bindingContext, @NotNull ScriptDescriptor scriptDescriptor) {
ClassDescriptor classDescriptor = bindingContext.get(CLASS_FOR_SCRIPT, scriptDescriptor);
@@ -86,6 +87,7 @@ public class CodegenBinding {
return asmType(bindingContext, classDescriptor);
}
// SCRIPT: Generate asmType for script, move to ScriptingUtil
@NotNull
public static Type asmTypeForScriptPsi(BindingContext bindingContext, @NotNull JetScript script) {
ScriptDescriptor scriptDescriptor = bindingContext.get(SCRIPT, script);
@@ -138,6 +140,7 @@ public class CodegenBinding {
return asmType(bindingContext, classDescriptor);
}
// SCRIPT: register asmType for script descriptor, move to ScriptingUtil
public static void registerClassNameForScript(
BindingTrace bindingTrace,
@NotNull ScriptDescriptor scriptDescriptor,
@@ -217,6 +220,7 @@ public class CodegenBinding {
innerClasses.add(inner);
}
// SCRIPT: register asmType for script, move to ScriptingUtil
public static void registerClassNameForScript(
BindingTrace bindingTrace,
@NotNull JetScript jetScript,
@@ -234,10 +238,11 @@ public class CodegenBinding {
// todo: we use Set and add given files but ignoring other scripts because something non-clear kept in binding
// for scripts especially in case of REPL
// SCRIPT: collect fq names for files that are not scripts
HashSet<FqName> names = new HashSet<FqName>();
for (JetFile file : files) {
if (!file.isScript()) {
names.add(JetPsiUtil.getFQName(file));
names.add(file.getPackageFqName());
}
}

View File

@@ -80,18 +80,15 @@ public final class PsiCodegenPredictor {
}
}
else {
String packageName = ((JetFile) declaration.getContainingFile()).getPackageName();
if (packageName == null) {
return null;
}
FqName packageFqName = ((JetFile) declaration.getContainingFile()).getPackageFqName();
if (declaration instanceof JetNamedFunction) {
JvmClassName packageClass = JvmClassName.byFqNameWithoutInnerClasses(getPackageClassFqName(new FqName(packageName)));
JvmClassName packageClass = JvmClassName.byFqNameWithoutInnerClasses(getPackageClassFqName(packageFqName));
Name name = ((JetNamedFunction) declaration).getNameAsName();
return name == null ? null : packageClass.getInternalName() + "$" + name.asString();
}
parentInternalName = JvmClassName.byFqNameWithoutInnerClasses(packageName).getInternalName();
parentInternalName = JvmClassName.byFqNameWithoutInnerClasses(packageFqName).getInternalName();
}
if (declaration instanceof JetClassObject) {

View File

@@ -39,6 +39,7 @@ import java.util.HashMap;
import java.util.Map;
import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PRIVATE;
import static org.jetbrains.org.objectweb.asm.Opcodes.ACC_PROTECTED;
import static org.jetbrains.jet.codegen.AsmUtil.CAPTURED_THIS_FIELD;
import static org.jetbrains.jet.codegen.AsmUtil.getVisibilityAccessFlag;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
@@ -190,13 +191,14 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
@NotNull
public ConstructorContext intoConstructor(@Nullable ConstructorDescriptor descriptor, @Nullable MutableClosure closure) {
if (descriptor == null) {
descriptor = new ConstructorDescriptorImpl(getThisDescriptor(), Annotations.EMPTY, true)
descriptor = ConstructorDescriptorImpl.create(getThisDescriptor(), Annotations.EMPTY, true)
.initialize(Collections.<TypeParameterDescriptor>emptyList(), Collections.<ValueParameterDescriptor>emptyList(),
Visibilities.PUBLIC);
Visibilities.PUBLIC, false);
}
return new ConstructorContext(descriptor, getContextKind(), this, closure);
}
// SCRIPT: generate into script, move to ScriptingUtil
@NotNull
public ScriptContext intoScript(@NotNull ScriptDescriptor script, @NotNull ClassDescriptor classDescriptor) {
return new ScriptContext(script, classDescriptor, OwnerKind.IMPLEMENTATION, this, closure);
@@ -332,7 +334,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
break;
}
else {
return result == null ? innerValue : StackValue.composed(result, innerValue);
return result == null ? innerValue : composedOrStatic(result, innerValue);
}
}
}
@@ -348,7 +350,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
resultValue = parentContext != null ? parentContext.lookupInContext(d, result, state, ignoreNoOuter) : null;
}
if (myOuter != null && resultValue != null) {
if (myOuter != null && resultValue != null && !isStaticField(resultValue)) {
closure.setCaptureThis();
}
return resultValue;
@@ -397,15 +399,16 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
PropertyGetterDescriptor getter = propertyDescriptor.getGetter();
flag |= (getter == null ? 0 : getVisibilityAccessFlag(getter)) |
(setter == null ? 0 : getVisibilityAccessFlag(setter));
(setter == null ? 0 : getVisibilityAccessFlag(setter));
}
return flag;
}
@NotNull
private MemberDescriptor accessibleDescriptorIfNeeded(CallableMemberDescriptor descriptor, boolean fromOutsideContext) {
int flag = getAccessFlags(descriptor);
if ((flag & ACC_PRIVATE) == 0) {
CallableMemberDescriptor unwrappedDescriptor = DescriptorUtils.unwrapFakeOverride(descriptor);
int flag = getAccessFlags(unwrappedDescriptor);
if ((flag & ACC_PRIVATE) == 0 && (flag & ACC_PROTECTED) == 0) {
return descriptor;
}
@@ -437,7 +440,24 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
}
}
return (MemberDescriptor) (descriptorContext != null ? descriptorContext.getAccessor(descriptor) : descriptor);
if (descriptorContext == null) {
return descriptor;
}
if ((flag & ACC_PROTECTED) != 0) {
PackageFragmentDescriptor unwrappedDescriptorPackage =
DescriptorUtils.getParentOfType(unwrappedDescriptor, PackageFragmentDescriptor.class, false);
PackageFragmentDescriptor contextDescriptorPackage =
DescriptorUtils.getParentOfType(descriptorContext.getContextDescriptor(), PackageFragmentDescriptor.class, false);
boolean inSamePackage = contextDescriptorPackage != null && unwrappedDescriptorPackage != null &&
unwrappedDescriptorPackage.getFqName().equals(contextDescriptorPackage.getFqName());
if (inSamePackage) {
return descriptor;
}
}
return (MemberDescriptor) descriptorContext.getAccessor(descriptor);
}
private void addChild(@NotNull CodegenContext child) {
@@ -454,7 +474,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
DeclarationDescriptor childContextDescriptor = child.contextDescriptor;
if (childContextDescriptor instanceof ClassDescriptor) {
ClassKind kind = ((ClassDescriptor) childContextDescriptor).getKind();
return kind == ClassKind.CLASS_OBJECT;
return kind == ClassKind.CLASS_OBJECT;
}
return false;
}
@@ -463,4 +483,16 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
public CodegenContext findChildContext(@NotNull DeclarationDescriptor child) {
return childContexts == null ? null : childContexts.get(child);
}
}
@NotNull
private static StackValue composedOrStatic(@NotNull StackValue prefix, @NotNull StackValue suffix) {
if (isStaticField(suffix)) {
return suffix;
}
return StackValue.composed(prefix, suffix);
}
private static boolean isStaticField(@NotNull StackValue value) {
return value instanceof StackValue.Field && ((StackValue.Field) value).isStatic;
}
}

View File

@@ -16,17 +16,19 @@
package org.jetbrains.jet.codegen.context;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.jet.codegen.CodegenUtil;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.binding.MutableClosure;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.org.objectweb.asm.Type;
import static org.jetbrains.jet.codegen.AsmUtil.CAPTURED_RECEIVER_FIELD;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.asmTypeForAnonymousClass;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
public interface LocalLookup {
boolean lookupLocal(DeclarationDescriptor descriptor);
@@ -86,7 +88,15 @@ public interface LocalLookup {
boolean idx = localLookup != null && localLookup.lookupLocal(vd);
if (!idx) return null;
Type localType = asmTypeForAnonymousClass(state.getBindingContext(), vd);
BindingContext bindingContext = state.getBindingContext();
Type localType = asmTypeForAnonymousClass(bindingContext, vd);
MutableClosure localFunClosure = bindingContext.get(CLOSURE, bindingContext.get(CLASS_FOR_FUNCTION, vd));
if (localFunClosure != null && CodegenUtil.isConst(localFunClosure)) {
// This is an optimization: we can obtain an instance of a const closure simply by GETSTATIC ...$instance
// (instead of passing this instance to the constructor and storing as a field)
return StackValue.field(localType, localType, JvmAbi.INSTANCE_FIELD, true);
}
String fieldName = "$" + vd.getName();
StackValue innerValue = StackValue.field(localType, classType, fieldName, false);

View File

@@ -23,6 +23,7 @@ import org.jetbrains.jet.codegen.binding.MutableClosure;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
// SCRIPT: script as field owner context
public class ScriptContext extends FieldOwnerContext<ClassDescriptor> {
@NotNull
private final ScriptDescriptor scriptDescriptor;

View File

@@ -85,7 +85,7 @@ public class InlineCodegenUtil {
VirtualFile file;
DeclarationDescriptor parentDeclaration = deserializedDescriptor.getContainingDeclaration();
if (parentDeclaration instanceof PackageFragmentDescriptor) {
ProtoBuf.Callable proto = deserializedDescriptor.getFunctionProto();
ProtoBuf.Callable proto = deserializedDescriptor.getProto();
if (!proto.hasExtension(JavaProtoBuf.implClassName)) {
throw new IllegalStateException("Function in namespace should have implClassName property in proto: " + deserializedDescriptor);
}

View File

@@ -24,7 +24,7 @@ import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.expressions.OperatorConventions;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -59,8 +59,8 @@ public class IntrinsicMethods {
private static final EnumValueOf ENUM_VALUE_OF = new EnumValueOf();
private static final ToString TO_STRING = new ToString();
private static final FqName KOTLIN_ANY_FQ_NAME = DescriptorUtils.getFqNameSafe(KotlinBuiltIns.getInstance().getAny());
private static final FqName KOTLIN_STRING_FQ_NAME = DescriptorUtils.getFqNameSafe(KotlinBuiltIns.getInstance().getString());
private static final FqNameUnsafe KOTLIN_ANY_FQ_NAME = DescriptorUtils.getFqName(KotlinBuiltIns.getInstance().getAny());
private static final FqNameUnsafe KOTLIN_STRING_FQ_NAME = DescriptorUtils.getFqName(KotlinBuiltIns.getInstance().getString());
private final Map<String, IntrinsicMethod> namedMethods = new HashMap<String, IntrinsicMethod>();
private static final IntrinsicMethod ARRAY_ITERATOR = new ArrayIterator();

View File

@@ -32,11 +32,11 @@ import java.util.Map;
class IntrinsicsMap {
private static final class Key {
private final FqNameUnsafe owner;
private final FqName receiverParameter;
private final FqNameUnsafe receiverParameter;
private final String name;
private final int valueParameterCount;
private Key(@NotNull FqNameUnsafe owner, @Nullable FqName receiverParameter, @NotNull String name, int valueParameterCount) {
private Key(@NotNull FqNameUnsafe owner, @Nullable FqNameUnsafe receiverParameter, @NotNull String name, int valueParameterCount) {
this.owner = owner;
this.receiverParameter = receiverParameter;
this.name = name;
@@ -85,7 +85,7 @@ class IntrinsicsMap {
*/
public void registerIntrinsic(
@NotNull FqName owner,
@Nullable FqName receiverParameter,
@Nullable FqNameUnsafe receiverParameter,
@NotNull String name,
int valueParameterCount,
@NotNull IntrinsicMethod impl
@@ -105,13 +105,13 @@ class IntrinsicsMap {
}
@Nullable
private static FqName getReceiverParameterFqName(@NotNull CallableMemberDescriptor descriptor) {
private static FqNameUnsafe getReceiverParameterFqName(@NotNull CallableMemberDescriptor descriptor) {
ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter();
if (receiverParameter == null) return null;
ClassifierDescriptor classifier = receiverParameter.getType().getConstructor().getDeclarationDescriptor();
if (classifier == null) return null;
return DescriptorUtils.getFqNameSafe(classifier);
return DescriptorUtils.getFqName(classifier);
}
}

View File

@@ -43,7 +43,7 @@ public class StupidSync extends IntrinsicMethod {
@NotNull Type returnType,
@Nullable PsiElement element,
@Nullable List<JetExpression> arguments,
StackValue receiver
@Nullable StackValue receiver
) {
assert element != null : "Element should not be null";
ResolvedCall<?> resolvedCall =
@@ -51,7 +51,7 @@ public class StupidSync extends IntrinsicMethod {
assert resolvedCall != null : "Resolved call for " + element.getText() + " should be not null";
codegen.pushMethodArguments(resolvedCall, Arrays.asList(OBJECT_TYPE, FUNCTION0_TYPE), codegen.defaulCallGenerator);
codegen.pushMethodArgumentsWithoutCallReceiver(resolvedCall, Arrays.asList(OBJECT_TYPE, FUNCTION0_TYPE), false, codegen.defaultCallGenerator);
v.invokestatic("kotlin/jvm/internal/Intrinsics", "stupidSync", Type.getMethodDescriptor(OBJECT_TYPE, OBJECT_TYPE, FUNCTION0_TYPE));
return OBJECT_TYPE;
}

View File

@@ -183,8 +183,8 @@ public class BothSignatureWriter {
public void writeParameterType(JvmMethodParameterKind parameterKind) {
// This magic mimics the behavior of javac that enum constructor have these synthetic parameters in erased signature, but doesn't
// have them in generic signature. IDEA relies on this behavior.
if (parameterKind == JvmMethodParameterKind.ENUM_NAME || parameterKind == JvmMethodParameterKind.ENUM_ORDINAL) {
// have them in generic signature. IDEA, javac and their friends rely on this behavior.
if (parameterKind.isSkippedInGenericSignature()) {
generic = true;
// pushing dummy visitor, because we don't want these parameters to appear in generic JVM signature

View File

@@ -16,13 +16,21 @@
package org.jetbrains.jet.codegen.signature;
import java.util.EnumSet;
public enum JvmMethodParameterKind {
VALUE,
THIS,
OUTER,
RECEIVER,
SHARED_VAR,
CAPTURED_LOCAL_VARIABLE,
ENUM_NAME,
ENUM_ORDINAL,
SUPER_CALL_PARAM
SUPER_OF_ANONYMOUS_CALL_PARAM;
private static final EnumSet<JvmMethodParameterKind> SKIPPED_IN_GENERIC_SIGNATURE = EnumSet.of(OUTER, ENUM_NAME, ENUM_ORDINAL);
public boolean isSkippedInGenericSignature() {
return SKIPPED_IN_GENERIC_SIGNATURE.contains(this);
}
}

View File

@@ -29,6 +29,8 @@ import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.config.IncrementalCompilation;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall;
@@ -126,13 +128,18 @@ public class JetTypeMapper extends BindingTraceAware {
}
// It's not a package created for Java class statics
JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor);
if (insideModule && file != null) {
return PackageCodegen.getPackagePartInternalName(file);
}
else {
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/');
if (insideModule) {
JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor);
if (file != null) {
return PackageCodegen.getPackagePartInternalName(file);
}
if (descriptor instanceof DeserializedCallableMemberDescriptor && IncrementalCompilation.ENABLED) {
//
// TODO calls from other modules/libraries should use facade: KT-4590
return PackageCodegen.getPackagePartInternalName((DeserializedCallableMemberDescriptor) descriptor);
}
}
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/');
}
@NotNull
@@ -762,7 +769,7 @@ public class JetTypeMapper extends BindingTraceAware {
}
if (type != null) {
signatureWriter.writeParameterType(JvmMethodParameterKind.SHARED_VAR);
signatureWriter.writeParameterType(JvmMethodParameterKind.CAPTURED_LOCAL_VARIABLE);
signatureWriter.writeAsmType(type);
signatureWriter.writeParameterTypeEnd();
}
@@ -775,7 +782,7 @@ public class JetTypeMapper extends BindingTraceAware {
if (superDescriptor instanceof ConstructorDescriptor && isAnonymousObject(descriptor.getContainingDeclaration())) {
for (JvmMethodParameterSignature parameter : mapSignature((ConstructorDescriptor) superDescriptor).getValueParameters()) {
signatureWriter.writeParameterType(JvmMethodParameterKind.SUPER_CALL_PARAM);
signatureWriter.writeParameterType(JvmMethodParameterKind.SUPER_OF_ANONYMOUS_CALL_PARAM);
signatureWriter.writeAsmType(parameter.getAsmType());
signatureWriter.writeParameterTypeEnd();
}

View File

@@ -40,7 +40,6 @@ import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM
import org.jetbrains.jet.lang.resolve.BindingTraceContext
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor
import org.jetbrains.jet.lang.resolve.name.FqName
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.utils.recursePostOrder
@@ -67,11 +66,9 @@ public class BuiltInsSerializer(val out: PrintStream?) {
val environment = JetCoreEnvironment.createForTests(disposable, configuration)
val files = environment.getSourceFiles() ?: error("No source files in $sourceRoots")
val files = environment.getSourceFiles()
val project = environment.getProject()
val session = AnalyzerFacadeForJVM.createLazyResolveSession(project, files, BindingTraceContext(), false)
val session = AnalyzerFacadeForJVM.createLazyResolveSession(environment.getProject(), files, BindingTraceContext(), false)
val module = session.getModuleDescriptor()
// We don't use FileUtil because it spawns JNA initialization, which fails because we don't have (and don't want to have) its
@@ -82,8 +79,9 @@ public class BuiltInsSerializer(val out: PrintStream?) {
System.err.println("Could not make directories: " + destDir)
}
for (fqName in ContainerUtil.mapNotNull(files) { it?.getPackageName() }.toSet()) {
serializePackage(module, FqName(fqName), destDir)
files.map { it.getPackageFqName() }.toSet().forEach {
fqName ->
serializePackage(module, fqName, destDir)
}
out?.println("Total bytes written: $totalSize to $totalFiles files")

View File

@@ -52,7 +52,7 @@ public object ClassSerializationUtil {
public fun getClassId(classDescriptor: ClassDescriptor): ClassId {
val owner = classDescriptor.getContainingDeclaration()
if (owner is PackageFragmentDescriptor) {
return ClassId(owner.getFqName(), FqNameUnsafe.topLevel(classDescriptor.getName()))
return ClassId(owner.fqName, FqNameUnsafe.topLevel(classDescriptor.getName()))
}
return getClassId(owner as ClassDescriptor).createNestedClassId(classDescriptor.getName())
}

View File

@@ -18,6 +18,8 @@
<orderEntry type="module" module-name="descriptor.loader.java" />
<orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="backend-common" />
<orderEntry type="module" module-name="serialization" />
<orderEntry type="module" module-name="serialization.java" />
</component>
</module>

View File

@@ -0,0 +1,39 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.cli.jvm.compiler
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.codegen.PackageCodegen.getPackagePartInternalName
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.java.JvmClassName
public class CliSourcesMemberFilter(environment: JetCoreEnvironment): MemberFilter {
val packagePartClassNames = environment.getSourceFiles().map { getPackagePartInternalName(it) }.toSet()
override fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean {
if (member.hasExtension(JavaProtoBuf.implClassName)) {
val shortName = nameResolver.getName(member.getExtension(JavaProtoBuf.implClassName)!!)
val fqName = container.fqName.child(shortName)
val internalName = JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName()
return internalName !in packagePartClassNames
}
return true
}
}

View File

@@ -74,7 +74,7 @@ public class CompileEnvironmentUtil {
return ModuleChunk.EMPTY;
}
String extension = FileUtilRt.getExtension(moduleDefinitionFile);
if ("kts".equalsIgnoreCase(extension)) {
if ("ktm".equalsIgnoreCase(extension)) {
return new ModuleChunk(loadModuleScript(paths, moduleDefinitionFile, messageCollector));
}
if ("xml".equalsIgnoreCase(extension)) {

View File

@@ -57,6 +57,8 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.java.JetFilesProvider;
import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.lang.resolve.lazy.declarations.CliDeclarationProviderFactoryService;
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactoryService;
import org.jetbrains.jet.plugin.JetFileType;
import org.jetbrains.jet.utils.PathUtil;
@@ -75,7 +77,10 @@ public class JetCoreEnvironment {
private static int ourProjectCount = 0;
@NotNull
public static JetCoreEnvironment createForProduction(@NotNull Disposable parentDisposable, @NotNull CompilerConfiguration configuration) {
public static JetCoreEnvironment createForProduction(
@NotNull Disposable parentDisposable,
@NotNull CompilerConfiguration configuration
) {
// JPS may run many instances of the compiler in parallel (there's an option for compiling independent modules in parallel in IntelliJ)
// All projects share the same ApplicationEnvironment, and when the last project is disposed, the ApplicationEnvironment is disposed as well
Disposer.register(parentDisposable, new Disposable() {
@@ -88,7 +93,8 @@ public class JetCoreEnvironment {
}
}
});
JetCoreEnvironment environment = new JetCoreEnvironment(parentDisposable, getOrCreateApplicationEnvironmentForProduction(), configuration);
JetCoreEnvironment environment =
new JetCoreEnvironment(parentDisposable, getOrCreateApplicationEnvironmentForProduction(), configuration);
synchronized (APPLICATION_LOCK) {
ourProjectCount++;
}
@@ -138,14 +144,15 @@ public class JetCoreEnvironment {
applicationEnvironment.registerFileType(PlainTextFileType.INSTANCE, "xml");
applicationEnvironment.registerFileType(JetFileType.INSTANCE, "kt");
applicationEnvironment.registerFileType(JetFileType.INSTANCE, "kts");
applicationEnvironment.registerFileType(JetFileType.INSTANCE, "ktm");
applicationEnvironment.registerFileType(JetFileType.INSTANCE, JetParserDefinition.KTSCRIPT_FILE_SUFFIX); // should be renamed to kts
applicationEnvironment.registerFileType(JetFileType.INSTANCE, JetParserDefinition.STD_SCRIPT_SUFFIX); // should be renamed to kts
applicationEnvironment.registerParserDefinition(new JavaParserDefinition());
applicationEnvironment.registerParserDefinition(new JetParserDefinition());
applicationEnvironment.getApplication().registerService(OperationModeProvider.class, new CompilerModeProvider());
applicationEnvironment.getApplication().registerService(KotlinBinaryClassCache.class, new KotlinBinaryClassCache());
applicationEnvironment.getApplication().registerService(DeclarationProviderFactoryService.class,
new CliDeclarationProviderFactoryService());
return applicationEnvironment;
}
@@ -185,7 +192,7 @@ public class JetCoreEnvironment {
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClsCustomNavigationPolicy.EP_NAME,
ClsCustomNavigationPolicy.class);
CoreApplicationEnvironment.registerExtensionPoint(Extensions.getRootArea(), ClassFileDecompilers.EP_NAME,
ClassFileDecompilers.Decompiler.class);
ClassFileDecompilers.Decompiler.class);
annotationsManager = new CoreExternalAnnotationsManager(project.getComponent(PsiManager.class));
project.registerService(ExternalAnnotationsManager.class, annotationsManager);
@@ -294,6 +301,7 @@ public class JetCoreEnvironment {
}
}
@NotNull
public List<JetFile> getSourceFiles() {
return sourceFiles;
}

View File

@@ -42,7 +42,6 @@ import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
@@ -170,7 +169,7 @@ public class KotlinToJVMBytecodeCompiler {
// more than one main
return null;
}
FqName fqName = JetPsiUtil.getFQName(file);
FqName fqName = file.getPackageFqName();
mainClass = PackageClassUtils.getPackageClassFqName(fqName);
}
}
@@ -227,7 +226,7 @@ public class KotlinToJVMBytecodeCompiler {
return null;
}
GeneratedClassLoader classLoader = null;
GeneratedClassLoader classLoader;
try {
classLoader = new GeneratedClassLoader(state.getFactory(),
new URLClassLoader(new URL[] {
@@ -236,17 +235,12 @@ public class KotlinToJVMBytecodeCompiler {
}, AllModules.class.getClassLoader())
);
return classLoader.loadClass(ScriptNameUtil.classNameForScript(environment.getSourceFiles().get(0)));
FqName nameForScript = ScriptNameUtil.classNameForScript(environment.getSourceFiles().get(0));
return classLoader.loadClass(nameForScript.asString());
}
catch (Exception e) {
throw new RuntimeException("Failed to evaluate script: " + e, e);
}
finally {
if (classLoader != null) {
classLoader.dispose();
}
state.destroy();
}
}
@Nullable
@@ -281,8 +275,8 @@ public class KotlinToJVMBytecodeCompiler {
environment.getConfiguration().getList(JVMConfigurationKeys.SCRIPT_PARAMETERS),
Predicates.<PsiFile>alwaysTrue(),
false,
sharedModule
);
sharedModule,
new CliSourcesMemberFilter(environment));
}
}, environment.getSourceFiles()
);

View File

@@ -43,12 +43,13 @@ import org.jetbrains.jet.codegen.CompilationErrorHandler;
import org.jetbrains.jet.codegen.KotlinCodegenFacade;
import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.PackageLikeBuilderDummy;
import org.jetbrains.jet.lang.parsing.JetParserDefinition;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.psi.JetScript;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM;
@@ -75,9 +76,7 @@ import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BINARIES;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BUILT_INS;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.SOURCES;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.*;
public class ReplInterpreter {
@@ -111,7 +110,7 @@ public class ReplInterpreter {
false,
true,
Collections.<AnalyzerScriptParameter>emptyList());
injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module);
injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module, MemberFilter.ALWAYS_TRUE);
topDownAnalysisContext = new TopDownAnalysisContext(topDownAnalysisParameters);
module.addFragmentProvider(SOURCES, injector.getTopDownAnalyzer().getPackageFragmentProvider());
module.addFragmentProvider(BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
@@ -210,7 +209,7 @@ public class ReplInterpreter {
}
fullText.append(line);
LightVirtualFile virtualFile = new LightVirtualFile("line" + lineNumber + ".ktscript", JetLanguage.INSTANCE, fullText.toString());
LightVirtualFile virtualFile = new LightVirtualFile("line" + lineNumber + JetParserDefinition.STD_SCRIPT_EXT, JetLanguage.INSTANCE, fullText.toString());
virtualFile.setCharset(CharsetToolkit.UTF8_CHARSET);
JetFile psiFile = (JetFile) ((PsiFileFactoryImpl) PsiFileFactory.getInstance(jetCoreEnvironment.getProject())).trySetupPsiForFile(virtualFile, JetLanguage.INSTANCE, true, false);
@@ -362,7 +361,7 @@ public class ReplInterpreter {
state.beforeCompile();
KotlinCodegenFacade.generatePackage(
state,
JetPsiUtil.getFQName((JetFile) script.getContainingFile()),
((JetFile) script.getContainingFile()).getPackageFqName(),
Collections.singleton((JetFile) script.getContainingFile()),
errorHandler);
}

View File

@@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
@@ -56,6 +57,7 @@ public class InjectorForJavaDescriptorResolver {
private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker;
private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver;
private final VirtualFileFinder virtualFileFinder;
private final MemberFilter memberFilter;
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
@@ -84,6 +86,7 @@ public class InjectorForJavaDescriptorResolver {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.memberFilter = org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter.ALWAYS_TRUE;
this.descriptorDeserializers = new DescriptorDeserializers();
this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer();
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
@@ -101,10 +104,11 @@ public class InjectorForJavaDescriptorResolver {
psiBasedMethodSignatureChecker.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver);
psiBasedMethodSignatureChecker.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
deserializedDescriptorResolver.setAnnotationDeserializer(descriptorDeserializers);
deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);

View File

@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.LazyResolveBasedCache;
@@ -73,6 +74,7 @@ public class InjectorForLazyResolveWithJava {
private final ResolveSession resolveSession;
private final JavaDescriptorResolver javaDescriptorResolver;
private final VirtualFileFinder virtualFileFinder;
private final MemberFilter memberFilter;
private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final LazyResolveBasedCache lazyResolveBasedCache;
@@ -129,6 +131,7 @@ public class InjectorForLazyResolveWithJava {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, lazyResolveBasedCache);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.memberFilter = org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter.ALWAYS_TRUE;
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
this.argumentTypeResolver = new ArgumentTypeResolver();
@@ -171,7 +174,8 @@ public class InjectorForLazyResolveWithJava {
psiBasedMethodSignatureChecker.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setStorageManager(lockBasedStorageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);
@@ -220,10 +224,11 @@ public class InjectorForLazyResolveWithJava {
jetImportsFactory.setProject(project);
deserializedDescriptorResolver.setAnnotationDeserializer(descriptorDeserializers);
deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);

View File

@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
@@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final PlatformToKotlinClassMap platformToKotlinClassMap;
private final TopDownAnalyzer topDownAnalyzer;
private final MutablePackageFragmentProvider mutablePackageFragmentProvider;
private final MemberFilter memberFilter;
private final JavaDescriptorResolver javaDescriptorResolver;
private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
@@ -128,7 +130,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
@NotNull Project project,
@NotNull GlobalContext globalContext,
@NotNull BindingTrace bindingTrace,
@NotNull ModuleDescriptorImpl moduleDescriptor
@NotNull ModuleDescriptorImpl moduleDescriptor,
@NotNull MemberFilter memberFilter
) {
this.project = project;
this.globalContext = globalContext;
@@ -138,6 +141,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap();
this.topDownAnalyzer = new TopDownAnalyzer();
this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor());
this.memberFilter = memberFilter;
this.javaClassFinder = new JavaClassFinderImpl();
this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project);
this.deserializedDescriptorResolver = new DeserializedDescriptorResolver();
@@ -187,6 +191,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
this.topDownAnalyzer.setPackageFragmentProvider(mutablePackageFragmentProvider);
this.topDownAnalyzer.setProject(project);
this.topDownAnalyzer.setScriptHeaderResolver(scriptHeaderResolver);
this.topDownAnalyzer.setTrace(bindingTrace);
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
@@ -214,7 +219,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
bodyResolver.setTrace(bindingTrace);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setStorageManager(storageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);
@@ -298,10 +304,11 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver);
typeHierarchyResolver.setTrace(bindingTrace);
deserializedDescriptorResolver.setAnnotationDeserializer(descriptorDeserializers);
deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(storageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);

View File

@@ -28,6 +28,7 @@ import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything;
import org.jetbrains.jet.context.ContextPackage;
import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.context.GlobalContextImpl;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForLazyResolveWithJava;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind;
@@ -37,7 +38,8 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory;
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactoryService;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -59,21 +61,24 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@Override
@NotNull
public AnalyzeExhaust analyzeFiles(@NotNull Project project,
public AnalyzeExhaust analyzeFiles(
@NotNull Project project,
@NotNull Collection<JetFile> files,
@NotNull List<AnalyzerScriptParameter> scriptParameters,
@NotNull Predicate<PsiFile> filesToAnalyzeCompletely) {
@NotNull Predicate<PsiFile> filesToAnalyzeCompletely
) {
return analyzeFilesWithJavaIntegration(project, files, scriptParameters, filesToAnalyzeCompletely, true);
}
@NotNull
@Override
public AnalyzeExhaust analyzeBodiesInFiles(@NotNull Project project,
@NotNull List<AnalyzerScriptParameter> scriptParameters,
@NotNull Predicate<PsiFile> filesForBodiesResolve,
@NotNull BindingTrace headersTraceContext,
@NotNull BodiesResolveContext bodiesResolveContext,
@NotNull ModuleDescriptor module
public AnalyzeExhaust analyzeBodiesInFiles(
@NotNull Project project,
@NotNull List<AnalyzerScriptParameter> scriptParameters,
@NotNull Predicate<PsiFile> filesForBodiesResolve,
@NotNull BindingTrace headersTraceContext,
@NotNull BodiesResolveContext bodiesResolveContext,
@NotNull ModuleDescriptor module
) {
return AnalyzerFacadeForEverything.analyzeBodiesInFilesWithJavaIntegration(
project, scriptParameters, filesForBodiesResolve,
@@ -95,10 +100,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
) {
GlobalContextImpl globalContext = ContextPackage.GlobalContext();
// TODO: Replace with stub declaration provider
FileBasedDeclarationProviderFactory declarationProviderFactory = new FileBasedDeclarationProviderFactory(
globalContext.getStorageManager(),
files);
DeclarationProviderFactory declarationProviderFactory =
DeclarationProviderFactoryService.createDeclarationProviderFactory(project, globalContext.getStorageManager(), files);
InjectorForLazyResolveWithJava resolveWithJava = new InjectorForLazyResolveWithJava(
project,
@@ -120,7 +123,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@NotNull
public static AnalyzeExhaust analyzeOneFileWithJavaIntegrationAndCheckForErrors(
JetFile file, List<AnalyzerScriptParameter> scriptParameters) {
JetFile file, List<AnalyzerScriptParameter> scriptParameters
) {
AnalyzingUtils.checkForSyntacticErrors(file);
AnalyzeExhaust analyzeExhaust = analyzeOneFileWithJavaIntegration(file, scriptParameters);
@@ -132,7 +136,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@NotNull
public static AnalyzeExhaust analyzeOneFileWithJavaIntegration(
JetFile file, List<AnalyzerScriptParameter> scriptParameters) {
JetFile file, List<AnalyzerScriptParameter> scriptParameters
) {
return analyzeFilesWithJavaIntegration(file.getProject(), Collections.singleton(file), scriptParameters,
Predicates.<PsiFile>alwaysTrue());
}
@@ -169,8 +174,12 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
@NotNull
public static AnalyzeExhaust analyzeFilesWithJavaIntegration(
Project project, Collection<JetFile> files, List<AnalyzerScriptParameter> scriptParameters, Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve) {
Project project,
Collection<JetFile> files,
List<AnalyzerScriptParameter> scriptParameters,
Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve
) {
BindingTraceContext bindingTraceContext = new BindingTraceContext();
return analyzeFilesWithJavaIntegration(project, files, bindingTraceContext, scriptParameters, filesToAnalyzeCompletely,
@@ -187,7 +196,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
boolean storeContextForBodiesResolve
) {
return analyzeFilesWithJavaIntegration(project, files, trace, scriptParameters, filesToAnalyzeCompletely,
storeContextForBodiesResolve, createJavaModule("<module>"));
storeContextForBodiesResolve, createJavaModule("<module>"), MemberFilter.ALWAYS_TRUE);
}
@NotNull
@@ -198,11 +207,12 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
List<AnalyzerScriptParameter> scriptParameters,
Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve,
ModuleDescriptorImpl module
ModuleDescriptorImpl module,
MemberFilter memberFilter
) {
GlobalContext globalContext = ContextPackage.GlobalContext();
return analyzeFilesWithJavaIntegrationInGlobalContext(project, files, trace, scriptParameters, filesToAnalyzeCompletely,
storeContextForBodiesResolve, module, globalContext);
storeContextForBodiesResolve, module, globalContext, memberFilter);
}
@NotNull
@@ -214,7 +224,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve,
ModuleDescriptorImpl module,
GlobalContext globalContext
GlobalContext globalContext,
MemberFilter memberFilter
) {
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
globalContext.getStorageManager(),
@@ -225,7 +236,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
scriptParameters
);
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module);
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module,
memberFilter);
try {
module.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
TopDownAnalysisContext topDownAnalysisContext = injector.getTopDownAnalyzer().analyzeFiles(topDownAnalysisParameters, files);

View File

@@ -25,7 +25,6 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.Collection;
@@ -53,12 +52,12 @@ public abstract class JetFilesProvider {
private final FqName name;
public SameJetFilePredicate(JetFile file) {
this.name = JetPsiUtil.getFQName(file);
this.name = file.getPackageFqName();
}
@Override
public boolean apply(PsiFile psiFile) {
return JetPsiUtil.getFQName((JetFile) psiFile).equals(name);
return ((JetFile) psiFile).getPackageFqName().equals(name);
}
}
}

View File

@@ -207,6 +207,7 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
altParamDescriptors.add(new ValueParameterDescriptorImpl(
originalParameterDescriptor.getContainingDeclaration(),
null,
originalParameterDescriptor.getIndex(),
originalParameterDescriptor.getAnnotations(),
altName != null ? altName : originalParameterDescriptor.getName(),

View File

@@ -222,6 +222,7 @@ public class SignaturesPropagationData {
resultParameters.add(new ValueParameterDescriptorImpl(
originalParam.getContainingDeclaration(),
null,
shouldBeExtension ? originalIndex - 1 : originalIndex,
originalParam.getAnnotations(),
stableName != null ? stableName : originalParam.getName(),

View File

@@ -76,7 +76,9 @@ public class TypeTransformingVisitor extends JetVisitor<JetType, Void> {
throw new AlternativeSignatureMismatchException("Auto type '%s' is not-null, while type in alternative signature is nullable: '%s'",
DescriptorRenderer.TEXT.renderType(originalType), nullableType.getText());
}
return TypeUtils.makeNullable(computeType(nullableType.getInnerType(), originalType, originalToAltTypeParameters, typeUsage));
JetTypeElement innerType = nullableType.getInnerType();
assert innerType != null : "Syntax error: " + nullableType.getText();
return TypeUtils.makeNullable(computeType(innerType, originalType, originalToAltTypeParameters, typeUsage));
}
@Override

View File

@@ -58,7 +58,7 @@ public class LazyResolveBasedCache() : JavaResolverCache {
return resolveSession.findInPackageFragments(fqName) { packageFragmentDescriptor ->
ResolveSessionUtils.findByQualifiedName(
packageFragmentDescriptor.getMemberScope(),
fqName.tail(packageFragmentDescriptor.getFqName()))
fqName.tail(packageFragmentDescriptor.fqName))
}
}

View File

@@ -10,7 +10,6 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" exported="" name="protobuf-java" level="project" />
<orderEntry type="library" name="trove4j" level="project" />
<orderEntry type="library" name="intellij-core" level="project" />
<orderEntry type="module" module-name="util.runtime" exported="" />
<orderEntry type="module" module-name="descriptors" exported="" />
</component>

View File

@@ -46,12 +46,12 @@ public class DescriptorDeserializer {
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull NameResolver nameResolver,
@NotNull DescriptorFinder descriptorFinder,
@NotNull Deserializers annotationDeserializer
@NotNull Deserializers deserializers
) {
return new DescriptorDeserializer(storageManager,
new TypeDeserializer(storageManager, null, nameResolver, descriptorFinder,
"Deserializer for " + containingDeclaration.getName(), NONE),
containingDeclaration, nameResolver, annotationDeserializer);
containingDeclaration, nameResolver, deserializers);
}
@NotNull
@@ -60,9 +60,9 @@ public class DescriptorDeserializer {
@NotNull TypeDeserializer typeDeserializer,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull NameResolver nameResolver,
@NotNull Deserializers annotationDeserializer
@NotNull Deserializers deserializers
) {
return new DescriptorDeserializer(storageManager, typeDeserializer, containingDeclaration, nameResolver, annotationDeserializer);
return new DescriptorDeserializer(storageManager, typeDeserializer, containingDeclaration, nameResolver, deserializers);
}
private final DeclarationDescriptor containingDeclaration;
@@ -136,14 +136,17 @@ public class DescriptorDeserializer {
private PropertyDescriptor loadProperty(@NotNull final Callable proto) {
final int flags = proto.getFlags();
PropertyDescriptorImpl property = new PropertyDescriptorImpl(
DeserializedPropertyDescriptor property = new DeserializedPropertyDescriptor(
containingDeclaration,
null,
getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY),
modality(Flags.MODALITY.get(flags)),
visibility(Flags.VISIBILITY.get(flags)),
Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR,
nameResolver.getName(proto.getName()),
memberKind(Flags.MEMBER_KIND.get(flags))
memberKind(Flags.MEMBER_KIND.get(flags)),
proto,
nameResolver
);
List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(proto.getTypeParameterCount());
@@ -162,11 +165,11 @@ public class DescriptorDeserializer {
int getterFlags = proto.getGetterFlags();
boolean isNotDefault = proto.hasGetterFlags() && Flags.IS_NOT_DEFAULT.get(getterFlags);
if (isNotDefault) {
getter = new PropertyGetterDescriptorImpl(
property, getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER),
modality(Flags.MODALITY.get(getterFlags)), visibility(Flags.VISIBILITY.get(getterFlags)),
isNotDefault, !isNotDefault, property.getKind()
);
getter = new PropertyGetterDescriptorImpl(property,
getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER),
modality(Flags.MODALITY.get(getterFlags)),
visibility(Flags.VISIBILITY.get(getterFlags)), isNotDefault, !isNotDefault,
property.getKind(), null);
}
else {
getter = DescriptorFactory.createDefaultGetter(property);
@@ -178,11 +181,11 @@ public class DescriptorDeserializer {
int setterFlags = proto.getSetterFlags();
boolean isNotDefault = proto.hasSetterFlags() && Flags.IS_NOT_DEFAULT.get(setterFlags);
if (isNotDefault) {
setter = new PropertySetterDescriptorImpl(
property, getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER),
modality(Flags.MODALITY.get(setterFlags)), visibility(Flags.VISIBILITY.get(setterFlags)),
isNotDefault, !isNotDefault, property.getKind()
);
setter = new PropertySetterDescriptorImpl(property,
getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER),
modality(Flags.MODALITY.get(setterFlags)),
visibility(Flags.VISIBILITY.get(setterFlags)), isNotDefault, !isNotDefault,
property.getKind(), null);
DescriptorDeserializer setterLocal = local.createChildDeserializer(setter, Collections.<TypeParameter>emptyList(),
Collections.<TypeParameterDescriptor>emptyList());
List<ValueParameterDescriptor> valueParameters = setterLocal.valueParameters(proto, AnnotatedCallableKind.PROPERTY_SETTER);
@@ -219,7 +222,7 @@ public class DescriptorDeserializer {
@NotNull
private CallableMemberDescriptor loadFunction(@NotNull Callable proto) {
int flags = proto.getFlags();
DeserializedSimpleFunctionDescriptor function = new DeserializedSimpleFunctionDescriptor(
DeserializedSimpleFunctionDescriptor function = DeserializedSimpleFunctionDescriptor.create(
containingDeclaration, proto,
deserializers,
nameResolver
@@ -247,7 +250,7 @@ public class DescriptorDeserializer {
@NotNull
private CallableMemberDescriptor loadConstructor(@NotNull Callable proto) {
ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
ConstructorDescriptorImpl descriptor = new ConstructorDescriptorImpl(
ConstructorDescriptorImpl descriptor = ConstructorDescriptorImpl.create(
classDescriptor,
getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION),
// TODO: primary
@@ -398,6 +401,7 @@ public class DescriptorDeserializer {
Callable.ValueParameter proto = protos.get(i);
result.add(new ValueParameterDescriptorImpl(
containingDeclaration,
null,
i,
getAnnotations(classOrPackage, callable, kind, proto),
nameResolver.getName(proto.getName()),

View File

@@ -16,12 +16,10 @@
package org.jetbrains.jet.descriptors.serialization;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.TypeProjection;
@@ -400,7 +398,7 @@ public class DescriptorSerializer {
public ProtoBuf.Package.Builder packageProto(@NotNull Collection<PackageFragmentDescriptor> fragments) {
ProtoBuf.Package.Builder builder = ProtoBuf.Package.newBuilder();
Collection<DeclarationDescriptor> members = Lists.newArrayList();
Collection<DeclarationDescriptor> members = new ArrayList<DeclarationDescriptor>();
for (PackageFragmentDescriptor fragment : fragments) {
members.addAll(fragment.getMemberScope().getAllDescriptors());
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.descriptors.serialization.descriptors
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor
public trait DeserializedCallableMemberDescriptor: CallableMemberDescriptor {
public val proto: ProtoBuf.Callable
public val nameResolver: NameResolver
}

View File

@@ -60,11 +60,11 @@ public abstract class DeserializedMemberScope implements JetScope {
private final MemoizedFunctionToNotNull<Name, Collection<VariableDescriptor>> properties;
private final NotNullLazyValue<Collection<DeclarationDescriptor>> allDescriptors;
public DeserializedMemberScope(
protected DeserializedMemberScope(
@NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull DescriptorDeserializer deserializer,
@NotNull List<ProtoBuf.Callable> membersList
@NotNull Collection<ProtoBuf.Callable> membersList
) {
this.containingDeclaration = containingDeclaration;
this.deserializer = deserializer;
@@ -245,4 +245,4 @@ public abstract class DeserializedMemberScope implements JetScope {
p.popIndent();
p.println("}");
}
}
}

View File

@@ -19,13 +19,18 @@ package org.jetbrains.jet.descriptors.serialization.descriptors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.StorageManager;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class DeserializedPackageMemberScope extends DeserializedMemberScope {
private final DescriptorFinder descriptorFinder;
@@ -36,13 +41,14 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@NotNull StorageManager storageManager,
@NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull Deserializers deserializers,
@NotNull MemberFilter memberFilter,
@NotNull DescriptorFinder descriptorFinder,
@NotNull ProtoBuf.Package proto,
@NotNull NameResolver nameResolver
) {
super(storageManager, packageDescriptor,
DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, deserializers),
proto.getMemberList());
getFilteredMembers(packageDescriptor, proto, memberFilter, nameResolver));
this.descriptorFinder = descriptorFinder;
this.packageFqName = packageDescriptor.getFqName();
}
@@ -51,10 +57,11 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@NotNull StorageManager storageManager,
@NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull Deserializers deserializers,
@NotNull MemberFilter memberFilter,
@NotNull DescriptorFinder descriptorFinder,
@NotNull PackageData packageData
) {
this(storageManager, packageDescriptor, deserializers, descriptorFinder, packageData.getPackageProto(),
this(storageManager, packageDescriptor, deserializers, memberFilter, descriptorFinder, packageData.getPackageProto(),
packageData.getNameResolver());
}
@@ -85,4 +92,20 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
protected ReceiverParameterDescriptor getImplicitReceiver() {
return null;
}
@NotNull
private static Collection<ProtoBuf.Callable> getFilteredMembers(
@NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull ProtoBuf.Package packageProto,
@NotNull MemberFilter memberFilter,
@NotNull NameResolver nameResolver
) {
List<ProtoBuf.Callable> result = new ArrayList<ProtoBuf.Callable>();
for (ProtoBuf.Callable member : packageProto.getMemberList()) {
if (memberFilter.acceptPackagePartClass(packageDescriptor, member, nameResolver)) {
result.add(member);
}
}
return result;
}
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.descriptors.serialization.descriptors
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.Modality
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.descriptors.annotations.Annotations
import org.jetbrains.jet.lang.descriptors.Visibility
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind
public class DeserializedPropertyDescriptor(
containingDeclaration: DeclarationDescriptor,
original: PropertyDescriptor?,
annotations: Annotations,
modality: Modality,
visibility: Visibility,
isVar: Boolean,
name: Name,
kind: Kind,
override public val proto: ProtoBuf.Callable,
override public val nameResolver: NameResolver
) : DeserializedCallableMemberDescriptor,
PropertyDescriptorImpl(containingDeclaration, original, annotations, modality, visibility, isVar, name, kind) {
override fun createSubstitutedCopy(
newOwner: DeclarationDescriptor,
newModality: Modality,
newVisibility: Visibility,
original: PropertyDescriptor?,
kind: Kind
): PropertyDescriptorImpl {
return DeserializedPropertyDescriptor(
newOwner, original, getAnnotations(), newModality, newVisibility, isVar(), getName(), kind, proto, nameResolver)
}
}

View File

@@ -17,87 +17,53 @@
package org.jetbrains.jet.descriptors.serialization.descriptors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.DescriptorDeserializer;
import org.jetbrains.jet.descriptors.serialization.Flags;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
import org.jetbrains.jet.lang.descriptors.impl.FunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.resolve.name.Name;
public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescriptorImpl {
public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescriptorImpl implements DeserializedCallableMemberDescriptor {
private final ProtoBuf.Callable functionProto;
private final ProtoBuf.Callable proto;
private final NameResolver nameResolver;
private DeserializedSimpleFunctionDescriptor(
@NotNull DeclarationDescriptor containingDeclaration,
@Nullable SimpleFunctionDescriptor original,
@NotNull Annotations annotations,
@NotNull Name name,
@NotNull Kind kind,
@NotNull ProtoBuf.Callable functionProto,
@NotNull NameResolver nameResolver
) {
super(containingDeclaration, annotations, name, kind);
this.functionProto = functionProto;
this.nameResolver = nameResolver;
}
private DeserializedSimpleFunctionDescriptor(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull SimpleFunctionDescriptor original,
@NotNull Annotations annotations,
@NotNull Name name,
@NotNull Kind kind,
@NotNull ProtoBuf.Callable functionProto,
@NotNull ProtoBuf.Callable proto,
@NotNull NameResolver nameResolver) {
super(containingDeclaration, original, annotations, name, kind);
this.functionProto = functionProto;
this.proto = proto;
this.nameResolver = nameResolver;
}
public DeserializedSimpleFunctionDescriptor(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull ProtoBuf.Callable functionProto,
@NotNull Deserializers deserializers,
@NotNull NameResolver nameResolver
) {
this(containingDeclaration,
DescriptorDeserializer.getAnnotations(containingDeclaration, functionProto, functionProto.getFlags(),
Deserializers.AnnotatedCallableKind.FUNCTION, deserializers.getAnnotationDeserializer(),
nameResolver),
nameResolver.getName(functionProto.getName()),
DescriptorDeserializer.memberKind(Flags.MEMBER_KIND.get(functionProto.getFlags())),
functionProto,
nameResolver);
}
@NotNull
@Override
protected FunctionDescriptorImpl createSubstitutedCopy(DeclarationDescriptor newOwner, boolean preserveOriginal, Kind kind) {
if (preserveOriginal) {
return new DeserializedSimpleFunctionDescriptor(
newOwner,
getOriginal(),
getAnnotations(),
getName(),
kind,
functionProto,
nameResolver
);
}
else {
return new DeserializedSimpleFunctionDescriptor(
newOwner,
getAnnotations(),
getName(),
kind,
functionProto,
nameResolver
);
}
protected FunctionDescriptorImpl createSubstitutedCopy(
@NotNull DeclarationDescriptor newOwner,
@Nullable FunctionDescriptor original,
@NotNull Kind kind
) {
return new DeserializedSimpleFunctionDescriptor(
newOwner,
(DeserializedSimpleFunctionDescriptor) original,
getAnnotations(),
getName(),
kind,
proto,
nameResolver
);
}
@NotNull
@@ -106,11 +72,35 @@ public class DeserializedSimpleFunctionDescriptor extends SimpleFunctionDescript
return (DeserializedSimpleFunctionDescriptor) super.getOriginal();
}
public ProtoBuf.Callable getFunctionProto() {
return functionProto;
@NotNull
@Override
public ProtoBuf.Callable getProto() {
return proto;
}
@NotNull
@Override
public NameResolver getNameResolver() {
return nameResolver;
}
public static DeserializedSimpleFunctionDescriptor create(
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull ProtoBuf.Callable proto,
@NotNull Deserializers deserializers,
@NotNull NameResolver nameResolver
) {
Annotations annotations = DescriptorDeserializer.getAnnotations(containingDeclaration, proto, proto.getFlags(),
Deserializers.AnnotatedCallableKind.FUNCTION,
deserializers.getAnnotationDeserializer(),
nameResolver);
return new DeserializedSimpleFunctionDescriptor(
containingDeclaration,
null,
annotations,
nameResolver.getName(proto.getName()),
DescriptorDeserializer.memberKind(Flags.MEMBER_KIND.get(proto.getFlags())),
proto,
nameResolver);
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.descriptors.serialization.descriptors
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
public trait MemberFilter {
fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean
class object {
public val ALWAYS_TRUE: MemberFilter = object : MemberFilter {
override fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean = true
}
}
}

View File

@@ -50,7 +50,7 @@ public interface JetNodeTypes {
IElementType VALUE_PARAMETER_LIST = JetStubElementTypes.VALUE_PARAMETER_LIST;
IElementType VALUE_PARAMETER = JetStubElementTypes.VALUE_PARAMETER;
JetNodeType CLASS_BODY = new JetNodeType("CLASS_BODY", JetClassBody.class);
IElementType CLASS_BODY = JetStubElementTypes.CLASS_BODY;
JetNodeType IMPORT_LIST = new JetNodeType("IMPORT_LIST", JetImportList.class);
JetNodeType IMPORT_DIRECTIVE = new JetNodeType("IMPORT_DIRECTIVE", JetImportDirective.class);
JetNodeType MODIFIER_LIST = new JetNodeType("MODIFIER_LIST", JetModifierList.class);
@@ -108,7 +108,6 @@ public interface JetNodeTypes {
JetNodeType FOR = new JetNodeType("FOR", JetForExpression.class);
JetNodeType WHILE = new JetNodeType("WHILE", JetWhileExpression.class);
JetNodeType DO_WHILE = new JetNodeType("DO_WHILE", JetDoWhileExpression.class);
JetNodeType LOOP_PARAMETER = new JetNodeType("LOOP_PARAMETER", JetParameter.class); // TODO: Do we need separate type?
JetNodeType LOOP_RANGE = new JetNodeType("LOOP_RANGE", JetContainerNode.class);
JetNodeType BODY = new JetNodeType("BODY", JetContainerNode.class);
JetNodeType BLOCK = new JetNodeType("BLOCK", JetBlockExpression.class);
@@ -147,6 +146,8 @@ public interface JetNodeTypes {
JetNodeType WHEN_CONDITION_EXPRESSION = new JetNodeType("WHEN_CONDITION_WITH_EXPRESSION", JetWhenConditionWithExpression.class);
JetNodeType PACKAGE_DIRECTIVE = new JetNodeType("PACKAGE_DIRECTIVE", JetPackageDirective.class);
// SCRIPT: script node type
JetNodeType SCRIPT = new JetNodeType("SCRIPT", JetScript.class);
IFileElementType TYPE_CODE_FRAGMENT = new JetTypeCodeFragmentType();

View File

@@ -120,7 +120,8 @@ public class InjectorForBodyResolve {
this.bodyResolver.setTrace(bindingTrace);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setStorageManager(storageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);

View File

@@ -115,7 +115,8 @@ public class InjectorForLazyResolve {
this.resolveSession.setTypeResolver(typeResolver);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setStorageManager(lockBasedStorageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);

View File

@@ -21,14 +21,12 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingComponents;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.storage.StorageManager;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.DelegatedPropertyResolver;
@@ -36,6 +34,8 @@ import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.types.expressions.ControlStructureTypingUtils;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
import org.jetbrains.jet.lang.types.expressions.ForLoopConventionsChecker;
import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -48,14 +48,12 @@ public class InjectorForMacros {
private final PlatformToKotlinClassMap platformToKotlinClassMap;
private final ExpressionTypingServices expressionTypingServices;
private final ExpressionTypingComponents expressionTypingComponents;
private final CallResolver callResolver;
private final GlobalContext globalContext;
private final StorageManager storageManager;
private final AnnotationResolver annotationResolver;
private final CallResolver callResolver;
private final ArgumentTypeResolver argumentTypeResolver;
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final CandidateResolver candidateResolver;
private final CallExpressionResolver callExpressionResolver;
private final DescriptorResolver descriptorResolver;
private final DelegatedPropertyResolver delegatedPropertyResolver;
@@ -63,6 +61,8 @@ public class InjectorForMacros {
private final ControlStructureTypingUtils controlStructureTypingUtils;
private final ExpressionTypingUtils expressionTypingUtils;
private final ForLoopConventionsChecker forLoopConventionsChecker;
private final ArgumentTypeResolver argumentTypeResolver;
private final CandidateResolver candidateResolver;
public InjectorForMacros(
@NotNull Project project,
@@ -73,21 +73,21 @@ public class InjectorForMacros {
this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap();
this.expressionTypingComponents = new ExpressionTypingComponents();
this.expressionTypingServices = new ExpressionTypingServices(getExpressionTypingComponents());
this.callResolver = new CallResolver();
this.globalContext = org.jetbrains.jet.context.ContextPackage.GlobalContext();
this.storageManager = globalContext.getStorageManager();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
this.argumentTypeResolver = new ArgumentTypeResolver();
this.typeResolver = new TypeResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.candidateResolver = new CandidateResolver();
this.callExpressionResolver = new CallExpressionResolver();
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.controlStructureTypingUtils = new ControlStructureTypingUtils(getExpressionTypingServices());
this.expressionTypingUtils = new ExpressionTypingUtils(getExpressionTypingServices(), callResolver);
this.expressionTypingUtils = new ExpressionTypingUtils(getExpressionTypingServices(), getCallResolver());
this.forLoopConventionsChecker = new ForLoopConventionsChecker();
this.argumentTypeResolver = new ArgumentTypeResolver();
this.candidateResolver = new CandidateResolver();
this.expressionTypingServices.setAnnotationResolver(annotationResolver);
this.expressionTypingServices.setCallExpressionResolver(callExpressionResolver);
@@ -105,23 +105,19 @@ public class InjectorForMacros {
this.expressionTypingComponents.setGlobalContext(globalContext);
this.expressionTypingComponents.setPlatformToKotlinClassMap(platformToKotlinClassMap);
this.callResolver.setArgumentTypeResolver(argumentTypeResolver);
this.callResolver.setCandidateResolver(candidateResolver);
this.callResolver.setExpressionTypingServices(expressionTypingServices);
this.callResolver.setTypeResolver(typeResolver);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setTypeResolver(typeResolver);
argumentTypeResolver.setExpressionTypingServices(expressionTypingServices);
argumentTypeResolver.setTypeResolver(typeResolver);
annotationResolver.setStorageManager(storageManager);
annotationResolver.setTypeResolver(typeResolver);
typeResolver.setAnnotationResolver(annotationResolver);
typeResolver.setModuleDescriptor(moduleDescriptor);
typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
callExpressionResolver.setExpressionTypingServices(expressionTypingServices);
descriptorResolver.setAnnotationResolver(annotationResolver);
@@ -137,6 +133,11 @@ public class InjectorForMacros {
forLoopConventionsChecker.setExpressionTypingUtils(expressionTypingUtils);
forLoopConventionsChecker.setProject(project);
argumentTypeResolver.setExpressionTypingServices(expressionTypingServices);
argumentTypeResolver.setTypeResolver(typeResolver);
candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
}
@PreDestroy
@@ -151,4 +152,8 @@ public class InjectorForMacros {
return this.expressionTypingComponents;
}
public CallResolver getCallResolver() {
return this.callResolver;
}
}

View File

@@ -145,6 +145,7 @@ public class InjectorForTopDownAnalyzerBasic {
this.topDownAnalyzer.setOverloadResolver(overloadResolver);
this.topDownAnalyzer.setOverrideResolver(overrideResolver);
this.topDownAnalyzer.setPackageFragmentProvider(mutablePackageFragmentProvider);
this.topDownAnalyzer.setProject(project);
this.topDownAnalyzer.setScriptHeaderResolver(scriptHeaderResolver);
this.topDownAnalyzer.setTrace(bindingTrace);
this.topDownAnalyzer.setTypeHierarchyResolver(typeHierarchyResolver);
@@ -160,7 +161,8 @@ public class InjectorForTopDownAnalyzerBasic {
bodyResolver.setTrace(bindingTrace);
annotationResolver.setCallResolver(callResolver);
annotationResolver.setExpressionTypingServices(expressionTypingServices);
annotationResolver.setStorageManager(storageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCandidateResolver(candidateResolver);

View File

@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.CompileTimeConstantUtils;
import org.jetbrains.jet.lang.resolve.calls.model.DottedCallInfo;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument;
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
@@ -784,6 +785,11 @@ public class JetControlFlowProcessor {
generateInstructions(selectorExpression, NOT_IN_CONDITION);
DottedCallInfo dottedCallInfo = trace.get(BindingContext.DOTTED_CALL_INFO, selectorExpression);
if (dottedCallInfo != null) {
generateInstructions((JetCallExpression) dottedCallInfo.getCall().getCallElement(), NOT_IN_CONDITION);
}
// receiver was generated for resolvedCall
JetExpression calleeExpression = JetPsiUtil.getCalleeExpressionIfAny(selectorExpression);
if (calleeExpression == null || getResolvedCall(calleeExpression) == null) {

View File

@@ -16,14 +16,12 @@
package org.jetbrains.jet.lang.evaluate
import com.intellij.psi.tree.IElementType
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.*
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall
import org.jetbrains.jet.lang.resolve.constants.*
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.types.expressions.OperatorConventions
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
@@ -36,7 +34,6 @@ import java.math.BigInteger
import org.jetbrains.jet.lang.diagnostics.Errors
import com.intellij.psi.util.PsiTreeUtil
[suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")]
public class ConstantExpressionEvaluator private (val trace: BindingTrace) : JetVisitor<CompileTimeConstant<*>, JetType>() {
class object {
@@ -166,16 +163,15 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
return createCompileTimeConstant(result, expectedType)
}
else {
return evaluateCall(expression, expression.getOperationReference(), leftExpression, expectedType)
return evaluateCall(expression.getOperationReference(), leftExpression, expectedType)
}
}
private fun evaluateCall(fullExpression: JetExpression, callExpression: JetExpression, receiverExpression: JetExpression, expectedType: JetType?): CompileTimeConstant<*>? {
private fun evaluateCall(callExpression: JetExpression, receiverExpression: JetExpression, expectedType: JetType?): CompileTimeConstant<*>? {
val resolvedCall = trace.getBindingContext().get(BindingContext.RESOLVED_CALL, callExpression)
if (resolvedCall == null) return null
val resultingDescriptorName = resolvedCall.getResultingDescriptor()?.getName()
if (resultingDescriptorName == null) return null
val resultingDescriptorName = resolvedCall.getResultingDescriptor().getName()
val argumentForReceiver = createOperationArgumentForReceiver(resolvedCall, receiverExpression)
if (argumentForReceiver == null) return null
@@ -285,7 +281,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
val leftExpression = expression.getBaseExpression()
if (leftExpression == null) return null
return evaluateCall(expression, expression.getOperationReference(), leftExpression, expectedType)
return evaluateCall(expression.getOperationReference(), leftExpression, expectedType)
}
override fun visitSimpleNameExpression(expression: JetSimpleNameExpression, expectedType: JetType?): CompileTimeConstant<*>? {
@@ -323,7 +319,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
}
val receiverExpression = expression.getReceiverExpression()
return evaluateCall(expression, calleeExpression, receiverExpression, expectedType)
return evaluateCall(calleeExpression, receiverExpression, expectedType)
}
// MyEnum.A, Integer.MAX_VALUE
@@ -339,7 +335,6 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
if (call == null) return null
val resultingDescriptor = call.getResultingDescriptor()
if (resultingDescriptor == null) return null
// array()
if (CompileTimeConstantUtils.isArrayMethodCall(call)) {
@@ -355,7 +350,7 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
if (DescriptorUtils.isAnnotationClass(classDescriptor)) {
val descriptor = AnnotationDescriptorImpl()
descriptor.setAnnotationType(classDescriptor.getDefaultType())
AnnotationResolver.resolveAnnotationArgument(descriptor, call, trace)
AnnotationResolver.resolveAnnotationArguments(descriptor, call, trace)
return AnnotationValue(descriptor)
}
}

View File

@@ -1374,7 +1374,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
advance(); // COLON
myJetParsing.parseTypeRef(TokenSet.create(IN_KEYWORD));
}
parameter.done(LOOP_PARAMETER);
parameter.done(VALUE_PARAMETER);
}
expect(IN_KEYWORD, "Expecting 'in'", TokenSet.create(LPAR, LBRACE));

View File

@@ -26,7 +26,6 @@ import org.jetbrains.annotations.NotNull;
public class JetParser implements PsiParser {
public static final String STD_SCRIPT_EXT = "." + JetParserDefinition.KTSCRIPT_FILE_SUFFIX;
private final JetScriptDefinitionProvider scriptDefinitionProvider;
public JetParser(Project project) {
@@ -43,7 +42,8 @@ public class JetParser implements PsiParser {
@NotNull
public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder, PsiFile psiFile) {
JetParsing jetParsing = JetParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder));
if (scriptDefinitionProvider != null && scriptDefinitionProvider.isScript(psiFile) || psiFile.getName().endsWith(STD_SCRIPT_EXT)) {
if (scriptDefinitionProvider != null && scriptDefinitionProvider.isScript(psiFile)
|| psiFile.getName().endsWith(JetParserDefinition.STD_SCRIPT_EXT)) {
jetParsing.parseScript();
}
else {

View File

@@ -40,7 +40,8 @@ import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.plugin.JetLanguage;
public class JetParserDefinition implements ParserDefinition {
public static final String KTSCRIPT_FILE_SUFFIX = "ktscript";
public static final String STD_SCRIPT_SUFFIX = "kts";
public static final String STD_SCRIPT_EXT = "." + STD_SCRIPT_SUFFIX;
public JetParserDefinition() {
//todo: ApplicationManager.getApplication() is null during JetParsingTest setting up

View File

@@ -50,7 +50,8 @@ public class JetParsing extends AbstractJetParsing {
private static final TokenSet IMPORT_RECOVERY_SET = TokenSet.create(AS_KEYWORD, DOT, EOL_OR_SEMICOLON);
/*package*/ static final TokenSet TYPE_REF_FIRST = TokenSet.create(LBRACKET, IDENTIFIER, FUN_KEYWORD, LPAR, CAPITALIZED_THIS_KEYWORD, HASH);
private static final TokenSet RECEIVER_TYPE_TERMINATORS = TokenSet.create(DOT, SAFE_ACCESS);
private static final TokenSet VALUE_PARAMETER_FIRST = TokenSet.orSet(TokenSet.create(IDENTIFIER, LBRACKET), MODIFIER_KEYWORDS);
private static final TokenSet VALUE_PARAMETER_FIRST =
TokenSet.orSet(TokenSet.create(IDENTIFIER, LBRACKET, VAL_KEYWORD, VAR_KEYWORD), MODIFIER_KEYWORDS);
static JetParsing createForTopLevel(SemanticWhitespaceAwarePsiBuilder builder) {
JetParsing jetParsing = new JetParsing(builder);

View File

@@ -29,10 +29,10 @@ public class JetScriptDefinitionProvider {
private final HashMap<String,JetScriptDefinition> scripts = new HashMap<String, JetScriptDefinition>();
private final HashSet<PsiFile> scriptsFiles = new HashSet<PsiFile>();
private static final JetScriptDefinition standardScript = new JetScriptDefinition(".ktscript", Collections.<AnalyzerScriptParameter>emptyList());
private static final JetScriptDefinition standardScript = new JetScriptDefinition(JetParserDefinition.STD_SCRIPT_EXT, Collections.<AnalyzerScriptParameter>emptyList());
public JetScriptDefinitionProvider() {
// .ktscript will take analyzer parameters explicitly specified on compilation
// .kts will take analyzer parameters explicitly specified on compilation
addScriptDefinition(standardScript);
}

View File

@@ -17,7 +17,6 @@
package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.stubs.IStubElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
@@ -32,12 +31,6 @@ public class JetAnnotationEntry extends JetElementImplStub<PsiJetAnnotationStub>
super(node);
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.ANNOTATION_ENTRY;
}
public JetAnnotationEntry(@NotNull PsiJetAnnotationStub stub) {
super(stub, JetStubElementTypes.ANNOTATION_ENTRY);
}

View File

@@ -22,7 +22,6 @@ import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
@@ -165,12 +164,6 @@ public class JetClass extends JetTypeParameterListOwnerStub<PsiJetClassStub> imp
return hasModifier(JetTokens.INNER_KEYWORD);
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.CLASS;
}
@Override
public void delete() throws IncorrectOperationException {
JetPsiUtil.deleteClass(this);
@@ -205,7 +198,7 @@ public class JetClass extends JetTypeParameterListOwnerStub<PsiJetClassStub> imp
}
PsiFile file = getContainingFile();
if (!(file instanceof JetFile)) return null;
String fileQualifiedName = ((JetFile) file).getPackageDirective().getQualifiedName();
String fileQualifiedName = ((JetFile) file).getPackageFqName().asString();
if (!fileQualifiedName.isEmpty()) {
parts.add(fileQualifiedName);
}

View File

@@ -18,20 +18,27 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassBodyStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.List;
public class JetClassBody extends JetElementImpl implements JetDeclarationContainer {
public class JetClassBody extends JetElementImplStub<PsiJetClassBodyStub> implements JetDeclarationContainer {
public JetClassBody(@NotNull ASTNode node) {
super(node);
}
public JetClassBody(@NotNull PsiJetClassBodyStub stub) {
super(stub, JetStubElementTypes.CLASS_BODY);
}
@Override
@NotNull
public List<JetDeclaration> getDeclarations() {

View File

@@ -45,7 +45,7 @@ public class JetElementImplStub<T extends StubElement> extends StubBasedPsiEleme
@Override
public String toString() {
return getNode().getElementType().toString();
return getElementType().toString();
}
@Override

View File

@@ -18,13 +18,11 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import java.util.Collections;
import java.util.List;
@@ -55,12 +53,6 @@ public class JetEnumEntry extends JetClass {
return nameAsDeclaration == null ? null : nameAsDeclaration.getNameIdentifier();
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.ENUM_ENTRY;
}
@Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
JetObjectDeclarationName nameAsDeclaration = getNameAsDeclaration();

View File

@@ -25,11 +25,11 @@ import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiClassOwner;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.stubs.PsiJetFileStub;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.JetFileType;
import org.jetbrains.jet.plugin.JetLanguage;
@@ -92,23 +92,32 @@ public class JetFile extends PsiFileBase implements JetDeclarationContainer, Jet
return null;
}
// scripts have no package directive
// scripts have no package directive, all other files must have package directives
@Nullable
public JetPackageDirective getPackageDirective() {
ASTNode ast = getNode().findChildByType(JetNodeTypes.PACKAGE_DIRECTIVE);
return ast != null ? (JetPackageDirective) ast.getPsi() : null;
}
@Deprecated // getPackageFqName should be used instead
@Override
@Nullable
@NotNull
public String getPackageName() {
return getPackageFqName().asString();
}
@NotNull
public FqName getPackageFqName() {
PsiJetFileStub stub = (PsiJetFileStub) getStub();
if (stub != null) {
return stub.getPackageName();
return stub.getPackageFqName();
}
JetPackageDirective directive = getPackageDirective();
return directive != null ? directive.getQualifiedName() : null;
JetPackageDirective packageDirective = getPackageDirective();
if (packageDirective == null) {
return FqName.ROOT;
}
return packageDirective.getFqName();
}
@NotNull
@@ -120,6 +129,7 @@ public class JetFile extends PsiFileBase implements JetDeclarationContainer, Jet
@Override
public void setPackageName(String packageName) { }
// SCRIPT: find script in file
@Nullable
public JetScript getScript() {
return PsiTreeUtil.getChildOfType(this, JetScript.class);

View File

@@ -34,7 +34,7 @@ public class JetForExpression extends JetLoopExpression {
@Nullable
public JetParameter getLoopParameter() {
return (JetParameter) findChildByType(JetNodeTypes.LOOP_PARAMETER);
return (JetParameter) findChildByType(JetNodeTypes.VALUE_PARAMETER);
}
@Nullable

View File

@@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lexer.JetTokens;
public class JetFunctionLiteral extends JetFunctionNotStubbed {
@@ -66,4 +67,10 @@ public class JetFunctionLiteral extends JetFunctionNotStubbed {
public ASTNode getArrowNode() {
return getNode().findChildByType(JetTokens.ARROW);
}
@Nullable
@Override
public FqName getFqName() {
return null;
}
}

View File

@@ -21,6 +21,7 @@ import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lexer.JetTokens;
import static org.jetbrains.jet.lexer.JetTokens.VAL_KEYWORD;
@@ -63,4 +64,10 @@ public class JetMultiDeclarationEntry extends JetNamedDeclarationNotStubbed impl
public ASTNode getValOrVarNode() {
return getParentNode().findChildByType(TokenSet.create(VAL_KEYWORD, VAR_KEYWORD));
}
@Nullable
@Override
public FqName getFqName() {
return null;
}
}

View File

@@ -19,9 +19,12 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.psi.PsiNameIdentifierOwner;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
public interface JetNamedDeclaration extends JetDeclaration, PsiNameIdentifierOwner, JetStatementExpression, JetNamed {
@NotNull
Name getNameAsSafeName();
@Nullable
FqName getFqName();
}

View File

@@ -21,14 +21,16 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.stubs.NamedStub;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.stubs.PsiJetStubWithFqName;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lexer.JetTokens;
abstract class JetNamedDeclarationStub<T extends NamedStub> extends JetDeclarationStub<T> implements JetNamedDeclaration {
abstract class JetNamedDeclarationStub<T extends PsiJetStubWithFqName> extends JetDeclarationStub<T> implements JetNamedDeclaration {
public JetNamedDeclarationStub(@NotNull T stub, @NotNull IStubElementType nodeType) {
super(stub, nodeType);
}
@@ -92,4 +94,14 @@ abstract class JetNamedDeclarationStub<T extends NamedStub> extends JetDeclarati
return super.getUseScope();
}
@Nullable
@Override
public FqName getFqName() {
T stub = getStub();
if (stub != null) {
return stub.getFqName();
}
return JetNamedDeclarationUtil.getFQName(this);
}
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.psi;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
public final class JetNamedDeclarationUtil {
@Nullable
public static FqNameUnsafe getUnsafeFQName(@NotNull JetNamedDeclaration namedDeclaration) {
FqName fqName = namedDeclaration.getFqName();
return fqName != null ? fqName.toUnsafe() : null;
}
@Nullable
//NOTE: use JetNamedDeclaration#getFqName instead
/*package private*/ static FqName getFQName(@NotNull JetNamedDeclaration namedDeclaration) {
Name name = namedDeclaration.getNameAsName();
if (name == null) {
return null;
}
FqName parentFqName = getParentFqName(namedDeclaration);
if (parentFqName == null) {
return null;
}
return parentFqName.child(name);
}
@Nullable
public static FqName getParentFqName(@NotNull JetNamedDeclaration namedDeclaration) {
PsiElement parent = namedDeclaration.getParent();
if (parent instanceof JetClassBody) {
// One nesting to JetClassBody doesn't affect to qualified name
parent = parent.getParent();
}
if (parent instanceof JetFile) {
return ((JetFile) parent).getPackageFqName();
}
else if (parent instanceof JetNamedFunction || parent instanceof JetClass) {
return getFQName((JetNamedDeclaration) parent);
}
else if (namedDeclaration instanceof JetParameter) {
JetClass constructorClass = JetPsiUtil.getClassIfParameterIsProperty((JetParameter) namedDeclaration);
if (constructorClass != null) {
return getFQName(constructorClass);
}
}
else if (parent instanceof JetObjectDeclaration) {
if (parent.getParent() instanceof JetClassObject) {
JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(parent, JetClassOrObject.class);
if (classOrObject != null) {
return getFQName(classOrObject);
}
}
else {
return getFQName((JetNamedDeclaration) parent);
}
}
return null;
}
private JetNamedDeclarationUtil() {
}
}

View File

@@ -20,7 +20,6 @@ import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
@@ -28,8 +27,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.JetNodeTypes;
import org.jetbrains.jet.lang.psi.stubs.PsiJetFunctionStub;
import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.Collections;
@@ -77,41 +74,6 @@ public class JetNamedFunction extends JetTypeParameterListOwnerStub<PsiJetFuncti
return PsiTreeUtil.getNextSiblingOfType(getEqualsToken(), JetExpression.class);
}
/**
* Returns full qualified name for function "package_fqn.function_name"
* Not null for top level functions unless syntax errors are present.
* @return
*/
@Nullable
public FqName getFqName() {
PsiJetFunctionStub stub = getStub();
if (stub != null) {
return stub.getTopFQName();
}
PsiElement parent = getParent();
if (parent instanceof JetFile) {
// fqname is different in scripts
if (((JetFile) parent).getPackageDirective() == null) {
return null;
}
JetFile jetFile = (JetFile) parent;
FqName fileFQN = JetPsiUtil.getFQName(jetFile);
Name nameAsName = getNameAsName();
if (nameAsName != null) {
return fileFQN.child(nameAsName);
}
}
return null;
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.FUNCTION;
}
@Override
public ItemPresentation getPresentation() {
return ItemPresentationProviders.getItemPresentation(this);

View File

@@ -18,8 +18,10 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lexer.JetTokens;
import java.util.Collections;
import java.util.List;
public class JetNullableType extends JetTypeElement {
@@ -35,7 +37,8 @@ public class JetNullableType extends JetTypeElement {
@NotNull
@Override
public List<JetTypeReference> getTypeArgumentsAsTypes() {
return getInnerType().getTypeArgumentsAsTypes();
JetTypeElement innerType = getInnerType();
return innerType == null ? Collections.<JetTypeReference>emptyList() : innerType.getTypeArgumentsAsTypes();
}
@Override
@@ -43,7 +46,8 @@ public class JetNullableType extends JetTypeElement {
return visitor.visitNullableType(this, data);
}
@NotNull
@Nullable
@IfNotParsed
public JetTypeElement getInnerType() {
return findChildByClass(JetTypeElement.class);
}

View File

@@ -20,7 +20,6 @@ import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -44,12 +43,6 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub<PsiJetObjectSt
super(stub, JetStubElementTypes.OBJECT_DECLARATION);
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.OBJECT_DECLARATION;
}
@Override
public String getName() {
PsiJetObjectStub stub = getStub();
@@ -61,19 +54,6 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub<PsiJetObjectSt
return nameAsDeclaration == null ? null : nameAsDeclaration.getName();
}
/**
* Could be null for anonymous objects and object declared inside functions
* @return
*/
public FqName getFqName() {
PsiJetObjectStub stub = getStub();
if (stub != null) {
return stub.getFqName();
}
return JetPsiUtil.getFQName(this);
}
public boolean isTopLevel() {
PsiJetObjectStub stub = getStub();
if (stub != null) {

View File

@@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.ItemPresentationProviders;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.util.ArrayFactory;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -42,14 +41,8 @@ public class JetParameter extends JetNamedDeclarationStub<PsiJetParameterStub> {
super(node);
}
public JetParameter(@NotNull PsiJetParameterStub stub, @NotNull IStubElementType nodeType) {
super(stub, nodeType);
}
@NotNull
@Override
public IStubElementType getElementType() {
return JetStubElementTypes.VALUE_PARAMETER;
public JetParameter(@NotNull PsiJetParameterStub stub) {
super(stub, JetStubElementTypes.VALUE_PARAMETER);
}
@Override
@@ -108,4 +101,8 @@ public class JetParameter extends JetNamedDeclarationStub<PsiJetParameterStub> {
public ItemPresentation getPresentation() {
return ItemPresentationProviders.getItemPresentation(this);
}
public boolean isLoopParameter() {
return getParent() instanceof JetForExpression;
}
}

Some files were not shown because too many files have changed in this diff Show More