Compare commits

..

807 Commits

Author SHA1 Message Date
Andrey Uskov
00708e8002 Improved performance of MPP projects import
#KT-39059 Fixed

(cherry picked from commit e6165ed785)
2020-06-22 11:37:01 +03:00
Lilia
5efcbacff3 Add changelog for 1.3.72 IDE plugind update 2020-06-17 15:28:54 +02:00
Sergey Rostov
3368369139 JPS: ignore removed java files
#KT-27458 Fixed

(cherry picked from commit 800fcc511a)
2020-06-16 17:47:02 +03:00
Alexey Tsvetkov
616119e551 Remove dirty output files when expanding IC scope early
Previously IC could go to the next iteration without removing
outputs for the files compiled during the last iteration.
For example, it could happen, when a multifile part is changed
(we add sources for other parts and recompile everything together).

In case of MPP it could lead to compile error, because
the compiler would see the same actual declarations from dirty sources
and dirty outputs from previous iteration (which should have been removed).
That behaviour did not raise an error before dc8240c24e
because actual declarations from binaries (e.g. compile classpath) were ignored.

    #KT-35957 Fixed
2020-06-16 15:37:40 +03:00
Mikhail Bogdanov
bba2967156 Don't use labels for caching
Avoid new objects creation

(cherry picked from commit fe4bb24a3e)
2020-06-16 11:55:28 +02:00
Mikhail Bogdanov
b393308944 Fix compilation with ASM 8
General rule to use linkedLabel or linkWithLabel
  when label from node is reused in other instructions.
  If label is not linked then it will point to another labelNode when visited

  #KT-39013 Fixed

(cherry picked from commit db50afeafe)
2020-06-16 11:55:28 +02:00
Andrey Uskov
a3dbd95e3a Fixed import of MPP modules with single artifacts
#KT-38037 Fixed

(cherry picked from commit 2eb354f211)
2020-06-15 22:50:15 +03:00
Mikhail Zarechenskiy
27c3126de0 Update test data after disabling new inference in IDE
Continue of KT-39590
2020-06-15 14:35:06 +03:00
Mikhail Zarechenskiy
cf3bd3a5eb Disable new inference in IDE by default
#KT-39590 Fixed
2020-06-15 14:34:47 +03:00
Vyacheslav Gerasimov
1915f78704 as41: Fix build scripts for AS 4.1 C10 2020-06-11 11:09:30 +03:00
Vyacheslav Gerasimov
c254a83457 as41: Build against AS 4.1 C10 2020-06-11 11:09:29 +03:00
Vyacheslav Gerasimov
fe510bf61c as41: Setup bunch config and compatibility dsl for AS 4.1
(cherry picked from commit 097b93cb2a)
2020-06-11 11:09:29 +03:00
Vyacheslav Gerasimov
aeeb52af3a Build: Remove bunch files with intellijUltimateEnabled=false for AS
(cherry picked from commit d6011103e2)
2020-06-11 11:09:29 +03:00
Vladimir Dolzhenko
20d7ae95dc Do not search TODOs in non KT and non physical files
#KT-37896 Fixed
#EA-230407 Fixed

(cherry picked from commit 86a02c07f6)
2020-06-11 09:50:25 +02:00
Dmitry Gridin
b1e7727cd1 i18n, MoveKotlinNestedClassesToUpperLevelDialog: add missing bundles for 201
#KT-38527 Fixed

(cherry picked from commit 60dc2f9674)
2020-06-11 14:37:30 +07:00
Mikhail Bogdanov
db6e9cc327 Call missed visit method on ClassWriter in IC caching
Otherwise ASM fails with error on invalid frames because bytecode version is 0

(cherry picked from commit 3134832396)
2020-05-13 17:26:43 +03:00
Lilia
0f9a413ee9 Added 1.3.72 to the changelog 2020-04-14 14:57:11 +02:00
Victor Turansky
10bdc8ddb5 Gradle plugin publish plugin security update (#3246)
(cherry picked from commit 5d34b156bf)
2020-04-14 15:12:50 +03:00
Roman Golyshev
398d8a9f99 KT-37144 Respect quotes in package name during decompilation
- Odd package names (for example `try` in `arrow-core`) were pasted
as-is to the decompiled text
- Because of this, stub checks were failing, forcing completion to start
over and over again, as if something changed in the files
- See EA-5572315 for the error
- ^KT-37144 Fixed

(cherry picked from commit d7667209b2)
2020-04-13 13:03:27 +03:00
Elena Lepilkina
1f76edc015 Update Kotlin/Native version 2020-04-10 21:00:54 +03:00
Miguel Serra
fb2ff79dbf Samples of Map functions "contains" and "isNotEmpty"
Co-authored-by: Ilya Gorbunov <ilya.gorbunov@jetbrains.com>
(cherry picked from commit 61ad32f012)
2020-04-10 14:13:40 +03:00
Ilya Gorbunov
5fd68180d5 Improve samples for partition: add destructuring
(cherry picked from commit 606b4db48a)
2020-04-10 14:13:31 +03:00
n-p-s
ed3479b9c6 Add samples for partition
(cherry picked from commit 7bb7c86fa9)
2020-04-10 14:13:17 +03:00
Ilya Gorbunov
48a60254a2 Add sample for filterNot and improve sample for filter
(cherry picked from commit dd2aa3de28)
2020-04-10 14:13:05 +03:00
Brian Plummer
be9ff5e973 Add sample for filter
(cherry picked from commit f887a29279)
2020-04-10 14:12:54 +03:00
adammc331
6fef1af294 Add sample for filterNotNull
(cherry picked from commit 840f222867)
2020-04-10 14:12:42 +03:00
Scott Weber
a07983adf7 Add sample for text version of chunked
(cherry picked from commit e8ee405cdb)
2020-04-10 14:12:26 +03:00
Mikhail Zarechenskiy
9177b74a2e Fix delegated property resolve with intermediate ID provideDelegate
#KT-37406 Fixed
2020-04-09 15:48:10 +03:00
Toshiaki Kameyama
237bf05d17 Replace with: do not remove annotation use-site targets
(cherry picked from commit 06bd620dd6)
2020-04-09 17:45:45 +07:00
Kevin Bierhoff
6e0708fb4a only stub default constructor when compiling against .java source files
(cherry picked from commit 7448761dfd)
2020-04-08 19:28:00 +02:00
Kirill Shmakov
8652cff489 Fix tests for KT-38079
(cherry picked from commit 5460327c8d)
2020-04-08 11:16:10 +03:00
Kirill Shmakov
a0268f98ac Adapt exception line numbering for file link (KT-38079)
#KT-38079 Fixed

(cherry picked from commit 2b8b5af18b)
2020-04-08 11:16:06 +03:00
Vladimir Dolzhenko
1416564b72 Improvements in KotlinCopyPasteReferenceProcessor
reduced scope of nonBlockingRead to avoid long rerun of it
used smart pointers to keep valid elements over changes
moved back to non-modal progress

Relates to #KT-37414
#KT-37971 Fixed
#KT-37808 Fixed

(cherry picked from commit 87242b419a)
2020-04-07 18:42:31 +02:00
Ilya Matveev
2128d3dfe7 Gradle, native: Correctly clear flag when detecting parallel compilation
Issue #KT-37696 Fixed
2020-03-27 16:36:09 +07:00
Igor Yakovlev
3aaf376c73 Rename of "destruction declarations" to "destructuring declarations" in UI
Fixed #KT-37487
2020-03-26 12:33:09 +03:00
Dmitry Gridin
f6725ba880 i18n, konan: fix bundles
#KT-37483

(cherry picked from commit 3a5deaac09)
2020-03-26 10:18:02 +07:00
Vladimir Dolzhenko
e0be2044a5 Add checkCanceled on common autocompletion, hl resolve path
(cherry picked from commit 15e2afe5ab)

Relates to #KT-35135
2020-03-25 18:31:30 +01:00
Denis Zharkov
752ef6d3f3 Fix UI freezes caused by calls with a huge number overloads
While we have an overload resolution algorithm working for O(n^2),
call resolution for the single particular call may work more then just
a second.
Thus, we need to call ProgressManager.checkCanceled() with more granularity

^KT-35135 Fixed

(cherry picked from commit aac72871e7)
2020-03-25 18:30:59 +01:00
Vladimir Dolzhenko
05cbeae123 Fix incremental analysis for whitespaces
incremental analysis could ignore whitespace iff old item was whitespace

#KT-37629 Fixed

(cherry picked from commit 0073d260f8)
2020-03-25 16:15:20 +01:00
Vladimir Ilmov
b76f7ea56c (CoroutineDebugger) NPE fix in CoroutineAsyncStackTraceProvider 2020-03-25 11:14:37 +01:00
Dmitry Gridin
1566c2e219 i18n: NativeDefinitions: remove redundant bundle
#KT-37483

(cherry picked from commit 84c9929935)
2020-03-25 14:55:58 +07:00
Dmitry Gridin
cfbf8ee81a i18n: NativeDefinitions: add getter to property
#KT-37483

(cherry picked from commit afb8ff1dd5)
2020-03-25 14:55:57 +07:00
nikita.movshin
7fe66d3456 Fix changelog for 1.3.71 2020-03-23 18:05:51 +03:00
nikita.movshin
b659ad424c Fix changelog for 1.3.71 2020-03-23 15:50:11 +03:00
nikita.movshin
c4ab358aab Add changelog for 1.3.71 2020-03-23 11:49:56 +03:00
Dmitry Gridin
61a60317aa KotlinSdkType: fix i18n for 192
#KT-37632 Fixed
#KT-37483

(cherry picked from commit d84f528a47)
2020-03-20 18:20:14 +07:00
Alexander Podkhalyuzin
fc81533c16 Fixed diff with master 2020-03-20 09:50:02 +03:00
Valentin Kipyatkov
6473e35c73 Suppress suggested refactoring for unused private and local declarations
(cherry picked from commit 084276ef1f)
2020-03-20 09:45:44 +03:00
Valentin Kipyatkov
05c33660ae Do not suggest to update usages on renaming duplicated method or property
(cherry picked from commit e95d1c1224)
2020-03-20 09:45:31 +03:00
Valentin Kipyatkov
bcdb9344a6 Using new API
(cherry picked from commit 395ba7d008)
2020-03-20 09:45:16 +03:00
Valentin Kipyatkov
a5ef38ab18 Minor changes after code review
(cherry picked from commit 12bf8a44e7)
2020-03-20 09:43:54 +03:00
Valentin Kipyatkov
1c7a952ca6 Suggested Rename and Change Signature implementation for Kotlin
(cherry picked from commit b9a9000569)
2020-03-20 09:43:39 +03:00
Natalia Selezneva
703be29c0e Remove idea-gradle-tooling-api.jar from IDEA 2020
Because gradle-6.1.jar is now bundled into idea-gradle plugin

(cherry picked from commit 04c924a119)
2020-03-18 21:26:04 +03:00
Vladimir Dolzhenko
5519806a0e Run inspections after completion of general highlight pass in 201
#KT-37553 Fixed

(cherry picked from commit e1ae81e0a1)
2020-03-18 18:29:58 +01:00
Vladimir Dolzhenko
52cb5bfa36 Register Kotlin specific highlight passes via highlightingPassFactory in 193+
(cherry picked from commit 3cdcdbf6a8)
2020-03-18 18:29:38 +01:00
Vladimir Dolzhenko
5032dde2a6 Update to 201.6487-EAP-CANDIDATE-SNAPSHOT
(cherry picked from commit 2e20cdf2e6)
2020-03-18 18:28:25 +01:00
nikita.movshin
05d16cac90 Update K/N 2020-03-18 17:15:51 +03:00
Mikhail Zarechenskiy
c63f8176cb Fix project compilation against bootstrap compiler
This is needed after e3b6104489
2020-03-18 16:26:57 +03:00
Dmitry Gridin
a4438287f0 Formatter: fix continuation indent in call chain
#KT-37545 Fixed

(cherry picked from commit 7a3f6f5312)
2020-03-18 19:48:43 +07:00
Alexander Gorshenev
65956caf2e 1.3.70 to fail nicely on 1.4 klibs 2020-03-18 13:44:50 +03:00
Alexander Gorshenev
6616660456 Provide library producer compiler version in klib abi mismatch disagnostics 2020-03-18 13:44:50 +03:00
Alexander Gorshenev
deaeaa3ab3 Be prepared if in the future we extend klib abi version to a triple 2020-03-18 13:44:50 +03:00
Yan Zhulanow
33f30e2c42 Add more robust check for plugin application order (KT-37245)
Cause build to fail if the 'kotlin-kapt' plugin is applied before the
  main Kotlin plugin ('kotlin' or 'kotlin-android').
  The 'logger.error()' prints an error message, however the build
  continues.

(cherry picked from commit 897c48f97e)
2020-03-18 18:27:26 +09:00
Andrey Uskov
29e0c84996 Fix import of MPP projects in IDEA 2020.1 2020-03-18 11:35:07 +03:00
Anton Bannykh
46abf98743 JS: fix KT-37386
Anonymous object constructor parameters should not reuse JsName's
of the super class. Otherwise the temporary name renamer gets
confused.

(cherry picked from commit 63a909dee6)
2020-03-18 10:33:37 +03:00
Ilya Matveev
1c1b637cc4 Gradle, native: Forbid parallel in-process compiler execution
After enabling the in-process compiler execution, we got several
reports related to the race condition that takes place during
system properties configuring (e.g. KT-37442, KT-37444, probably
KT-37362).

The right fix here is to get rid of using system properties at all.
But it requires changes in many places of the K/N compiler and such
a patch is not safe enough to include it into a bug-fix release. So
it's decided to forbid parallel in-process compiler execution in 1.3.71

Issue #KT-37565 Fixed
2020-03-18 12:01:55 +07:00
Vladimir Dolzhenko
8a21d3d506 Don't show modal progress dialog on calculate method parameter hint info
#KT-37537 Fixed
Relates to #EA-216268

(cherry picked from commit c29f76580c)
2020-03-17 11:17:30 +01:00
Igor Yakovlev
3753bf0e20 Fix for change signature refactoring type resolve
Fixed #KT-37451
2020-03-17 12:03:58 +03:00
Dmitry Gridin
7c0f68c007 i18n: remove template name from bundle
#KT-37483

(cherry picked from commit 309ceef49a)
2020-03-17 15:38:37 +07:00
Dmitry Gridin
f12ecbccf5 Replace ConfigurationFactory with SimpleConfigurationType
#KT-36781 Fixed

(cherry picked from commit b9ffed3f04)
2020-03-16 22:11:05 +07:00
Sergey Igushkin
8ad6ace648 Filter kapt generate stubs classpath for non-existent entries (KT-37241)
Issue #KT-37241 Fixed

(cherry picked from commit a0aeb1554d)
2020-03-16 16:59:09 +03:00
Dmitry Gridin
5919fc4054 EqualsOrHashCodeInspection: update bundle for 201
#KT-37483

(cherry picked from commit 75f1fb0237)
2020-03-16 18:54:08 +07:00
Dmitry Gridin
7b06b6d233 i18n: fix findUsages for 201
#KT-37483

(cherry picked from commit c7a21a094f)
2020-03-16 18:54:00 +07:00
Dmitry Gridin
e5b208de44 i18n: fix findUsages dialogs
#KT-37483

(cherry picked from commit 49cdea7fdb)
2020-03-16 18:53:52 +07:00
Vladimir Dolzhenko
7933b06fdb Fix ExtensionTestUtil compilation for 191; CustomUsageSearcherTest compilation for 201
Relates to #KT-36657
2020-03-15 09:32:08 +01:00
Dmitry Gridin
d72913b100 i18n: update bundle for IdeErrorMessages 2020-03-13 20:23:39 +07:00
Dmitry Gridin
7fdd660ec8 i18n: update bundle for *.form 2020-03-13 20:23:39 +07:00
Dmitry Gridin
6bcc9008b3 i18n: fix tests 2020-03-13 20:23:39 +07:00
Dmitry Gridin
a9157c4657 i18n: update bundle for idea 2020-03-13 20:23:39 +07:00
Dmitry Gridin
2d1de19246 i18n: fix tests 2020-03-13 20:23:39 +07:00
Dmitry Gridin
eb7f5dc4f1 i18n: update bundle for jvm-debugger 2020-03-13 20:23:39 +07:00
Dmitry Gridin
458d8c91a3 i18n: add bundle for idea-repl 2020-03-13 20:23:39 +07:00
Dmitry Gridin
3ecdcf8436 i18n: add bundle for idea-live-templates 2020-03-13 20:23:39 +07:00
Dmitry Gridin
ad974f4c97 i18n: update bundle for idea-jvm 2020-03-13 20:23:38 +07:00
Dmitry Gridin
dfa615dc73 i18n: update bundle for idea-gradle 2020-03-13 20:23:38 +07:00
Dmitry Gridin
60566b0808 i18n: add bundle for idea-completion 2020-03-13 20:23:38 +07:00
Dmitry Gridin
0e19c05db8 i18n: update bundle for idea-analysis 2020-03-13 20:23:38 +07:00
Dmitry Gridin
392a70785a i18n: fix bundle location 2020-03-13 20:23:38 +07:00
Dmitry Gridin
1c24e4b72b i18n: add @NonNls to NodeIndentStrategy 2020-03-13 20:23:38 +07:00
Dmitry Gridin
6ab0bfebcc i18n: add bundle for idea/intentions 2020-03-13 20:23:38 +07:00
Dmitry Gridin
3b3ec92015 i18n: fix tests 2020-03-13 20:23:37 +07:00
Dmitry Gridin
6a15465e8d i18n: fix compilation 2020-03-13 20:23:37 +07:00
Dmitry Gridin
40d96812c4 i18n: fix text 2020-03-13 20:23:37 +07:00
Dmitry Gridin
7d2d6f1671 i18n: replace KotlinBundleBase with AbstractKotlinBundle 2020-03-13 20:23:37 +07:00
Dmitry Gridin
90c5b1d9b8 i18n: add bundle for idea/inspections 2020-03-13 20:23:37 +07:00
Dmitry Gridin
88c71bdb7d i18n: add bundle for idea/inspections/* 2020-03-13 20:23:37 +07:00
Dmitry Gridin
aa55353916 i18n: add bundle for idea/codeInsight 2020-03-13 20:23:37 +07:00
Dmitry Gridin
3448dd87be i18n: add bundle for idea/actions 2020-03-13 20:23:36 +07:00
Dmitry Gridin
669f801aeb i18n: add bundle for idea/quickfix 2020-03-13 20:23:36 +07:00
Dmitry Gridin
e70f1e9cc7 i18n: createByPattern: add @NonNls to parameters 2020-03-13 20:23:36 +07:00
Dmitry Gridin
66111eb9c6 i18n: KtPsiFactory: add @NonNls to parameters 2020-03-13 20:23:36 +07:00
Dmitry Gridin
8cbe8d8e63 i18n: add bundle for idea/quickfix/* 2020-03-13 20:23:36 +07:00
Dmitry Gridin
f0f252730d i18n: add bundle for idea/refactoring/ui 2020-03-13 20:23:36 +07:00
Dmitry Gridin
47133126b9 i18n: add bundle for idea/refactoring/safeDelete 2020-03-13 20:23:36 +07:00
Dmitry Gridin
16d8b66a62 i18n: fix tests 2020-03-13 20:23:36 +07:00
Roman Golyshev
5ed7937d83 i18n: move all kotlin bundles to resources/messages directories 2020-03-13 20:23:35 +07:00
Roman Golyshev
bc6d563205 i18n: fix bundle messages/testData messages where necessary 2020-03-13 20:23:35 +07:00
Roman Golyshev
e923541d07 i18n: add bundle for idea/refactoring/rename
- Modify `text.parameter` value to `Parameter`;
use `text.parameter.0` in previous usages
- Add @Nls and @NonNls annotations to few places
2020-03-13 20:23:35 +07:00
Roman Golyshev
ff192a7d81 i18n: add bundle for idea/refactoring/pushDown 2020-03-13 20:23:35 +07:00
Roman Golyshev
7be8159365 i18n: add bundle for idea/refactoring/pullUp
- Add @NonNls to used methods from `KtPsiFactory`
2020-03-13 20:23:35 +07:00
Roman Golyshev
936518d07f i18n: add bundle for idea/refactoring/move 2020-03-13 20:23:35 +07:00
Roman Golyshev
09b9c93bdf i18n: add bundle for idea/refactoring/memberInfo 2020-03-13 20:23:34 +07:00
Dmitry Gridin
4f0c3c583a i18n: fix compilation 2020-03-13 20:23:34 +07:00
Dmitry Gridin
9a010ffc33 i18n: move to KotlinBundle 2020-03-13 20:23:34 +07:00
Dmitry Gridin
bbb905b60a i18n: add bundle for idea/refactoring/introduce 2020-03-13 20:23:33 +07:00
Dmitry Gridin
87daee8641 i18n: add bundle for idea/refactoring/inline 2020-03-13 20:23:33 +07:00
Dmitry Gridin
88e5a34de0 i18n: add bundle for idea/refactoring/cutPaste 2020-03-13 20:23:33 +07:00
Dmitry Gridin
307c7962f1 i18n: add bundle for idea/refactoring/copy 2020-03-13 20:23:33 +07:00
Dmitry Gridin
a57e0c6957 i18n: add bundle for idea/refactoring/changeSignature 2020-03-13 20:23:33 +07:00
Dmitry Gridin
c9875fbb07 i18n: add @NotNls to bundles 2020-03-13 20:23:33 +07:00
Dmitry Gridin
330eeb62d2 i18n: add bundle for idea/reporter 2020-03-13 20:23:32 +07:00
Dmitry Gridin
1290e807df i18n: add bundle for idea/roots 2020-03-13 20:23:32 +07:00
Dmitry Gridin
d8f5f0a5a1 i18n: add bundle for idea/script 2020-03-13 20:23:32 +07:00
Dmitry Gridin
33876a4857 i18n: add bundle for idea/slicer 2020-03-13 20:23:32 +07:00
Dmitry Gridin
6187103cdd i18n: add bundle for idea/testIntegration 2020-03-13 20:23:32 +07:00
Dmitry Gridin
da536d816f i18n: add bundle for idea/update 2020-03-13 20:23:32 +07:00
Dmitry Gridin
b9fa42cd8a i18n: add bundle for idea/versions 2020-03-13 20:23:32 +07:00
Dmitry Gridin
c773216b68 i18n: add bundle for idea/internal 2020-03-13 20:23:32 +07:00
Dmitry Gridin
caa00c207d i18n: add bundle for idea/imports 2020-03-13 20:23:32 +07:00
Dmitry Gridin
ef459e1c47 i18n: fix bundle for idea/findUsages 2020-03-13 20:23:31 +07:00
Dmitry Gridin
f5e9c03e09 i18n: add bundle for idea/highlighter 2020-03-13 20:23:31 +07:00
Dmitry Gridin
d354fd16ae i18n: add bundle for idea/hierarchy 2020-03-13 20:23:31 +07:00
Dmitry Gridin
ef4ba70626 i18n: add bundle for idea/framework 2020-03-13 20:23:31 +07:00
Dmitry Gridin
ace06e0a86 i18n: add bundle for idea/formatter 2020-03-13 20:23:31 +07:00
Yan Zhulanow
30a886a9ae i18n: Internationalize part of the 'idea' module 2020-03-13 20:23:31 +07:00
Dmitry Gridin
b5a5d9be47 i18n: add bundle for idea/findUsages 2020-03-13 20:23:31 +07:00
Dmitry Gridin
c98735e25d i18n: add bundle for idea/filters 2020-03-13 20:23:31 +07:00
Dmitry Gridin
542073914d i18n: add bundle for idea/facet 2020-03-13 20:23:30 +07:00
Dmitry Gridin
15ceee9813 i18n: add bundle for idea/editor 2020-03-13 20:23:30 +07:00
Dmitry Gridin
9dc530d060 i18n: add bundle for idea/copy 2020-03-13 20:23:30 +07:00
Dmitry Gridin
d22610b448 i18n: fix compilation 192 2020-03-13 20:23:30 +07:00
Dmitry Gridin
d143f22405 i18n: add bundle for idea/configuration 2020-03-13 20:23:30 +07:00
Dmitry Gridin
8b5aab5b6c i18n: add bundle for j2k 2020-03-13 20:23:30 +07:00
Dmitry Gridin
5ea660ad49 i18n: fix properties in idea-gradle 2020-03-13 20:23:30 +07:00
Yan Zhulanow
3a86f7a50f i18n: Unify string naming in KotlinBundle 2020-03-13 20:23:30 +07:00
Yan Zhulanow
8838a72889 i18n: Add bundle for idea-jvm 2020-03-13 20:23:29 +07:00
Yan Zhulanow
40019a4c2b i18n: Add bundle for idea-gradle-native 2020-03-13 20:23:29 +07:00
Yan Zhulanow
c415b902ab i18n: Add bundle for idea-new-project-wizard 2020-03-13 20:23:29 +07:00
Yan Zhulanow
6aa10b4f1b i18n: Add bundle for idea-native 2020-03-13 20:23:29 +07:00
Yan Zhulanow
71a6667d5b i18n: Add bundle for idea-maven 2020-03-13 20:23:29 +07:00
Yan Zhulanow
f8c5f50f54 i18n: Add bundle for JVM debugger (evaluation) 2020-03-13 20:23:29 +07:00
Yan Zhulanow
d54cd6c3eb i18n: Add bundle for JVM debugger (coroutine) 2020-03-13 20:23:29 +07:00
Yan Zhulanow
b82870624e i18n: Add bundle for JVM debugger (core) 2020-03-13 20:23:29 +07:00
Yan Zhulanow
0f07aa3c26 i18n: Add bundle for New J2K 2020-03-13 20:23:29 +07:00
Yan Zhulanow
ef5de7cf96 i18n: Add bundle for New J2K services 2020-03-13 20:23:28 +07:00
Yan Zhulanow
f5e042dd67 i18n: Add bundle for idea-git 2020-03-13 20:23:28 +07:00
Yan Zhulanow
297598af4e i18n: Extract common caching code from bundles, J2K existing bundles 2020-03-13 20:23:28 +07:00
Yan Zhulanow
6b4bc145cd Rename .java to .kt 2020-03-13 20:23:28 +07:00
Dmitry Gridin
e7acac9db4 i18n: add bundle for idea-gradle 2020-03-13 20:23:28 +07:00
Dmitry Gridin
207ce72c42 i18n: rewrite bundles with AbstractKotlinBundle 2020-03-13 20:23:28 +07:00
Dmitry Gridin
3173881779 i18n: add bundle for idea-gradle 2020-03-13 20:23:28 +07:00
Dmitry Gridin
2892ccf168 i18n: add bundle for idea-core 2020-03-13 20:23:28 +07:00
Dmitry Gridin
9e2ebbf1af i18n: add bundle for ide-common 2020-03-13 20:23:27 +07:00
Dmitry Gridin
cc44efc1c3 i18n: add bundle for formatter 2020-03-13 20:23:27 +07:00
Dmitry Gridin
9380eb0258 i18n: introduce AbstractKotlinBundle 2020-03-13 20:23:27 +07:00
Nicolay Mitropolsky
1e691a7d23 Uast: UastFakeLightMethod hashcode fix (KT-37200)
(cherry picked from commit d1739289c6)
2020-03-13 12:00:38 +03:00
Nicolay Mitropolsky
7dc08666ed Uast: UastFakeLightMethod equality fix (KT-37200)
(cherry picked from commit 753d4b3cbd)
2020-03-13 12:00:38 +03:00
kovalp
1ea8900fc4 Do not stop searchTextOccurrences when isSearchForTextOccurrences is false
#KT-36657 Fixed

(cherry picked from commit 9ceca69154)
2020-03-13 10:00:07 +03:00
kovalp
e0bad4b4d3 Adds AdditionalExtractableAnalyser EP.
Adds annotations to ExtractableCodeDescriptor.
Adds functionality of adding annotations to KtPsiFactory.CallableBuilder

(cherry picked from commit 86f9cb6eef)
2020-03-13 09:59:50 +03:00
Dmitry Gridin
f4883f2912 UnusedUnaryOperatorInspection: shouldn't report on annotation entry
#KT-37294 Fixed

(cherry picked from commit 80caa063b3)
2020-03-12 15:58:20 +07:00
Anton Yalyshev
b9f1efe868 Disable FUS for Code Completion in 1.3.71
(cherry picked from commit b44be51b5c)
2020-03-12 10:53:41 +03:00
Mikhail Zarechenskiy
7254a72abc Filter out PSI values & valueOf methods from Java structure
These methods were recently added in Java PSI for IJ 201 and now have
 clash with the methods that we add on our side. Note that we can't
 start using methods from PSI as is because of different nullability:
 they have flexible types in their signatures while current methods
 have not-null types

 #KT-36095 Fixed
2020-03-12 10:25:30 +03:00
Leonid Startsev
5e603318b8 Do not check visibility of enum entries in explicit api mode
Although they're instances of DeclarationDescriptorWithVisibility,
they can't have visibilities

#KT-37040 Fixed

(cherry picked from commit 5d73550b48 and 01108d595c)
2020-03-11 17:13:10 +03:00
Leonid Startsev
9608f1798f Do not insert @SerializableWith marker annotation if already present
Such situation may happen if generic class is customized by user
with object-kind serializer. In such case, both arguments from
generateSerializerGetter and generateSerializerFactory are objects.
See linked issue for details:

Fixes https://github.com/Kotlin/kotlinx.serialization/issues/749

(cherry picked from commit 15fa6ea757)
2020-03-11 17:12:24 +03:00
Leonid Startsev
373a1147c8 Do not check 'no ctor parameters' for serializable enums
fixes https://github.com/Kotlin/kotlinx.serialization/issues/742

Do not use serializableIrClass if it is not bound (this may happen
in case we're generating external serializer for library class)

fixes https://github.com/Kotlin/kotlinx.serialization/issues/744

(cherry picked from commit e20354926b)
2020-03-11 17:12:07 +03:00
Alexander Podkhalyuzin
9bc0dff4b9 Fixed generated text from jvm classfile, when quotes is required
#KT-34759 Fixed

(cherry picked from commit 5bb74d9840)
2020-03-11 15:55:29 +03:00
Alexander Udalov
726c66e0bf Remove unneeded workaround for IBM JDK and older intellij-core
The underlying problem (IDEA-206446) was fixed a long time ago and the
compiler is no longer affected by it.

 #KT-37286 Fixed

(cherry picked from commit 4d2ee279c0)
2020-03-11 13:25:04 +01:00
Vladimir Dolzhenko
2c5e3798b3 Make copy-paste resolve task modal to avoid invalid psi elements
Due to background formatting pasted PSI elements become invalid quite soon and it is not possible to make resolve

#KT-37414 Fixed

(cherry picked from commit 8af5e2bb04)
2020-03-11 11:59:07 +01:00
Nikolay Krasko
eb0e5e3aca 201: Update to 201.6073.9 2020-03-11 12:09:43 +03:00
Nikolay Krasko
0734da0461 201: Mute JS android tests in MultiplatformProjectImportingTest 2020-03-11 12:09:43 +03:00
Nikolay Krasko
4cfc3cfc99 201: Mute test because of NPE: element.parent must not be null (IDEA-234737) 2020-03-11 12:09:43 +03:00
Nikolay Krasko
8474b23b4f 201: Fix setup for AbstractKotlinExceptionFilterTest tests 2020-03-11 12:09:43 +03:00
Nikolay Krasko
bba8ed21bc 201: Mute SpringRenameTestGenerated tests 2020-03-11 12:09:43 +03:00
Nikolay Krasko
01ddb0be62 201: Remove declarations added for dropped newApi in hierarchy 2020-03-11 12:09:42 +03:00
Nikolay Krasko
4084c48edd 201: Update to 201.5985.32 2020-03-11 12:09:42 +03:00
Nikolay Krasko
67eea10b19 Update to 201.5259.13-EAP-SNAPSHOT
- No UIUtil.removeLeakingAppleListeners anymore
- getParameterHints nullability
- versions of lz4-java and guava were changed

(cherry picked from commit 2340a86d8d)
2020-03-11 12:09:42 +03:00
Nikolay Krasko
019ce473a5 Access to test root disposable through accessor
(cherry picked from commit 6c968859ad)
2020-03-11 12:09:42 +03:00
Nikolay Krasko
27b732e035 Refactoring: extract resetApplicationToNull to separate file
(cherry picked from commit 272ccf64ae)
2020-03-11 12:09:42 +03:00
Nikolay Krasko
34954f79aa Fixes 2020-03-11 12:09:42 +03:00
Nikolay Krasko
90a05e51e5 Remove trailing commas 2020-03-11 12:09:42 +03:00
Nikolay Krasko
01924b8d08 Disable parallel execution for gradle tests
(cherry picked from commit 208c7274dd)
2020-03-11 12:09:42 +03:00
Nikolay Krasko
889277827a Fix testUnresolvedMultiline test data
(cherry picked from commit d47fc7280b)
2020-03-11 12:09:42 +03:00
Nikolay Krasko
8f3ea372f2 201: Mute HierarchicalMultiplatformProjectImportingTest: No module dependency found
(cherry picked from commit 6a9dfd4935)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
de7e77053a 201: Mute quick fix tests: Range must be inside element being annotated
(cherry picked from commit 774db02b23)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
34e2208fbf 201: Mute TodoSearchTest: duplicate TODO items
(cherry picked from commit 06adac1abf)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
601a647ebe 201: Mute incremental compilation tests with constants
(cherry picked from commit 543168c61d)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
381e560335 201: Mute a lot of tests with enums
(cherry picked from commit 8501ea78c8)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
0278cf710b 201: Mute QuickFixTestGenerate: Range must be inside element being annotated
(cherry picked from commit 79e663828a)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
b1110e0e46 201: Mute GradleScriptInputsWatcherTest failures
(cherry picked from commit f5a97ea56e)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
d2b2f71789 201: Upgrade nodejs plugin in 201 branch
(cherry picked from commit dad7fd383c)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
ba0068578c 201: Mute NewMultiplatformProjectImportingTest tests
No module dependency found
No source folder found

(cherry picked from commit f0a4f838f2)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
44ce7b6017 201: Mute MultiplatformProjectImportingTest tests
Failed search dependency in Gradle tests.

(cherry picked from commit f4cd25ce72)
2020-03-11 12:09:41 +03:00
Nikolay Krasko
a4c4c8574c 201: Mute NewJavaToKotlinConverterSingleFileTestGenerated tests
(cherry picked from commit 67dee52b8a)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
0b6cce6b0b 201: Fix maven plugin loading by adding repository-search to runtime
(cherry picked from commit 958b8a0b10)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
40cc9b934b 201: Fix loading project in configuration tests
De-bunch AbstractConfigureKotlinTest.kt, just don't use field in 193.

(cherry picked from commit 0fcd011abb)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
769fdc2c1f 201: Trick idea home path exception with custom idea.home variable
(cherry picked from commit 1a01ba0ae5)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
6bc1ab9583 Copy 192 muted tests
(cherry picked from commit da2683d180)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
c76bca3483 Register JDK for default project to prevent create leaking one for Gradle import
(cherry picked from commit dd21736471)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
522529eb1c Enable mute in code for all KotlinLightCodeInsightFixtureTestCaseBase
(cherry picked from commit c9fd79c311)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
8c6ad6efe3 Minor: better asserts in TodoSearchTest.kt
(cherry picked from commit 1c0a9d2981)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
56417b7577 Enable mute test with database in BaseKotlinJpsBuildTestCase
(cherry picked from commit 26df2a5c68)
2020-03-11 12:09:40 +03:00
Nikolay Krasko
f1eebf60d9 Ignore auto-mute files
(cherry picked from commit 31ba40cc99)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
e8e8121aa1 Enable mute for KotlinCompletionTestCase
(cherry picked from commit c22272bbca)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
295cc79181 Update method after UsefulTestCase update to make in work in 201
(cherry picked from commit 66e2f95dba)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
d17d6386f7 Support auto-mute in parametrized JUnit 4 tests
(cherry picked from commit 3c3b1bb5e4)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
a8a80d0d31 Minor: remove unneeded class
(cherry picked from commit f042b04320)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
92fec04b91 Revert global project settings to LATEST_STABLE in teardown
(cherry picked from commit a46c6ce5df)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
b148d0c4a1 Always configure and restore api version settings in tests
(cherry picked from commit f995192f21)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
568553af3b Clean LANGUAGE_VERSION_SETTINGS after the test
(cherry picked from commit 6c83e9fb85)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
bc095ef1af Clean facet if it wasn't set before test (fix tests on 201)
(cherry picked from commit 19bc39d3ab)
2020-03-11 12:09:39 +03:00
Nikolay Krasko
e214a18f8d Always clean language and api versions after usage
(cherry picked from commit af3b057ba2)
2020-03-11 12:09:38 +03:00
Nikolay Krasko
3d4b7f1936 Refactoring: extract long function out of local context
(cherry picked from commit c0dac9bf32)
2020-03-11 12:09:38 +03:00
Nikolay Krasko
d95a94a6c1 Refactoring: always use compiler settings with de-configuration in tests
(cherry picked from commit 3a5f42cc5e)
2020-03-11 12:09:38 +03:00
Nikolay Krasko
fd4b10985a De-bunch KotlinLightCodeInsightFixtureTestCase.kt
(cherry picked from commit 018215f47d)
2020-03-11 12:09:38 +03:00
nikita.movshin
352d8cabf8 Fix changelog 2020-03-07 23:51:02 +03:00
nikita.movshin
9efc495990 Update compatibility range for AS 3.6 and 4.0 2020-03-06 19:09:33 +03:00
Sergey Igushkin
59e8a4992e Internal visibility between common source sets in Gradle (KT-37264)
In KotlinCompileCommon, pass the friendPaths and refinesPaths arguments

In KotlinNativeCompilation, add both friend and refined dependencies as
friends for now.

In getVisibleSourceSetsFromAssociateCompilations, exclude the metadata
compilations to avoid incorrect results (those compilations don't have
proper kotlin

Issue #KT-37264 Fixed
2020-03-06 18:44:57 +03:00
Sergey Igushkin
671f9ebe06 Support friend internal visibility in K2Metadata compiler (KT-37264)
Add and handle the friend paths and refines paths compiler arguments;
Reuse klib dependency module descriptors in the resolver for project;

Issue #KT-37264
2020-03-06 18:44:55 +03:00
Ilya Goncharov
1db02e921a [Gradle, JS] Move logic of resolving NpmDependency to Npm Api
#KT-36196 fixed

[Gradle, JS] Support transitive mode for npm dependencies

#KT-36196 fixed

[Gradle, JS] Fix naming

#KT-36196 fixed

[Gradle, JS] Consider transitivity in cache of npm dependencies

#KT-36196 fixed

[Gradle, JS] Migrate from singletons to classes

#KT-36196 fixed
2020-03-06 16:43:02 +03:00
Vladimir Dolzhenko
4eaabf2a1a Handle properly lambda change in incremental analysis
Fixed #KT-37273

(cherry picked from commit dc6be68a41)
2020-03-06 11:47:59 +01:00
Alexander Podkhalyuzin
709195d069 Revert "Since build updated for 193 branch due incompatibility"
This reverts commit 070a6546
2020-03-06 10:29:03 +03:00
Alexander Podkhalyuzin
070a654658 Since build updated for 193 branch due incompatibility
(cherry picked from commit 135ae32f75)
2020-03-06 10:26:16 +03:00
Dmitry Petrov
58f75f0ba5 Generate compiler tests 2020-03-04 20:26:23 +03:00
Dmitry Petrov
7cb6be8b18 KT-37024 Optimized delegated property metadata generation in inline fun 2020-03-04 20:26:22 +03:00
Vladimir Dolzhenko
c99801cc04 Use LightJavaModule.getModule for 193
Fixed #KT-37229

(cherry picked from commit 0be5a82460)
2020-03-04 17:23:34 +01:00
Yan Zhulanow
f8c36eb0a0 Changelog: remove "trailing comma" feature from 1.3.70 2020-03-04 20:44:45 +09:00
Yan Zhulanow
1889376aba Remove 1.4-specific language features from 1.3.70 changelog 2020-03-04 17:17:54 +09:00
Dmitriy Novozhilov
5d9e053928 Update ChangeLog.md 2020-03-03 19:34:15 +03:00
nikita.movshin
bfb48645f3 Update K/N 2020-03-03 12:53:48 +03:00
Dmitry Gridin
facddfc77c ExperimentalFixesFactory: OptIn shouldn't be added for old version
#KT-36478

(cherry picked from commit ecb7478794)
2020-03-03 14:50:39 +07:00
Natalia Selezneva
9922e745f7 .gradle.kts: fix freezes by avoiding fs walking
^KT-36502 Fixed
2020-03-02 16:35:44 +03:00
Ilya Goncharov
0cf79f851b [Gradle, JS] Fix timeout for debug
#KT-37035 fixed

(cherry picked from commit 7719dfca4a)
2020-02-26 11:58:19 +03:00
Dmitry Gridin
0f22b3cd43 Tests: fix some tests in formatter for AS
(cherry picked from commit 50c2c38624)
2020-02-26 14:43:34 +07:00
Dmitry Gridin
ead89cb080 Formatter: fix indent after trailing comma in calls
#KT-36917 Fixed

(cherry picked from commit ca598b6465)
2020-02-26 14:37:42 +07:00
Dmitry Gridin
f5528bca0b Formatter: shouldn't format property chains
(cherry picked from commit feaa53c4f2)
2020-02-26 11:52:33 +07:00
Dmitry Savvinov
e7d1dac7f0 Remove accidentally committed dependency on kotlin-gradle-testing.xml
This dependency is not needed in 1.3.70 and actually leads to duplicate
EP registration
2020-02-25 18:53:15 +03:00
Zalim Bashorov
ffc3d7ffc6 [JS DCE] Add an ability to define overwriting strategy when copying dependencies in dev-mode
* CLI option "-Xdev-mode-overwriting-strategy"
* System Property "kotlin.js.dce.devmode.overwriting.strategy"

Possible values: "older", "all".

#KT-36349 Fixed

(cherry picked from commit 6f61ea7f67)
2020-02-21 20:47:50 +03:00
Dmitry Savvinov
1f9b772053 Disable platform-specific checkers in common 2020-02-21 14:05:48 +03:00
Dmitry Savvinov
df2b049b85 Add test on platform checks in project without that target 2020-02-21 14:05:29 +03:00
Konstantin Tskhovrebov
d6c7b7bd5d Fix class name for test suite descriptor.
Issue #KT-36725 Fixed
Issue #KT-36716 Fixed
Issue #KT-36726 Fixed
2020-02-20 18:55:35 +03:00
Vladimir Dolzhenko
e9f42c04c1 Move copy/paste resource bundles to Kotlin
#EA-224686 #KT-36877 Fixed
2020-02-20 14:16:06 +01:00
Yan Zhulanow
9f2a5898c5 Update changelog (EAP 3) 2020-02-20 16:43:01 +09:00
nikita.movshin
62a0cd3d87 Update K/N 2020-02-19 08:44:50 +03:00
Sergey Igushkin
89b75bb158 Fix KT-36804 by eagerly instantiating the Kotlin/Native tasks
This commit partially reverts 970ee4539b.

The Kotlin/Native klib compilation task configuration logic involved
adding dependencies for the compiler plugin artifacts. However, the
compiler plugins classpath, shared across all of the K/N tasks, was
tracked as the tasks' input. This made the following scenario possible:

1. Configuration of some of the Kotlin/Native tasks is avoided at the
   evaluation phase;

2. During task graph construction, one of the tasks are evaluated, and
   to determine their dependencies, Gradle resolves their inputs,
   including the compiler plugins classpath mentioned above;

3. Another K/N task is evaluated afterwards, and the configuration logic
   attempts to add a dependency into the compiler plugin classpath
   configuration, which has already been resolved in (2).
   The build fails.

Fix this by cancelling task configuration avoidance for the K/N tasks.

Issue #KT-36804 Fixed
2020-02-18 17:01:36 +03:00
Nikolay Krasko
a0d64ea859 Make 201 plugin compatible with IDEA trunk (KT-36780)
^KT-36780 Fixed
2020-02-18 15:31:41 +03:00
Abduqodiri Qurbonzoda
40e104ff12 Mark shared global vals to fix K/N worker thread crash
(cherry picked from commit 5a4ce2aa4c)
2020-02-18 12:16:43 +03:00
nikita.movshin
17e43f0c37 Update K/N 2020-02-18 09:54:21 +03:00
Dmitry Savvinov
f7c4afd00d Force-set path to exact project for MPP run configurations
Otherwise, path will be set to the root project. Given that we provide
task names in relative form rather than absolute, that will lead to
launching this task in all subprojects (e.g. task 'jvmTest'). This might
be a huge issue, because when we create run configuration for specific
test method/class, we pass test filter as well. This test filter will
execute in all projects with matched test tasks, so if some other
subproject has similarly-named test task, but doesn't have a suitable
tests for that filter, the whole build will fail.

Note that the ideal fix would involve using fully-qualified task names:
the current approach might lead to isses in advanced scenarious (e.g.
when user selects several test files from different modules -- then, we
won't be able to find one exact project path for the whole test run)

^KT-35038 Fixed
2020-02-17 20:18:17 +03:00
Natalia Selezneva
f6685b30d6 Fix requesting KotlinDslScriptModels for 191
^KT-36756 Fixed
2020-02-17 11:22:40 +03:00
Sergey Rostov
de71c7bd06 .gradle.kts: more clear tooltip for out of project scripts notification
The current text/action/help text may not be clear: action is not related to project import, and help text doesn't make it clear.

#KT-36703 Fixed

(cherry picked from commit 2677fa7472)
2020-02-17 08:46:03 +03:00
Nikolay Krasko
4fe339c7b8 201: Fix icon set in ShowFirAction.kt 2020-02-17 01:43:22 +03:00
Nikolay Krasko
2126837b37 201: Fix usage of picocontainer and openapi 2020-02-17 01:42:30 +03:00
Nikolay Krasko
15fc7dec1f Clean trailing commas in ported commits 2020-02-16 23:37:54 +03:00
Roman Golyshev
556e5662bd KT-33372 Remove renaming file reference to the contents of the file
- There is still a hack with returning null from `getLastFileReference`,
it is here to keep KT-25674 issue fixed
- Overrides of `bindToElement` are removed, they caused renames of the
file references to their contents
- Code of `KotlinFilePathReferenceContributor.kt` is refactored
- ^KT-33372 ^KT-32514 ^KT-36306 Fixed

(cherry picked from commit 3461effd47)
2020-02-16 17:25:38 +03:00
Vladimir Dolzhenko
286cacd55e Add missed create in usage of new annotation highlighting API
Relates to #KT-36712

(cherry picked from commit ba5a335e95)
2020-02-15 08:29:16 +01:00
Natalia Selezneva
35f3a66e83 Fix compilation for AS35 2020-02-14 22:09:03 +03:00
Natalia Selezneva
88f2afdc4a Fix compilation for 1.3.70 2020-02-14 22:09:03 +03:00
Natalia Selezneva
c9b9d51e03 KotlinDslScriptsModel: pass provider mode properly 2020-02-14 22:09:01 +03:00
Natalia Selezneva
478db14ae6 KotlinDslScriptsModel: do not add prepare task for each gradle task invocation
^KT-36090 Fixed
2020-02-14 22:09:01 +03:00
Natalia Selezneva
8ef1b43f8d KotlinDslScriptsModel: pass correlationId during the request
^KT-36200 Fixed
2020-02-14 22:09:00 +03:00
Nikolay Krasko
8e04fafcc9 Remove trailing comma in 1.3.70 2020-02-14 21:21:32 +03:00
Nikolay Krasko
5edbed9ce7 201: Restrict 193 and own plugin for 201
(cherry picked from commit b75d0eb1a1)
2020-02-14 21:21:32 +03:00
Nikolay Krasko
002fa48b5a 201: Additional method getOwnReferences is introduced (bunched)
(cherry picked from commit a983b0bf74)
2020-02-14 21:21:32 +03:00
Nikolay Krasko
df02fb2628 201: Notification group was rewritten to Kotlin (no sam conversion)
(cherry picked from commit c9d97ae555)
2020-02-14 21:21:32 +03:00
Nikolay Krasko
5df8f4b961 201: ExecutionManager.contentManager was rewritten to Kotlin (bunched)
(cherry picked from commit 034243b5e7)
2020-02-14 21:21:31 +03:00
Nikolay Krasko
b7c35148d5 201: Processor<in PsiMethod> used in PsiShortNamesCache
(cherry picked from commit 1cb56ee946)
2020-02-14 21:21:31 +03:00
Nikolay Krasko
8f176d1035 201: Processors changed for UsageInfo and SliceUsage
(cherry picked from commit 9f6f8088e3)
2020-02-14 21:21:31 +03:00
Nikolay Krasko
f16d27c0d9 201: New DynamicBundle.LanguageBundleEP.EP_NAME needed for Java
https://github.com/JetBrains/intellij-community/commits/master/platform/core-api/src/com/intellij/DynamicBundle.java
(cherry picked from commit e23f3b54c6)
2020-02-14 21:21:31 +03:00
Nikolay Krasko
d9de37715e 201: Return JavaCoreApplicationEnvironment subclassing (bunched)
(cherry picked from commit 51244d7b1d)
2020-02-14 21:21:30 +03:00
Nikolay Krasko
3b59638d1c 201: Update version to 201.4515.24-EAP-SNAPSHOT
(cherry picked from commit cfd92f252a)
2020-02-14 21:21:30 +03:00
Nikolay Krasko
10c5cbaf2d 201: uast-tests.jar new dependency (depend on whole idea in tests)
(cherry picked from commit 314474c33b)
2020-02-14 21:21:30 +03:00
Nikolay Krasko
b874a194f1 201: Change of ProblemDescriptorBase.getFixes() return type
15a39d5742
(cherry picked from commit 7a89bd9c90)
2020-02-14 21:21:30 +03:00
Nikolay Krasko
e8d275b14a 201: Raw Class -> Class<?> (bunched)
f8b7e8b0b5
(cherry picked from commit 8cb4a8f5c6)
2020-02-14 21:21:30 +03:00
Nikolay Krasko
86e8d91728 201: PsiElementVisitor.visitElement nullability
(cherry picked from commit 890109beb8)
2020-02-14 21:21:29 +03:00
Nikolay Krasko
5ac0a620ab 201: BinaryFileStubBuilders.EP_NAME dropped (bunched)
(cherry picked from commit 98c6efaed9)
2020-02-14 21:21:29 +03:00
Nikolay Krasko
8c10c0268a 201: ProjectManagerEx.forceCloseProject(project, true) - no second parameter
(cherry picked from commit 2cc4d878a8)
2020-02-14 21:21:29 +03:00
Nikolay Krasko
6599094843 201: MadTestingUtil.enableAllInspections second parameter was removed
(cherry picked from commit 41ca51cb9e)
2020-02-14 21:21:29 +03:00
Nikolay Krasko
de5837acef 201: IdeaTestApplication -> TestApplicationManager in tests
(cherry picked from commit ae1cfff5d2)
2020-02-14 21:21:29 +03:00
Nikolay Krasko
49d7266e45 201: ExternalProjectsManagerImpl.disableProjectWatcherAutoUpdate removed (bunched)
(cherry picked from commit 3eb4d46c3d)
2020-02-14 21:21:28 +03:00
Nikolay Krasko
ffe2eb13f8 201: No PlatformTestCase.myProjectManager anymore (bunched)
(cherry picked from commit 10ce3c58e1)
2020-02-14 21:21:28 +03:00
Nikolay Krasko
832acaf366 201: TemplateManagerImpl.setTemplateTesting() parameter removed
(cherry picked from commit 75f05d8329)
2020-02-14 21:21:28 +03:00
Nikolay Krasko
04bf9d739b 201: Can't instantiate subclass of Task anymore
(cherry picked from commit b17a28381b)
2020-02-14 21:21:28 +03:00
Nikolay Krasko
bbe5c3df24 201: LookupImpl.focusedDegree renamed
(cherry picked from commit 54b1c512c5)
2020-02-14 21:21:27 +03:00
Nikolay Krasko
f02b1d7086 201: "testFramework" and "testFramework.core" libs introduced
(cherry picked from commit 56d960c65b)
2020-02-14 21:21:27 +03:00
Nikolay Krasko
ead0b45443 201: TextEditorWithPreview.java update - no ApiStatus (bunched)
Class should be removed

(cherry picked from commit 641fa1f17c)
2020-02-14 21:21:27 +03:00
Nikolay Krasko
6de44dfa56 201: AbstractProjectResolverExtension.createModule returns nullable
(cherry picked from commit 10aef79434)
2020-02-14 21:21:27 +03:00
Nikolay Krasko
48e904a3c5 201: Tool windows - source incompatible change with Kotlin (bunched)
(cherry picked from commit 066d77f396)
2020-02-14 21:21:27 +03:00
Nikolay Krasko
53e026505c 201: AbstractTreeNode generified in ide.projectView package (bunched)
(cherry picked from commit 4afd7c553b)
2020-02-14 21:21:26 +03:00
Nikolay Krasko
353c525657 201: TreeStructureProvider api changed: AbstractTreeNode<Any -> *>
(cherry picked from commit b425bf9a1b)
2020-02-14 21:21:26 +03:00
Nikolay Krasko
f8b7e76a3b 201: MoveDestination.analyzeModuleConflicts variance in parameter changed
(cherry picked from commit 9261f69dc8)
2020-02-14 21:21:26 +03:00
Nikolay Krasko
f3eebc9aad 201: Print type explicitly as RefactoringBundle.message() not null
(cherry picked from commit 7ea52ebb45)
2020-02-14 21:21:26 +03:00
Nikolay Krasko
b871555b72 201: MoveMultipleElementsViewDescriptor constructor nullability
(cherry picked from commit 4bc10f4c4f)
2020-02-14 21:21:26 +03:00
Nikolay Krasko
ada42cf5d6 201: AbstractNavBarModelExtension.adjustElement nullability (bunched)
(cherry picked from commit 2c72f53937)
2020-02-14 21:21:25 +03:00
Nikolay Krasko
e0c0b91750 201: Update hierarchy to new API (fix bugs introduced by the platform)
193 plugins with old API are affected while being binary compatible.

(cherry picked from commit 78385d5f63)
2020-02-14 21:21:25 +03:00
Nikolay Krasko
766046591b 201: Convert KotlinHierarchyViewTestBase.java because of typealiases
(cherry picked from commit 5e58a66c58)
2020-02-14 21:21:25 +03:00
Nikolay Krasko
08e72ec0d2 201: Rename .java to .kt
(cherry picked from commit 6bd91ec5b0)
2020-02-14 21:21:25 +03:00
Nikolay Krasko
580f0df4a2 201: Convert AbstractHierarchyTest.java because of typealiases
(cherry picked from commit 27467e4db7)
2020-02-14 21:21:25 +03:00
Nikolay Krasko
68cd7922b3 201: Rename .java to .kt
(cherry picked from commit 9f6f6838b8)
2020-02-14 21:21:24 +03:00
Nikolay Krasko
fcf9dd51c8 201: J2K manual
(cherry picked from commit 579dd8f8fe)
2020-02-14 21:21:24 +03:00
Nikolay Krasko
8a49941717 201: Convert KotlinCallHierarchyBrowser and KotlinCallHierarchyBrowser
Need convert to use Kotlin typealias feature.

(cherry picked from commit b92a228fb3)
2020-02-14 21:21:24 +03:00
Nikolay Krasko
2e8d948c88 201: Rename .java to .kt
(cherry picked from commit b795b38794)
2020-02-14 21:21:24 +03:00
Nikolay Krasko
0a46a9a6f9 201: RefactoringHelper.prepareOperation nullability (bunched)
(cherry picked from commit 866c33fbde)
2020-02-14 21:21:23 +03:00
Nikolay Krasko
07ad659769 201: No BinaryFileStubBuilders.EP_NAME anymore (bunched)
(cherry picked from commit 5440a5e228)
2020-02-14 21:21:23 +03:00
Nikolay Krasko
1500631dcf 201: CoreApplicationEnvironment.registerExtensionPointAndExtensions accepts Path
(cherry picked from commit beb70526a2)
2020-02-14 21:21:23 +03:00
Nikolay Krasko
00b6976e7f 201: PsiShortNamesCache.getAllClassNames(HashSet<String>) removed
(cherry picked from commit cf78058cc2)
2020-02-14 21:21:23 +03:00
Nikolay Krasko
457153f0b9 201: ContainerUtil.newTroveSet<T>() removed
(cherry picked from commit 4668518b2f)
2020-02-14 21:21:23 +03:00
Nikolay Krasko
7faf442b39 201: Remove JpsPersistentHashMap (bunched)
(cherry picked from commit 9d3d59fccb)
2020-02-14 21:21:22 +03:00
Nikolay Krasko
295091deb0 201: Processor<String> -> Processor<in String> in PsiShortNamesCache
(cherry picked from commit 1ecd1a293d)
2020-02-14 21:21:22 +03:00
Nikolay Krasko
8b0ae3a8d5 201: picocontainer.jar is removed
(cherry picked from commit 2a71fe97cf)
2020-02-14 21:21:22 +03:00
Nikolay Krasko
e91eb5dea4 201: versions.jar.streamex and versions.jar.gson versions
(cherry picked from commit 354d7306dd)
2020-02-14 21:21:22 +03:00
Nikolay Krasko
a3eed22f90 201: openapi.jar is removed
(cherry picked from commit 162c2f3dc9)
2020-02-14 21:21:22 +03:00
Nikolay Krasko
558898d1c1 201: Introduce 201 platform
(cherry picked from commit c26e1e9c1a)
2020-02-14 21:21:21 +03:00
Nikolay Krasko
4ca62a9baa 201: Create bunch
(cherry picked from commit 0f4fadf104)
2020-02-14 21:21:21 +03:00
Vladimir Dolzhenko
204e564ae6 Use new annotation highlighting API
Fixed #KT-36712

(cherry picked from commit 2e597a3a32)
2020-02-14 15:58:45 +01:00
Igor Yakovlev
dbbc5211f4 Disable facade fake classes with registry key
Fix #KT-35122 #EA-218642 #EA-217640
2020-02-14 17:40:58 +03:00
Shagen Ogandzhanian
01d88b27e1 Update dukat dependency to 0.0.28
(cherry picked from commit 3fcdf6c78c)
2020-02-14 15:16:16 +01:00
Ilya Goncharov
bdfedea231 [Gradle, JS] Migrate on strings
(cherry picked from commit 64f13ab3ae)

#KT-36714 fixed
2020-02-14 16:53:22 +03:00
Ilya Goncharov
801d697e57 [Gradle, JS] Add all possible values of library target as enums
(cherry picked from commit 9b462b76d4)
2020-02-14 16:53:00 +03:00
Ilya Goncharov
ad6c84f649 [Gradle, JS] Add webpack output
(cherry picked from commit fbabbfab44)
2020-02-14 16:52:58 +03:00
Natalia Selezneva
3137add817 GradleScriptInputsWatcher: move long running operation out of EDT
^KT-36502

(cherry picked from commit dc77df1083)
2020-02-14 16:32:26 +03:00
Leonid Startsev
a2f7cf1644 Remove special casing for Unit in kotlinx.serialization
Unignore test since it is in muted list and auto-generated

(cherry picked from commit bdf1441c80)
2020-02-14 15:33:27 +03:00
Mikhail Zarechenskiy
b7231d9b58 Enable new inference in IDE by default 2020-02-14 15:24:03 +03:00
Yan Zhulanow
c418b47a5e Minor: Update generated tests for KT-34569
(cherry picked from commit 36a6eedd9c)
2020-02-14 21:22:32 +09:00
Ivan Gavrilovic
80452f779f KT-35472: Detect when content of annotation processor changes
Even if annotation processor classpath is the same, in case
individual entries change (e.g. bulding annotationo processor
from source), KATP should run non-incrementally.

Test: KaptIncrementalWithIsolatingApt.testUnchangedAnnotationProcessorClasspathButContentChanged
2020-02-14 21:22:32 +09:00
Ivan Gavrilovic
3b45d80f5c KT-36113: Make KAPT classpath snapshot deterministic
When snapshotting a classpath entry, sort information about types
so there is no dependency on the order of entries in jar.

Test: ClasspathAnalyzerTest
2020-02-14 21:22:32 +09:00
Sergey Igushkin
95ec589834 Add a non-public-API mechanism to import free args for MPP source sets
Arguments can be set using a project extra property following the
pattern: `kotlin.mpp.freeCompilerArgsForSourceSet.$sourceSetName`.

Only a compilation's default source set free args are appended to the
compiler args during Gradle builds.

(cherry picked from commit 764bf1cb32)
2020-02-14 14:17:05 +03:00
Sergey Igushkin
11a46c8795 Fix API version parsing: add 1.4 to available values
In Kotlin 1.3, we didn't allow setting language version to 1.4. With
the default language version changed to 1.4, it worked because the
language version had only been checked in the setter of the language
settings, and the default value had not been checked.

(cherry picked from commit a8aa334203)
2020-02-14 14:17:02 +03:00
Sergey Igushkin
4edcf801a1 Fix MPP Gradle tests
* Use `maven { setUrl(...) }` in Groovy DSL
* Configure compilation tasks beforehand
  in testMppBuildWithCompilerPlugins
* Prevent `gradleSettingsScript()` from failing
  when no settings script is found

(cherry picked from commit cd32cef2b6)
2020-02-14 14:16:59 +03:00
Sergey Igushkin
34eb27ab9a Enable KlibBasedMppIT by default and on all host (using Linux targets)
(cherry picked from commit 77f60d6d6c)
2020-02-14 14:16:56 +03:00
Sergey Igushkin
16049dfe69 Compile common code to klib whenever HMPP is enabled
As the HMPP with *.kotlin_metadata was never widespread, we can
immediately move to *.klib compilations whenever a build author
enables HMPP.

(cherry picked from commit 5cc8dfb2a3)
2020-02-14 14:16:54 +03:00
Sergey Igushkin
a265f29532 Rework legacy metadata variant in MPP with source sets metadata
* Make publishing the compatibility variant optional, and don't publish
  the compatibility variant by default -- the library maintainer should
  do this explicitly
* To build the compatibility artifact, compile the commonMain source
  set using a separate compilation (the default `main` compilation,
  while creating a separate `commonMain` compilation; this separation
  is needed to be able to still compile *.kotlin_metadata from
  commonMain even when compiling *.klib from all source sets)
* When the compatibility variant is disabled, clear the dependencies of
  the `main` compilation and disable its Kotlin compilation task
* When the compatibility variant is enabled, exposed it for project
  dependencies resolution as well, so that its artifact can be used by
  the dependent project instead of the granular metadata artifact that
  will contain *.klib (which can't be read by the legacy compiler)
* Refactor the configuration of the metadata compilation dependencies:
  concentrate all the logic in one place and make it process the source
  sets graph lazily.

(cherry picked from commit 0ef8d23f57)
2020-02-14 14:16:52 +03:00
Sergey Igushkin
9d0db2f8eb Export implementation dependencies of Native-shared source sets as API
As the Kotlin/Native compiler always requires transitive dependencies
to be present among the libraries during compilation, it is necessary
to export the implementation dependencies of Native-shared source sets
as if they were API dependencies.

To do that, add the extendsFrom-relationship between the apiElements
configuration of the metadata target (so that Gradle adds the
dependencies to the transitive dependencies graph) and also add the
dependencies to the project structure metadata (so that the consumer
can find out that it's only their corresponding Native-shared source
sets that need these particular transitive dependencies)

(cherry picked from commit 8a08fef2b3)
2020-02-14 14:15:05 +03:00
Sergey Igushkin
12302390ab Use the project name + compilation name for secondary klib compilations
This helps avoid duplicate library names when compiling shared-Native
source sets (the resulting klibs will have a more unique name than just
the source set name which likely repeats between projects)

(cherry picked from commit 81216ceb51)
2020-02-14 14:15:03 +03:00
Abduqodiri Qurbonzoda
db3602d1b1 Scan functions for Sequences and Iterable #KT-7657
(cherry picked from commit ed7b8e9b85)
2020-02-13 21:36:59 +03:00
Ilya Kirillov
4b864e0168 Show experimental features panel only for non-stable plugin versions
Also, use registry as backend for features settings

(cherry picked from commit 531a63bd19)
2020-02-13 15:27:41 +03:00
Vladimir Dolzhenko
453dc53b1d Avoid using quite new ScratchFileService API
Relates to #KT-35918

(cherry picked from commit 918895b88f)
2020-02-13 12:22:30 +01:00
Ilya Kirillov
ab154aa097 Fix compilation for 191 & as35
(cherry picked from commit 40f907ec2f)
2020-02-11 23:53:35 +03:00
Vladimir Dolzhenko
e8575551cb Enforce analysis inside top-level property initializer
Relates to #KT-36460

(cherry picked from commit a0ed2c8640)
2020-02-11 17:00:24 +01:00
Ilya Kirillov
d1c052ae62 Do not render redundant Nullable annotations when generating declarations
#KT-36321 fixed

(cherry picked from commit 0fe5694cb7)
2020-02-11 14:55:24 +03:00
Ilya Kirillov
be9fe86352 Rename by-name parameter usage in function calls when renaming function's parameter
#KT-32999 fixed

(cherry picked from commit 4df8744b34)
2020-02-11 14:55:22 +03:00
Vladimir Dolzhenko
3a23083a92 Use PluginManagerCore instead of PluginManager
Relates to #KT-35918
2020-02-10 20:45:38 +01:00
Vladimir Dolzhenko
a1595675f9 Fixed MoveJavaInnerClassKotlinUsagesHandler after obsolete API drop off
Relates to #KT-35918

(cherry picked from commit b451c25dba)
2020-02-09 20:52:36 +01:00
Vladimir Dolzhenko
641bd35705 Added missed runReadAction to access psi on bg thread
Relates to #KT-24122

(cherry picked from commit 5b48f63bb9)
2020-02-08 15:08:38 +01:00
Vladimir Dolzhenko
f08804a3e5 Fix documentListener leakage in PluginStartupActivity
drop trailing comma
Fix 191, 192 compatibility

Relates to #KT-35918
2020-02-07 22:24:58 +01:00
Vladimir Dolzhenko
1f21c9a712 Cleaned IDEA 193 and below obsolete API
Fixed #KT-35918
2020-02-07 11:10:12 +01:00
Abduqodiri Qurbonzoda
c55ed7ac5f Update number of reachable nodes because of MutableList.removeFirst/Last
(cherry picked from commit b06645d1c0)
2020-02-06 21:28:16 +03:00
Natalia Selezneva
053af9a875 Tests: fix gradle tests for script configuration loading
Introduce `testAffectedGradleProjectFiles` property
to avoid full gradle project import in some tests

(cherry picked from commit e33a81a968)
2020-02-06 10:15:07 +03:00
Natalia Selezneva
5c5966730f Idea compatibility: remove usages of deprecated icons in Call Hierarchy
This also should fix the problem with overlay of icon and text in tree view
2020-02-06 10:15:07 +03:00
Natalia Selezneva
37f54f181e Idea compatibility: remove usages of deprecated icons in REPL, use similar ones 2020-02-06 10:15:07 +03:00
Ilya Matveev
1bfac9fde2 Fix data race in zip FileSystem reference counting
Issue #KT-36076 Fixed

(cherry picked from commit 0725a336fc)
2020-02-05 17:54:07 +07:00
Vladimir Dolzhenko
48429d9fe2 Fix 192 compilation for move remove redundant imports to bg thread
Relates to #KT-24122

(cherry picked from commit 6489b56fb0)
2020-02-04 18:41:22 +01:00
Vladimir Dolzhenko
bae024ed87 Move remove redundant imports to bg thread
#KT-24122 Fixed

(cherry picked from commit dd0613bc7a)
2020-02-04 16:46:59 +01:00
Ilya Goncharov
65e3655e62 [Gradle, JS] Fix test 2020-02-04 16:18:23 +03:00
Ilya Goncharov
3ab0a0d627 [Gradle, JS] Distribution and distributeResources
(cherry picked from commit 60da37404e)
2020-02-04 14:49:15 +03:00
Ilya Goncharov
c0857f79b1 [Gradle, JS] Fix Task Configuration Avoidance
(cherry picked from commit ca150005a8)
2020-02-04 14:48:50 +03:00
Ilya Goncharov
0f8d4ed143 [Gradle, JS] Distribution task depends on processResources
(cherry picked from commit a2b774b186)
2020-02-04 14:48:48 +03:00
Ilya Kirillov
0b97edbca5 Wizard: do not show disable/enable checkbox for new project wizard in AS
#KT-36195 fixed

(cherry picked from commit ed5156ee83)
2020-02-04 14:22:58 +03:00
Ilya Kirillov
8d14259225 Fix change signature refactoring
Do not increase modification count for OutOfCodeBlockTracker when KtTypeCodeFragment is modified

KtTypeCodeFragment is used in UI for providing completion for types.
When OutOfCodeBlockModification happens it invalidates ModuleDescriptors
But change signature relies on them which causes InvalidModuleException

#KT-35903 fixed
#KT-35689 fixed
#KT-34415 fixed
#KT-34415 fixed
2020-02-04 14:08:42 +03:00
Nicolay Mitropolsky
5d6c0c1d72 Uast: fix for Lambda in place call identifiers (KT-35432)
(cherry picked from commit 222ceb7698)
2020-02-04 11:19:35 +03:00
Nicolay Mitropolsky
7cfe41a913 Uast: fixes for Enum identifiers (KT-35432)
(cherry picked from commit ac3a8eb494)
2020-02-04 11:19:35 +03:00
Mikhail Zarechenskiy
53fb90f3d9 [NI] Record substituted generic signature for SAM arguments
#KT-36297 Fixed
2020-02-04 11:05:38 +03:00
Mark Punzalan
12d527bf5c ForLoopsLowering: Fix issue with break/continue in loop over withIndex.
(cherry picked from commit 3ee344b836)
2020-02-04 08:56:48 +01:00
Mikhail Zarechenskiy
28b69d0b3a Regenerate compiler tests 2020-02-04 10:32:08 +03:00
Mikhail Zarechenskiy
db8e045172 Update test data: add missing diagnostics for NI 2020-02-04 10:32:02 +03:00
Mikhail Glukhikh
bcfcb30104 [FIR] Add forgotten test data for old FE test 2020-02-04 10:31:55 +03:00
Dmitriy Novozhilov
b8fed578ca [TEST] Add js runtime to failing box test 2020-02-04 10:31:48 +03:00
Dmitriy Novozhilov
fe31eff855 Add js runtime to failing blackbox test 2020-02-04 10:31:42 +03:00
Dmitriy Novozhilov
a2a298214f [FIR-TEST] Mute failing blackbox test 2020-02-04 10:31:21 +03:00
Dmitriy Dolovov
d5ff419d0e Fix GradleNativeLibrariesInIDENamingTest 2020-02-04 14:19:19 +07:00
Dmitriy Dolovov
097e745b3c Fix: KotlinNativeABICompatibilityChecker.dispose() leads to dead lock
Issue #KT-36040
2020-02-04 14:19:10 +07:00
Yan Zhulanow
fdc700724c Update 1.3.70 changelog for EAP 2 2020-02-03 23:28:05 +09:00
Kirill Shmakov
a0516d6aec Use better wording in plugin advertiser
(cherry picked from commit 46b4620fdd)
2020-02-03 11:41:06 +03:00
Nikolay Krasko
63a3373c52 Leave hack for PsiSubstitutor in AS40 (KT-36039)
KotlinCoreApplicationEnvironment is not expected to be triggered from the plugin.
2020-01-31 01:33:53 +03:00
nikita.movshin
160ed0a438 Update K/N 2020-01-30 11:36:12 +03:00
Nikolay Krasko
7197b918e2 Update to a newer idea to fix bad initialization of PsiSubstitutor (KT-36039)
PsiSubstitutor instantiation doesn't need EmptySubstitutor service anymore.
Remove hack with interface field reassign that doesn't work with JDK >= 12.
2020-01-28 14:58:54 +03:00
Andrey Uskov
a7cabe352a Fixed locking statistics files when multiple gradle daemons started 2020-01-27 19:49:45 +03:00
nikita.movshin
712264aaac Update K/N 2020-01-27 12:01:43 +03:00
Vladimir Ilmov
1f7a27ad8f [coroutine] Coroutine's missing frames added from continuation info. 2020-01-27 09:27:39 +01:00
Ilya Kirillov
19b2247666 Fix as40 compilation: add missing bunch file 2020-01-27 10:31:34 +03:00
Ilya Kirillov
13cf304b0a Use snakeyaml from maven instead of from intellij
As new-project-wizard-cli module is not bundled into the plugin jar

(cherry picked from commit 69e9ae94c6)
2020-01-27 01:43:03 +03:00
Yan Zhulanow
55e6fbd3f1 Imitate behavior of old light classes to fix method run configurations (KT-33787)
The bug appeared when we turned “ultra light classes” on by default. The difference with the old implementation is that PsiClass.getTextRange() returns the correct non-null value. This triggers JavaExecutionUtil#stepIntoSingleClass() to return a light class instead of the original location (of a PsiIdentifier). So AbstractJavaTestConfigurationProducer#isConfigurationFromContext() returns true, and the wrong configuration is reused instead of creating the new one.
By the way, for Java it also returns an identifier because of the PsiTreeUtil.getParentOfType(element, PsiClass.class) != null check.

The proper fix should land in the newer versions of IDEA, however this (hopefully, temporary) hack will fix test method gutters for all platform versions.
2020-01-27 05:09:46 +09:00
Yan Zhulanow
36b81dffb8 Revert "Import Kotlin JUnit run configuration settings from Gradle"
This reverts commit 748cbd7e
2020-01-27 05:09:46 +09:00
Yan Zhulanow
c215ef9003 Partially revert "Prefer Kotlin Gradle test run configurations when possible (KT-33787)"
This commit reverts 987307cf92.
Tests are left behind as the different fix will be provided for KT-33787.
2020-01-27 05:09:46 +09:00
Yan Zhulanow
9f49918ec3 Partially revert "Prefer Kotlin Junit test run configurations when possible (KT-33787)"
This commit reverts parts of ef8b3cb72a.
Tests are left behind as the different fix will be provided for KT-33787.
2020-01-27 05:09:46 +09:00
Yan Zhulanow
b39e65608f Minor: Update copyrights in Fir elements 2020-01-27 05:09:46 +09:00
Dmitry Savvinov
02183148f1 Add IDE support for common klibs 2020-01-25 16:09:09 +03:00
Dmitry Savvinov
3de465b77d Check for presence of ir-folder in klibs additionally for Kotlin/Native 2020-01-25 16:09:08 +03:00
Dmitry Savvinov
953dc87c43 Minor: extract name of ir-folder in klib into const property 2020-01-25 16:09:08 +03:00
Dmitry Savvinov
9b6f405710 Pass proper metadata_version in K2MetadataKlibSerializer
Otherwise newer IDE Plugins will think that it's an old klib and will
refuse to analyze against it
2020-01-25 16:09:07 +03:00
Dmitriy Dolovov
cc0f4d59db Fast check of Kotlin/Native KLIBs by virtual files 2020-01-25 16:08:17 +03:00
Vladimir Ilmov
6e879206b0 [coroutine] debugger extension signature fixed for 193 bunch 2020-01-24 20:16:04 +01:00
Ilya Gorbunov
e562ce1359 KT-15363 Rename expectedSize to capacity and edit docs
(cherry picked from commit 7bb504321c)
2020-01-24 21:24:26 +03:00
Ilya Gorbunov
1c3e0da8d4 KT-15363 Fix failing test: missing capacity parameter check in JS
Partially restore JVM map capacity implementation

(cherry picked from commit 14351446d7)
2020-01-24 21:24:26 +03:00
Ilya Gorbunov
f46b37ec5d KT-15363 Collection builders: improve tests and samples
(cherry picked from commit 4aa7d45a5a)
2020-01-24 21:24:25 +03:00
Fleshgrinder
b239f0e8e1 KT-15363 Collection Builders
Added container builders for lists, sets, and maps.
The new experimental type inference only works for the simple builders
with a single generic type. The versions with nullability and the maps
still require explicit specification of the types. Obviously explicit
specification is required for all users who are not using the new
experimental inference. Improving the type inference is something that
should be done separately and many things – including these builders –
will benefit from it, however, this is not a blocker for these builders
in my opinion.

(cherry picked from commit bf9d3d87a6)
2020-01-24 21:24:25 +03:00
Ilya Gorbunov
b120cb8ae3 Advance bootstrap to 1.3.70-eap-145 2020-01-24 21:23:22 +03:00
Sergey Igushkin
85116652c9 Fix KlibBasedMppIT test compilation error (missing import)
(cherry picked from commit 1f42951152)
2020-01-24 20:51:57 +03:00
Sergey Igushkin
d3e283f438 Fix the K/N stdlib leaking into other common source sets
The Kotlin/Native stdlib was added to the shared-native source sets
in order for the IDE to import the stdlib dependency.

However, it was added to the '*Implementation' configuration, from
where it was also collected for the dependency source set
visibility inference algorithm. The current implementation of source
sets visibility inference only works for module dependencies and is
not quite suitable for local file dependencies. The implementation
should likely be fixed, but for now, it's enough to add the dependency
directly to the place where the visibility inference results are
taken from by the IDE during import, i.e. to the
'*ImplementationDependenciesMetadata' configurations.

Also, since all tests were flawed by the leakin K/N stdlib, the
K2Metadata/Klib compiler mistakenly didn't include its own built-ins
to the module dependencies (and everything worked because the K/N
built-ins were there). Now that the K/N doesn't leak, the compiler
must add its own built-ins.

(cherry picked from commit d1826374a6)
2020-01-24 19:02:52 +03:00
Sergey Igushkin
7324a5ea0e Common klib support in the Kotlin Gradle plugin (KT-32677)
Refactor the Kotlin/Native compilations and tasks to support
Kotlin/Native-shared source sets compilation within the metadata target.

Provide the feature flag kotlin.mpp.enableCommonKlibs that enables
the following behavior:
* compilation of Kotlin/Native-shared source sets to a klib using
the Kotlin/Native compiler.
* compilation of common source sets (not just Kotlin/Native) into a
klib rather than *.kotlin_metadata

Issue #KT-32677 Fixed

(cherry picked from commit 970ee4539b)
2020-01-24 19:02:48 +03:00
Anton Yalyshev
48bd96b95c Enable FUS for Code Completion in 1.3.70
(cherry picked from commit 90fe1bb1ab)
2020-01-24 18:31:51 +03:00
Vyacheslav Gerasimov
ca8504a482 Build: Add :compiler:ir.serialization.common to kotlin-plugin.jar
:compiler:ir.serialization.jvm contains classes depending on this module
which makes idea plugin verifier to fail.

 #KT-36103
2020-01-24 18:09:14 +03:00
Vsevolod Tolstopyatov
17bf57fd81 KT-36118 Introduce AbstractCoroutineContextKey and corresponding extensions required by its implementors
* It enables subtyping relationship for keys and elements, allowing type-safe and concise manipulations on the context when complex hierarchies of elements (e.g. implementors of ContinuationInterceptor) are present
    * It unblocks possibility to implement suspendCancellableCoroutine in stdlib
    * Implementing proper polymorphic get and minusKey in AbstractCoroutineContextElement is impossible because it will introduce source-incompatible change
    * ContinuationInterceptor get and minusKey are adjusted in a completely backwards-compatible way
2020-01-24 18:04:02 +03:00
Mikhail Zarechenskiy
9f9c2b0135 Regenerate tests after rebase 2020-01-24 17:21:04 +03:00
Mikhail Zarechenskiy
ccbf2fc603 Fix project compilation after rebase 2020-01-24 17:17:40 +03:00
Mikhail Zarechenskiy
d7295ced58 [NI] Fix issue with returning non-deparenthesized lambdas from labmdas
#KT-36080 Fixed
2020-01-24 17:17:39 +03:00
Denis Zharkov
d0d1ea2b4b NI: Fix resolution ambiguity for references returned from lambda
^KT-32267 Fixed
2020-01-24 17:17:39 +03:00
Pavel Kirpichenkov
2120e68db0 [NI] Soften restictions on using Nothing as proper constraint for full call completion
Consider lower `Nothing` constraint non-proper only if there is a dependant not analyzed postponed atom.
Early completion to `Nothing` provides data flow info for smart casts.

KT-35668 Fixed
2020-01-24 17:17:39 +03:00
Mikhail Zarechenskiy
9a6a88b191 [NI] Fix adapting arguments for callable references with receivers
#KT-35912 Fixed
2020-01-24 17:17:39 +03:00
Dmitriy Novozhilov
288f817dbf [NI] Add collecting forgotten type variables from callable references 2020-01-24 17:17:38 +03:00
Dmitriy Novozhilov
646b29f890 [NI] Add missing type variables to common system in builder inference 2020-01-24 17:17:38 +03:00
Pavel Kirpichenkov
55c9713e54 [NI] Make behaviour of anonymous functions consistent with lambdas
Fix completion of anonymous functions with expression body without expected type.
Premature completion led to losing type info from outer calls.
Also report type mismatches on empty lambda expressions.

KT-34729 In progress
2020-01-24 17:17:38 +03:00
Pavel Kirpichenkov
a3cd1f23ab [NI] Check stub types in result type
An uninferred parameter stub may leak through calculation of CST(Inv<Uninferred Stub>, Nothing) into a result type.
A stub type in the result type means a type error. So we can afford recalculating
CST with stub-containing types filtered out, since its an error anyway.
This prevents stub types leakages and helps with reporting type error diagnostics.

KT-35914 Fixed
KT-35943 Fixed
2020-01-24 17:17:37 +03:00
Victor Petukhov
8d04ba0611 NI: Prefer nullable lower bound to flexible one when substitution of type variable is performed and remember flexibility of type parameters based on flexibility of its upper bounds
^KT-32435 Fixed
2020-01-24 17:17:37 +03:00
Victor Petukhov
3051bcf878 Temporary change sinceVersion to null for ProhibitVarargAsArrayAfterSamArgument
It will be set to `KOTLIN_1_5` as it will be added.
2020-01-24 17:17:36 +03:00
Mikhail Zarechenskiy
3457b3f4a4 [NI] Fix CST calculation for covariant type projections 2020-01-24 17:17:36 +03:00
Pavel Kirpichenkov
a97751ee89 [NI] Refactor OnlyInputType annotation check
Hold position consumed during incorporation in Constraint instead of ConstraintPosition.
2020-01-24 17:17:36 +03:00
Pavel Kirpichenkov
3c48218097 [NI] Update filtering of constraints with equal types
Make check for synthetic nullability constraint status before skipping
new constraint with nonunique type.
2020-01-24 17:17:36 +03:00
Pavel Kirpichenkov
2878800030 [NI] Consider synthetic lower nullability constraint non-proper 2020-01-24 17:17:36 +03:00
Denis Zharkov
5260916cb3 NI: Fix exception during callable references overload resolution
^KT-35847 Fixed
2020-01-24 17:17:35 +03:00
Dmitriy Novozhilov
976ae1c967 [NI] Fix resolve of lambdas with expected function type with receiver
#KT-30245
2020-01-24 17:17:35 +03:00
Dmitriy Novozhilov
ec1aa0689c [NI] Improve completing callable references with type variable as expected type
#KT-32462 Fixed
2020-01-24 17:17:35 +03:00
Denis Zharkov
87c2f30b99 Fix project compilation after fix for KT-35920
See KT-35931 for a feature request allowing to write IrConstImpl::int
2020-01-24 17:17:34 +03:00
Denis Zharkov
11fbf77b9f NI: Do not resolve static callable references on generic types
As they weren't resolved in old inference

^KT-35920 Fixed
2020-01-24 17:17:34 +03:00
Denis Zharkov
392e84f538 NI: Fix callable references resolution when LHS is generic nested class
In case of null qualifier, we should not look into any static scope
NB: factory::createCallableProcessor returns NoExplicitReceiver processor
in case of null-receiver, that makes resolving the call in the test as
`property(::key)` that matches to the property itself, thus leading to
overload resolution ambiguity

^KT-35887 Fixed
2020-01-24 17:17:34 +03:00
Pavel Kirpichenkov
a290524f89 [NI] Restore old behaviour of AbstractPartialBodyResolveTest
Smartcasts between partial and full resolution mode should almost never match,
comparing smartcasted types in test runner is incorrect in general case.
Mute failing test until decision about correct behaviour (KT-35922).
2020-01-24 17:17:33 +03:00
Pavel Kirpichenkov
4ecfcc0340 [minor] Move quickFixUtil to util package 2020-01-24 17:17:33 +03:00
Pavel Kirpichenkov
0c02064363 Remove dependencies on data flow aware expression type in BindingContext
`BindingContext.getType`'s behaviour on argument expression has been different for OI and NI for some time.
New inference used to rewrite argument's type after smartcast, which led to missing subsequent smartcasts in some cases.
This commit makes retrieval of smartcasted argument type explicit.
2020-01-24 17:17:33 +03:00
Pavel Kirpichenkov
430f9b0e6e [NI] Add restored smart casts to spec tests
KT-35668 Fixed
2020-01-24 17:17:33 +03:00
Pavel Kirpichenkov
75a575b49f [NI] Restore missing smart casts after another smart cast in call
Expression type serves as a part of a key for retrieving smart cast info.
Rewriting expression type with SmartCastManager leads to incorrect processing of following smartcasts for same expression, therefore it was removed.

KT-32507 Fixed
KT-32358 Fixed
2020-01-24 17:17:33 +03:00
Dmitriy Novozhilov
640f734657 [NI] Use new type substitutor instead of old in completion of callable references
It's necessary because of new type substitutor is eager than odl, so
  if there is a substitution of type parameter deep inside type arguments
  then second substitutor wins against first

#KT-35896 Fixed
2020-01-24 17:17:32 +03:00
Dmitriy Novozhilov
0cff128038 [NI] Postpone calls with not enough information in builder inference 2020-01-24 17:17:32 +03:00
Denis Zharkov
6a5f88ac0b NI: In subtyping do not intersect arguments for non-covariant types
It partially reverts 7898922066
because it's not obvious that it's a safe operation
for invariant/contravariant types.

Also, there's a necessary fix in prepareReceiverRegardingCaptureTypes
to make types order stable
Otherwise test bareTypesWithStarProjections becomes flaky.

Also, the changes in bareTypesWithStarProjections.kt are also expected
because the type of the expression `coneSymbol` after the second "if" is
FirVariableSymbol<*> & FirPropertySymbol & AbstractFirBasedSymbol<*>
thus we fix D in the call `coneSymbol.phasedFir()` to FirVariableSymbol<*>
because it's the first type in the list
(see the next line after the last changed in AbstractTypeChecker)
2020-01-24 17:17:32 +03:00
Denis Zharkov
11302532c5 NI: Fix regression for star-projections approximation
See the test added

^KT-35703 Fixed
2020-01-24 17:17:32 +03:00
Denis Zharkov
0f7ad244db NI: Fix smart-cast related regression
See the test and the issue for the clarification
After the change 7898922066
the expected type for "a" in expression "foo(a)" is A<E & B<*>>
But we have the original type A<E> and smart-casted enriched type A<B<*>>
(non of them is a subtype of A<E & B<*>>)
and fail in checkTypeInternal when checking types in during completion

^KT-35844 Fixed
2020-01-24 17:17:31 +03:00
Pavel Kirpichenkov
154f28175f [NI] discriminate Nothing for reified parameters
Related issues: KT-32836, KT-35728
2020-01-24 17:17:31 +03:00
Mikhail Zarechenskiy
cbca609d45 [NI] Fix ambiguity when there are no applicable candidates
#KT-35064 Fixed
2020-01-24 17:17:31 +03:00
Dmitriy Novozhilov
0ceeac0c63 [NI] Use infered delegate expression type if there is no resolved call in trace
#KT-35707 Fixed
2020-01-24 17:17:30 +03:00
Pavel Kirpichenkov
79b9a058e5 [NI] Decrease only input types check diagnostic level to warning 2020-01-24 17:17:30 +03:00
Pavel Kirpichenkov
4c128c7735 [NI] Report "not enough information" on callable references in lambdas
^KT-34314 Fixed
2020-01-24 17:17:30 +03:00
Ilya Chernikov
5eb94e4903 [NI] Convert extension lambda to the non-extension one, if needed 2020-01-24 17:17:30 +03:00
Pavel Kirpichenkov
7da991f76b [NI] Remove hack for special functions
Treating special functions for `if`, `when`, `try`, `?:` as not accepting `Nothing` result type is incorrect.
Making so leads to cases with uninferred `Nothing` result type for inner calls and lost data flow info.
2020-01-24 17:17:29 +03:00
Dmitriy Novozhilov
a8ad8e0e29 [NI] Don't replace context dependency for blocks with expected type
#KT-35702 Fixed
2020-01-24 17:17:29 +03:00
Denis Zharkov
3e7b2beac9 NI: Fix type mismatch caused by smartcast
^KT-25434 Fixed
2020-01-24 17:17:29 +03:00
Denis Zharkov
7c4d79e6ee Fix bare typed smartcasts in NI
Star projections should be replaced with star projections
not for their expansions

See the test
2020-01-24 17:17:28 +03:00
Denis Zharkov
eb2c17992c Remove effectively dead code in AbstractTypeCheckerContext 2020-01-24 17:17:28 +03:00
Denis Zharkov
0fd6c5c628 NI: Approximate captured-for-star-projections to *
^KT-35602 Fixed
2020-01-24 17:17:28 +03:00
Dmitriy Novozhilov
84913a71b0 Cleanup and reformart DelegatedPropertyResolver.kt 2020-01-24 17:17:28 +03:00
Dmitriy Novozhilov
c5a96f7c11 [NI] Fix completion of error delegates with receiver with type parameters 2020-01-24 17:17:28 +03:00
Dmitriy Novozhilov
aba050fc1b [NI] Don't resolve delegates twice
#KT-31219 Fixed
#KT-31679 Fixed
#KT-32249 Fixed
2020-01-24 17:17:27 +03:00
Dmitriy Novozhilov
68ea4f7d09 [NI] Improve completing calls with multiple postponed arguments 2020-01-24 17:17:27 +03:00
Victor Petukhov
df81249d59 NI: don't filter flexible types during CST calculation and force return as result the first of such types
^KT-35658 Fixed
2020-01-24 17:17:27 +03:00
Dmitriy Novozhilov
19bf96a8b1 [NI] Add constraint K <: T from constraint K <: CapturedType(in T)
#KT-33263 Fixed
2020-01-24 17:17:27 +03:00
Dmitriy Novozhilov
4ec6b4eca9 [NI] Fix substitution in completion of callable references in coroutine inference 2020-01-24 17:17:26 +03:00
Pavel Kirpichenkov
e193e42e07 [NI] Discriminate Nothing? result type from nullability constraints
Nullability constraints should not be chosen when proper
argument constraints for variables in contravariant position present.

^KT-32106 Fixed
^KT-33166 Fixed
2020-01-24 17:17:26 +03:00
Pavel Kirpichenkov
9e9d953728 [NI] Disallow full completion based on lower Nothing constraint 2020-01-24 17:17:26 +03:00
Pavel Kirpichenkov
41debe5806 [NI] Support fixation to subtype in completion mode calculator
Allow full compltion mode for return type depending on type parameters in
contravariant position only if they have proper equality constraint.
2020-01-24 17:17:25 +03:00
Pavel Kirpichenkov
409bbfca7c [NI] Remove direcion calculator from variable fixation
Force constraint system completer to always fix variable with unknown position.
This makes inferred type for in parameters less specific, but OI infers to
subtype in such cases, so NI won't infer to less specific types than before.
2020-01-24 17:17:25 +03:00
Pavel Kirpichenkov
c4d2abcdef [NI] Implement algorithm for completion mode selection
Current selection of completion mode for call is not always correct in case of full mode,
and sometimes too conservative in case of partial mode. Updated algorithm checks constraints
wrt position of type variables in return type and in other related constraints.
Full completion happens if proper constraint requirements are satisfied for variables.
2020-01-24 17:17:25 +03:00
Pavel Kirpichenkov
79c4390aa6 [NI] Remove Nothing result type restriction in most cases
Make Nothing as result type not suitable only for if, when, try and ?: special functions.
2020-01-24 17:17:25 +03:00
Mikhail Zarechenskiy
2386132d6f [NI] Don't discriminate Nothing-type from resulting ones
^KT-32106 Fixed
2020-01-24 17:17:24 +03:00
Mikhail Zarechenskiy
d53af5a7e7 Fix incorrect use of language feature
See #KT-34889 for details
2020-01-24 17:17:24 +03:00
Dmitriy Novozhilov
281f87c934 [NI] Approximate intersection type in type argument to star if it's necessary
#KT-32196 Fixed
2020-01-24 17:17:24 +03:00
Dmitriy Novozhilov
85564530e3 [NI] Infer type variable to Nothing if all upper constraints are from upper bounds
#KT-32196 Fixed
2020-01-24 17:17:24 +03:00
Ilya Chernikov
65a4ea9de3 [NI] Fix inference if inner system has only by "uninteresting" constraint
#KT-32250 fixed
2020-01-24 17:17:23 +03:00
Ilya Chernikov
a11ab4ef83 [minor] [NI] Additional test for loosing type annotations on extension functions
taken from KT-34820
2020-01-24 17:17:23 +03:00
Denis Zharkov
20fb8cc43b NI: Report incompatible receiver of callable reference
^KT-35535 Fixed
2020-01-24 17:17:23 +03:00
Denis Zharkov
1ebae512c5 NI: Fix property references overload ambiguity
^KT-35213 Fixed
2020-01-24 17:17:22 +03:00
Pavel Kirpichenkov
ff23b094f3 [NI] Fix issues with star projection uncapturing
Prevent stack overflow during uncapturing of star projection
for parameter with recursive upper bound.
Uncapture star projections for flexible type parameters with
respect to flexible upper bound.

^KT-35210 Fixed
2020-01-24 17:17:22 +03:00
Pavel Kirpichenkov
a15ee1b5fc [NI] Preserve constraint position for OnlyInputType during incorporation
Variable with complex dependency on other variable loses its
original constraint position when variable it depends on is fixed.
To prevent that, original input position is saved in incorporation
position.
2020-01-24 17:17:22 +03:00
Pavel Kirpichenkov
cf936fe372 [NI] Fix OnlyInputTypes for captured types
Uncapture projections recursively for cases when captured type is not
top-level type or first level type argument
2020-01-24 17:17:22 +03:00
Natalia Selezneva
1fae69264c build.gradle.kts: change notification text 2020-01-24 15:59:54 +03:00
Ilya Goncharov
32d5999508 [IDEA] Use withType instead of isAssignableFrom
#KT-36093 fixed

(cherry picked from commit fa811c731f)
2020-01-24 15:27:18 +03:00
Ilya Goncharov
a51b9b59a9 [IDEA] Check assignable from task to KotlinTest class
(cherry picked from commit 6dc9109736)
2020-01-24 15:27:15 +03:00
Ilya Goncharov
0cdb337870 [IDEA] Use GradleVersion fqn to use it in case when there is no import
(cherry picked from commit 6b860206bd)
2020-01-24 15:27:10 +03:00
Ilya Goncharov
543a3a9d2a [IDEA] Preload KotlinTest class instead of loop finding
(cherry picked from commit c3951d394b)
2020-01-24 15:27:07 +03:00
Ilya Goncharov
1df47400f1 [IDEA] Add check on gradle version not to broke Gradle older 4.0
(cherry picked from commit 2c4cfd2fb8)
2020-01-24 15:27:03 +03:00
Shagen Ogandzhanian
a8cb0fd281 Update dukat dependency to 0.0.26
(cherry picked from commit de07d3387b)
2020-01-24 12:20:14 +01:00
Kevin Bierhoff
c776b7be8c suppress duplicate @Override annotations
(cherry picked from commit 6d32b3256b)
2020-01-24 18:56:10 +09:00
Yan Zhulanow
bf47acd232 Revert "Remove deprecated method from CommandLineProcessor"
This reverts commit 508330e0bb.

An external plugin depends on the deprecated API: com.jereksel.jailbreakk:0.0.2.

(cherry picked from commit 632fe18db6)
2020-01-24 18:46:30 +09:00
Yan Zhulanow
3742726579 Kapt, minor: Add extra case for property initializers
(cherry picked from commit 9bf63f5399)
2020-01-24 18:46:26 +09:00
Yan Zhulanow
26dd649a57 Minor: Fix deprecation notice in KotlinIndicesHelperExtension
(cherry picked from commit 9782f6808d)
2020-01-24 18:46:24 +09:00
Yan Zhulanow
5ec9aa709d Kapt: Support all kinds of constant types (KT-35536)
(cherry picked from commit 520f9a6da5)
2020-01-24 18:46:17 +09:00
Ivan Gavrilovic
50c4f480b6 KT-35536: Fix enum constants in KAPT
Enum constants are Pair, so make sure to unpack them correctly.

(cherry picked from commit eab6864269)
2020-01-24 18:46:08 +09:00
Yan Zhulanow
1570196dc1 Pill: Fix gradle-api artifacts attaching after migration to compileClasspath/runtimeClasspath
(cherry picked from commit 532e879d5c)
2020-01-24 18:44:08 +09:00
Yan Zhulanow
7f8fe34a36 Pill: Support Kotlin JUnit configurations
(cherry picked from commit ea957872eb)
2020-01-24 18:44:05 +09:00
Yan Zhulanow
29224ad4d4 Pill: Remove robolectric classpath passing
(cherry picked from commit 66cd78fbc0)
2020-01-24 18:44:03 +09:00
Yan Zhulanow
1eac5518f8 Pill: Support api/implementation configurations
(cherry picked from commit 5fe06ceb06)
2020-01-24 18:44:02 +09:00
Natalia Selezneva
4dbd5e9885 Scripts: clear manual configuration loading state after project import
^KT-35268

(cherry picked from commit a55a0d94de)
2020-01-24 12:03:08 +03:00
Natalia Selezneva
b7a651fe01 Provide a notification for gradle script that aren't related to any gradle project (KT-35268)
Add action to load/reload configuration for them manually
^KT-35268 Fixed

(cherry picked from commit 858698cf9a)
2020-01-24 12:03:05 +03:00
Natalia Selezneva
fc05b8edbb Implement persistent storage for script class path roots (KT-35886)
Save absolute paths instead of getCanonicalPath usages

^KT-34444
^KT-35886 Fixed

(cherry picked from commit a373ab96d4)
2020-01-24 12:03:03 +03:00
Anton Yalyshev
c0b8b10976 Properly handle a case when Code Style settings = null
(cherry picked from commit 0f049fd536)
2020-01-24 11:33:23 +03:00
Anton Yalyshev
a4c3267c7b Add bunches for unsupported versions
(cherry picked from commit 6d49f36cd6)
2020-01-24 11:33:23 +03:00
Anton Yalyshev
18e7741546 Add Formatter settings tracking to FUS
(cherry picked from commit 1d7dcf3633)
2020-01-24 11:33:23 +03:00
Anton Yalyshev
4d89903b48 Add languageVersion tracking to FUS
(cherry picked from commit 7c0d8ad6c7)
2020-01-24 11:33:22 +03:00
Andrey Uskov
c49bf7ddb1 Added project size and metrics collectors in gradle plugin 2020-01-24 11:22:32 +03:00
Ilya Kirillov
5918bbde21 Wizard: change new wizard title 2020-01-24 09:22:48 +03:00
Ilya Kirillov
9c467c01d9 Wizard: make new wizard to be second in the Kotlin group 2020-01-24 09:22:47 +03:00
Ilya Kirillov
ca0a398a31 Wizard: add FUS statistic collection 2020-01-24 09:22:45 +03:00
Ilya Kirillov
339fd2ae58 Wizard: allow simple js template to be used with JsSingleplatformModuleConfigurator 2020-01-24 09:22:44 +03:00
Ilya Kirillov
ebd825ac8c Wizard: fix removing template in UI 2020-01-24 09:22:43 +03:00
Ilya Kirillov
c87d48eedd Wizard: allow enabling new wizard in UI 2020-01-24 09:22:41 +03:00
Ilya Kirillov
f83f48c803 Wizard: fix tests 2020-01-24 09:22:40 +03:00
Ilya Kirillov
e2f81ee85b Wizard: fix adding dependencies to targets 2020-01-24 09:22:39 +03:00
Ilya Kirillov
0d63c35ee0 Wizard: temporary hide sourcesets editing for users 2020-01-24 09:22:38 +03:00
Ilya Kirillov
ef675dba06 Wizard: fix incorrectly added classpath dependency for Android with Groovy dsl 2020-01-24 09:22:36 +03:00
Ilya Kirillov
70d26bff46 Wizard: put pluginManagement section in the beginning of settings.gradle file 2020-01-24 09:22:35 +03:00
Ilya Kirillov
7da178c345 Wizard: add support of creating run configurations
#KT-36043 fixed
2020-01-24 09:22:33 +03:00
Ilya Kirillov
c2b02afe29 Wizard: add support of react js to the js template 2020-01-24 09:22:32 +03:00
Ilya Kirillov
8882c2e958 Wizard: fix not added dependencies for MPP modules 2020-01-24 09:22:31 +03:00
Ilya Kirillov
9c6e561349 Wizard: fix text of module configurators which is shown in module editor 2020-01-24 09:22:29 +03:00
Ilya Kirillov
6309710c0e Wizard: add support of JS singleplatform projects 2020-01-24 09:22:28 +03:00
Ilya Kirillov
d2602cd5bf Wizard: automatically determine Kotlin version based on Kotlin plugin version
For snapshot plugin just take the latest eap or stable version
2020-01-24 09:22:26 +03:00
Ilya Kirillov
142600f91f Wizard: remove empty border from module settings 2020-01-24 09:22:25 +03:00
Ilya Kirillov
5efb9934a3 Wizard: remove unused function 2020-01-24 09:22:24 +03:00
Ilya Kirillov
36bd7791b2 Wizard: fix incorrectly added modules to the tree 2020-01-24 09:22:23 +03:00
Ilya Kirillov
c6b6f07d3d Wizard: move "validation error" string from message to title 2020-01-24 09:22:21 +03:00
Ilya Kirillov
5e08272f25 Wizard: add validation for project name 2020-01-24 09:22:20 +03:00
Ilya Kirillov
15469c4f8d Wizard: do not suggest invalid groupId 2020-01-24 09:22:19 +03:00
Ilya Kirillov
12a18a8860 Wizard: do not show expert panel form wizard 2020-01-24 09:22:18 +03:00
Ilya Kirillov
46b824ade3 Wizard: remove duplicated string validator 2020-01-24 09:22:16 +03:00
Ilya Kirillov
d2175822e8 Wizard: add validators for POM data 2020-01-24 09:22:15 +03:00
Ilya Kirillov
0faa152537 Wizard: Show message when module has no configurable settings 2020-01-24 09:22:14 +03:00
Ilya Kirillov
051d6afae6 Wizard: Move test framework settings to module configurators 2020-01-24 09:22:12 +03:00
Ilya Kirillov
d4c458e77a Wizard: Move module templates to modules: separate SourcetModuleIR to MultiplatformModuleIR & SourcesetIR 2020-01-24 09:22:11 +03:00
Ilya Kirillov
b864bfe08f Wizard: move module templates to modules 2020-01-24 09:22:10 +03:00
Ilya Kirillov
cf2fa7f27a Wizard: add module dependencies for JPS 2020-01-24 09:22:08 +03:00
Ilya Kirillov
fabb1fed09 Wizard: add kotlin native console application template 2020-01-24 09:22:07 +03:00
Ilya Kirillov
f8ca0d031f Wizard: do not print binaries specification for all native targets
#KT-35719 fixed
2020-01-24 09:22:06 +03:00
Ilya Kirillov
0b8af7d6f8 Wizard: sort & distinct imports in Gradle build files 2020-01-24 09:22:04 +03:00
Ilya Kirillov
78f4a35317 Wizard: move fqName to import in NativeTargetConfigurator 2020-01-24 09:22:03 +03:00
Ilya Kirillov
dfa09aa5ba Wizard: add irs for build files from targets 2020-01-24 09:21:59 +03:00
Ilya Kirillov
540aabc357 Wizard: do not add empty gradle project to settings.gradle 2020-01-24 09:21:58 +03:00
Ilya Kirillov
bd2ed53e33 Wizard: use settings.gradle instead of .kts for Groovy DSL Gradle projects
#KT-35694 fixed
2020-01-24 09:21:57 +03:00
Ilya Kirillov
1450c0ad83 Wizard: print repositories for Maven
#KT-35715 fixed
2020-01-24 09:21:55 +03:00
Ilya Kirillov
3b74c305c8 Wizard: retrieve repositories from artifacts 2020-01-24 09:21:54 +03:00
Ilya Kirillov
ad359f0198 Wizard: correctly add Kotlin dependencies to singleplatform modules with gradle dsl build system
#KT-35695 fixed
2020-01-24 09:21:53 +03:00
Ilya Kirillov
0413c73574 Wizard: fix adding invalid dependencies for maven build files
#KT-35711 fixed
2020-01-24 09:21:52 +03:00
Ilya Kirillov
259d85fdbb Wizard: allow dashes for module names
#KT-35584 fixed
2020-01-24 09:21:51 +03:00
Ilya Kirillov
8c5c5345ff Wizard: Use default Java source roots for JPS projects
#KT-35710 fixed
2020-01-24 09:21:49 +03:00
Ilya Kirillov
c14152eeb0 Wizard: rework UI components for settings
#KT-35712 fixed
2020-01-24 09:21:48 +03:00
Ilya Kirillov
b3ca8308d9 Wizard: fix incorrect ktor repository
#KT-35718 fixed
2020-01-24 09:21:47 +03:00
Ilya Kirillov
bad2a3a946 Wizard: remove redundant return in native target configuration
#KT-35720 fixed
2020-01-24 09:21:42 +03:00
Ilya Kirillov
ab47d3d508 Wizard: fix swapped artifactId and groupId fields titles
#KT-35690 fixed
2020-01-24 09:21:41 +03:00
Ilya Kirillov
59537803d5 Wizard: do not overwrite existing artifactId & groupId settings
#KT-35713 fixed
2020-01-24 09:21:40 +03:00
Ilya Kirillov
2acafe32d0 Fix 191 & as35 compilation
(cherry picked from commit c311a66e5e)
2020-01-24 09:21:20 +03:00
Ilya Kirillov
586a1d3c8f Fix "Protected function call from public-API inline function is prohibited" error
(cherry picked from commit d6daaf14f8)
2020-01-24 09:21:19 +03:00
Ilya Kirillov
d0634d2b6f Fix compilation for AS
(cherry picked from commit 06dc2caf41)
2020-01-24 09:21:18 +03:00
Nikolay Krasko
9cf23713fd Allow @author usage in ...projectWizard.settings.version.maven package
(cherry picked from commit 1f878049eb)
2020-01-24 09:18:51 +03:00
Ilya Kirillov
8815f67511 Fix class not found exception in gradle wizard tests
(cherry picked from commit 830f0c6137)
2020-01-24 09:18:22 +03:00
Ilya Kirillov
a275716dd6 Wizard: introduce unit test mode
(cherry picked from commit 1ab405a86c)
2020-01-24 09:18:21 +03:00
Ilya Kirillov
3b83af751a Wizard: fix android tests
(cherry picked from commit 1c30572844)
2020-01-24 09:18:20 +03:00
Ilya Kirillov
845251f2da Wizard: fix wrong checking for project kind in UI
(cherry picked from commit b2166dc40d)
2020-01-24 09:18:19 +03:00
Ilya Kirillov
a927841af1 Wizard: disable abbility to switch between targets in existing module
(cherry picked from commit c1ce215b5d)
2020-01-24 09:18:18 +03:00
Ilya Kirillov
e47bfec05e Wizard: add suggested module names for js targets
(cherry picked from commit 7204ab091a)
2020-01-24 09:18:17 +03:00
Ilya Kirillov
820a90c3bc Wizard: do not allow to create more than one target of each type
(cherry picked from commit fc9f63d49f)
2020-01-24 09:18:16 +03:00
Ilya Kirillov
a7099c6c30 Wizard: add additional applicability checker for template
(cherry picked from commit aa2992e84a)
2020-01-24 09:18:15 +03:00
Ilya Kirillov
c7e97c2861 Wizard: remove unused android service
(cherry picked from commit 40367635cc)
2020-01-24 09:18:13 +03:00
Ilya Kirillov
1e2c56380a Wizard: format templates code
(cherry picked from commit af174b4f74)
2020-01-24 09:18:12 +03:00
Ilya Kirillov
83c559cf49 Wizard: add simple js template
(cherry picked from commit b29e6d0c69)
2020-01-24 09:18:11 +03:00
Ilya Kirillov
09a771dad0 Wizard: do not print duplicated repositories
(cherry picked from commit 5d56f3d28b)
2020-01-24 09:18:09 +03:00
Ilya Kirillov
d80512dd98 Wizard: introduce interceptors for module templates
(cherry picked from commit 32a151f561)
2020-01-24 09:18:07 +03:00
Ilya Kirillov
d8df582975 Wizard: add simple JS client template
(cherry picked from commit 8bf9c31880)
2020-01-24 09:18:05 +03:00
Ilya Kirillov
a1ece3b529 Wizard: add basic ktor server template
(cherry picked from commit 56fccce305)
2020-01-24 09:18:02 +03:00
Ilya Kirillov
388668edf7 Wizard: introduce ServicesManager & correctly handle disabled gradle & maven Idea plugins
(cherry picked from commit f927fb3471)
2020-01-24 09:18:00 +03:00
Ilya Kirillov
03c1eee25d Wizard: change wizard title to experimental
(cherry picked from commit 9011eecfdf)
2020-01-24 09:17:59 +03:00
Ilya Kirillov
24fc714e01 Wizard: Create parent group for current and experimental project wizard
(cherry picked from commit b10e157147)
2020-01-24 09:17:57 +03:00
Ilya Kirillov
aad67ddbda Wizard: show experimental new project wizard only by registry flag
(cherry picked from commit 8684b0d6c1)
2020-01-24 09:17:56 +03:00
Ilya Kirillov
aeab899542 Wizard: Add initial version of the new project wizard
(cherry picked from commit aca193ddd2)
2020-01-24 09:17:55 +03:00
Abduqodiri Qurbonzoda
cdf89677fb Optimize ArrayDeque tests run time
(cherry picked from commit e89893b6fd)
2020-01-24 05:57:18 +03:00
Ilya Gorbunov
d17908b9ce ArrayDeque: avoid triggering JDK 1.6 bug in tests
Use System.arraycopy instead of Arrays.copyOfRange to
avoid triggering JDK-7174363 bug in copyOfRange.

Fix package of ArrayDequeTest

(cherry picked from commit 8733d5f9ed)
2020-01-24 05:56:54 +03:00
Abduqodiri Qurbonzoda
a00c12d876 Add removeFirst(OrNull) and removeLast(OrNull) methods to MutableList
(cherry picked from commit e459542e6f)
2020-01-24 05:56:25 +03:00
Abduqodiri Qurbonzoda
d8193a5a9f Common ArrayDeque
(cherry picked from commit b6849efd47)
2020-01-24 05:56:02 +03:00
Vladimir Dolzhenko
2af2140f70 Track changes of non physical files with incOutOfBlockModificationCount
To invalidate synthetic file cache have to increment
incOutOfBlockModificationCount on valuable psi changes

#KT-35186 Fixed

(cherry picked from commit 6352cded1b)
2020-01-23 21:24:16 +01:00
Vladimir Dolzhenko
20f5ad2be5 Track changes of non physical files with incOutOfBlockModificationCount
To invalidate synthetic file cache have to increment
incOutOfBlockModificationCount on valuable psi changes

#KT-35186 Fixed

(cherry picked from commit 6352cded1b)
2020-01-23 21:22:38 +01:00
Andrey Uskov
9eb8700d3a Added FUS extensions and new metrics for reporting statistics from gradle 2020-01-23 20:36:47 +03:00
Andrey Uskov
b5202dc104 Added tests to gradle statistics reporter 2020-01-23 20:36:36 +03:00
Andrey Uskov
937a8947cd Metric description and anonymization rules added
Added metrics and their anonymization rules added. Persisted gradle
statistical information will not contain any sensitive information.
#KT-33404 Fixed
2020-01-23 20:36:28 +03:00
Andrey Uskov
ae1be18241 Collecting performance information in Gradle plugin supported
The build performance information is collected during the build
when the Kotlin Gradle plugin is applied. Only hashed values are
saved if they may contain sensitive information. Numeric metrics
obtained on the basis of user's project are saved with random seed.
Persisted information is saved in gradleUserHomeDir.

#KT-33404 Fixed
2020-01-23 20:36:23 +03:00
Andrey Uskov
c0d1b76b62 Open files leak on incremental compilation fixed
#KT-25206 Fixed
2020-01-23 20:36:18 +03:00
Andrey Uskov
0db48ed660 Do not show warnings when some projects are not generated before import
#KT-35442 Fixed
2020-01-23 20:36:14 +03:00
Vladimir Ilmov
765dc2dc28 AsyncStackTraceContext extra logging removed 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
35f4dc57a1 Coroutine debugger starting even if registry key set to false - fixed 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
9a23886042 [coroutine] ComboBox disabled as in progress 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
823cc41123 [coroutine] Exception fixed for SUSPEND coroutines. 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
21ba1f2455 Flaky ConcurrentModificationException in NewMultiplatformProjectImportingTest.testFileCollectionDependency fixed 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
0fac6d2d50 POC coroutine panel removed 2020-01-23 15:26:47 +01:00
Vladimir Ilmov
0903e0dcdc [debug] coroutine's stack frame locations pre-calculated on initialization 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
cd39237566 CodeConformanceTest @author mention in sources fixed 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
a934b348e1 Coroutine as35 compatibility patch also added to 191. 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
abd956c123 CoroutineAsyncStackTraceProvider stack corruption fix 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
ab727cbfbf coroutine debugger toolbar added 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
9f1d8f38a3 coroutine debugger logic moved to jvm-debugger-coroutine module 2020-01-23 15:26:46 +01:00
Vladimir Ilmov
58bbf6a57a [coroutine][debugger] implementation basing on X-* approach
XCoroutine view added for direct comparison with Coroutines
2020-01-23 15:26:46 +01:00
Vladimir Ilmov
8ed20ce667 [coroutine][debugger] refactoring being done
X-view approach added for review, thread groups added
2020-01-23 15:26:46 +01:00
Leonid Startsev
90fe752ae9 Do not include annotations and KDoc into NO_EXPLICIT_VISIBILITY_IN_API_MODE report range
Rename positioning strategy to better reflect its behavior.
#KT-36021 Fixed

(cherry picked from commit 43858e8169)
2020-01-23 17:17:15 +03:00
Leonid Startsev
7b82c0e90b Fix unavailable 'Specify visibility explicitly' quickfix
in explicit API mode due to incorrect cast.
Add tests for applying this quickfix.
#KT-36020 Fixed

(cherry picked from commit 4285c6045a)
2020-01-23 17:17:05 +03:00
Leonid Startsev
dcb5df4f48 Search for standard serializers in both internal and root packages
To allow graduate migration of some classes (e.g. IntSerializer)
from kotlinx.serialization.internal.* to kotlinx.serialization.*

(cherry picked from commit 9e8f21cc20)
2020-01-23 12:42:30 +03:00
Leonid Startsev
38965ccf51 Pass actual serializable properties count in the generated code
to SerialClassDescImpl.
This is needed to optimize space allocation.

(cherry picked from commit db4273d677)
2020-01-23 12:42:06 +03:00
Leonid Startsev
b695f2b8fe Refactor plugin-generated call to EnumSerializer():
support new values() argument.
Get rid of old @JvmOverloads requirements in runtime.

(cherry picked from commit 9558538d15)
2020-01-23 12:41:54 +03:00
Vladimir Dolzhenko
f0535a787f Put a proper version of ProgressIndicatorUtils.kt.192
Relates to #KT-33939
2020-01-23 08:57:56 +01:00
Vladimir Dolzhenko
f95d9ca024 Handle kdoc case for Introduce import alias inspection
#EA-210889 Fixed
2020-01-22 22:26:01 +01:00
Vladimir Dolzhenko
59df5711aa Show Review Added Imports on paste action
Fixed multi-caret selection in kotlin-to-kotlin copy-paste processor

Relates to #KT-33939

(cherry picked from commit db8b0a6593)
2020-01-22 17:23:05 +01:00
Vladimir Dolzhenko
036f88424a Fixed ProgressIndicatorUtils.kt for 201
#KT-36008 Fixed
Relates to #KT-33939

(cherry picked from commit 1911cbb077)
2020-01-22 17:22:49 +01:00
Vladimir Dolzhenko
b49b795bd2 ProgressIndicatorUtils.kt for 191 is added
Relates to #KT-33939

(cherry picked from commit c0c929c449)
2020-01-22 17:22:09 +01:00
Vladimir Dolzhenko
ce829cb220 Reworked k2k copy-paste action.
Get rid of resolve from copy phase, paste phase performs resolve in bg

#KT-33939 Fixed

(cherry picked from commit 5730a21e7b)
2020-01-22 17:22:00 +01:00
Ilya Matveev
4ec1ec7fd9 Gradle, native: Allow setting destination directory for binaries
Issue #KT-29395 fixed
2020-01-22 17:41:00 +07:00
Ilya Matveev
0611e79d98 Gradle, native: Don't pass to compiler missing klib files
We don't compile a klib if there are no sources for it (NO-SOURCE
checks). So, we need to take this fact into account and don't
pass such libraries to compiler in dependent modules. See also:
GH-2617 in the K/N repo.

This patch checks that a klib file exists before passing it to the
compiler.
2020-01-22 17:40:59 +07:00
Ilya Matveev
90ef8f9b55 Gradle, tests: Skip building in native binaries test for Groovy DSL
This test is one of the most time-consuming tests because
it builds a lot of final native binaries. Moreover, it exists
in two versions: for Groovy DSL and for Kotlin DSL. The only
difference between these versions is build script DSL.

This patch disables project building for the Groovy DSL version to
reduce total test execution time. Now this test only checks that
project configuration is successful. But it's enough to detect DSL
problems.
2020-01-22 17:40:58 +07:00
Ilya Matveev
9b5bd0dd5d Gradle, native: Support exporting dependencies for static and shared libs
Issue #KT-35352 fixed
2020-01-22 17:40:57 +07:00
Yaroslav Chernyshev
17d3f1d075 [Gradle, Native] Implement custom name for generated framework for XCode
(cherry picked from commit 401baa35ab)
2020-01-22 10:53:21 +03:00
Natalia Selezneva
1af05fd600 Fix script configurations for gradle project without source roots in 193 and as40
GradleKtsImportTest:testEmpty fixed
(cherry picked from commit b38836c488)
2020-01-22 09:51:48 +03:00
Natalia Selezneva
9a36ec0219 KotlinDslScriptModel request shouldn't fail the gradle build
(cherry picked from commit f0cb51a5bc)
2020-01-22 09:51:48 +03:00
Natalia Selezneva
f3bb45c59c as36: Update to AS 3.6 RC (192.7142.36.36.6071332)
^KT-36005 Fixed

(cherry picked from commit 606279b462)
2020-01-22 09:51:48 +03:00
Natalia Selezneva
a9ba149554 Remove unnecessary bunch file for AS4.0
(cherry picked from commit 4699ba758e)
2020-01-22 09:51:48 +03:00
Natalia Selezneva
521d3eee70 Scripting: do not call getConfiguration inside ScriptClassRootsCache
We already have all configurations inside `all` property.
If script doesn't have loaded configuration getting script sdk - ask for configuration explicitly to avoid situations when configuration is already loaded but not yet saved in memory cache

Looks related to KT-35590
^KT-35590

(cherry picked from commit a24e62eaf7)
2020-01-22 09:51:47 +03:00
Vladimir Dolzhenko
195104f7cf Store addUnambiguousImportsOnTheFly in kotlin code insight settings
store optimizeImportsOnTheFly in kotlin code insight workspace settings

#KT-36034 Fixed
2020-01-21 17:56:18 +01:00
Alexander Podkhalyuzin
a1ec739727 Now using Kotlin setting instead of Java one in 191 as well 2020-01-21 17:55:49 +01:00
Ilya Chernikov
8e812c2685 Add only non-jdk classpath entries from the compiler to script
remove unnecessary manifest classpath entries in the saved compiled
script jar
2020-01-21 15:12:03 +01:00
Ilya Chernikov
19ddcc0895 Use scripting cache earlier in the pipeline:
before initializing compiler and processing callbacks
2020-01-21 15:12:03 +01:00
Ilya Chernikov
6b25f14bfd Speed up REPL package member declaration provider
about 10-15% on specific test
also preparing test infrastructure for it
2020-01-21 15:12:03 +01:00
Ilya Chernikov
794c22b758 [minor] fix typo in function name 2020-01-21 15:12:03 +01:00
Ilya Chernikov
401f659734 Immplement default cache in main-kts 2020-01-21 15:12:03 +01:00
Ilya Chernikov
874d08b04e Get rid of kotlinx.coroutines usage in saved script runner
to reduce dpendencies for the save dscipt running
2020-01-21 15:12:03 +01:00
Ilya Chernikov
995699cc36 Fix ivy mapping to the maven repos in main-kts 2020-01-21 15:12:03 +01:00
Ilya Chernikov
c9d0e97eaf Implement automatic loading of .main.kts scripts support
also fix discovery from ScriptDefinitionsProvider
2020-01-21 15:12:03 +01:00
Ilya Chernikov
afed7fde01 Check REPL snippet syntax before calling analysis
restores the behaviour of the GenericRepl implementation and fixes
issues then invalid code is being compiled
#KT-34888 fixed
2020-01-21 15:12:02 +01:00
Ilya Gorbunov
464c8782c2 Rename Clock to TimeSource, ClockMark to TimeMark
Step 2: rename classes and interfaces.
Provide deprecated typealiases to smooth migration.

(cherry picked from commit 1336da8453)
2020-01-21 16:07:52 +03:00
Ilya Gorbunov
57c5d0ee83 Rename Clock to TimeSource, ClockMark to TimeMark
Step 1: rename files

(cherry picked from commit a11a25087a)
2020-01-21 16:07:52 +03:00
Elena Lepilkina
2abdeaf365 Update K/N version 2020-01-21 14:05:59 +03:00
Zalim Bashorov
c544749e14 [Build] Remove the property to skip JS IR BE tests
It's no longer needed since we going to start building libraries using the new BE,
so we have to be sure that everything works well in releases branches too.

(cherry picked from commit 9cf1a2b404)
2020-01-21 00:09:36 +03:00
Zalim Bashorov
86441a95c4 [JS BE] Fix is check with Function
#KT-33149 fixed

(cherry picked from commit ee06678484)
2020-01-21 00:09:36 +03:00
Igor Chevdar
2c2aa081e4 [kotlin-native-plugin] Enabled compiler daemon 2020-01-20 18:43:14 +03:00
Leonid Startsev
7993a02d9f Support SerializerFactory in Native
kotlinx.serialization plugin now adds additional function to companions
of generic classes in order to overcome lack of reflection. This
helps retrieving generic serializers from KType.

(cherry picked from commit 137c500e3a)
2020-01-20 14:57:12 +03:00
Nikolay Krasko
5db3ae7680 Switch to 193 platform 2020-01-20 13:46:44 +03:00
Nikolay Krasko
7e3ba2f976 Update 193 to 193.6015.22-EAP-SNAPSHOT 2020-01-20 13:44:42 +03:00
Nikolay Krasko
3d632163d8 Advance version to 193.5662.53
(cherry picked from commit 80d5723a07)
2020-01-20 13:44:42 +03:00
Nikolay Krasko
7562bc44d2 Mute TCServiceMessageOutputStreamHandlerTest for 193 platform (KT-35938)
(cherry picked from commit b4ae1645ec)
2020-01-20 13:44:42 +03:00
Nikolay Krasko
513f8b26d5 JUnit 4 runner for ignoring muted tests
(cherry picked from commit fd8ff463bb)
2020-01-20 13:44:42 +03:00
Nikolay Krasko
059b0b4e8c Run tests in kotlin-gradle-plugin in repository working dir
Unify with other modules and make GradleNodeModuleBuilderTest work under
JPS.

(cherry picked from commit 6963c81b40)
2020-01-20 13:44:42 +03:00
Mikhael Bogdanov
6100899487 Minor. Convert test
(cherry picked from commit 52ac8d788d)
2020-01-20 10:57:47 +01:00
Mikhael Bogdanov
01b1567723 Don't generate type annotations on synthetic accessors
#KT-35843 Fixed

(cherry picked from commit 70d71f0f07)
2020-01-20 10:57:35 +01:00
Mikhael Bogdanov
3bb25c889a Support field type annotations
#KT-35843 Fixed

(cherry picked from commit 1032e3a17c)
2020-01-20 10:57:22 +01:00
Mikhael Bogdanov
a4b3912ea7 Support type annotations
#KT-35843 Fixed

(cherry picked from commit 2ed0cb2a89)
2020-01-20 10:57:06 +01:00
victor.petukhov
04ad28046a Fix isNegated psi method in KtWhenConditionInRange
^KT-34395 Fixed

(cherry picked from commit fc7b836151)
2020-01-17 19:26:17 +03:00
Victor Petukhov
982d86b4a3 Workaround an inliner problem upon which the compiler code itself stumbled
^KT-35856 Fixed

(cherry picked from commit 5917591205)
2020-01-17 19:26:07 +03:00
Sergey Igushkin
c5fdddb719 Support serializing a module's own descriptors without dependencies
The KlibMetadataSerializer used to serialize all package fragments that a module
could provide, including those coming from the module's dependencies. In order
to produce a klib from a module that is analyzed by the K2MetadataCompiler, the
serializer needs to take just the own package fragments of the module, excluding
those of the dependencies.

(cherry picked from commit 1129b2d3eb)
2020-01-17 18:51:11 +03:00
Sergey Igushkin
65b4680521 Support generating a klib from common code with K2MetadataCompiler
(cherry picked from commit ed6034e449)
2020-01-17 18:51:10 +03:00
Sergey Igushkin
820be03e25 Allow not providing IR to serialize a klib with just the frontend metadata
(cherry picked from commit 28e0089259)
2020-01-17 18:51:08 +03:00
Sergey Igushkin
a1909b10ef Fix non-existing files passed in classpath to Kotlin/JS compiler
(cherry picked from commit 38feadcfe8)
2020-01-17 18:31:51 +03:00
Nikolay Krasko
f184c4d2ac Simplify adding Kotlin sdk by inlining internals of ProjectSdksModel
Because of using cloning sdks inside ProjectSdksModel tests fail with sdk leaked errors.

(cherry picked from commit c7d39b612c)
2020-01-17 18:25:08 +03:00
Nikolay Krasko
48cd03a66c Better fix for compiler plugin test initialization
The previous one didn't work in 191.
Also revert changes in tests-common module.

(cherry picked from commit 70067bc9bf)
2020-01-17 18:25:08 +03:00
Nikolay Krasko
919092558c Mute flaky JavaAgainstKotlin.testUsingMutableInterfaces
(cherry picked from commit ddda93ad96)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
1d1453197b Enable mute tests feature for BuiltInDecompilerTest
(cherry picked from commit e20c66011a)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
7e0e94736e Mute flaky step over tests on Android Studio
(cherry picked from commit 28e23f0aa8)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
4c89c4bccc Mute GradleMigrateTest.testMigrateStdlib in AS
(cherry picked from commit 11e4b710b5)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
44fd8a8a16 Mute tests for preferring JDK classes in completion and auto-import in 191 and 192 (KT-35709)
BasicCompletionWeigherTestGenerated.testPreferFromJdk
AutoImports.testAmbiguousNamePreferFromJdk

(cherry picked from commit 77edfed764)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
a64f0366b1 Fix test data for QuickFixTestGenerated.SupertypeInitialization in 191
(cherry picked from commit 74e2c98426)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
be7ae53b40 Mute JavaToKotlinConverterSingleFileTestGenerated in 191
(cherry picked from commit 0d48855333)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
d4bb1f3f42 Fix UpdateConfigurationQuickFixTest.testEnableCoroutinesFacet test
(cherry picked from commit 28eb6a223d)
2020-01-17 18:25:07 +03:00
Nikolay Krasko
e9d6cce9a3 Split tests to common and platform parts
(cherry picked from commit 4c28e0dec3)
2020-01-17 18:25:06 +03:00
Nikolay Krasko
2e436a2c25 Minor: sort tests in mute database
(cherry picked from commit 570b522e8e)
2020-01-17 18:25:06 +03:00
Nikolay Krasko
ad0884e0cb Port muting database from master
(cherry picked from commit 8014a6509e)
(cherry picked from commit 482cb07420)
(cherry picked from commit 9d54d1ec40)
(cherry picked from commit c5d4213a5c)
(cherry picked from commit c935078f05)
(cherry picked from commit c848212ae9)
(cherry picked from commit 08ade450ff)
(cherry picked from commit f41b588f70)
(cherry picked from commit 712517a02e)
(cherry picked from commit 5f25242cbf)
(cherry picked from commit 3520d5b81d)
(cherry picked from commit 18b1d64adc)
(cherry picked from commit c11f36cf1d)
(cherry picked from commit 84604b91bf)
(cherry picked from commit 1058f04c53)
(cherry picked from commit 1e3736ec1e)
(cherry picked from commit 6613b73657)
(cherry picked from commit dca5ff10c7)
(cherry picked from commit d80fdf307f)
(cherry picked from commit d2909814c2)
(cherry picked from commit 03bd80b1ba)
(cherry picked from commit 3210e1d44c)
(cherry picked from commit 1682ace428)
(cherry picked from commit 9206f1cfb2)
(cherry picked from commit 1e14c48742)
(cherry picked from commit 0884681662)
(cherry picked from commit c372dc7f0a)
(cherry picked from commit 9b68008208)
(cherry picked from commit d575df56e9)
(cherry picked from commit 1b9bae0cca)
(cherry picked from commit bf79b660c4)
(cherry picked from commit 2f129ea435)
(cherry picked from commit 7a94b1d88b)
(cherry picked from commit 5583b57ed7)
(cherry picked from commit 70ff3d36d0)
2020-01-17 18:25:06 +03:00
Yan Zhulanow
899d1c844e Remove changelog for previous releases 2020-01-17 21:10:16 +09:00
Dmitry Gridin
cabe30f973 idea: cleanup code
(cherry picked from commit 8dbbd64beb)
2020-01-17 17:29:23 +07:00
Ilya Matveev
5585074266 Gradle, native: Don't use an arg file when compiler daemon is enabled
We pass compiler flags using an arg file if the compiler is executed
in a separate process because Windows limits maximal command line
length (see https://github.com/JetBrains/kotlin-native/issues/1999).

But for the compiler daemon we pass the args directly to the compiler
entry point method. So we can abandon using an arg file here.
2020-01-17 12:45:50 +07:00
Ilya Matveev
fd89b9000b Gradle, native: Escape spaces in K/N compiler args
We use an argument file to pass arguments to the K/N compiler.
Earlier each line of such a file was treated by the compiler
as a separate argument. But this logic was updated some time
ago and now content for this file is treated as a space separated
list of arguments.

This patch takes this into account at the Gradle side and quotes
arguments written to the arg file.

Issue #KT-35934 Fixed
2020-01-17 12:45:49 +07:00
Abduqodiri Qurbonzoda
96059aead3 Create method Collection.randomOrNull() #KT-35347
(cherry picked from commit 3cad1bbb51)
2020-01-16 22:56:28 +03:00
Sergey Rostov
db8be3fc8a AbstractScriptConfigurationLoadingTest: add asserting messages
(cherry picked from commit 07041574da)
2020-01-16 19:17:42 +03:00
Sergey Rostov
287cbd8382 .gralde.kts: optimize getAffectedGradleProjectFiles (EA-220597 fixed)
(cherry picked from commit 40914e79ee)
2020-01-16 19:17:41 +03:00
Alexander Udalov
13aea1382e Revert "JVM/JVM_IR: fix mapping of KClass in annotation classes"
This reverts commit 7cd55c85e6.

Since we don't have much time for carrying out the deprecation policy,
KT-35207 will be supported since 1.4-M1.
2020-01-16 17:02:06 +01:00
Alexander Udalov
8f09dcbe9b Keep annotation FQ name in experimental API diagnostics
This fixes compilation of ExperimentalFixesFactory where this FQ name
is used to construct a correct quick fix instance.

(cherry picked from commit b5afdc7553)
2020-01-16 17:01:06 +01:00
Alexander Udalov
f9f286dd8c Deprecate Experimental/UseExperimental in favor of RequiresOptIn/OptIn
(cherry picked from commit 514bf3eec0)
2020-01-16 17:01:06 +01:00
Alexander Udalov
fd879cb4f5 Support custom message in RequiresOptIn
#KT-34648 Fixed

(cherry picked from commit f954a6c812)
2020-01-16 17:01:05 +01:00
Alexander Udalov
73d3b7632c Rename UseExperimental->OptIn, Experimental->RequiresOptIn in quickfix and IDE tests
(cherry picked from commit 9187a85aaf)
2020-01-16 17:01:05 +01:00
Alexander Udalov
82b18c9291 Fix compiler and IDE tests on Experimental/RequiresOptIn
See cdbabf224f, e009c7064e

(cherry picked from commit 16db3a8b5f)
2020-01-16 17:01:05 +01:00
Alexander Udalov
cd668eae98 Rename UseExperimental->OptIn, Experimental->RequiresOptIn in Gradle plugin
(cherry picked from commit da077b5353)
2020-01-16 17:01:05 +01:00
Alexander Udalov
e821a7c516 Rename UseExperimental->OptIn, Experimental->RequiresOptIn in stdlib kdocs
(cherry picked from commit 8f94a2bb75)
2020-01-16 17:01:05 +01:00
Alexander Udalov
e35f1c4bbc Rename UseExperimental->OptIn, Experimental->RequiresOptIn in compiler tests
(cherry picked from commit 7742a3b697)
2020-01-16 17:01:04 +01:00
Alexander Udalov
834fc4d457 Rename Experimental/UseExperimental in compiler diagnostic messages
#KT-34647

(cherry picked from commit b839b905b5)
2020-01-16 17:01:04 +01:00
Alexander Udalov
deced92e8d Fix NPE in ExperimentalUsageChecker in corner case
Since there's no nullability assertion, null could end up in this list
and cause NPE further at `reportNotAcceptedExperimentalities`. This
could happen if a declaration was annotated with WasExperimental, the
marker was annotated with the new RequiresOptIn, and API version 1.2 was
used.

No new tests are added because 1.2 is obsolete and WasExperimental is
internal.

(cherry picked from commit d547af00aa)
2020-01-16 17:01:04 +01:00
Alexander Udalov
1c047daeae Add -Xopt-in command line argument
As per https://github.com/Kotlin/KEEP/pull/201

(cherry picked from commit e009c7064e)
2020-01-16 17:01:04 +01:00
Alexander Udalov
adec550d1a Introduce RequiresOptIn and OptIn annotations
RequiresOptIn should be used now instead of Experimental, OptIn instead
of UseExperimental. See https://github.com/Kotlin/KEEP/pull/201.

This change adds the new declarations only to the stdlib, and supports
them in the compiler. Because of the way compiler loads annotations, we
need to bootstrap it first before deprecating the old annotations and
updating tests.

 #KT-34647 Fixed

(cherry picked from commit cdbabf224f)
2020-01-16 17:01:04 +01:00
Alexander Udalov
35258657af Deprecate -Xexperimental compiler argument
This option is not widely used and its implementation relies on a
complicated mechanism of a module-wide metadata, which is not properly
supported in the IDE (see IdeModuleAnnotationsResolver).

 #KT-34649 Fixed

(cherry picked from commit 33bc3db144)
2020-01-16 17:01:03 +01:00
Vyacheslav Gerasimov
6d8148f64b Build: Add missing com.github.node-gradle.node plugin versions
(cherry picked from commit fa1c6c9697)
2020-01-16 18:52:25 +03:00
Vyacheslav Gerasimov
5ca2a9b79f Build: Add kotlinPluginPublication to idea-gradle-tooling-api
(cherry picked from commit a0e73bffa0)
2020-01-16 18:52:14 +03:00
Dmitry Gridin
fb10a6de3a KtScratchExecutionSession: fix compilation for 191
(cherry picked from commit 09acdb655d)
2020-01-16 18:40:12 +07:00
Dmitry Gridin
353404705f KotlinDebuggerCaches: fix INRE
#EA-219472 Fixed

(cherry picked from commit 898308c7ba)
2020-01-16 18:40:09 +07:00
Dmitry Gridin
33251ee2ee KotlinConsoleRunner: fix INRE
#EA-219478 Fixed

(cherry picked from commit 3f500c6e92)
2020-01-16 18:40:07 +07:00
Dmitry Gridin
2dcf96cd71 IDEKotlinAsJavaSupport: fix INRE
#EA-213321 Fixed

(cherry picked from commit 02beb72ab1)
2020-01-16 18:38:09 +07:00
Dmitry Gridin
c82520e1bf KotlinFunctionBreakpoint: fix INRE
#KT-35316 Fixed
#EA-219418 Fixed

(cherry picked from commit 4d7fe78a51)
2020-01-16 18:38:05 +07:00
Dmitry Gridin
286149efe5 KotlinNativeModuleConfigurator: fix INRE
#EA-219416 Fixed

(cherry picked from commit 09bcfab047)
2020-01-16 18:38:04 +07:00
Dmitry Gridin
4be844bbe7 KtScratchExecutionSession: fix INRE
#EA-218701 Fixed

(cherry picked from commit 86f9253fa0)
2020-01-16 18:38:01 +07:00
Dmitry Gridin
de7f8c34c8 KotlinVariableInplaceIntroducer: fix PIEAE
#EA-209820 Fixed

(cherry picked from commit 78f7ed2c27)
2020-01-16 18:37:58 +07:00
Dmitry Gridin
6b4d2ed7db JavaToKotlinAction: fix KNPE
#EA-215300 Fixed

(cherry picked from commit 580885245d)
2020-01-16 18:36:50 +07:00
Dmitry Gridin
83ed2150a5 idea: fix some ControlFlowException
#EA-219412 Fixed

(cherry picked from commit 34dcc72e7f)
2020-01-16 18:36:47 +07:00
Dmitry Gridin
327acd5f5f PerModulePackageCacheService: fix NPE for code injection
#KT-35208 Fixed

(cherry picked from commit 7c9826b60b)
2020-01-16 18:35:05 +07:00
Nicolay Mitropolsky
b31f88a51d 191: Uast: fix compilation for 191
(cherry picked from commit ed57a53ad6)
2020-01-16 10:24:02 +03:00
Nicolay Mitropolsky
72a7bc2beb Uast: KotlinIDERenderLogTest for running UAST tests with ULC
In case of result difference the `-ide`-suffixed testdata is used.
Actually the difference in results is more likely to be a bug
but currently we are fixating at least some behaviour to protect from
 unexpected regressions in Ultra Light Classes.

`object Local` were removed because there is no local objects in actual
 Kotlin syntax

(cherry picked from commit 54285d328f)
2020-01-16 10:24:00 +03:00
Mikhail Zarechenskiy
589a07494d Add feature that allows references to synthetic properties with warning
See KT-35933 for details
2020-01-16 09:46:00 +03:00
Natalia Selezneva
9e3ed92e26 Scripting: use VFS events instead of document changes to track changes outside of IDE (KT-35557)
^KT-35557 Fixed

(cherry picked from commit a653feb2dc)
2020-01-16 09:38:05 +03:00
Natalia Selezneva
bdf3543ebf Simplify check for that gradle script configurations is up to date
Get time stamp for script inputs before gradle import

(cherry picked from commit 6bf0e4b1a9)
2020-01-16 09:38:04 +03:00
Natalia Selezneva
cf3c505097 Implement persistent storage for time stamps of files that affect build script configuration (KT-3556)
^KT-3556 Fixed

(cherry picked from commit 3dfbd824e4)
2020-01-16 09:38:04 +03:00
Natalia Selezneva
426815b8ae Scripting: extract API to check if script is related to any gradle project
KT-35268 cannot be implemented without explicit action for loading configurations for script outside of project model

^KT-35268
^KT-34625

(cherry picked from commit ecb05ace91)
2020-01-16 09:38:04 +03:00
Natalia Selezneva
d3bcbcc7eb Tests: switch off script configuration update in MutlifileRefactoringTests
(cherry picked from commit feda832eb7)
2020-01-16 09:38:04 +03:00
Natalia Selezneva
0ef8ecea02 Scripting: remove unexpected cache clear
(cherry picked from commit 233d400e93)
2020-01-16 09:38:04 +03:00
Sergey Igushkin
b9888d160b Deprecate 1.2.x MPP Gradle plugins
Issue #KT-31570 Fixed
2020-01-16 00:00:28 +03:00
Sergey Igushkin
0cb15d8c88 Support Gradle instant execution for Kapt tasks
* In the Kotlin/JVM tasks, move the compiler arguments setup logic to
  a separate class, so that it can be reused by the Kapt tasks without
  directly referencing the Kotlin/JVM tasks

* In the Kapt tasks, carefully capture the values using the Provider API
  so that the task can be serialized for Instant Execution and then
  deserialized and executed without relying on the project model

Issue #KT-35181 Fixed

(cherry picked from commit f9acc0ab88)
2020-01-15 23:55:49 +03:00
Ilmir Usmanov
0ddeb3975c Unconditionally remove $$forInline suffix from enclosing method
when transforming objects with suspend functions/lambdas, which
capture crossinline suspend lambdas. Since functions with the
suffix have a counterpart without the suffix, for java interop
and reflection call purposes, it is safe change.
 #KT-31242 Fixed
2020-01-15 15:12:57 +01:00
Ilya Kirillov
bbb0788e4a New J2K: fix exception when met PsiLambdaParameterType
#KT-35431 fixed

(cherry picked from commit a10f37dd50)
2020-01-15 14:18:25 +03:00
Ilya Kirillov
0dcec158ec New J2K: fix converting multiline comment with /* inside
#KT-18001 fixed
#KT-35081 fixed

(cherry picked from commit 5be80be74d)
2020-01-15 14:18:24 +03:00
Ilya Kirillov
b3654b7d03 New J2K: add missing line break between property and getter
#KT-35739 fixed

(cherry picked from commit a87de01c74)
2020-01-15 14:18:24 +03:00
Ilya Kirillov
47ee2452aa New J2K: fix incorrectly removed line break before constructor comment
That caused class body brace to be under the comment

#KT-35478 fixed

(cherry picked from commit b83a529b77)
2020-01-15 14:18:23 +03:00
Ilya Kirillov
3990d7337a New J2K: correctly convert compound Java assignment expression
#KT-35476 fixed

(cherry picked from commit 7bfad12e6a)
2020-01-15 14:18:23 +03:00
Ilya Kirillov
0b7f44d5ea New J2K: fix UninitializedPropertyAccessException when calculating type of anonymous class
#KT-35395 fixed

(cherry picked from commit 6a8a68a263)
2020-01-15 14:18:22 +03:00
Ilya Kirillov
62eaad300a New J2K: Fix SOE in nj2k Java declarations printer
(cherry picked from commit 7882f566be)
2020-01-15 14:18:22 +03:00
Ilya Kirillov
77cc29b42d New J2K: remove initializer from property without backing field
#KT-33637 fixed

(cherry picked from commit 14a8d3726d)
2020-01-15 14:18:21 +03:00
Leonid Startsev
85dd870693 Supply correct Native platform for module descriptor while compiling from CLI
(cherry picked from commit 9bd966c123)
2020-01-15 12:51:07 +03:00
Leonid Startsev
dddab06b9f Support .decodeSequentially call on JVM and Native and remove READ_ALL handling from all platforms
Fix codegen test

Ignore JVM IR codegen test for a while since it requires updated kotlinx-serialization-runtime in classpath

(cherry picked from commit f2026a49bb)
2020-01-15 12:50:49 +03:00
Yaroslav Chernyshev
49f7aa38ea [Gradle, Native] Added subspecs support in CocoaPods plugin
#KT-32750 fixed
2020-01-15 15:42:59 +07:00
Alexander Gorshenev
797dd80ee5 Allow parallel access to klib zip filesystem 2020-01-14 19:12:30 +03:00
Nicolay Mitropolsky
2d8701a2d9 Uast: fake light method for uast is created only when containing class exists (KT-35310, EA-219604)
(cherry picked from commit 23c2a5c830)
2020-01-14 17:05:29 +03:00
Nicolay Mitropolsky
3330db8c7b Uast: the returnType support for light methods for reified functions (KT-35610)
(cherry picked from commit ed4e73c8e9)
2020-01-14 17:05:27 +03:00
Nicolay Mitropolsky
c54f55d460 Uast: properly handling annotations on destructured variables (KT-35673, EA-220128)
(cherry picked from commit c04ba009e6)
2020-01-14 17:05:26 +03:00
Vladimir Dolzhenko
6aa9fe6def IAE: RangeMarkerImpl.<init>
#EA-141884 Fixed
2020-01-14 13:11:22 +01:00
Vladimir Dolzhenko
e972901b9c Access index under runReadActionInSmartMode in ProbablyContractedCallableNamesImpl
#EA-219476 Fixed
2020-01-14 13:11:10 +01:00
Vladimir Dolzhenko
c5a669ead4 Improve investigation info in KtDotQualifiedExpression
Relates to #EA-212081
2020-01-14 13:11:01 +01:00
Vladimir Dolzhenko
5d4ab93db3 Access index under runReadActionInSmartMode in KotlinRuntimeLibraryUtil
#EA-220414 Fixed
2020-01-14 13:10:52 +01:00
Vladimir Dolzhenko
550d057fc8 Edit kdoc reference in Introducing import alias
#KT-35837 Fixed
2020-01-14 13:10:41 +01:00
Vladimir Dolzhenko
c26522dfd2 Handle kdoc case for Introduce import alias inspection
#EA-210889 Fixed
2020-01-14 13:10:30 +01:00
Vladimir Dolzhenko
5f6f2f8af9 Module info has to be read under readAction in KotlinConfigurationCheckerComponent
#EA-209610 Fixed
2020-01-14 13:09:57 +01:00
Vladimir Dolzhenko
bc5ffe14a9 Improve investigation info in PackageCodegenImpl
Relates to #EA-218779
2020-01-14 13:09:46 +01:00
Vladimir Dolzhenko
dc8b3ffd8a Handle \r line endings in plaintext j2k
#KT-35831 #EA-209568 Fixed
2020-01-14 13:09:35 +01:00
Vladimir Dolzhenko
e1beebde08 Handle java ctor case for Introduce import alias inspection
#KT-35824 #EA-218654 Fixed
2020-01-14 13:09:23 +01:00
Vladimir Dolzhenko
edfe97a165 Add more investigation info to diagnoseUnknownModuleInfo
Relates to #EA-220276
2020-01-14 13:09:08 +01:00
Vladimir Dolzhenko
0e66b5ed9d Add disposable to document listener in ScratchEditorSyncHighlighter
#EA-220382 Fixed
2020-01-14 13:08:32 +01:00
Vladimir Dolzhenko
803df7d7a1 Fix renaming class according to a file name when file name has no name (but extension)
#EA-219715 Fixed
2020-01-14 13:08:23 +01:00
Vladimir Dolzhenko
4f3e26e7be Commit documents before createResourceReference in KotlinAndroidAddStringResource
#EA-127016 Fixed
2020-01-14 13:08:09 +01:00
Vladimir Dolzhenko
87477fe15a Add more investigation info to getFilesForElements
Relates to #EA-209630
2020-01-14 13:08:00 +01:00
Vladimir Dolzhenko
175d0da3e8 Module info has to be read under readAction in scriptDefinitionsFromDependencies
#EA-220355 Fixed
2020-01-14 13:07:46 +01:00
Vladimir Dolzhenko
3eb3e55d6f Module info has to be read under readAction in KotlinNativeABICompatibilityChecker
#EA-220356 Fixed
2020-01-14 13:07:37 +01:00
Ilya Gorbunov
85b931b64a Rewrite UnderMigration and MigrationStatus in Java
to remove dependency on kotlin-stdlib.

#KT-33141

(cherry picked from commit 0764a065e8)
2020-01-14 14:34:08 +03:00
Miguel Serra
5a9e771197 KT-20357: Add samples for linkedSetOf
(cherry picked from commit 4fa5e2d85c)
2020-01-14 14:34:08 +03:00
Tillmann Berg
94b82080bc KT-20357: Add sample for reduce, reduceRight and their indexed counterparts
(cherry picked from commit 95300ae31d)
2020-01-14 14:34:08 +03:00
Ilya Gorbunov
cd7a6989ec Add more reduceOrNull tests
- Test for unsigned arrays
- Update binary api dump with the new functions

(cherry picked from commit 6d092b5f71)
2020-01-14 14:34:08 +03:00
Alfredo Delli Bovi
5bfc9ad010 Add sample for reduceOrNull and reduceRightOrNull
(cherry picked from commit 9546307243)
2020-01-14 14:34:07 +03:00
Alfredo Delli Bovi
f28c13bdcc KT-33761 Add reduceRightOrNull
(cherry picked from commit 06008c40ab)
2020-01-14 14:34:07 +03:00
Alfredo Delli Bovi
773cdf314f KT-33761 Add reduceOrNull
(cherry picked from commit f5d696d3c4)
2020-01-14 14:34:07 +03:00
Abduqodiri Qurbonzoda
cc8dcef9aa Rename Appendable methods parameters
(cherry picked from commit b868e6f8da)
2020-01-14 14:34:07 +03:00
Ilmir Usmanov
16d78e45a7 Disable tail-call optimization for suspend functions with Unit return type
if it overrides functions with another return type.
Otherwise, we cannot determine on call site that the function returns Unit
and cannot { POP, PUSH Unit } in order to avoid the situation when callee's
continuation resumes with non-unit result. The observed behavior is that
suspend function, which should return Unit, suddenly returns other value.
 #KT-35262: Fixed
2020-01-14 12:21:23 +01:00
Ilya Matveev
4d0c015575 IDEA plugin: Don't create iOS test in the share lib project template
Since 1.3.70 an iOS simulator test task is created by the MPP Gradle
plugin out of the box. So we stop creating such a task manually in
the shared library project template.

Issue #KT-35560 Fixed.
2020-01-14 17:44:08 +07:00
Vladimir Dolzhenko
787192fc0d Drop UNREACHABLE_CODE eager text range calculation
#KT-35242 Fixed

(cherry picked from commit 272ca002d7)
2020-01-14 11:25:00 +01:00
Ilya Chernikov
49791a3207 Allow only single expression eval in cli compiler and kotlin runner
#KT-35740 fixed
also add tests and drop logger usage in the cli dependencies manager:
the logger is normally unitialized in the usage scenarios, but related
warnings are annoying.

(cherry picked from commit 995c6a32b8)
2020-01-14 07:59:51 +01:00
Ilya Chernikov
8c24a860c1 [minor] "fix" fir testdata for KT-30245 test, todo: fix problems in fir accordingly
(cherry picked from commit 9da536c202)
2020-01-14 07:59:51 +01:00
Ilya Chernikov
a014725187 [NI] Convert extension lambda to the non-extension one, if needed
#KT-30245 fixed
2020-01-14 07:59:51 +01:00
Ilya Goncharov
7fa0f15a11 [Gradle, JS] Actualize node and yarn version
#KT-35599 fixed

(cherry picked from commit 74889ef3ad)
2020-01-13 19:17:09 +03:00
Ilya Goncharov
f05288848c [Gradle, JS] Add check on run and dist task
- Check existence of compile output file to prevent fail in case of NO-SOURCE

#KT-31894 fixed

(cherry picked from commit 24e3310393)
2020-01-13 19:17:09 +03:00
Vyacheslav Gerasimov
4efebea5db Build: Specify version explicitly for com.github.node-gradle.node 2020-01-13 15:48:10 +03:00
Yan Zhulanow
804c57d90a Update Changelog: add entries for 1.3.70 EAP 1 2020-01-13 17:33:30 +09:00
Yan Zhulanow
464076b5d1 Update Changelog: add entries from 1.3.60/61 2020-01-13 17:31:48 +09:00
nikita.movshin
116e34a0ae Update K/N version 2019-12-26 19:46:21 +03:00
Vyacheslav Gerasimov
0d60f2b5b9 as40: Minor: Fix copyright header in AbstractModelBuilderTest.java
(cherry picked from commit 5a9070b6da)
2019-12-26 16:40:55 +03:00
Vyacheslav Gerasimov
21c3050e96 as40: Fix duplicate registration of kotlin-copyright
(cherry picked from commit 3d79e4609e)
2019-12-26 16:40:55 +03:00
Vyacheslav Gerasimov
ba57ab531b Build: Fix android-wizardTemplate-plugin dependencies
Present only in AS 3.6

(cherry picked from commit 7b1c4e72ba)
2019-12-26 16:40:55 +03:00
Vyacheslav Gerasimov
4ca8140d50 as40: Fix test compilation for AS 4.0 C7 2019-12-26 16:40:54 +03:00
Vyacheslav Gerasimov
e2edf54c86 as40: Fix KotlinDslScriptModelProvider and KotlinDslScriptModelResolver for AS 4.0 C7 2019-12-26 16:40:54 +03:00
Vyacheslav Gerasimov
923c1b1bf0 as40: Upgrade to AS 4.0 C7 2019-12-26 16:40:54 +03:00
Vyacheslav Gerasimov
675806569a Build: Use tar.gz extension for linux AS distributions 2019-12-26 16:40:54 +03:00
Vyacheslav Gerasimov
1e1ffcc4b4 Build: Add Ide.AS40 constant
(cherry picked from commit eda27ab298)
2019-12-26 16:40:54 +03:00
Vyacheslav Gerasimov
04a63cc87b Build: Add as40 to .bunch
(cherry picked from commit 19233ee120)
2019-12-26 16:40:54 +03:00
Alexander Gorshenev
c07d04e459 Don't search for expects when not given -Xmpp-klibs 2019-12-26 11:34:56 +03:00
nikita.movshin
0c71dde729 Update K/N version 2019-12-25 17:37:06 +03:00
Igor Chevdar
15384c9230 [native-gradle-plugin] Disabled cache building for iOS devices 2019-12-25 15:52:06 +05:00
nikita.movshin
415750c393 Update K/N version 2019-12-24 11:31:25 +03:00
Igor Chevdar
14f670f058 [kotlin-native-plugin] Disabled compiler daemon for now 2019-12-23 16:24:20 +03:00
Igor Chevdar
6886f1390d [kotlin-native-plugin] Two fixes:
* Added property to select the cache kind (none, dynamic, static)
* Fixed the check if the cache needs to be rebuilt
2019-12-23 13:32:03 +03:00
Mikhail Zarechenskiy
23c61dfb54 Fix ambiguity between Java and Kotlin SAM candidates
Because of incorrect flag we generated synthetic SAM candidates and got ambiguity when feature `SamConversionPerArgument` was enabled (Gradle case) because candidates for Java were duplicated

 #KT-35579 Fixed
2019-12-23 12:48:43 +03:00
Igor Yakovlev
895f2d609b Fix allopen call from UL methods
Fixed #KT-35577
2019-12-20 18:28:50 +03:00
Ilya Kirillov
1feda25af3 New J2K: Fix not converted jetbrains nullability annotations for types
it became broken after annotation started to be assigned to type elements
instead of declarations after 4da7d11

#KT-34987 fixed

(cherry picked from commit 92f8432b1e)
2019-12-20 13:05:34 +03:00
Roman Artemev
e4c06a63e7 Update bootstrap to #1.3.70-eap-17 2019-12-19 15:30:47 +03:00
nikita.movshin
7887cfdf99 Update K/N version 2019-12-19 14:39:39 +03:00
nikita.movshin
ae87b0a83e Update K/N version 2019-12-19 11:00:57 +03:00
Igor Chevdar
2cf6f0b00d [IR Serialization] Removed native-specific hack in mangler 2019-12-18 14:48:03 +03:00
Zalim Bashorov
2427764a87 [IDE, klib] Support in IDE klibs with dynamic type 2019-12-17 22:05:08 +03:00
Alexander Gorshenev
ae996c4819 Properly mute (and unmute) tests for unrelated backends 2019-12-17 20:57:39 +03:00
Alexander Gorshenev
c97abf79fc Reconciled -Xklib-mpp with commonizer 2019-12-17 20:57:39 +03:00
Alexander Gorshenev
5525b1cef5 Expect/actual support in klibs under -Xklib-mpp 2019-12-17 20:57:39 +03:00
Roman Artemev
c397da5e3f [KLIB] Fix references to type made from TypeParameter in KotlinMangler
- promote ABI version

(cherry picked from commit cad3cb1bbe)
2019-12-17 19:37:53 +03:00
Svyatoslav Kuzmich
a71f272b59 [JS IR BE] Support typeOf 2019-12-17 19:17:28 +03:00
Svyatoslav Kuzmich
644d25e3e5 [JS IR] Properly report compiler errors
Report compiler errors using message collector
Instead of crashing with stack trace
2019-12-17 19:17:28 +03:00
Roman Artemev
85949ab82d [JS IR] Fix external fields naming
(cherry picked from commit 0b7c11c96e)
2019-12-17 17:37:24 +03:00
Roman Artemev
d8e6937891 [JS IR] Fix state machine builder
(cherry picked from commit 02db5ea0eb)
2019-12-17 17:37:24 +03:00
Roman Golyshev
ea7b929543 Add ML completion jar to the resulting plugin jar
- Without it, ML completion jar will not be present in the runtime, causing errors when ML completion is enabled
- This step should have been done in 28ec74648e commit

(cherry picked from commit 8e53ccb852)
2019-12-17 16:35:38 +03:00
Dmitry Gridin
3365dfa5ae KotlinImportOptimizer: should use with isIndeterminate=false
#KT-34928 Fixed

(cherry picked from commit cdabff1941)
2019-12-17 20:20:39 +07:00
Igor Chevdar
33c7df6457 [IR] Remapped some forgotten types during IR copying 2019-12-17 15:50:45 +03:00
Mikhael Bogdanov
3e219f4ebf Keep original casts during reification to avoid VerifyError
#KT-26435 Fixed

(cherry picked from commit 03c2350e79)
2019-12-17 12:48:16 +01:00
Igor Chevdar
eb0ba37e88 [gradle-native-plugin] Build static caches instead of dynamic 2019-12-17 14:38:38 +03:00
Natalia Selezneva
759d1da0df Fix configuration for AS 3.5
(cherry picked from commit e77d8657f4)
2019-12-17 09:30:02 +03:00
25928 changed files with 304183 additions and 719249 deletions

5
.bunch
View File

@@ -1,7 +1,10 @@
193
201
202_201
192
191_192
183_191_192
as34_183_191_192
as35_191_192
as36_192
as40
as41_201

3
.gitattributes vendored
View File

@@ -1,7 +1,4 @@
**/testData/** linguist-vendored
*Generated.java linguist-generated=true
* text=auto
* eol=lf
*.png binary
compiler/cli/bin/* eol=lf
compiler/cli/bin/*.bat eol=crlf

8
.gitignore vendored
View File

@@ -1,9 +1,8 @@
.DS_Store
.idea/shelf
/android.tests.dependencies
/confluence/target
/dependencies/repo
/android.tests.dependencies
/dependencies/android.tests.dependencies
/dist
/local
/gh-pages
@@ -18,7 +17,6 @@ workspace.xml
/jps-plugin/testData/kannotator
/js/js.translator/testData/out/
/js/js.translator/testData/out-min/
/js/js.translator/testData/out-pir/
.gradle/
build/
!**/src/**/build
@@ -50,12 +48,10 @@ build/
.idea/artifacts/kotlin_main_kts_jar.xml
.idea/artifacts/kotlin_compiler_client_embeddable_jar.xml
.idea/artifacts/kotlin_reflect_jar.xml
.idea/artifacts/kotlin_stdlib_js_ir_*
.idea/artifacts/kotlin_test_js_ir_*
.idea/artifacts/kotlin_stdlib_wasm_*
.idea/jarRepositories.xml
kotlin-ultimate/
node_modules/
.rpt2_cache/
libraries/tools/kotlin-test-js-runner/lib/
libraries/tools/kotlin-source-map-loader/lib/
local.properties

View File

@@ -13,21 +13,6 @@
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<MarkdownNavigatorCodeStyleSettings>

View File

@@ -2,8 +2,6 @@
<dictionary name="4u7">
<words>
<w>bintray</w>
<w>cacheability</w>
<w>cacheable</w>
<w>cidr</w>
<w>foldable</w>
<w>instrumentator</w>
@@ -11,7 +9,6 @@
<w>protobuf</w>
<w>redirector</w>
<w>remapper</w>
<w>sonatype</w>
<w>unpresent</w>
</words>
</dictionary>

View File

@@ -1,19 +1,12 @@
<component name="ProjectDictionaryState">
<dictionary name="dmitriy.dolovov">
<words>
<w>cinterop</w>
<w>commonizable</w>
<w>commonization</w>
<w>commonize</w>
<w>commonized</w>
<w>commonizer</w>
<w>commonizers</w>
<w>commonizes</w>
<w>commonizing</w>
<w>jetbrains</w>
<w>konan</w>
<w>kotlinx</w>
<w>macos</w>
</words>
</dictionary>
</component>

View File

@@ -6,7 +6,6 @@
<w>destructured</w>
<w>hacky</w>
<w>impls</w>
<w>inlined</w>
<w>kapt</w>
<w>kotlinc</w>
<w>mutators</w>

BIN
.idea/icon.png generated

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -99,6 +99,7 @@
<option name="problems">
<list>
<Problem reference="com.intellij.util.JdomKt#element" reason="Removed in 191" />
<Problem reference="com.intellij.execution.JavaRunConfigurationExtensionManager#getInstance" reason="Can't be used in Kotlin, because method was replaced with property after J2K in 183. Use JavaRunConfigurationExtensionManagerUtil instead." />
<Problem reference="org.jetbrains.kotlin.idea.reporter.ITNReporterCompat#submit" reason="parentComponent is nullable in AS" />
<Problem reference="com.intellij.diagnostic.ITNReporter#submit" reason="parentComponent is nullable in AS" />
</list>

12
.idea/misc.xml generated
View File

@@ -24,7 +24,7 @@
<option name="myDefaultNotNull" value="org.jetbrains.annotations.NotNull" />
<option name="myNullables">
<value>
<list size="14">
<list size="11">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
@@ -36,15 +36,12 @@
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NullableType" />
<item index="9" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNullable" />
<item index="10" class="java.lang.String" itemvalue="com.android.annotations.Nullable" />
<item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.Nullable" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.Nullable" />
<item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="14">
<list size="11">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="javax.validation.constraints.NotNull" />
@@ -56,9 +53,6 @@
<item index="8" class="java.lang.String" itemvalue="org.checkerframework.checker.nullness.compatqual.NonNullType" />
<item index="9" class="java.lang.String" itemvalue="androidx.annotation.RecentlyNonNull" />
<item index="10" class="java.lang.String" itemvalue="com.android.annotations.NonNull" />
<item index="11" class="java.lang.String" itemvalue="org.eclipse.jdt.annotation.NonNull" />
<item index="12" class="java.lang.String" itemvalue="io.reactivex.annotations.NonNull" />
<item index="13" class="java.lang.String" itemvalue="io.reactivex.rxjava3.annotations.NonNull" />
</list>
</value>
</option>
@@ -66,7 +60,7 @@
<component name="ProjectResources">
<default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="PsiViewerSettings">

View File

@@ -12,7 +12,6 @@
<list>
<option value=":compiler:generateTests" />
<option value=":compiler:tests-java8:generateTests" />
<option value=":compiler:tests-against-klib:generateTests" />
<option value=":js:js.tests:generateTests" />
<option value=":core:descriptors.runtime:generateTests" />
</list>

View File

@@ -1,21 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Test: stdlib-js public kotlin api test, overwrite results" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="--tests &quot;org.jetbrains.kotlin.js.test.ApiTest&quot; -Poverwrite.output=true" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value=":js:js.tests:test" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<GradleScriptDebugEnabled>false</GradleScriptDebugEnabled>
<method v="2" />
</configuration>
</component>

View File

@@ -1,3 +1,3 @@
<component name="DependencyValidationManager">
<scope name="Apply copyright" pattern="!file[*]:*//testData//*&amp;&amp;!file[*]:testData//*&amp;&amp;!file[*]:*.gradle.kts&amp;&amp;!file[*]:*.gradle&amp;&amp;!file[kotlin.kotlin-ultimate]:*/&amp;&amp;!file[kotlin.kotlin-ultimate.*]:*/&amp;&amp;!file[kotlin.libraries]:stdlib/api//*" />
<scope name="Apply copyright" pattern="!file[*]:*//testData//*&amp;&amp;!file[*]:testData//*&amp;&amp;!file[*]:*.gradle.kts&amp;&amp;!file[*]:*.gradle" />
</component>

4
.idea/vcs.xml generated
View File

@@ -2,10 +2,8 @@
<project version="4">
<component name="CommitMessageInspectionProfile">
<profile version="1.0">
<inspection_tool class="BodyLimit" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="GrazieCommit" enabled="true" level="TYPO" enabled_by_default="true" />
<inspection_tool class="SubjectBodySeparation" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="SubjectLimit" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="GrazieCommit" enabled="true" level="TYPO" enabled_by_default="true" />
</profile>
</component>
<component name="IssueNavigationConfiguration">

10318
ChangeLog.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
[![official project](https://jb.gg/badges/official.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[![TeamCity (simple build status)](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/Kotlin_KotlinPublic_Compiler.svg)](https://teamcity.jetbrains.com/buildConfiguration/Kotlin_KotlinPublic_Compiler?branch=%3Cdefault%3E&buildTypeTab=overview&mode=builds)
[![TeamCity (simple build status)](https://img.shields.io/teamcity/http/teamcity.jetbrains.com/s/Kotlin_dev_Compiler.svg)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=Kotlin_dev_Compiler&branch_Kotlin_dev=%3Cdefault%3E&tab=buildTypeStatusDiv)
[![Maven Central](https://img.shields.io/maven-central/v/org.jetbrains.kotlin/kotlin-maven-plugin.svg)](https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.jetbrains.kotlin%22)
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -37,9 +37,9 @@ In order to build Kotlin distribution you need to have:
JDK_18="path to JDK 1.8"
JDK_9="path to JDK 9"
For local development, if you're not working on bytecode generation or the standard library, it's OK to have only JDK 1.8 and JDK 9 installed, and to point `JDK_16` and `JDK_17` environment variables to your JDK 1.8 installation.
For local development, if you're not working on bytecode generation or the standard library, it's OK to have only JDK 1.8 and JDK 9 installed, and to point JDK_16 and JDK_17 environment variables to your JDK 1.8 installation.
You also can use [Gradle properties](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties) to setup `JDK_*` variables.
You also can use [Gradle properties](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties) to setup JDK_* variables.
> Note: The JDK 6 for MacOS is not available on Oracle's site. You can [download it here](https://support.apple.com/kb/DL1572).
@@ -73,7 +73,7 @@ command line parameters on the first run:
- `clean` - clean build results
- `dist` - assembles the compiler distribution into `dist/kotlinc/` folder
- `ideaPlugin` - assembles the Kotlin IDEA plugin distribution into `dist/artifacts/ideaPlugin/Kotlin/` folder
- `ideaPlugin` - assembles the Kotlin IDEA plugin distribution into `dist/artifacts/Kotlin` folder
- `install` - build and install all public artifacts into local maven repository
- `runIde` - build IDEA plugin and run IDEA with it
- `coreLibsTest` - build and run stdlib, reflect and kotlin-test tests
@@ -106,39 +106,28 @@ bunch switch 191
Working with the Kotlin project requires at least IntelliJ IDEA 2019.1. You can download IntelliJ IDEA 2019.1 [here](https://www.jetbrains.com/idea/download).
After cloning the project, to import the project in IntelliJ choose the project directory in the Open project dialog. Then, after project opened, select
`File` -> `New` -> `Module from Existing Sources...` in the menu, and select `build.gradle.kts` file in the project's root folder.
After cloning the project, to import the project in Intellij choose the project directory in the Open project dialog. Then, after project opened, Select
`File` -> `New...` -> `Module from Existing Sources` in the menu, and select `build.gradle.kts` file in the project's root folder.
In the import dialog, select `use default gradle wrapper`.
To be able to run tests from IntelliJ easily, check `Delegate IDE build/run actions to Gradle` and choose `Gradle Test Runner` in the Gradle runner settings after importing the project.
At this time, you can use the latest released `1.3.x` version of the Kotlin plugin for working with the code. To make sure you have the latest version installed, use `Tools` -> `Kotlin` -> `Configure Kotlin Plugin Updates`.
At this time, you can use the latest released 1.3.x version of the Kotlin plugin for working with the code. To make sure you have the latest version installed, use Tools | Kotlin | Configure Kotlin Plugin Updates and press "Check for updates now".
### Compiling and running
From this root project there are Run/Debug Configurations for running `IDEA` or the `Generate Compiler Tests` for example; so if you want to try out the latest and greatest IDEA plugin
From this root project there are Run/Debug Configurations for running IDEA or the Compiler Tests for example; so if you want to try out the latest and greatest IDEA plugin
* `VCS` -> `Git` -> `Pull`
* Run the `IDEA` run configuration in the project
* A child IntelliJ IDEA with the Kotlin plugin will then startup
* VCS -> Git -> Pull
* Run the "IDEA" run configuration in the project
* a child IntelliJ IDEA with the Kotlin plugin will then startup
### Including into composite build
To include kotlin compiler into [composite build](https://docs.gradle.org/current/userguide/composite_builds.html) you need to define `dependencySubstitution` for `kotlin-compiler` module in `settings.gradle.kts`
To include kotlin compiler into [composite build](https://docs.gradle.org/current/userguide/composite_builds.html) you need to define `dependencySubstitution` for `kotlin-compiler` module in `settings.gradle`
```Kotlin
includeBuild("/path/to/kotlin") {
dependencySubstitution {
substitute(module("org.jetbrains.kotlin:kotlin-compiler"))
.with(project(":include:kotlin-compiler"))
}
}
```
or in `settings.gradle`
```Groovy
includeBuild('/path/to/kotlin') {
dependencySubstitution {
substitute module('org.jetbrains.kotlin:kotlin-compiler') with project(':include:kotlin-compiler')

View File

@@ -75,21 +75,6 @@ benchmark {
include("CommonCallsBenchmark")
//include("InferenceBaselineCallsBenchmark")
}
register("ni") {
warmups = 10
iterations = 10
iterationTime = 1
iterationTimeUnit = "sec"
param("useNI", true)
param("isIR", false)
param("size", 1000)
include("InferenceBaselineCallsBenchmark")
include("InferenceExplicitArgumentsCallsBenchmark")
include("InferenceForInApplicableCandidate")
include("InferenceFromArgumentCallsBenchmark")
include("InferenceFromReturnTypeCallsBenchmark")
}
}
targets {
register("main")

View File

@@ -32,8 +32,8 @@ import org.jetbrains.kotlin.fir.java.FirJavaModuleBasedSession
import org.jetbrains.kotlin.fir.java.FirLibrarySession
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveProcessor
import org.jetbrains.kotlin.fir.resolve.impl.FirProviderImpl
import org.jetbrains.kotlin.fir.resolve.transformers.FirTotalResolveTransformer
import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform
@@ -66,25 +66,25 @@ private val JDK_PATH = File("${System.getProperty("java.home")!!}/lib/rt.jar")
private val RUNTIME_JAR = File(System.getProperty("kotlin.runtime.path") ?: "dist/kotlinc/lib/kotlin-runtime.jar")
private val LANGUAGE_FEATURE_SETTINGS =
LanguageVersionSettingsImpl(
LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3,
specificFeatures = mapOf(LanguageFeature.NewInference to LanguageFeature.State.ENABLED)
)
LanguageVersionSettingsImpl(
LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3,
specificFeatures = mapOf(LanguageFeature.NewInference to LanguageFeature.State.ENABLED)
)
private fun newConfiguration(useNewInference: Boolean): CompilerConfiguration {
val configuration = CompilerConfiguration()
configuration.put(CommonConfigurationKeys.MODULE_NAME, "benchmark")
configuration.put(CLIConfigurationKeys.INTELLIJ_PLUGIN_ROOT, "../compiler/cli/cli-common/resources")
configuration.put(CLIConfigurationKeys.INTELLIJ_PLUGIN_ROOT, "../idea/resources")
configuration.addJvmClasspathRoot(JDK_PATH)
configuration.addJvmClasspathRoot(RUNTIME_JAR)
configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
val newInferenceState = if (useNewInference) LanguageFeature.State.ENABLED else LanguageFeature.State.DISABLED
configuration.languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3,
specificFeatures = mapOf(
LanguageFeature.NewInference to newInferenceState
)
LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3,
specificFeatures = mapOf(
LanguageFeature.NewInference to newInferenceState
)
)
return configuration
}
@@ -105,21 +105,21 @@ abstract class AbstractSimpleFileBenchmark {
fun setUp() {
if (isIR && !useNewInference) error("Invalid configuration")
env = KotlinCoreEnvironment.createForTests(
myDisposable,
newConfiguration(useNewInference),
EnvironmentConfigFiles.JVM_CONFIG_FILES
myDisposable,
newConfiguration(useNewInference),
EnvironmentConfigFiles.JVM_CONFIG_FILES
)
if (isIR) {
Extensions.getArea(env.project)
.getExtensionPoint(PsiElementFinder.EP_NAME)
.unregisterExtension(JavaElementFinder::class.java)
.getExtensionPoint(PsiElementFinder.EP_NAME)
.unregisterExtension(JavaElementFinder::class.java)
}
file = createFile(
"test.kt",
buildText(),
env.project
"test.kt",
buildText(),
env.project
)
}
@@ -134,22 +134,22 @@ abstract class AbstractSimpleFileBenchmark {
private fun analyzeGreenFileFrontend(bh: Blackhole) {
val tracker = ExceptionTracker()
val storageManager: StorageManager =
LockBasedStorageManager.createWithExceptionHandling("benchmarks", tracker)
LockBasedStorageManager.createWithExceptionHandling("benchmarks", tracker)
val context = SimpleGlobalContext(storageManager, tracker)
val module =
ModuleDescriptorImpl(
Name.special("<benchmark>"), storageManager,
JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES)
)
ModuleDescriptorImpl(
Name.special("<benchmark>"), storageManager,
JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES)
)
val moduleContext = context.withProject(env.project).withModule(module)
val result = TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
moduleContext.project,
listOf(file),
NoScopeRecordCliBindingTrace(),
env.configuration,
{ scope -> JvmPackagePartProvider(LANGUAGE_FEATURE_SETTINGS, scope) }
moduleContext.project,
listOf(file),
NoScopeRecordCliBindingTrace(),
env.configuration,
{ scope -> JvmPackagePartProvider(LANGUAGE_FEATURE_SETTINGS, scope) }
)
assert(result.bindingContext.diagnostics.none { it.severity == Severity.ERROR })
@@ -159,15 +159,16 @@ abstract class AbstractSimpleFileBenchmark {
private fun analyzeGreenFileIr(bh: Blackhole) {
val scope = GlobalSearchScope.filesScope(env.project, listOf(file.virtualFile))
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(env.project))
.uniteWith(TopDownAnalyzerFacadeForJVM.AllJavaSourcesInProjectScope(env.project))
val session = createSession(env, scope)
val firProvider = session.firProvider as FirProviderImpl
val builder = RawFirBuilder(session, firProvider.kotlinScopeProvider, stubMode = false)
val builder = RawFirBuilder(session, stubMode = false)
val totalTransformer = FirTotalResolveProcessor(session)
val firFile = builder.buildFirFile(file).also(firProvider::recordFile)
val totalTransformer = FirTotalResolveTransformer()
val firFile = builder.buildFirFile(file).also((session.firProvider as FirProviderImpl)::recordFile)
totalTransformer.process(listOf(firFile))
for (transformer in totalTransformer.transformers) {
transformer.transformFile(firFile, null)
}
bh.consume(firFile.hashCode())
}
@@ -176,37 +177,37 @@ abstract class AbstractSimpleFileBenchmark {
}
fun createSession(
environment: KotlinCoreEnvironment,
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope = GlobalSearchScope.notScope(sourceScope)
environment: KotlinCoreEnvironment,
sourceScope: GlobalSearchScope,
librariesScope: GlobalSearchScope = GlobalSearchScope.notScope(sourceScope)
): FirSession {
val moduleInfo = FirTestModuleInfo()
val project = environment.project
val provider = FirProjectSessionProvider(project)
return FirJavaModuleBasedSession.create(moduleInfo, provider, sourceScope).also {
return FirJavaModuleBasedSession(moduleInfo, provider, sourceScope).also {
createSessionForDependencies(provider, moduleInfo, librariesScope, environment)
}
}
private fun createSessionForDependencies(
provider: FirProjectSessionProvider,
moduleInfo: FirTestModuleInfo,
librariesScope: GlobalSearchScope,
environment: KotlinCoreEnvironment
provider: FirProjectSessionProvider,
moduleInfo: FirTestModuleInfo,
librariesScope: GlobalSearchScope,
environment: KotlinCoreEnvironment
) {
val dependenciesInfo = FirTestModuleInfo()
moduleInfo.dependencies.add(dependenciesInfo)
FirLibrarySession.create(
dependenciesInfo, provider, librariesScope, environment.project,
environment.createPackagePartProvider(librariesScope)
dependenciesInfo, provider, librariesScope, environment.project,
environment.createPackagePartProvider(librariesScope)
)
}
class FirTestModuleInfo(
override val name: Name = Name.identifier("TestModule"),
val dependencies: MutableList<ModuleInfo> = mutableListOf(),
override val platform: TargetPlatform = JvmPlatforms.unspecifiedJvmPlatform,
override val analyzerServices: PlatformDependentAnalyzerServices = JvmPlatformAnalyzerServices
override val name: Name = Name.identifier("TestModule"),
val dependencies: MutableList<ModuleInfo> = mutableListOf(),
override val platform: TargetPlatform = JvmPlatforms.unspecifiedJvmPlatform,
override val analyzerServices: PlatformDependentAnalyzerServices = JvmPlatformAnalyzerServices
) : ModuleInfo {
override fun dependencies(): List<ModuleInfo> = dependencies
}

View File

@@ -1,50 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.benchmarks
import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.infra.Blackhole
import java.util.concurrent.TimeUnit
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
open class ManyImplicitReceiversBenchmark : AbstractSimpleFileBenchmark() {
@Param("1", "10", "50")
private var size: Int = 0
@Benchmark
fun benchmark(bh: Blackhole) {
analyzeGreenFile(bh)
}
override fun buildText(): String {
return buildString {
appendLine("inline fun <T, R> with(receiver: T, block: T.() -> R): R = block()")
for (i in 1..size) {
appendLine("interface A$i {")
appendLine(" fun foo$i()")
appendLine("}")
appendLine()
}
appendLine()
append("fun test(")
append((1..size).joinToString(", ") { "a$it: A$it" })
appendLine(" {")
for (i in 1..size) {
appendLine("with(a$i) {")
}
for (i in 1..size) {
appendLine("foo$i()")
}
for (i in 1..size) {
appendLine("}")
}
appendLine("}")
}
}
}

View File

@@ -1,49 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.benchmarks
import org.openjdk.jmh.annotations.*
import org.openjdk.jmh.infra.Blackhole
import java.util.concurrent.TimeUnit
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
open class PlusAssignOperatorDesugaringBenchmark : AbstractInferenceBenchmark() {
@Param("9", "10", "11", "12", "13", "14")
private var size: Int = 0
@Benchmark
fun benchmark(bh: Blackhole) {
analyzeGreenFile(bh)
}
override fun buildText(): String = buildString {
appendLine(
"""
class A {
operator fun <T : Number> plus(other: (Int) -> T): A = this
operator fun <T : CharSequence> plusAssign(other: (String) -> T) {}
}
""".trimIndent()
)
appendLine("fun test() {")
appendLine("var a = A()")
for (i in 1..size) {
appendLine("a += {")
}
for (i in 1..size) {
appendLine(
"""
it.inc()
1
}
""".trimIndent()
)
}
appendLine()
}
}

View File

@@ -1,3 +1,4 @@
description = "Kotlin Build Common"
plugins {
@@ -11,7 +12,7 @@ dependencies {
compileOnly(project(":compiler:cli-common"))
compileOnly(project(":compiler:frontend.java"))
compileOnly(project(":js:js.serializer"))
compileOnly(project(":js:js.config"))
compileOnly(project(":js:js.frontend"))
compileOnly(project(":kotlin-util-klib-metadata"))
compileOnly(intellijCoreDep()) { includeJars("intellij-core") }
compileOnly(intellijDep()) { includeJars("asm-all", "trove4j", "util", rootProject = rootProject) }

View File

@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.compilerRunner
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.cli.common.messages.OutputMessageUtil
@@ -25,7 +25,7 @@ class MessageCollectorToOutputItemsCollectorAdapter(
private val delegate: MessageCollector,
private val outputCollector: OutputItemsCollector
) : MessageCollector by delegate {
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageSourceLocation?) {
override fun report(severity: CompilerMessageSeverity, message: String, location: CompilerMessageLocation?) {
// TODO: consider adding some other way of passing input -> output mapping from compiler, e.g. dedicated service
OutputMessageUtil.parseOutputMessage(message)?.let {
outputCollector.add(it.sourceFiles, it.outputFile)

View File

@@ -83,17 +83,6 @@ open class IncrementalJsCache(
dirtySources.addAll(removedAndCompiledSources)
}
fun compare(translatedFiles: Map<File, TranslationResultValue>, changesCollector: ChangesCollector) {
for ((srcFile, data) in translatedFiles) {
val oldProtoMap = translationResults[srcFile]?.metadata?.let { protoData(srcFile, it) } ?: emptyMap()
val newProtoMap = protoData(srcFile, data.metadata)
for (classId in oldProtoMap.keys + newProtoMap.keys) {
changesCollector.collectProtoChanges(oldProtoMap[classId], newProtoMap[classId])
}
}
}
fun compareAndUpdate(incrementalResults: IncrementalResultsConsumerImpl, changesCollector: ChangesCollector) {
val translatedFiles = incrementalResults.packageParts
@@ -128,8 +117,8 @@ open class IncrementalJsCache(
}
for ((srcFile, irData) in incrementalResults.irFileData) {
val (fileData, types, signatures, strings, declarations, bodies, fqn) = irData
irTranslationResults.put(srcFile, fileData, types, signatures, strings, declarations, bodies, fqn)
val (fileData, symbols, types, strings, declarations, bodies, fqn) = irData
irTranslationResults.put(srcFile, fileData, symbols, types, strings, declarations, bodies, fqn)
}
}
@@ -240,8 +229,8 @@ private class TranslationResultMap(
private object IrTranslationResultValueExternalizer : DataExternalizer<IrTranslationResultValue> {
override fun save(output: DataOutput, value: IrTranslationResultValue) {
output.writeArray(value.fileData)
output.writeArray(value.symbols)
output.writeArray(value.types)
output.writeArray(value.signatures)
output.writeArray(value.strings)
output.writeArray(value.declarations)
output.writeArray(value.bodies)
@@ -262,14 +251,14 @@ private object IrTranslationResultValueExternalizer : DataExternalizer<IrTransla
override fun read(input: DataInput): IrTranslationResultValue {
val fileData = input.readArray()
val symbols = input.readArray()
val types = input.readArray()
val signatures = input.readArray()
val strings = input.readArray()
val declarations = input.readArray()
val bodies = input.readArray()
val fqn = input.readArray()
return IrTranslationResultValue(fileData, types, signatures, strings, declarations, bodies, fqn)
return IrTranslationResultValue(fileData, symbols, types, strings, declarations, bodies, fqn)
}
}
@@ -280,8 +269,8 @@ private class IrTranslationResultMap(
BasicStringMap<IrTranslationResultValue>(storageFile, IrTranslationResultValueExternalizer) {
override fun dumpValue(value: IrTranslationResultValue): String =
"Filedata: ${value.fileData.md5()}, " +
"Symbols: ${value.symbols.md5()}, " +
"Types: ${value.types.md5()}, " +
"Signatures: ${value.signatures.md5()}, " +
"Strings: ${value.strings.md5()}, " +
"Declarations: ${value.declarations.md5()}, " +
"Bodies: ${value.bodies.md5()}"
@@ -289,15 +278,15 @@ private class IrTranslationResultMap(
fun put(
sourceFile: File,
newFiledata: ByteArray,
newSymbols: ByteArray,
newTypes: ByteArray,
newSignatures: ByteArray,
newStrings: ByteArray,
newDeclarations: ByteArray,
newBodies: ByteArray,
fqn: ByteArray
) {
storage[pathConverter.toPath(sourceFile)] =
IrTranslationResultValue(newFiledata, newTypes, newSignatures, newStrings, newDeclarations, newBodies, fqn)
IrTranslationResultValue(newFiledata, newSymbols, newTypes, newStrings, newDeclarations, newBodies, fqn)
}
operator fun get(sourceFile: File): IrTranslationResultValue? =

View File

@@ -1,6 +1,17 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
* Copyright 2010-2017 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.kotlin.incremental

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2018 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.
@@ -206,11 +206,6 @@ open class ProtoCompareGenerated(
if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) return false
}
if (old.hasExtension(JvmProtoBuf.jvmClassFlags) != new.hasExtension(JvmProtoBuf.jvmClassFlags)) return false
if (old.hasExtension(JvmProtoBuf.jvmClassFlags)) {
if (old.getExtension(JvmProtoBuf.jvmClassFlags) != new.getExtension(JvmProtoBuf.jvmClassFlags)) return false
}
if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) {
return false
}
@@ -269,7 +264,6 @@ open class ProtoCompareGenerated(
JVM_EXT_CLASS_MODULE_NAME,
JVM_EXT_CLASS_LOCAL_VARIABLE_LIST,
JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME,
JVM_EXT_JVM_CLASS_FLAGS,
JS_EXT_CLASS_ANNOTATION_LIST,
JS_EXT_CLASS_CONTAINING_FILE_ID,
JAVA_EXT_IS_PACKAGE_PRIVATE_CLASS,
@@ -338,11 +332,6 @@ open class ProtoCompareGenerated(
if (!checkStringEquals(old.getExtension(JvmProtoBuf.anonymousObjectOriginName), new.getExtension(JvmProtoBuf.anonymousObjectOriginName))) result.add(ProtoBufClassKind.JVM_EXT_ANONYMOUS_OBJECT_ORIGIN_NAME)
}
if (old.hasExtension(JvmProtoBuf.jvmClassFlags) != new.hasExtension(JvmProtoBuf.jvmClassFlags)) result.add(ProtoBufClassKind.JVM_EXT_JVM_CLASS_FLAGS)
if (old.hasExtension(JvmProtoBuf.jvmClassFlags)) {
if (old.getExtension(JvmProtoBuf.jvmClassFlags) != new.getExtension(JvmProtoBuf.jvmClassFlags)) result.add(ProtoBufClassKind.JVM_EXT_JVM_CLASS_FLAGS)
}
if (old.getExtensionCount(JsProtoBuf.classAnnotation) != new.getExtensionCount(JsProtoBuf.classAnnotation)) {
result.add(ProtoBufClassKind.JS_EXT_CLASS_ANNOTATION_LIST)
}
@@ -1746,10 +1735,6 @@ fun ProtoBuf.Class.hashCode(stringIndexes: (Int) -> Int, fqNameIndexes: (Int) ->
hashCode = 31 * hashCode + stringIndexes(getExtension(JvmProtoBuf.anonymousObjectOriginName))
}
if (hasExtension(JvmProtoBuf.jvmClassFlags)) {
hashCode = 31 * hashCode + getExtension(JvmProtoBuf.jvmClassFlags)
}
for(i in 0..getExtensionCount(JsProtoBuf.classAnnotation) - 1) {
hashCode = 31 * hashCode + getExtension(JsProtoBuf.classAnnotation, i).hashCode(stringIndexes, fqNameIndexes, typeById)
}

View File

@@ -28,42 +28,42 @@ import org.jetbrains.kotlin.modules.KotlinModuleXmlBuilder
import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
import org.jetbrains.kotlin.resolve.sam.SAM_LOOKUP_NAME
import org.jetbrains.kotlin.synthetic.SAM_LOOKUP_NAME
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import org.jetbrains.kotlin.utils.keysToMap
import java.io.File
import java.util.*
import kotlin.collections.HashSet
import kotlin.collections.LinkedHashSet
const val DELETE_MODULE_FILE_PROPERTY = "kotlin.delete.module.file.after.build"
fun makeModuleFile(
name: String,
isTest: Boolean,
outputDir: File,
sourcesToCompile: Iterable<File>,
commonSources: Iterable<File>,
javaSourceRoots: Iterable<JvmSourceRoot>,
classpath: Iterable<File>,
friendDirs: Iterable<File>
name: String,
isTest: Boolean,
outputDir: File,
sourcesToCompile: Iterable<File>,
commonSources: Iterable<File>,
javaSourceRoots: Iterable<JvmSourceRoot>,
classpath: Iterable<File>,
friendDirs: Iterable<File>
): File {
val builder = KotlinModuleXmlBuilder()
builder.addModule(
name,
outputDir.absolutePath,
// important to transform file to absolute paths,
// otherwise compiler will use module file's parent as base path (a temporary file; see below)
// (see org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.getAbsolutePaths)
sourcesToCompile.map { it.absoluteFile },
javaSourceRoots,
classpath,
commonSources.map { it.absoluteFile },
null,
"java-production",
isTest,
// this excludes the output directories from the class path, to be removed for true incremental compilation
setOf(outputDir),
friendDirs
name,
outputDir.absolutePath,
// important to transform file to absolute paths,
// otherwise compiler will use module file's parent as base path (a temporary file; see below)
// (see org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.getAbsolutePaths)
sourcesToCompile.map { it.absoluteFile },
javaSourceRoots,
classpath,
commonSources.map { it.absoluteFile },
null,
"java-production",
isTest,
// this excludes the output directories from the class path, to be removed for true incremental compilation
setOf(outputDir),
friendDirs
)
val scriptFile = File.createTempFile("kjps", sanitizeJavaIdentifier(name) + ".script.xml")
@@ -84,9 +84,9 @@ private fun sanitizeJavaIdentifier(string: String) =
}
fun makeCompileServices(
incrementalCaches: Map<TargetId, IncrementalCache>,
lookupTracker: LookupTracker,
compilationCanceledStatus: CompilationCanceledStatus?
incrementalCaches: Map<TargetId, IncrementalCache>,
lookupTracker: LookupTracker,
compilationCanceledStatus: CompilationCanceledStatus?
): Services =
with(Services.Builder()) {
register(LookupTracker::class.java, lookupTracker)
@@ -106,14 +106,12 @@ fun updateIncrementalCache(
for (generatedFile in generatedFiles) {
when {
generatedFile is GeneratedJvmClass -> cache.saveFileToCache(generatedFile, changesCollector)
generatedFile.outputFile.isModuleMappingFile() -> cache.saveModuleMappingToCache(
generatedFile.sourceFiles,
generatedFile.outputFile
)
generatedFile.outputFile.isModuleMappingFile() -> cache.saveModuleMappingToCache(generatedFile.sourceFiles, generatedFile.outputFile)
}
}
javaChangesTracker?.javaClassesUpdates?.forEach { (source, serializedJavaClass) ->
javaChangesTracker?.javaClassesUpdates?.forEach {
(source, serializedJavaClass) ->
cache.saveJavaClassProto(source, serializedJavaClass, changesCollector)
}
@@ -121,9 +119,9 @@ fun updateIncrementalCache(
}
fun LookupStorage.update(
lookupTracker: LookupTracker,
filesToCompile: Iterable<File>,
removedFiles: Iterable<File>
lookupTracker: LookupTracker,
filesToCompile: Iterable<File>,
removedFiles: Iterable<File>
) {
if (lookupTracker !is LookupTrackerImpl) throw AssertionError("Lookup tracker is expected to be LookupTrackerImpl, got ${lookupTracker::class.java}")
@@ -133,8 +131,8 @@ fun LookupStorage.update(
}
data class DirtyData(
val dirtyLookupSymbols: Collection<LookupSymbol> = emptyList(),
val dirtyClassesFqNames: Collection<FqName> = emptyList()
val dirtyLookupSymbols: Collection<LookupSymbol> = emptyList(),
val dirtyClassesFqNames: Collection<FqName> = emptyList()
)
fun ChangesCollector.getDirtyData(
@@ -216,21 +214,19 @@ fun mapClassesFqNamesToFiles(
}
fun withSubtypes(
typeFqName: FqName,
caches: Iterable<IncrementalCacheCommon>
typeFqName: FqName,
caches: Iterable<IncrementalCacheCommon>
): Set<FqName> {
val types = LinkedHashSet(listOf(typeFqName))
val types = LinkedList(listOf(typeFqName))
val subtypes = hashSetOf<FqName>()
while (types.isNotEmpty()) {
val iterator = types.iterator()
val unprocessedType = iterator.next()
iterator.remove()
val unprocessedType = types.pollFirst()
caches.asSequence()
.flatMap { it.getSubtypesOf(unprocessedType) }
.filter { it !in subtypes }
.forEach { types.add(it) }
.flatMap { it.getSubtypesOf(unprocessedType) }
.filter { it !in subtypes }
.forEach { types.addLast(it) }
subtypes.add(unprocessedType)
}

View File

@@ -273,10 +273,6 @@ class DifferenceCalculatorForClass(
isClassAffected = true
areSubclassesAffected = true
}
ProtoBufClassKind.JVM_EXT_JVM_CLASS_FLAGS -> {
isClassAffected = true
areSubclassesAffected = true
}
}
}

View File

@@ -0,0 +1,81 @@
/*
* Copyright 2010-2015 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.kotlin.incremental.storage
import com.intellij.util.io.DataExternalizer
import com.intellij.util.io.EnumeratorStringDescriptor
import com.intellij.util.io.KeyDescriptor
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.utils.Printer
import java.io.File
abstract class BasicMap<K : Comparable<K>, V>(
internal val storageFile: File,
keyDescriptor: KeyDescriptor<K>,
valueExternalizer: DataExternalizer<V>
) {
protected val storage = LazyStorage(storageFile, keyDescriptor, valueExternalizer)
fun clean() {
storage.clean()
}
fun flush(memoryCachesOnly: Boolean) {
storage.flush(memoryCachesOnly)
}
fun close() {
storage.close()
}
@TestOnly
fun dump(): String {
return with(StringBuilder()) {
with(Printer(this)) {
println(this@BasicMap::class.java.simpleName)
pushIndent()
for (key in storage.keys.sorted()) {
println("${dumpKey(key)} -> ${dumpValue(storage[key]!!)}")
}
popIndent()
}
this
}.toString()
}
@TestOnly
protected abstract fun dumpKey(key: K): String
@TestOnly
protected abstract fun dumpValue(value: V): String
}
abstract class BasicStringMap<V>(
storageFile: File,
keyDescriptor: KeyDescriptor<String>,
valueExternalizer: DataExternalizer<V>
) : BasicMap<String, V>(storageFile, keyDescriptor, valueExternalizer) {
constructor(
storageFile: File,
valueExternalizer: DataExternalizer<V>
) : this(storageFile, EnumeratorStringDescriptor.INSTANCE, valueExternalizer)
override fun dumpKey(key: String): String = key
}

View File

@@ -0,0 +1,55 @@
/*
* Copyright 2010-2015 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.kotlin.incremental.storage
import org.jetbrains.kotlin.incremental.dumpCollection
import org.jetbrains.kotlin.name.FqName
import java.io.File
internal open class ClassOneToManyMap(
storageFile: File
) : BasicStringMap<Collection<String>>(storageFile, StringCollectionExternalizer) {
override fun dumpValue(value: Collection<String>): String = value.dumpCollection()
fun add(key: FqName, value: FqName) {
storage.append(key.asString(), value.asString())
}
operator fun get(key: FqName): Collection<FqName> =
storage[key.asString()]?.map(::FqName) ?: setOf()
operator fun set(key: FqName, values: Collection<FqName>) {
if (values.isEmpty()) {
remove(key)
return
}
storage[key.asString()] = values.map(FqName::asString)
}
fun remove(key: FqName) {
storage.remove(key.asString())
}
fun removeValues(key: FqName, removed: Set<FqName>) {
val notRemoved = this[key].filter { it !in removed }
this[key] = notRemoved
}
}
internal class SubtypesMap(storageFile: File) : ClassOneToManyMap(storageFile)
internal class SupertypesMap(storageFile: File) : ClassOneToManyMap(storageFile)

View File

@@ -0,0 +1,122 @@
/*
* Copyright 2010-2015 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.kotlin.incremental.storage
import com.intellij.util.io.DataExternalizer
import com.intellij.util.io.IOUtil
import com.intellij.util.io.KeyDescriptor
import com.intellij.util.io.PersistentHashMap
import java.io.DataOutput
import java.io.File
import java.io.IOException
/**
* It's lazy in a sense that PersistentHashMap is created only on write
*/
class LazyStorage<K, V>(
private val storageFile: File,
private val keyDescriptor: KeyDescriptor<K>,
private val valueExternalizer: DataExternalizer<V>
) {
@Volatile
private var storage: PersistentHashMap<K, V>? = null
@Synchronized
private fun getStorageIfExists(): PersistentHashMap<K, V>? {
if (storage != null) return storage
if (storageFile.exists()) {
storage = createMap()
return storage
}
return null
}
@Synchronized
private fun getStorageOrCreateNew(): PersistentHashMap<K, V> {
if (storage == null) {
storage = createMap()
}
return storage!!
}
val keys: Collection<K>
get() = getStorageIfExists()?.allKeysWithExistingMapping ?: listOf()
operator fun contains(key: K): Boolean =
getStorageIfExists()?.containsMapping(key) ?: false
operator fun get(key: K): V? =
getStorageIfExists()?.get(key)
operator fun set(key: K, value: V) {
getStorageOrCreateNew().put(key, value)
}
fun remove(key: K) {
getStorageIfExists()?.remove(key)
}
fun append(key: K, value: String) {
append(key) { out -> IOUtil.writeUTF(out, value) }
}
fun append(key: K, value: Int) {
append(key) { out -> out.writeInt(value) }
}
@Synchronized
fun clean() {
try {
storage?.close()
}
catch (ignored: Throwable) {
}
PersistentHashMap.deleteFilesStartingWith(storageFile)
storage = null
}
@Synchronized
fun flush(memoryCachesOnly: Boolean) {
val existingStorage = storage ?: return
if (memoryCachesOnly) {
if (existingStorage.isDirty) {
existingStorage.dropMemoryCaches()
}
}
else {
existingStorage.force()
}
}
@Synchronized
fun close() {
storage?.close()
}
private fun createMap(): PersistentHashMap<K, V> =
PersistentHashMap(storageFile, keyDescriptor, valueExternalizer)
private fun append(key: K, append: (DataOutput)->Unit) {
getStorageOrCreateNew().appendData(key, append)
}
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright 2010-2015 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.kotlin.incremental.storage
import java.io.File
internal class LookupMap(storage: File) : BasicMap<LookupSymbolKey, Collection<Int>>(storage, LookupSymbolKeyDescriptor, IntCollectionExternalizer) {
override fun dumpKey(key: LookupSymbolKey): String = key.toString()
override fun dumpValue(value: Collection<Int>): String = value.toString()
fun add(name: String, scope: String, fileId: Int) {
storage.append(LookupSymbolKey(name, scope), fileId)
}
operator fun get(key: LookupSymbolKey): Collection<Int>? = storage[key]
operator fun set(key: LookupSymbolKey, fileIds: Set<Int>) {
storage[key] = fileIds
}
fun remove(key: LookupSymbolKey) {
storage.remove(key)
}
val keys: Collection<LookupSymbolKey>
get() = storage.keys
}

View File

@@ -0,0 +1,62 @@
/*
* Copyright 2010-2017 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.kotlin.incremental.storage
import org.jetbrains.kotlin.incremental.dumpCollection
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import java.io.File
internal class SourceToJvmNameMap(
storageFile: File,
pathConverter: FileToPathConverter
) : AbstractSourceToOutputMap<JvmClassName>(JvmClassNameTransformer, storageFile, pathConverter)
internal class SourceToFqNameMap(
storageFile: File,
pathConverter: FileToPathConverter
) : AbstractSourceToOutputMap<FqName>(FqNameTransformer, storageFile, pathConverter)
internal abstract class AbstractSourceToOutputMap<Name>(
private val nameTransformer: NameTransformer<Name>,
storageFile: File,
private val pathConverter: FileToPathConverter
) : BasicStringMap<Collection<String>>(storageFile, PathStringDescriptor, StringCollectionExternalizer) {
fun clearOutputsForSource(sourceFile: File) {
remove(pathConverter.toPath(sourceFile))
}
fun add(sourceFile: File, className: Name) {
storage.append(pathConverter.toPath(sourceFile), nameTransformer.asString(className))
}
fun contains(sourceFile: File): Boolean =
pathConverter.toPath(sourceFile) in storage
operator fun get(sourceFile: File): Collection<Name> =
storage[pathConverter.toPath(sourceFile)].orEmpty().map(nameTransformer::asName)
fun getFqNames(sourceFile: File): Collection<FqName> =
storage[pathConverter.toPath(sourceFile)].orEmpty().map(nameTransformer::asFqName)
override fun dumpValue(value: Collection<String>) =
value.dumpCollection()
private fun remove(path: String) {
storage.remove(path)
}
}

View File

@@ -22,13 +22,11 @@ data class BuildLogFinder(
private val isDataContainerBuildLogEnabled: Boolean = false,
private val isGradleEnabled: Boolean = false,
private val isJsEnabled: Boolean = false,
private val isJsIrEnabled: Boolean = false, // TODO rename as it is used for metadata-only test
private val isScopeExpansionEnabled: Boolean = false
private val isJsIrEnabled: Boolean = false // TODO rename as it is used for metadata-only test
) {
companion object {
private const val JS_LOG = "js-build.log"
private const val JS_IR_LOG = "js-ir-build.log"
private const val SCOPE_EXPANDING_LOG = "build-with-scope-expansion.log"
private const val GRADLE_LOG = "gradle-build.log"
private const val DATA_CONTAINER_LOG = "data-container-version-build.log"
const val JS_JPS_LOG = "js-jps-build.log"
@@ -42,7 +40,6 @@ data class BuildLogFinder(
val names = dir.list() ?: arrayOf()
val files = names.filter { File(dir, it).isFile }.toSet()
val matchedName = when {
isScopeExpansionEnabled && SCOPE_EXPANDING_LOG in files -> SCOPE_EXPANDING_LOG
isJsIrEnabled && JS_IR_LOG in files -> JS_IR_LOG
isJsEnabled && JS_LOG in files -> JS_LOG
isGradleEnabled && GRADLE_LOG in files -> GRADLE_LOG

View File

@@ -10100,7 +10100,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
boolean hasFlags();
@@ -10117,7 +10116,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
int getFlags();
@@ -10855,7 +10853,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public boolean hasFlags() {
@@ -10874,7 +10871,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public int getFlags() {
@@ -12246,7 +12242,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public boolean hasFlags() {
@@ -12265,7 +12260,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public int getFlags() {
@@ -12284,7 +12278,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public Builder setFlags(int value) {
@@ -12306,7 +12299,6 @@ public final class DebugProtoBuf {
*isExternal
*isExpect
*isInline
*isFun
* </pre>
*/
public Builder clearFlags() {

View File

@@ -208,65 +208,6 @@ public final class DebugJvmModuleProtoBuf {
*/
org.jetbrains.kotlin.metadata.DebugProtoBuf.AnnotationOrBuilder getAnnotationOrBuilder(
int index);
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class>
getOptionalAnnotationClassList();
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class getOptionalAnnotationClass(int index);
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
int getOptionalAnnotationClassCount();
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
java.util.List<? extends org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder>
getOptionalAnnotationClassOrBuilderList();
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder getOptionalAnnotationClassOrBuilder(
int index);
}
/**
* Protobuf type {@code org.jetbrains.kotlin.metadata.jvm.Module}
@@ -379,14 +320,6 @@ public final class DebugJvmModuleProtoBuf {
annotation_.add(input.readMessage(org.jetbrains.kotlin.metadata.DebugProtoBuf.Annotation.PARSER, extensionRegistry));
break;
}
case 130: {
if (!((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
optionalAnnotationClass_ = new java.util.ArrayList<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class>();
mutable_bitField0_ |= 0x00000040;
}
optionalAnnotationClass_.add(input.readMessage(org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.PARSER, extensionRegistry));
break;
}
}
}
} catch (org.jetbrains.kotlin.protobuf.InvalidProtocolBufferException e) {
@@ -407,9 +340,6 @@ public final class DebugJvmModuleProtoBuf {
if (((mutable_bitField0_ & 0x00000020) == 0x00000020)) {
annotation_ = java.util.Collections.unmodifiableList(annotation_);
}
if (((mutable_bitField0_ & 0x00000040) == 0x00000040)) {
optionalAnnotationClass_ = java.util.Collections.unmodifiableList(optionalAnnotationClass_);
}
this.unknownFields = unknownFields.build();
makeExtensionsImmutable();
}
@@ -698,76 +628,6 @@ public final class DebugJvmModuleProtoBuf {
return annotation_.get(index);
}
public static final int OPTIONAL_ANNOTATION_CLASS_FIELD_NUMBER = 16;
private java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class> optionalAnnotationClass_;
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class> getOptionalAnnotationClassList() {
return optionalAnnotationClass_;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public java.util.List<? extends org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder>
getOptionalAnnotationClassOrBuilderList() {
return optionalAnnotationClass_;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public int getOptionalAnnotationClassCount() {
return optionalAnnotationClass_.size();
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.Class getOptionalAnnotationClass(int index) {
return optionalAnnotationClass_.get(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder getOptionalAnnotationClassOrBuilder(
int index) {
return optionalAnnotationClass_.get(index);
}
private void initFields() {
packageParts_ = java.util.Collections.emptyList();
metadataParts_ = java.util.Collections.emptyList();
@@ -775,7 +635,6 @@ public final class DebugJvmModuleProtoBuf {
stringTable_ = org.jetbrains.kotlin.metadata.DebugProtoBuf.StringTable.getDefaultInstance();
qualifiedNameTable_ = org.jetbrains.kotlin.metadata.DebugProtoBuf.QualifiedNameTable.getDefaultInstance();
annotation_ = java.util.Collections.emptyList();
optionalAnnotationClass_ = java.util.Collections.emptyList();
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -807,12 +666,6 @@ public final class DebugJvmModuleProtoBuf {
return false;
}
}
for (int i = 0; i < getOptionalAnnotationClassCount(); i++) {
if (!getOptionalAnnotationClass(i).isInitialized()) {
memoizedIsInitialized = 0;
return false;
}
}
memoizedIsInitialized = 1;
return true;
}
@@ -838,9 +691,6 @@ public final class DebugJvmModuleProtoBuf {
for (int i = 0; i < annotation_.size(); i++) {
output.writeMessage(6, annotation_.get(i));
}
for (int i = 0; i < optionalAnnotationClass_.size(); i++) {
output.writeMessage(16, optionalAnnotationClass_.get(i));
}
getUnknownFields().writeTo(output);
}
@@ -879,10 +729,6 @@ public final class DebugJvmModuleProtoBuf {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(6, annotation_.get(i));
}
for (int i = 0; i < optionalAnnotationClass_.size(); i++) {
size += org.jetbrains.kotlin.protobuf.CodedOutputStream
.computeMessageSize(16, optionalAnnotationClass_.get(i));
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@@ -997,7 +843,6 @@ public final class DebugJvmModuleProtoBuf {
getStringTableFieldBuilder();
getQualifiedNameTableFieldBuilder();
getAnnotationFieldBuilder();
getOptionalAnnotationClassFieldBuilder();
}
}
private static Builder create() {
@@ -1038,12 +883,6 @@ public final class DebugJvmModuleProtoBuf {
} else {
annotationBuilder_.clear();
}
if (optionalAnnotationClassBuilder_ == null) {
optionalAnnotationClass_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000040);
} else {
optionalAnnotationClassBuilder_.clear();
}
return this;
}
@@ -1120,15 +959,6 @@ public final class DebugJvmModuleProtoBuf {
} else {
result.annotation_ = annotationBuilder_.build();
}
if (optionalAnnotationClassBuilder_ == null) {
if (((bitField0_ & 0x00000040) == 0x00000040)) {
optionalAnnotationClass_ = java.util.Collections.unmodifiableList(optionalAnnotationClass_);
bitField0_ = (bitField0_ & ~0x00000040);
}
result.optionalAnnotationClass_ = optionalAnnotationClass_;
} else {
result.optionalAnnotationClass_ = optionalAnnotationClassBuilder_.build();
}
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -1239,32 +1069,6 @@ public final class DebugJvmModuleProtoBuf {
}
}
}
if (optionalAnnotationClassBuilder_ == null) {
if (!other.optionalAnnotationClass_.isEmpty()) {
if (optionalAnnotationClass_.isEmpty()) {
optionalAnnotationClass_ = other.optionalAnnotationClass_;
bitField0_ = (bitField0_ & ~0x00000040);
} else {
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.addAll(other.optionalAnnotationClass_);
}
onChanged();
}
} else {
if (!other.optionalAnnotationClass_.isEmpty()) {
if (optionalAnnotationClassBuilder_.isEmpty()) {
optionalAnnotationClassBuilder_.dispose();
optionalAnnotationClassBuilder_ = null;
optionalAnnotationClass_ = other.optionalAnnotationClass_;
bitField0_ = (bitField0_ & ~0x00000040);
optionalAnnotationClassBuilder_ =
org.jetbrains.kotlin.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?
getOptionalAnnotationClassFieldBuilder() : null;
} else {
optionalAnnotationClassBuilder_.addAllMessages(other.optionalAnnotationClass_);
}
}
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@@ -1294,12 +1098,6 @@ public final class DebugJvmModuleProtoBuf {
return false;
}
}
for (int i = 0; i < getOptionalAnnotationClassCount(); i++) {
if (!getOptionalAnnotationClass(i).isInitialized()) {
return false;
}
}
return true;
}
@@ -2628,372 +2426,6 @@ public final class DebugJvmModuleProtoBuf {
return annotationBuilder_;
}
private java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class> optionalAnnotationClass_ =
java.util.Collections.emptyList();
private void ensureOptionalAnnotationClassIsMutable() {
if (!((bitField0_ & 0x00000040) == 0x00000040)) {
optionalAnnotationClass_ = new java.util.ArrayList<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class>(optionalAnnotationClass_);
bitField0_ |= 0x00000040;
}
}
private org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder<
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder, org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder> optionalAnnotationClassBuilder_;
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class> getOptionalAnnotationClassList() {
if (optionalAnnotationClassBuilder_ == null) {
return java.util.Collections.unmodifiableList(optionalAnnotationClass_);
} else {
return optionalAnnotationClassBuilder_.getMessageList();
}
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public int getOptionalAnnotationClassCount() {
if (optionalAnnotationClassBuilder_ == null) {
return optionalAnnotationClass_.size();
} else {
return optionalAnnotationClassBuilder_.getCount();
}
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.Class getOptionalAnnotationClass(int index) {
if (optionalAnnotationClassBuilder_ == null) {
return optionalAnnotationClass_.get(index);
} else {
return optionalAnnotationClassBuilder_.getMessage(index);
}
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder setOptionalAnnotationClass(
int index, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class value) {
if (optionalAnnotationClassBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.set(index, value);
onChanged();
} else {
optionalAnnotationClassBuilder_.setMessage(index, value);
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder setOptionalAnnotationClass(
int index, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder builderForValue) {
if (optionalAnnotationClassBuilder_ == null) {
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.set(index, builderForValue.build());
onChanged();
} else {
optionalAnnotationClassBuilder_.setMessage(index, builderForValue.build());
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder addOptionalAnnotationClass(org.jetbrains.kotlin.metadata.DebugProtoBuf.Class value) {
if (optionalAnnotationClassBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.add(value);
onChanged();
} else {
optionalAnnotationClassBuilder_.addMessage(value);
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder addOptionalAnnotationClass(
int index, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class value) {
if (optionalAnnotationClassBuilder_ == null) {
if (value == null) {
throw new NullPointerException();
}
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.add(index, value);
onChanged();
} else {
optionalAnnotationClassBuilder_.addMessage(index, value);
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder addOptionalAnnotationClass(
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder builderForValue) {
if (optionalAnnotationClassBuilder_ == null) {
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.add(builderForValue.build());
onChanged();
} else {
optionalAnnotationClassBuilder_.addMessage(builderForValue.build());
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder addOptionalAnnotationClass(
int index, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder builderForValue) {
if (optionalAnnotationClassBuilder_ == null) {
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.add(index, builderForValue.build());
onChanged();
} else {
optionalAnnotationClassBuilder_.addMessage(index, builderForValue.build());
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder addAllOptionalAnnotationClass(
java.lang.Iterable<? extends org.jetbrains.kotlin.metadata.DebugProtoBuf.Class> values) {
if (optionalAnnotationClassBuilder_ == null) {
ensureOptionalAnnotationClassIsMutable();
org.jetbrains.kotlin.protobuf.AbstractMessageLite.Builder.addAll(
values, optionalAnnotationClass_);
onChanged();
} else {
optionalAnnotationClassBuilder_.addAllMessages(values);
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder clearOptionalAnnotationClass() {
if (optionalAnnotationClassBuilder_ == null) {
optionalAnnotationClass_ = java.util.Collections.emptyList();
bitField0_ = (bitField0_ & ~0x00000040);
onChanged();
} else {
optionalAnnotationClassBuilder_.clear();
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public Builder removeOptionalAnnotationClass(int index) {
if (optionalAnnotationClassBuilder_ == null) {
ensureOptionalAnnotationClassIsMutable();
optionalAnnotationClass_.remove(index);
onChanged();
} else {
optionalAnnotationClassBuilder_.remove(index);
}
return this;
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder getOptionalAnnotationClassBuilder(
int index) {
return getOptionalAnnotationClassFieldBuilder().getBuilder(index);
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder getOptionalAnnotationClassOrBuilder(
int index) {
if (optionalAnnotationClassBuilder_ == null) {
return optionalAnnotationClass_.get(index); } else {
return optionalAnnotationClassBuilder_.getMessageOrBuilder(index);
}
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public java.util.List<? extends org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder>
getOptionalAnnotationClassOrBuilderList() {
if (optionalAnnotationClassBuilder_ != null) {
return optionalAnnotationClassBuilder_.getMessageOrBuilderList();
} else {
return java.util.Collections.unmodifiableList(optionalAnnotationClass_);
}
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder addOptionalAnnotationClassBuilder() {
return getOptionalAnnotationClassFieldBuilder().addBuilder(
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.getDefaultInstance());
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder addOptionalAnnotationClassBuilder(
int index) {
return getOptionalAnnotationClassFieldBuilder().addBuilder(
index, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.getDefaultInstance());
}
/**
* <code>repeated .org.jetbrains.kotlin.metadata.Class optional_annotation_class = 16;</code>
*
* <pre>
* &#64;OptionalExpectation-annotated annotation classes in this module. This list is only used in the compiler frontend when compiling
* a second-tier multiplatform module against a multiplatform module which uses optional annotations, not actualized on the JVM.
* This is not needed in the IDE because optional annotations can only be used in common modules, where the IDE plugin resolves
* it to the corresponding class with the resolution capabilities of common modules.
* </pre>
*/
public java.util.List<org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder>
getOptionalAnnotationClassBuilderList() {
return getOptionalAnnotationClassFieldBuilder().getBuilderList();
}
private org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder<
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder, org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder>
getOptionalAnnotationClassFieldBuilder() {
if (optionalAnnotationClassBuilder_ == null) {
optionalAnnotationClassBuilder_ = new org.jetbrains.kotlin.protobuf.RepeatedFieldBuilder<
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class, org.jetbrains.kotlin.metadata.DebugProtoBuf.Class.Builder, org.jetbrains.kotlin.metadata.DebugProtoBuf.ClassOrBuilder>(
optionalAnnotationClass_,
((bitField0_ & 0x00000040) == 0x00000040),
getParentForChildren(),
isClean());
optionalAnnotationClass_ = null;
}
return optionalAnnotationClassBuilder_;
}
// @@protoc_insertion_point(builder_scope:org.jetbrains.kotlin.metadata.jvm.Module)
}
@@ -5212,7 +4644,7 @@ public final class DebugJvmModuleProtoBuf {
"\n,core/metadata.jvm/src/jvm_module.debug" +
".proto\022!org.jetbrains.kotlin.metadata.jv" +
"m\032&core/metadata/src/metadata.debug.prot" +
"o\"\316\003\n\006Module\022F\n\rpackage_parts\030\001 \003(\0132/.or" +
"o\"\205\003\n\006Module\022F\n\rpackage_parts\030\001 \003(\0132/.or" +
"g.jetbrains.kotlin.metadata.jvm.PackageP" +
"arts\022G\n\016metadata_parts\030\002 \003(\0132/.org.jetbr" +
"ains.kotlin.metadata.jvm.PackageParts\022\030\n" +
@@ -5221,18 +4653,16 @@ public final class DebugJvmModuleProtoBuf {
"ringTable\022O\n\024qualified_name_table\030\005 \001(\0132",
"1.org.jetbrains.kotlin.metadata.Qualifie" +
"dNameTable\022=\n\nannotation\030\006 \003(\0132).org.jet" +
"brains.kotlin.metadata.Annotation\022G\n\031opt" +
"ional_annotation_class\030\020 \003(\0132$.org.jetbr" +
"ains.kotlin.metadata.Class\"\276\002\n\014PackagePa" +
"rts\022\027\n\017package_fq_name\030\001 \002(\t\022\030\n\020short_cl" +
"ass_name\030\002 \003(\t\022*\n\036multifile_facade_short" +
"_name_id\030\003 \003(\005B\002\020\001\022#\n\033multifile_facade_s" +
"hort_name\030\004 \003(\t\022.\n&class_with_jvm_packag" +
"e_name_short_name\030\005 \003(\t\022F\n:class_with_jv",
"m_package_name_multifile_facade_short_na" +
"me_id\030\007 \003(\005B\002\020\001\0222\n&class_with_jvm_packag" +
"e_name_package_id\030\006 \003(\005B\002\020\001B\030B\026DebugJvmM" +
"oduleProtoBuf"
"brains.kotlin.metadata.Annotation\"\276\002\n\014Pa" +
"ckageParts\022\027\n\017package_fq_name\030\001 \002(\t\022\030\n\020s" +
"hort_class_name\030\002 \003(\t\022*\n\036multifile_facad" +
"e_short_name_id\030\003 \003(\005B\002\020\001\022#\n\033multifile_f" +
"acade_short_name\030\004 \003(\t\022.\n&class_with_jvm" +
"_package_name_short_name\030\005 \003(\t\022F\n:class_" +
"with_jvm_package_name_multifile_facade_s" +
"hort_name_id\030\007 \003(\005B\002\020\001\0222\n&class_with_jvm",
"_package_name_package_id\030\006 \003(\005B\002\020\001B\030B\026De" +
"bugJvmModuleProtoBuf"
};
org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
@@ -5252,7 +4682,7 @@ public final class DebugJvmModuleProtoBuf {
internal_static_org_jetbrains_kotlin_metadata_jvm_Module_fieldAccessorTable = new
org.jetbrains.kotlin.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_org_jetbrains_kotlin_metadata_jvm_Module_descriptor,
new java.lang.String[] { "PackageParts", "MetadataParts", "JvmPackageName", "StringTable", "QualifiedNameTable", "Annotation", "OptionalAnnotationClass", });
new java.lang.String[] { "PackageParts", "MetadataParts", "JvmPackageName", "StringTable", "QualifiedNameTable", "Annotation", });
internal_static_org_jetbrains_kotlin_metadata_jvm_PackageParts_descriptor =
getDescriptor().getMessageTypes().get(1);
internal_static_org_jetbrains_kotlin_metadata_jvm_PackageParts_fieldAccessorTable = new

View File

@@ -18,7 +18,6 @@ public final class DebugJvmProtoBuf {
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.classModuleName);
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.classLocalVariable);
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.anonymousObjectOriginName);
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.jvmClassFlags);
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.packageModuleName);
registry.add(org.jetbrains.kotlin.metadata.jvm.DebugJvmProtoBuf.packageLocalVariable);
}
@@ -4651,21 +4650,6 @@ public final class DebugJvmProtoBuf {
.newFileScopedGeneratedExtension(
java.lang.Integer.class,
null);
public static final int JVM_CLASS_FLAGS_FIELD_NUMBER = 104;
/**
* <code>extend .org.jetbrains.kotlin.metadata.Class { ... }</code>
*
* <pre>
* isFunctionBodyInInterface: 0 if actual body generated in DefaultImpl, 1 - otherwise (in interface default method)
* </pre>
*/
public static final
org.jetbrains.kotlin.protobuf.GeneratedMessage.GeneratedExtension<
org.jetbrains.kotlin.metadata.DebugProtoBuf.Class,
java.lang.Integer> jvmClassFlags = org.jetbrains.kotlin.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
java.lang.Integer.class,
null);
public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101;
/**
* <code>extend .org.jetbrains.kotlin.metadata.Package { ... }</code>
@@ -4774,13 +4758,12 @@ public final class DebugJvmProtoBuf {
"\'.org.jetbrains.kotlin.metadata.Property",
":P\n\034anonymous_object_origin_name\022$.org.j" +
"etbrains.kotlin.metadata.Class\030g \001(\005B\004\230\265" +
"\030\001:@\n\017jvm_class_flags\022$.org.jetbrains.ko" +
"tlin.metadata.Class\030h \001(\005:\0010:I\n\023package_" +
"module_name\022&.org.jetbrains.kotlin.metad" +
"ata.Package\030e \001(\005B\004\230\265\030\001:o\n\026package_local" +
"_variable\022&.org.jetbrains.kotlin.metadat" +
"a.Package\030f \003(\0132\'.org.jetbrains.kotlin.m" +
"etadata.PropertyB\022B\020DebugJvmProtoBuf"
"\030\001:I\n\023package_module_name\022&.org.jetbrain" +
"s.kotlin.metadata.Package\030e \001(\005B\004\230\265\030\001:o\n" +
"\026package_local_variable\022&.org.jetbrains." +
"kotlin.metadata.Package\030f \003(\0132\'.org.jetb" +
"rains.kotlin.metadata.PropertyB\022B\020DebugJ" +
"vmProtoBuf"
};
org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new org.jetbrains.kotlin.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() {
@@ -4837,9 +4820,8 @@ public final class DebugJvmProtoBuf {
classModuleName.internalInit(descriptor.getExtensions().get(8));
classLocalVariable.internalInit(descriptor.getExtensions().get(9));
anonymousObjectOriginName.internalInit(descriptor.getExtensions().get(10));
jvmClassFlags.internalInit(descriptor.getExtensions().get(11));
packageModuleName.internalInit(descriptor.getExtensions().get(12));
packageLocalVariable.internalInit(descriptor.getExtensions().get(13));
packageModuleName.internalInit(descriptor.getExtensions().get(11));
packageLocalVariable.internalInit(descriptor.getExtensions().get(12));
org.jetbrains.kotlin.protobuf.ExtensionRegistry registry =
org.jetbrains.kotlin.protobuf.ExtensionRegistry.newInstance();
registry.add(org.jetbrains.kotlin.metadata.DebugExtOptionsProtoBuf.stringIdInTable);

View File

@@ -1,13 +1,14 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.crypto.checksum.Checksum
import org.gradle.plugins.ide.idea.model.IdeaModel
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import proguard.gradle.ProGuardTask
buildscript {
extra["defaultSnapshotVersion"] = "1.3-SNAPSHOT"
val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true
kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap(kotlinBuildProperties.kotlinBootstrapVersion!!, cacheRedirectorEnabled))
kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap("1.3.70-eap-145", cacheRedirectorEnabled))
repositories {
bootstrapKotlinRepo?.let(::maven)
@@ -27,23 +28,17 @@ buildscript {
dependencies {
bootstrapCompilerClasspath(kotlin("compiler-embeddable", bootstrapKotlinVersion))
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.17")
classpath("com.gradle.publish:plugin-publish-plugin:0.11.0")
classpath(kotlin("gradle-plugin", bootstrapKotlinVersion))
classpath("net.sf.proguard:proguard-gradle:6.1.0")
classpath("org.jetbrains.dokka:dokka-gradle-plugin:0.9.17")
}
}
if (kotlinBuildProperties.buildScanServer != null) {
apply(from = "gradle/buildScanUserData.gradle")
}
plugins {
base
idea
id("jps-compatible")
id("org.jetbrains.gradle.plugin.idea-ext")
id("org.gradle.crypto.checksum") version "1.2.0"
signing
}
pill {
@@ -66,13 +61,9 @@ val configuredJdks: List<JdkId> =
val defaultSnapshotVersion: String by extra
val buildNumber by extra(findProperty("build.number")?.toString() ?: defaultSnapshotVersion)
val kotlinVersion by extra(
findProperty("deployVersion")?.toString()?.let { deploySnapshotStr ->
if (deploySnapshotStr != "default.snapshot") deploySnapshotStr else defaultSnapshotVersion
} ?: buildNumber
)
val kotlinVersion by extra(findProperty("deployVersion")?.toString() ?: buildNumber)
val kotlinLanguageVersion by extra("1.4")
val kotlinLanguageVersion by extra("1.3")
allprojects {
group = "org.jetbrains.kotlin"
@@ -150,8 +141,6 @@ rootProject.apply {
from(rootProject.file("gradle/report.gradle.kts"))
from(rootProject.file("gradle/javaInstrumentation.gradle.kts"))
from(rootProject.file("gradle/jps.gradle.kts"))
from(rootProject.file("gradle/checkArtifacts.gradle.kts"))
from(rootProject.file("gradle/checkCacheability.gradle.kts"))
}
IdeVersionConfigurator.setCurrentIde(project)
@@ -165,28 +154,24 @@ extra["versions.junit"] = "4.12"
extra["versions.javaslang"] = "2.0.6"
extra["versions.ant"] = "1.8.2"
extra["versions.android"] = "2.3.1"
val coroutinesVersion = if (Platform[192].orHigher()) "1.3.7" else "1.1.1"
val coroutinesVersion = if (Platform[192].orHigher()) "1.2.1" else "1.1.1"
extra["versions.kotlinx-coroutines-core"] = coroutinesVersion
extra["versions.kotlinx-coroutines-jdk8"] = coroutinesVersion
extra["versions.json"] = "20160807"
extra["versions.native-platform"] = "0.14"
extra["versions.ant-launcher"] = "1.8.0"
extra["versions.robolectric"] = "4.0"
extra["versions.robolectric"] = "3.1"
extra["versions.org.springframework"] = "4.2.0.RELEASE"
extra["versions.jflex"] = "1.7.0"
extra["versions.markdown"] = "0.1.25"
extra["versions.trove4j"] = "1.0.20181211"
extra["versions.completion-ranking-kotlin"] = "0.1.2"
extra["versions.r8"] = "1.5.70"
val immutablesVersion = "0.3.1"
extra["versions.kotlinx-collections-immutable"] = immutablesVersion
extra["versions.kotlinx-collections-immutable-jvm"] = immutablesVersion
extra["versions.completion-ranking-kotlin"] = "0.0.2"
// NOTE: please, also change KTOR_NAME in pathUtil.kt and all versions in corresponding jar names in daemon tests.
extra["versions.ktor-network"] = "1.0.1"
if (!project.hasProperty("versions.kotlin-native")) {
extra["versions.kotlin-native"] = "1.4-M3-dev-15627"
extra["versions.kotlin-native"] = "1.3.72"
}
val intellijUltimateEnabled by extra(project.kotlinBuildProperties.intellijUltimateEnabled)
@@ -199,10 +184,7 @@ extra["intellijSeparateSdks"] = intellijSeparateSdks
extra["IntellijCoreDependencies"] =
listOf(
when {
Platform[202].orHigher() -> "asm-all-8.0.1"
else -> "asm-all-7.0.1"
},
if (Platform[191].orHigher()) "asm-all-7.0.1" else "asm-all",
"guava",
"jdom",
"jna",
@@ -216,8 +198,6 @@ extra["IntellijCoreDependencies"] =
extra["compilerModules"] = arrayOf(
":compiler:util",
":compiler:config",
":compiler:config.jvm",
":compiler:container",
":compiler:resolution",
":compiler:serialization",
@@ -242,20 +222,15 @@ extra["compilerModules"] = arrayOf(
":compiler:backend",
":compiler:plugin-api",
":compiler:light-classes",
":compiler:javac-wrapper",
":compiler:cli",
":compiler:cli-js",
":compiler:incremental-compilation-impl",
":compiler:compiler.version",
":js:js.ast",
":js:js.serializer",
":js:js.parser",
":js:js.config",
":js:js.frontend",
":js:js.translator",
":js:js.dce",
":native:frontend.native",
":native:kotlin-native-utils",
":compiler",
":kotlin-build-common",
":core:metadata",
@@ -268,39 +243,11 @@ extra["compilerModules"] = arrayOf(
":core:type-system",
":compiler:fir:cones",
":compiler:fir:resolve",
":compiler:fir:fir-serialization",
":compiler:fir:tree",
":compiler:fir:raw-fir:fir-common",
":compiler:fir:raw-fir:psi2fir",
":compiler:fir:raw-fir:light-tree2fir",
":compiler:fir:psi2fir",
":compiler:fir:lightTree",
":compiler:fir:fir2ir",
":compiler:fir:fir2ir:jvm-backend",
":compiler:fir:java",
":compiler:fir:jvm",
":compiler:fir:checkers",
":compiler:fir:analysis-tests"
)
extra["compilerModulesForJps"] = listOf(
":core:type-system",
":kotlin-build-common",
":kotlin-util-io",
":kotlin-util-klib",
":kotlin-util-klib-metadata",
":compiler:cli-common",
":kotlin-compiler-runner",
":daemon-common",
":daemon-common-new",
":core:descriptors",
":core:descriptors.jvm",
":idea:idea-jps-common",
":kotlin-preloader",
":compiler:util",
":compiler:config",
":compiler:config.jvm",
":js:js.config",
":core:util.runtime",
":compiler:compiler.version"
":compiler:fir:java"
)
val coreLibProjects = listOfNotNull(
@@ -310,24 +257,25 @@ val coreLibProjects = listOfNotNull(
":kotlin-stdlib-js-ir",
":kotlin-stdlib-jdk7",
":kotlin-stdlib-jdk8",
":kotlin-test:kotlin-test-annotations-common",
":kotlin-test:kotlin-test-common",
":kotlin-test:kotlin-test-jvm",
":kotlin-test:kotlin-test-junit",
":kotlin-test:kotlin-test-junit5",
":kotlin-test:kotlin-test-testng",
":kotlin-test:kotlin-test-js".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync },
":kotlin-test:kotlin-test-js-ir".takeIf { !kotlinBuildProperties.isInJpsBuildIdeaSync },
":kotlin-reflect",
":kotlin-coroutines-experimental-compat"
":kotlin-reflect"
)
val gradlePluginProjects = listOf(
":kotlin-gradle-plugin",
":kotlin-gradle-plugin:plugin-marker",
":kotlin-gradle-plugin-api",
// ":kotlin-gradle-plugin-integration-tests", // TODO: build fails
":kotlin-allopen",
":kotlin-allopen:plugin-marker",
":kotlin-annotation-processing-gradle",
":kotlin-noarg",
":kotlin-noarg:plugin-marker",
":kotlin-sam-with-receiver"
)
@@ -353,18 +301,11 @@ fun Task.listConfigurationContents(configName: String) {
val defaultJvmTarget = "1.8"
val defaultJavaHome = jdkPath(defaultJvmTarget)
val ignoreTestFailures by extra(project.kotlinBuildProperties.ignoreTestFailures)
val ignoreTestFailures by extra(project.findProperty("ignoreTestFailures")?.toString()?.toBoolean() ?: project.hasProperty("teamcity"))
allprojects {
configurations.maybeCreate("embedded").apply {
isCanBeConsumed = false
isCanBeResolved = true
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR))
}
}
configurations.maybeCreate("embedded")
jvmTarget = defaultJvmTarget
javaHome = defaultJavaHome
@@ -386,19 +327,16 @@ allprojects {
maven("https://dl.bintray.com/kotlin/ktor")
maven("https://kotlin.bintray.com/kotlin-dependencies")
maven("https://jetbrains.bintray.com/intellij-third-party-dependencies")
maven("https://dl.google.com/dl/android/maven2")
bootstrapKotlinRepo?.let(::maven)
internalBootstrapRepo?.let(::maven)
internalKotlinRepo?.let(::maven)
}
configureJvmProject(javaHome!!, jvmTarget!!)
val commonCompilerArgs = listOfNotNull(
"-Xopt-in=kotlin.RequiresOptIn",
"-Xuse-experimental=kotlin.Experimental",
"-Xread-deserialized-contracts",
"-Xjvm-default=compatibility",
"-Xno-optimized-callable-references",
"-Xno-kotlin-nothing-value-exception",
"-progressive".takeIf { hasProperty("test.progressive.mode") }
)
@@ -428,32 +366,12 @@ allprojects {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
tasks.withType<AbstractArchiveTask> {
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
tasks.withType<Test> {
outputs.doNotCacheIf("https://youtrack.jetbrains.com/issue/KT-37089") { true }
}
normalization {
runtimeClasspath {
ignore("META-INF/MANIFEST.MF")
ignore("META-INF/compiler.version")
ignore("META-INF/plugin.xml")
}
}
tasks {
register("listArchives") { listConfigurationContents("archives") }
register("listRuntimeJar") { listConfigurationContents("runtimeJar") }
register("listDistJar") { listConfigurationContents("distJar") }
// Aggregate task for build related checks
register("checkBuild")
}
afterEvaluate {
@@ -490,17 +408,25 @@ allprojects {
?.exclude("org.jetbrains.kotlin", "kotlin-scripting-compiler-embeddable")
}
// Aggregate task for build related checks
tasks.register("checkBuild")
apply(from = "$rootDir/gradle/cacheRedirector.gradle.kts")
}
}
gradle.taskGraph.whenReady {
fun Boolean.toOnOff(): String = if (this) "on" else "off"
val profile = if (isTeamcityBuild) "CI" else "Local"
logger.warn("$profile build profile is active (proguard is ${kotlinBuildProperties.proguard.toOnOff()}" +
", jar compression is ${kotlinBuildProperties.jarCompression.toOnOff()})." +
" Use -Pteamcity=<true|false> to reproduce CI/local build")
if (isTeamcityBuild) {
logger.warn("CI build profile is active (IC is off, proguard is on). Use -Pteamcity=false to reproduce local build")
for (task in allTasks) {
when (task) {
is AbstractKotlinCompile<*> -> task.incremental = false
is JavaCompile -> task.options.isIncremental = false
}
}
} else {
logger.warn("Local build profile is active (IC is on, proguard is off). Use -Pteamcity=true to reproduce TC build")
}
allTasks.filterIsInstance<org.gradle.jvm.tasks.Jar>().forEach { task ->
task.entryCompression = if (kotlinBuildProperties.jarCompression)
@@ -526,7 +452,7 @@ val ideaPlugin by task<Task> {
}
tasks {
named("clean") {
register("clean") {
doLast {
delete("$buildDir/repo")
delete(distDir)
@@ -572,8 +498,7 @@ tasks {
":compiler:test",
":compiler:container:test",
":compiler:tests-java8:test",
":compiler:tests-spec:test",
":compiler:tests-against-klib:test"
":compiler:tests-spec:remoteRunTests"
)
dependsOn(":plugins:jvm-abi-gen:test")
}
@@ -591,32 +516,16 @@ tasks {
}
register("wasmCompilerTest") {
// TODO: fix once
// dependsOn(":js:js.tests:wasmTest")
}
register("nativeCompilerTest") {
dependsOn(":native:kotlin-native-utils:test")
dependsOn(":js:js.tests:wasmTest")
}
register("firCompilerTest") {
dependsOn(":compiler:fir:raw-fir:psi2fir:test")
dependsOn(":compiler:fir:raw-fir:light-tree2fir:test")
dependsOn(":compiler:fir:analysis-tests:test")
dependsOn(":compiler:fir:psi2fir:test")
dependsOn(":compiler:fir:resolve:test")
dependsOn(":compiler:fir:fir2ir:test")
dependsOn(":compiler:fir:lightTree:test")
}
register("firAllTest") {
dependsOn(
":dist",
":compiler:fir:raw-fir:psi2fir:test",
":compiler:fir:raw-fir:light-tree2fir:test",
":compiler:fir:analysis-tests:test",
":compiler:fir:fir2ir:test",
":plugins:fir:fir-plugin-prototype:test"
)
}
register("compilerFrontendVisualizerTest") {
dependsOn("compiler:visualizer:test")
}
@@ -624,7 +533,7 @@ tasks {
register("scriptingTest") {
dependsOn("dist")
dependsOn(":kotlin-script-util:test")
dependsOn(":kotlin-scripting-compiler-embeddable:test")
dependsOn(":kotlin-scripting-compiler:test")
dependsOn(":kotlin-scripting-common:test")
dependsOn(":kotlin-scripting-jvm:test")
dependsOn(":kotlin-scripting-jvm-host-test:test")
@@ -635,22 +544,14 @@ tasks {
// dependsOn(":kotlin-scripting-jvm-host-test:embeddableTest")
dependsOn(":kotlin-scripting-jsr223-test:embeddableTest")
dependsOn(":kotlin-main-kts-test:test")
dependsOn(":kotlin-scripting-ide-services-test:test")
dependsOn(":kotlin-scripting-js-test:test")
}
register("compilerTest") {
dependsOn("jvmCompilerTest")
dependsOn("jsCompilerTest")
dependsOn("miscCompilerTest")
}
register("miscCompilerTest") {
dependsOn("wasmCompilerTest")
dependsOn("nativeCompilerTest")
dependsOn("firCompilerTest")
dependsOn(":kotlin-daemon-tests:test")
dependsOn("scriptingTest")
dependsOn(":kotlin-build-common:test")
dependsOn(":compiler:incremental-compilation-impl:test")
@@ -661,7 +562,6 @@ tasks {
register("toolsTest") {
dependsOn(":tools:kotlinp:test")
dependsOn(":native:kotlin-klib-commonizer:test")
}
register("examplesTest") {
@@ -692,6 +592,14 @@ tasks {
dependsOn(":jps-plugin:test")
}
register("konan-tests") {
dependsOn("dist")
dependsOn(
":kotlin-native:kotlin-native-library-reader:test",
":kotlin-native:commonizer:test"
)
}
register("idea-plugin-main-tests") {
dependsOn("dist")
dependsOn(":idea:test")
@@ -713,32 +621,20 @@ tasks {
)
}
if (Ide.IJ()) {
register("idea-new-project-wizard-tests") {
dependsOn("dist")
dependsOn(
":libraries:tools:new-project-wizard:test",
":libraries:tools:new-project-wizard:new-project-wizard-cli:test",
":idea:idea-new-project-wizard:test"
)
}
register("idea-new-project-wizard-tests") {
dependsOn("dist")
dependsOn(
":libraries:tools:new-project-wizard:test",
":libraries:tools:new-project-wizard:new-project-wizard-cli:test"
)
}
register("idea-plugin-tests") {
dependsOn("dist")
dependsOn(
"idea-plugin-main-tests",
"idea-plugin-additional-tests"
)
if (Ide.IJ()) {
dependsOn("idea-new-project-wizard-tests")
}
}
register("idea-plugin-performance-tests") {
dependsOn("dist")
dependsOn(
":idea:performanceTests:performanceTest"
"idea-plugin-additional-tests",
"idea-new-project-wizard-tests"
)
}
@@ -755,6 +651,7 @@ tasks {
dependsOn("dist")
dependsOn(
":kotlin-annotation-processing:test",
":kotlin-source-sections-compiler-plugin:test",
":kotlin-allopen-compiler-plugin:test",
":kotlin-noarg-compiler-plugin:test",
":kotlin-sam-with-receiver-compiler-plugin:test",
@@ -771,43 +668,13 @@ tasks {
dependsOn(
"idea-plugin-tests",
"jps-tests",
"konan-tests",
"plugins-tests",
"android-ide-tests",
":generators:test"
)
}
register("publishIdeArtifacts") {
idePluginDependency {
dependsOn(
":prepare:ide-plugin-dependencies:android-extensions-compiler-plugin-for-ide:publish",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide:publish",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-tests-for-ide:publish",
":prepare:ide-plugin-dependencies:incremental-compilation-impl-tests-for-ide:publish",
":prepare:ide-plugin-dependencies:kotlin-build-common-tests-for-ide:publish",
":prepare:ide-plugin-dependencies:kotlin-compiler-for-ide:publish",
":prepare:ide-plugin-dependencies:kotlin-dist-for-ide:publish",
":prepare:ide-plugin-dependencies:kotlin-gradle-statistics-for-ide:publish",
":prepare:ide-plugin-dependencies:kotlinx-serialization-compiler-plugin-for-ide:publish",
":prepare:ide-plugin-dependencies:noarg-compiler-plugin-for-ide:publish",
":prepare:ide-plugin-dependencies:sam-with-receiver-compiler-plugin-for-ide:publish",
":prepare:ide-plugin-dependencies:compiler-components-for-jps:publish",
":kotlin-script-runtime:publish",
":kotlin-script-util:publish",
":kotlin-scripting-common:publish",
":kotlin-scripting-jvm:publish",
":kotlin-scripting-compiler:publish",
":kotlin-scripting-compiler-impl:publish",
":kotlin-android-extensions-runtime:publish",
":kotlin-stdlib-common:publish",
":kotlin-stdlib:publish",
":kotlin-stdlib-jdk7:publish",
":kotlin-stdlib-jdk8:publish",
":kotlin-reflect:publish",
":kotlin-main-kts:publish"
)
}
}
register("test") {
doLast {
@@ -815,17 +682,9 @@ tasks {
}
}
named("check") {
register("check") {
dependsOn("test")
}
named("checkBuild") {
if (kotlinBuildProperties.isTeamcityBuild) {
doFirst {
println("##teamcity[setParameter name='bootstrap.kotlin.version' value='$bootstrapKotlinVersion']")
}
}
}
}
fun CopySpec.setExecutablePermissions() {
@@ -835,15 +694,15 @@ fun CopySpec.setExecutablePermissions() {
val zipCompiler by task<Zip> {
dependsOn(dist)
destinationDirectory.set(file(distDir))
archiveFileName.set("kotlin-compiler-$kotlinVersion.zip")
destinationDir = file(distDir)
archiveName = "kotlin-compiler-$kotlinVersion.zip"
from(distKotlinHomeDir)
into("kotlinc")
setExecutablePermissions()
doLast {
logger.lifecycle("Compiler artifacts packed to ${archiveFile.get().asFile.absolutePath}")
logger.lifecycle("Compiler artifacts packed to $archivePath")
}
}
@@ -852,7 +711,6 @@ val zipStdlibTests by task<Zip> {
archiveFileName.set("kotlin-stdlib-tests.zip")
from("libraries/stdlib/common/test") { into("common") }
from("libraries/stdlib/test") { into("test") }
from("libraries/kotlin.test/common/src/test/kotlin") { into("kotlin-test") }
doLast {
logger.lifecycle("Stdlib tests are packed to ${archiveFile.get()}")
}
@@ -881,45 +739,21 @@ val zipPlugin by task<Zip> {
}
val destPath = project.findProperty("pluginZipPath") as String?
val dest = File(destPath ?: "$buildDir/kotlin-plugin.zip")
destinationDirectory.set(dest.parentFile)
archiveFileName.set(dest.name)
destinationDir = dest.parentFile
archiveName = dest.name
doFirst {
if (destPath == null) throw GradleException("Specify target zip path with 'pluginZipPath' property")
}
from(src)
into("Kotlin")
setExecutablePermissions()
doLast {
logger.lifecycle("Plugin artifacts packed to $archiveFile")
logger.lifecycle("Plugin artifacts packed to $archivePath")
}
}
fun Project.secureZipTask(zipTask: TaskProvider<Zip>): RegisteringDomainObjectDelegateProviderWithAction<out TaskContainer, Task> {
val checkSumTask = tasks.register("${zipTask.name}Checksum", Checksum::class) {
dependsOn(zipTask)
val compilerFile = zipTask.get().outputs.files.singleFile
files = files(compilerFile)
outputDir = compilerFile.parentFile
algorithm = Checksum.Algorithm.SHA256
}
val signTask = tasks.register("${zipTask.name}Sign", Sign::class) {
description = "Signs the archive produced by the '" + zipTask.name + "' task."
sign(zipTask.get())
}
return tasks.registering {
dependsOn(checkSumTask)
dependsOn(signTask)
}
}
signing {
useGpgCmd()
}
val zipCompilerWithSignature by secureZipTask(zipCompiler)
val zipPluginWithSignature by secureZipTask(zipPlugin)
configure<IdeaModel> {
module {
excludeDirs = files(
@@ -927,8 +761,7 @@ configure<IdeaModel> {
commonLocalDataDir,
".gradle",
"dependencies",
"dist",
"tmp"
"dist"
).toSet()
}
}
@@ -1047,15 +880,3 @@ val Jar.outputFile: File
val Project.sourceSetsOrNull: SourceSetContainer?
get() = convention.findPlugin(JavaPluginConvention::class.java)?.sourceSets
val disableVerificationTasks = System.getProperty("disable.verification.tasks") == "true"
if (disableVerificationTasks) {
gradle.taskGraph.whenReady {
allTasks.forEach {
if (it is VerificationTask) {
logger.info("DISABLED: '$it'")
it.enabled = false
}
}
}
}

View File

@@ -1,11 +1,11 @@
extra["versions.shadow"] = "4.0.3"
extra["versions.native-platform"] = "0.14"
buildscript {
val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true
extra["defaultSnapshotVersion"] = kotlinBuildProperties.defaultSnapshotVersion
kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap(kotlinBuildProperties.kotlinBootstrapVersion!!, cacheRedirectorEnabled))
val buildSrcKotlinVersion: String by extra(findProperty("buildSrc.kotlin.version")?.toString() ?: embeddedKotlinVersion)
val buildSrcKotlinRepo: String? by extra(findProperty("buildSrc.kotlin.repo") as String?)
repositories {
if (cacheRedirectorEnabled) {
@@ -16,29 +16,27 @@ buildscript {
maven("https://kotlin.bintray.com/kotlin-dependencies")
}
project.bootstrapKotlinRepo?.let {
buildSrcKotlinRepo?.let {
maven(url = it)
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.17")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${project.bootstrapKotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-sam-with-receiver:${project.bootstrapKotlinVersion}")
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.6")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$buildSrcKotlinVersion")
classpath("org.jetbrains.kotlin:kotlin-sam-with-receiver:$buildSrcKotlinVersion")
}
}
val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true
logger.info("buildSrcKotlinVersion: " + extra["bootstrapKotlinVersion"])
logger.info("buildSrcKotlinVersion: " + extra["buildSrcKotlinVersion"])
logger.info("buildSrc kotlin compiler version: " + org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION)
logger.info("buildSrc stdlib version: " + KotlinVersion.CURRENT)
apply {
plugin("kotlin")
plugin("kotlin-sam-with-receiver")
from("../gradle/checkCacheability.gradle.kts")
}
plugins {
@@ -48,6 +46,10 @@ plugins {
gradlePlugin {
plugins {
register("pill-configurable") {
id = "pill-configurable"
implementationClass = "org.jetbrains.kotlin.pill.PillConfigurablePlugin"
}
register("jps-compatible") {
id = "jps-compatible"
implementationClass = "org.jetbrains.kotlin.pill.JpsCompatiblePlugin"
@@ -55,10 +57,6 @@ gradlePlugin {
}
}
kotlinDslPluginOptions {
experimentalWarning.set(false)
}
fun Project.getBooleanProperty(name: String): Boolean? = this.findProperty(name)?.let {
val v = it.toString()
if (v.isBlank()) true
@@ -72,12 +70,12 @@ rootProject.apply {
val isTeamcityBuild = kotlinBuildProperties.isTeamcityBuild
val intellijUltimateEnabled by extra(kotlinBuildProperties.intellijUltimateEnabled)
val intellijSeparateSdks by extra(project.getBooleanProperty("intellijSeparateSdks") ?: false)
val verifyDependencyOutput by extra( getBooleanProperty("kotlin.build.dependency.output.verification") ?: isTeamcityBuild)
extra["intellijReleaseType"] = when {
extra["versions.intellijSdk"]?.toString()?.contains("-EAP-") == true -> "snapshots"
extra["versions.intellijSdk"]?.toString()?.endsWith("SNAPSHOT") == true -> "nightly"
else -> "releases"
}
extra["intellijReleaseType"] = if (extra["versions.intellijSdk"]?.toString()?.endsWith("SNAPSHOT") == true)
"snapshots"
else
"releases"
extra["versions.androidDxSources"] = "5.0.0_r2"
@@ -89,24 +87,22 @@ repositories {
maven("https://kotlin.bintray.com/kotlin-dependencies")
gradlePluginPortal()
extra["bootstrapKotlinRepo"]?.let {
extra["buildSrcKotlinRepo"]?.let {
maven(url = it)
}
}
dependencies {
implementation(kotlin("stdlib", embeddedKotlinVersion))
implementation("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.17")
implementation("com.gradle.publish:plugin-publish-plugin:0.11.0")
implementation("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.6")
implementation("net.rubygrapefruit:native-platform:${property("versions.native-platform")}")
implementation("net.rubygrapefruit:native-platform-windows-amd64:${property("versions.native-platform")}")
implementation("net.rubygrapefruit:native-platform-windows-i386:${property("versions.native-platform")}")
implementation("com.jakewharton.dex:dex-method-list:3.0.0")
implementation("com.github.jengelman.gradle.plugins:shadow:${rootProject.extra["versions.shadow"]}")
implementation("net.sf.proguard:proguard-gradle:6.2.2")
implementation("org.jetbrains.intellij.deps:asm-all:8.0.1")
implementation("com.github.jengelman.gradle.plugins:shadow:${property("versions.shadow")}")
implementation("org.jetbrains.intellij.deps:asm-all:7.0.1")
implementation("gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext:0.5")
}

View File

@@ -0,0 +1,8 @@
org.gradle.jvmargs=-Duser.country=US -Dkotlin.daemon.jvm.options=-Xmx1600m -Dfile.encoding=UTF-8
cacheRedirectorEnabled=true
#buildSrc.kotlin.repo=https://jcenter.bintray.com
#buildSrc.kotlin.version=1.1.50
intellijUltimateEnabled=false

View File

@@ -2,20 +2,18 @@
import org.gradle.internal.os.OperatingSystem
import java.io.Closeable
import java.io.FileWriter
import java.io.OutputStreamWriter
import java.net.URI
import java.text.SimpleDateFormat
import java.util.*
import javax.xml.stream.XMLOutputFactory
import org.jetbrains.kotlin.gradle.tasks.internal.CleanableStore
import java.time.Duration
import java.time.Instant
plugins {
base
}
val verifyDependencyOutput: Boolean by rootProject.extra
val intellijUltimateEnabled: Boolean by rootProject.extra
val intellijReleaseType: String by rootProject.extra
val intellijVersion = rootProject.extra["versions.intellijSdk"] as String
@@ -33,6 +31,7 @@ if (intellijVersionDelimiterIndex == -1) {
val platformBaseVersion = intellijVersion.substring(0, intellijVersionDelimiterIndex)
logger.info("verifyDependencyOutput: $verifyDependencyOutput")
logger.info("intellijUltimateEnabled: $intellijUltimateEnabled")
logger.info("intellijVersion: $intellijVersion")
logger.info("androidStudioRelease: $androidStudioRelease")
@@ -106,7 +105,7 @@ val nodeJSPlugin by configurations.creating
val intellijRuntimeAnnotations = "intellij-runtime-annotations"
val dependenciesDir = (findProperty("kotlin.build.dependencies.dir") as String?)?.let(::File)
?: rootProject.gradle.gradleUserHomeDir.resolve("kotlin-build-dependencies")
?: rootProject.rootDir.parentFile.resolve("dependencies")
val customDepsRepoDir = dependenciesDir.resolve("repo")
@@ -148,20 +147,14 @@ val makeIntellijCore = buildIvyRepositoryTask(intellijCore, customDepsOrg, custo
val makeIntellijAnnotations by tasks.registering(Copy::class) {
dependsOn(makeIntellijCore)
val intellijCoreRepo = CleanableStore[repoDir.resolve("intellij-core").absolutePath][intellijVersion].use()
from(intellijCoreRepo.resolve("artifacts/annotations.jar"))
from(repoDir.resolve("intellij-core/$intellijVersion/artifacts/annotations.jar"))
val annotationsStore = CleanableStore[repoDir.resolve(intellijRuntimeAnnotations).absolutePath]
val targetDir = annotationsStore[intellijVersion].use()
val targetDir = File(repoDir, "$intellijRuntimeAnnotations/$intellijVersion")
into(targetDir)
val ivyFile = File(targetDir, "$intellijRuntimeAnnotations.ivy.xml")
outputs.files(ivyFile)
doFirst {
annotationsStore.cleanStore()
}
doLast {
writeIvyXml(
customDepsOrg,
@@ -178,11 +171,7 @@ val makeIntellijAnnotations by tasks.registering(Copy::class) {
val mergeSources by tasks.creating(Jar::class.java) {
dependsOn(sources)
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
if (!kotlinBuildProperties.isTeamcityBuild) {
from(provider { sources.map(::zipTree) })
}
from(provider { sources.map(::zipTree) })
destinationDirectory.set(File(repoDir, sources.name))
archiveBaseName.set("intellij")
archiveClassifier.set("sources")
@@ -197,8 +186,8 @@ val makeIde = if (androidStudioBuild != null) {
customDepsOrg,
customDepsRepoDir,
if (androidStudioOs == "mac")
::skipContentsDirectory
else
::skipContentsDirectory
else
::skipToplevelDirectory
)
} else {
@@ -216,6 +205,7 @@ val makeIde = if (androidStudioBuild != null) {
}
val buildJpsStandalone = buildIvyRepositoryTask(jpsStandalone, customDepsOrg, customDepsRepoDir, null, sourcesFile)
val buildNodeJsPlugin = buildIvyRepositoryTask(nodeJSPlugin, customDepsOrg, customDepsRepoDir, ::skipToplevelDirectory, sourcesFile)
tasks.named("build") {
dependsOn(
@@ -225,12 +215,15 @@ tasks.named("build") {
makeIntellijAnnotations
)
if (installIntellijUltimate) {
dependsOn(buildNodeJsPlugin)
}
}
if (installIntellijUltimate) {
val buildNodeJsPlugin =
buildIvyRepositoryTask(nodeJSPlugin, customDepsOrg, customDepsRepoDir, ::skipToplevelDirectory, sourcesFile)
tasks.named("build") { dependsOn(buildNodeJsPlugin) }
// Task to delete legacy repo locations
tasks.register<Delete>("cleanLegacy") {
delete("$projectDir/android-dx")
delete("$projectDir/intellij-sdk")
}
tasks.named<Delete>("clean") {
@@ -243,96 +236,86 @@ fun buildIvyRepositoryTask(
repoDirectory: File,
pathRemap: ((String) -> String)? = null,
sources: File? = null
): TaskProvider<Task> {
fun ResolvedArtifact.storeDirectory(): CleanableStore =
CleanableStore[repoDirectory.resolve("$organization/${moduleVersion.id.name}").absolutePath]
) = tasks.register("buildIvyRepositoryFor${configuration.name.capitalize()}") {
fun ResolvedArtifact.moduleDirectory(): File =
storeDirectory()[moduleVersion.id.version].use()
File(repoDirectory, "$organization/${moduleVersion.id.name}/${moduleVersion.id.version}")
return tasks.register("buildIvyRepositoryFor${configuration.name.capitalize()}") {
dependsOn(configuration)
inputs.files(configuration)
dependsOn(configuration)
inputs.files(configuration)
if (verifyDependencyOutput) {
outputs.dir(provider {
configuration.resolvedConfiguration.resolvedArtifacts.single().moduleDirectory()
})
} else {
outputs.upToDateWhen {
configuration.resolvedConfiguration.resolvedArtifacts.single()
.moduleDirectory()
.exists()
}
}
doFirst {
val artifact = configuration.resolvedConfiguration.resolvedArtifacts.single()
val moduleDirectory = artifact.moduleDirectory()
doFirst {
configuration.resolvedConfiguration.resolvedArtifacts.single().run {
val moduleDirectory = moduleDirectory()
val artifactsDirectory = File(moduleDirectory(), "artifacts")
artifact.storeDirectory().cleanStore()
logger.info("Unpacking ${file.name} into ${artifactsDirectory.absolutePath}")
copy {
val fileTree = when (extension) {
"tar.gz" -> tarTree(file)
"zip" -> zipTree(file)
else -> error("Unsupported artifact extension: $extension")
}
if (moduleDirectory.exists()) {
logger.info("Path ${moduleDirectory.absolutePath} already exists, skipping unpacking.")
return@doFirst
from(fileTree.matching {
exclude("**/plugins/Kotlin/**")
})
into(artifactsDirectory)
if (pathRemap != null) {
eachFile {
path = pathRemap(path)
}
}
includeEmptyDirs = false
}
with(artifact) {
val artifactsDirectory = File(moduleDirectory, "artifacts")
logger.info("Unpacking ${file.name} into ${artifactsDirectory.absolutePath}")
copy {
val fileTree = when (extension) {
"tar.gz" -> tarTree(file)
"zip" -> zipTree(file)
else -> error("Unsupported artifact extension: $extension")
writeIvyXml(
organization,
moduleVersion.id.name,
moduleVersion.id.version,
moduleVersion.id.name,
File(artifactsDirectory, "lib"),
File(artifactsDirectory, "lib"),
File(moduleDirectory, "ivy"),
*listOfNotNull(sources).toTypedArray()
)
val pluginsDirectory = File(artifactsDirectory, "plugins")
if (pluginsDirectory.exists()) {
file(File(artifactsDirectory, "plugins"))
.listFiles { file: File -> file.isDirectory }
.forEach {
writeIvyXml(
organization,
it.name,
moduleVersion.id.version,
it.name,
File(it, "lib"),
File(it, "lib"),
File(moduleDirectory, "ivy"),
*listOfNotNull(sources).toTypedArray()
)
}
from(
fileTree.matching {
exclude("**/plugins/Kotlin/**")
}
)
into(artifactsDirectory)
if (pathRemap != null) {
eachFile {
path = pathRemap(path)
}
}
includeEmptyDirs = false
}
writeIvyXml(
organization,
moduleVersion.id.name,
moduleVersion.id.version,
moduleVersion.id.name,
File(artifactsDirectory, "lib"),
File(artifactsDirectory, "lib"),
File(moduleDirectory, "ivy"),
*listOfNotNull(sources).toTypedArray()
)
val pluginsDirectory = File(artifactsDirectory, "plugins")
if (pluginsDirectory.exists()) {
file(File(artifactsDirectory, "plugins"))
.listFiles { file: File -> file.isDirectory }
.forEach {
writeIvyXml(
organization,
it.name,
moduleVersion.id.version,
it.name,
File(it, "lib"),
File(it, "lib"),
File(moduleDirectory, "ivy"),
*listOfNotNull(sources).toTypedArray()
)
}
}
}
}
}
}
fun CleanableStore.cleanStore() = cleanDir(Instant.now().minus(Duration.ofDays(30)))
fun writeIvyXml(
organization: String,
moduleName: String,
@@ -352,7 +335,7 @@ fun writeIvyXml(
val ivyFile = targetDir.resolve("$fileName.ivy.xml")
ivyFile.parentFile.mkdirs()
with(XMLWriter(ivyFile.writer())) {
with(XMLWriter(FileWriter(ivyFile))) {
document("UTF-8", "1.0") {
element("ivy-module") {
attribute("version", "2.0")
@@ -376,24 +359,24 @@ fun writeIvyXml(
}
element("publications") {
artifactDir.listFiles()
?.filter(::shouldIncludeIntellijJar)
?.sortedBy { it.name.toLowerCase() }
?.forEach { jarFile ->
val relativeName = jarFile.toRelativeString(baseDir).removeSuffix(".jar")
emptyElement("artifact") {
attributes(
"name" to relativeName,
"type" to "jar",
"ext" to "jar",
"conf" to "default"
)
}
artifactDir.listFiles()?.filter(::shouldIncludeIntellijJar)?.forEach { jarFile ->
val relativeName = jarFile.toRelativeString(baseDir).removeSuffix(".jar")
emptyElement("artifact") {
attributes(
"name" to relativeName,
"type" to "jar",
"ext" to "jar",
"conf" to "default"
)
}
}
sourcesJar.forEach { jarFile ->
emptyElement("artifact") {
val sourcesArtifactName = jarFile.name.substringBefore("-$version")
val sourcesArtifactName = jarFile.name
.substringBeforeLast("-")
.substringBeforeLast("-")
attributes(
"name" to sourcesArtifactName,
"type" to "jar",

View File

@@ -20,53 +20,33 @@ buildscript {
}
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.17")
classpath("org.jetbrains.kotlin:kotlin-build-gradle-plugin:0.0.6")
}
}
def buildProperties = BuildPropertiesKt.getKotlinBuildPropertiesForSettings(settings)
def projectVersions = file("../gradle/versions.properties").text
BuildCacheKt.setupBuildCache(settings)
include "prepare-deps"
def target_AppCode_Clion = buildProperties.includeCidrPlugins && !projectVersions.contains("versions.androidStudioRelease")
def target_AndroidStudio = buildProperties.includeCidrPlugins && projectVersions.contains("versions.androidStudioRelease")
def target_IdeaUltimate = buildProperties.includeUltimate
if (target_AppCode_Clion) {
logger.info("Including modules for AC and CL in buildSrc/settings.gradle")
if (buildProperties.includeCidrPlugins) {
logger.info("Including CIDR plugins in buildSrc/settings.gradle")
include ":prepare-deps:kotlin-native-platform-deps"
include ":prepare-deps:native-debug-plugin"
project(":prepare-deps:kotlin-native-platform-deps").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/kotlin-native-platform-deps")
project(":prepare-deps:native-debug-plugin").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/native-debug-plugin")
} else if (target_AndroidStudio) {
logger.info("Including modules for AS (mobile plugin) in buildSrc/settings.gradle")
include ":prepare-deps:cocoa-common-binaries"
include ":prepare-deps:lldb-framework"
include ":prepare-deps:lldb-frontend"
project(":prepare-deps:cocoa-common-binaries").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/cocoa-common-binaries")
project(":prepare-deps:lldb-framework").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/lldb-framework")
project(":prepare-deps:lldb-frontend").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/lldb-frontend")
} else if (target_IdeaUltimate) {
logger.info("Including modules for IU in buildSrc/settings.gradle")
} else {
logger.info("NOT including CIDR plugins in buildSrc/settings.gradle")
}
if (buildProperties.includeUltimate) {
logger.info("Including extension for IJ Ultimate in buildSrc/settings.gradle")
include ":prepare-deps:lldb-frontend"
include ":prepare-deps:native-debug-plugin"
project(":prepare-deps:lldb-frontend").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/lldb-frontend")
project(":prepare-deps:native-debug-plugin").projectDir =
file("${buildProperties.propertiesProvider.rootProjectDir}/kotlin-ultimate/buildSrc/prepare-deps/native-debug-plugin")
} else {
logger.info("Not including extra modules in buildSrc/settings.gradle")
}
logger.info("Not including extension for IJ Ultimate in buildSrc/settings.gradle")
}

View File

@@ -0,0 +1,114 @@
@file:Suppress("unused") // usages in build scripts are not tracked properly
import org.gradle.api.Project
import org.gradle.kotlin.dsl.*
import java.net.URI
var Project.bootstrapKotlinVersion: String
get() = this.property("bootstrapKotlinVersion") as String
private set(value) {
this.extra["bootstrapKotlinVersion"] = value
}
var Project.bootstrapKotlinRepo: String?
get() = this.property("bootstrapKotlinRepo") as String?
private set(value) {
this.extra["bootstrapKotlinRepo"] = value
}
val Project.internalKotlinRepo: String?
get() = "https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_KotlinPublic_Compiler),number:$bootstrapKotlinVersion," +
"branch:default:any/artifacts/content/internal/repo"
fun Project.kotlinBootstrapFrom(defaultSource: BootstrapOption) {
val customVersion = project.findProperty("bootstrap.kotlin.version") as String?
val customRepo = project.findProperty("bootstrap.kotlin.repo") as String?
val teamCityVersion = project.findProperty("bootstrap.teamcity.kotlin.version") as String?
val teamCityBuild = project.findProperty("bootstrap.teamcity.build.number") as String?
val teamCityProject = project.findProperty("bootstrap.teamcity.project") as String?
val bootstrapSource = when {
project.hasProperty("bootstrap.local") -> BootstrapOption.Local(
project.findProperty("bootstrap.local.version") as String?,
project.findProperty("bootstrap.local.path") as String?
)
teamCityVersion != null -> BootstrapOption.TeamCity(
teamCityVersion,
teamCityBuild,
projectExtId = teamCityProject,
onlySuccessBootstrap = false
)
customVersion != null -> BootstrapOption.Custom(kotlinVersion = customVersion, repo = customRepo)
else -> defaultSource
}
bootstrapSource.applyToProject(project)
project.logger.lifecycle("Using kotlin bootstrap version $bootstrapKotlinVersion from repo $bootstrapKotlinRepo")
}
sealed class BootstrapOption {
abstract fun applyToProject(project: Project)
/** Manual repository and version specification.
*
* If [repo] is not specified the default buildscript and project repositories are used
*/
open class Custom(val kotlinVersion: String, val repo: String?, val cacheRedirector: Boolean = false) : BootstrapOption() {
override fun applyToProject(project: Project) {
project.bootstrapKotlinVersion = kotlinVersion
project.bootstrapKotlinRepo = if (cacheRedirector)
repo?.let { URI(it) }?.let { "https://cache-redirector.jetbrains.com/${it.host}/${it.path}" }
else
repo
}
}
/** Get bootstrap from kotlin-dev bintray repo */
class BintrayDev(kotlinVersion: String, cacheRedirector: Boolean = false) :
Custom(kotlinVersion, "https://dl.bintray.com/kotlin/kotlin-dev", cacheRedirector)
/** Get bootstrap from kotlin-bootstrap bintray repo, where bootstraps are published */
class BintrayBootstrap(kotlinVersion: String, cacheRedirector: Boolean = false) :
Custom(kotlinVersion, "https://dl.bintray.com/kotlin/kotlin-bootstrap", cacheRedirector)
/** Get bootstrap from teamcity maven artifacts of the specified build configuration
*
* [kotlinVersion] the version of maven artifacts
* [buildNumber] build number of a teamcity build, by default the same as [kotlinVersion],
* [projectExtId] extId of a teamcity build configuration, by default "Kotlin_dev_Compiler",
* [onlySuccessBootstrap] allow artifacts only from success builds of the default branch tagged with 'bootstrap' tag
*/
class TeamCity(
val kotlinVersion: String,
val buildNumber: String? = null,
val projectExtId: String? = null,
val onlySuccessBootstrap: Boolean = true,
val teamcityUrl: String = "https://teamcity.jetbrains.com"
) : BootstrapOption() {
override fun applyToProject(project: Project) {
val query = if (onlySuccessBootstrap) "status:SUCCESS,tag:bootstrap,pinned:true" else "branch:default:any"
project.bootstrapKotlinRepo = "$teamcityUrl/guestAuth/app/rest/builds/buildType:(id:${projectExtId
?: "Kotlin_dev_Compiler"}),number:${buildNumber ?: kotlinVersion},$query/artifacts/content/maven/"
project.bootstrapKotlinVersion = kotlinVersion
}
}
/**
* Use previously published local artifacts from the build/repo maven repository
*
* [kotlinVersion] version of artifacts, by default the snapshot version of project is used
* [localPath] the path to local repository, if specified it is resolved with respect or project dir
*/
class Local(val kotlinVersion: String? = null, val localPath: String? = null) : BootstrapOption() {
override fun applyToProject(project: Project) {
val repoPath = if (localPath != null)
project.projectDir.resolve(localPath).canonicalFile
else
project.buildDir.resolve("repo")
project.bootstrapKotlinRepo = repoPath.toURI().toString()
project.bootstrapKotlinVersion = kotlinVersion ?: project.property("defaultSnapshotVersion") as String
}
}
}

View File

@@ -1,20 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
val KotlinBuildProperties.includeJava9: Boolean
get() = !isInJpsBuildIdeaSync && getBoolean("kotlin.build.java9", true)
val KotlinBuildProperties.useBootstrapStdlib: Boolean
get() = isInJpsBuildIdeaSync || getBoolean("kotlin.build.useBootstrapStdlib", false)
val KotlinBuildProperties.postProcessing: Boolean get() = isTeamcityBuild || getBoolean("kotlin.build.postprocessing", true)
val KotlinBuildProperties.relocation: Boolean get() = postProcessing
val KotlinBuildProperties.proguard: Boolean get() = postProcessing && getBoolean("kotlin.build.proguard", isTeamcityBuild)
val KotlinBuildProperties.jarCompression: Boolean get() = getBoolean("kotlin.build.jar.compression", isTeamcityBuild)
val KotlinBuildProperties.ignoreTestFailures: Boolean get() = getBoolean("ignoreTestFailures", isTeamcityBuild)

View File

@@ -1,385 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
import groovy.lang.Closure
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.*
import org.gradle.internal.jvm.Jvm
import org.gradle.internal.jvm.inspection.JvmVersionDetector
import proguard.ClassSpecification
import java.io.File
import javax.inject.Inject
@CacheableTask
open class CacheableProguardTask @Inject constructor(
private val jvmVersionDetector: JvmVersionDetector
) : proguard.gradle.ProGuardTask() {
@Internal
var jdkHome: File? = null
@get:Optional
@get:Input
internal val jdkMajorVersion: String?
get() = jdkHome?.let { jvmVersionDetector.getJavaVersion(Jvm.forHome(jdkHome)) }?.majorVersion
@CompileClasspath
override fun getLibraryJarFileCollection(): FileCollection = super.getLibraryJarFileCollection().filter { libraryFile ->
jdkHome?.let { !libraryFile.absoluteFile.startsWith(it.absoluteFile) } ?: true
}
@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
override fun getConfigurationFileCollection(): FileCollection = super.getConfigurationFileCollection()
@InputFiles
@Classpath
override fun getInJarFileCollection(): FileCollection = super.getInJarFileCollection()
@Optional
@OutputFiles
override fun getOutJarFileCollection(): FileCollection = super.getOutJarFileCollection()
@get:Optional
@get:OutputFile
internal val printConfigurationFile: File?
get() = configuration.printConfiguration?.takeIf { it.path.isNotEmpty() }
@Input
override fun getOutJarFilters(): MutableList<Any?> = super.getOutJarFilters()
@Input
override fun getInJarFilters(): MutableList<Any?> = super.getInJarFilters()
@Input
override fun getLibraryJarFilters(): MutableList<Any?> = super.getLibraryJarFilters()
@Internal
override fun getOutJarFiles(): MutableList<Any?> = super.getOutJarFiles()
@Internal
override fun getInJarFiles(): MutableList<Any?> = super.getInJarFiles()
@Internal
override fun getInJarCounts(): MutableList<Any?> = super.getInJarCounts()
@Internal
override fun getLibraryJarFiles(): MutableList<Any?> = super.getLibraryJarFiles()
/*
* Inputs properly declared these methods so we don't override them
*
* configuration(configurationFiles: Any?)
* libraryjars(libraryJarFiles: Any?)
* libraryjars(filterArgs: MutableMap<Any?, Any?>?, libraryJarFiles: Any?)
* injars(inJarFiles: Any?)
* injars(filterArgs: MutableMap<Any?, Any?>?, inJarFiles: Any?)
* outjars(outJarFiles: Any?)
* outjars(filterArgs: MutableMap<Any?, Any?>?, outJarFiles: Any?)
* printconfiguration()
* printconfiguration(printConfiguration: Any?)
*/
override fun renamesourcefileattribute() = throw NotImplementedError()
override fun renamesourcefileattribute(newSourceFileAttribute: String?) = throw NotImplementedError()
override fun dontshrink() = throw NotImplementedError()
override fun assumenosideeffects(classSpecificationString: String?) = throw NotImplementedError()
override fun assumenosideeffects(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun keepnames(classSpecificationString: String?) = throw NotImplementedError()
override fun keepnames(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keepnames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keepnames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun printmapping() = throw NotImplementedError()
override fun printmapping(printMapping: Any?) = throw NotImplementedError()
override fun keep(classSpecificationString: String?) = throw NotImplementedError()
override fun keep(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keep(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keep(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun keepdirectories() = throw NotImplementedError()
override fun keepdirectories(filter: String?) = throw NotImplementedError()
override fun dontpreverify() = throw NotImplementedError()
override fun dontnote() = throw NotImplementedError()
override fun dontnote(filter: String?) = throw NotImplementedError()
@Internal
override fun getrenamesourcefileattribute(): Any? = throw NotImplementedError()
override fun useuniqueclassmembernames() = throw NotImplementedError()
override fun overloadaggressively() = throw NotImplementedError()
@Internal
override fun getprintusage(): Any? = throw NotImplementedError()
@Internal
override fun getforceprocessing(): Any? = throw NotImplementedError()
override fun whyareyoukeeping(classSpecificationString: String?) = throw NotImplementedError()
override fun whyareyoukeeping(classSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun whyareyoukeeping(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun obfuscationdictionary(obfuscationDictionary: Any?) = throw NotImplementedError()
override fun adaptclassstrings() = throw NotImplementedError()
override fun adaptclassstrings(filter: String?) = throw NotImplementedError()
override fun applymapping(applyMapping: Any?) = throw NotImplementedError()
override fun mergeinterfacesaggressively() = throw NotImplementedError()
@Internal
override fun getdontwarn(): Any? = throw NotImplementedError()
override fun ignorewarnings() = throw NotImplementedError()
@Internal
override fun getaddconfigurationdebugging(): Any? = throw NotImplementedError()
override fun field(memberSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
@Internal
override fun getallowaccessmodification(): Any? = throw NotImplementedError()
override fun constructor(memberSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun dontusemixedcaseclassnames() = throw NotImplementedError()
@Internal
override fun getignorewarnings(): Any? = throw NotImplementedError()
@Internal
override fun getkeepdirectories(): Any? = throw NotImplementedError()
override fun classobfuscationdictionary(classObfuscationDictionary: Any?) = throw NotImplementedError()
override fun verbose() = throw NotImplementedError()
override fun optimizations(filter: String?) = throw NotImplementedError()
@Internal
override fun getuseuniqueclassmembernames(): Any? = throw NotImplementedError()
@Internal
override fun getmicroedition(): Any? = throw NotImplementedError()
override fun assumenoescapingparameters(classSpecificationString: String?) = throw NotImplementedError()
override fun assumenoescapingparameters(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
@Internal
override fun getandroid(): Any? = throw NotImplementedError()
override fun keeppackagenames() = throw NotImplementedError()
override fun keeppackagenames(filter: String?) = throw NotImplementedError()
@Internal
override fun getoverloadaggressively(): Any? = throw NotImplementedError()
override fun skipnonpubliclibraryclasses() = throw NotImplementedError()
@Internal
override fun getdontusemixedcaseclassnames(): Any? = throw NotImplementedError()
@Internal
override fun getdontnote(): Any? = throw NotImplementedError()
override fun assumenoexternalreturnvalues(classSpecificationString: String?) = throw NotImplementedError()
override fun assumenoexternalreturnvalues(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun target(targetClassVersion: String?) = throw NotImplementedError()
override fun keepattributes() = throw NotImplementedError()
override fun keepattributes(filter: String?) = throw NotImplementedError()
override fun keepclassmembernames(classSpecificationString: String?) = throw NotImplementedError()
override fun keepclassmembernames(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keepclassmembernames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keepclassmembernames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
@Internal
override fun getdontpreverify(): Any? = throw NotImplementedError()
@Internal
override fun getverbose(): Any? = throw NotImplementedError()
@Internal
override fun getskipnonpubliclibraryclasses(): Any? = throw NotImplementedError()
@Internal
override fun getdontoptimize(): Any? = throw NotImplementedError()
override fun keepclasseswithmembernames(classSpecificationString: String?) = throw NotImplementedError()
override fun keepclasseswithmembernames(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keepclasseswithmembernames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keepclasseswithmembernames(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun keepclasseswithmembers(classSpecificationString: String?) = throw NotImplementedError()
override fun keepclasseswithmembers(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keepclasseswithmembers(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keepclasseswithmembers(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
@Internal
override fun getdump(): Any? = throw NotImplementedError()
override fun printseeds() = throw NotImplementedError()
override fun printseeds(printSeeds: Any?) = throw NotImplementedError()
override fun dontoptimize() = throw NotImplementedError()
override fun dontobfuscate() = throw NotImplementedError()
override fun extendClassSpecifications(
classSpecifications: MutableList<Any?>?,
classSpecification: ClassSpecification?
): MutableList<Any?> = throw NotImplementedError()
override fun allowaccessmodification() = throw NotImplementedError()
@Internal
override fun getdontobfuscate(): Any? = throw NotImplementedError()
@Internal
override fun getprintmapping(): Any? = throw NotImplementedError()
override fun flattenpackagehierarchy() = throw NotImplementedError()
override fun flattenpackagehierarchy(flattenPackageHierarchy: String?) = throw NotImplementedError()
override fun android() = throw NotImplementedError()
override fun dump() = throw NotImplementedError()
override fun dump(dump: Any?) = throw NotImplementedError()
@Internal
override fun getdontshrink(): Any? = throw NotImplementedError()
@Internal
override fun getkeepattributes(): Any? = throw NotImplementedError()
override fun microedition() = throw NotImplementedError()
override fun keepparameternames() = throw NotImplementedError()
override fun addconfigurationdebugging() = throw NotImplementedError()
override fun packageobfuscationdictionary(packageObfuscationDictionary: Any?) = throw NotImplementedError()
@Internal
override fun getdontskipnonpubliclibraryclassmembers(): Any? = throw NotImplementedError()
override fun dontskipnonpubliclibraryclassmembers() = throw NotImplementedError()
@Internal
override fun getprintconfiguration(): Any? = throw NotImplementedError()
override fun forceprocessing() = throw NotImplementedError()
override fun keepclassmembers(classSpecificationString: String?) = throw NotImplementedError()
override fun keepclassmembers(keepArgs: MutableMap<Any?, Any?>?, classSpecificationString: String?) = throw NotImplementedError()
override fun keepclassmembers(keepClassSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
override fun keepclassmembers(keepClassSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
@Internal
override fun getmergeinterfacesaggressively(): Any? = throw NotImplementedError()
@Internal
override fun getConfigurationFiles(): MutableList<Any?> = throw NotImplementedError()
@Internal
override fun getkeeppackagenames(): Any? = throw NotImplementedError()
override fun assumevalues(classSpecificationString: String?) = throw NotImplementedError()
override fun assumevalues(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun printusage() = throw NotImplementedError()
override fun printusage(printUsage: Any?) = throw NotImplementedError()
@Internal
override fun getprintseeds(): Any? = throw NotImplementedError()
@Internal
override fun getadaptresourcefilenames(): Any? = throw NotImplementedError()
override fun assumenoexternalsideeffects(classSpecificationString: String?) = throw NotImplementedError()
override fun assumenoexternalsideeffects(classSpecificationArgs: MutableMap<Any?, Any?>?, classMembersClosure: Closure<*>?) = throw NotImplementedError()
override fun dontwarn() = throw NotImplementedError()
override fun dontwarn(filter: String?) = throw NotImplementedError()
@Internal
override fun getrepackageclasses(): Any? = throw NotImplementedError()
@Internal
override fun getadaptresourcefilecontents(): Any? = throw NotImplementedError()
@Internal
override fun getflattenpackagehierarchy(): Any? = throw NotImplementedError()
override fun optimizationpasses(optimizationPasses: Int) = throw NotImplementedError()
override fun adaptresourcefilenames() = throw NotImplementedError()
override fun adaptresourcefilenames(filter: String?) = throw NotImplementedError()
override fun method(memberSpecificationArgs: MutableMap<Any?, Any?>?) = throw NotImplementedError()
@Internal
override fun getadaptclassstrings(): Any? = throw NotImplementedError()
override fun repackageclasses() = throw NotImplementedError()
override fun repackageclasses(repackageClasses: String?) = throw NotImplementedError()
@Internal
override fun getkeepparameternames(): Any? = throw NotImplementedError()
override fun adaptresourcefilecontents() = throw NotImplementedError()
override fun adaptresourcefilecontents(filter: String?) = throw NotImplementedError()
}

View File

@@ -7,12 +7,10 @@ import org.gradle.api.Task
import org.gradle.api.file.CopySourceSpec
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.JavaExec
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.SourceSetContainer
import org.gradle.api.tasks.SourceSetOutput
import org.gradle.api.tasks.bundling.AbstractArchiveTask
import org.gradle.kotlin.dsl.*
import proguard.gradle.ProGuardTask
import java.io.File
import java.util.concurrent.Callable
@@ -58,7 +56,6 @@ fun Project.generator(fqName: String, sourceSet: SourceSet? = null) = smartJavaE
classpath = (sourceSet ?: testSourceSet).runtimeClasspath
main = fqName
workingDir = rootDir
systemProperty("line.separator", "\n")
}
fun Project.getBooleanProperty(name: String): Boolean? = this.findProperty(name)?.let {
@@ -72,11 +69,3 @@ inline fun CopySourceSpec.from(crossinline filesProvider: () -> Any?): CopySourc
fun Project.javaPluginConvention(): JavaPluginConvention = the()
fun Project.findJavaPluginConvention(): JavaPluginConvention? = convention.findByType() ?: convention.findPlugin()
fun JavaExec.pathRelativeToWorkingDir(file: File): String = file.relativeTo(workingDir).invariantSeparatorsPath
fun Task.singleOutputFile(): File = when (this) {
is AbstractArchiveTask -> archiveFile.get().asFile
is ProGuardTask -> project.file(outJarFiles.single()!!)
else -> outputs.files.singleFile
}

View File

@@ -26,12 +26,10 @@ fun CompatibilityPredicate.or(other: CompatibilityPredicate): CompatibilityPredi
}
enum class Platform : CompatibilityPredicate {
P183, P191, P192, P193, P201, P202;
P183, P191, P192, P193, P201;
val version: Int = name.drop(1).toInt()
val displayVersion: String = "20${name.drop(1).dropLast(1)}.${name.last()}"
override fun matches(ide: Ide) = ide.platform == this
companion object {
@@ -43,12 +41,13 @@ enum class Platform : CompatibilityPredicate {
}
enum class Ide(val platform: Platform) : CompatibilityPredicate {
IJ183(Platform.P183),
IJ191(Platform.P191),
IJ192(Platform.P192),
IJ193(Platform.P193),
IJ201(Platform.P201),
IJ202(Platform.P202),
AS34(Platform.P183),
AS35(Platform.P183),
AS36(Platform.P192),
AS40(Platform.P193),
@@ -57,11 +56,6 @@ enum class Ide(val platform: Platform) : CompatibilityPredicate {
val kind = Kind.values().first { it.shortName == name.take(2) }
val version = name.dropWhile { !it.isDigit() }.toInt()
val displayVersion: String = when (kind) {
Kind.IntelliJ -> "IJ${platform.displayVersion}"
Kind.AndroidStudio -> "Studio${name.substringAfter("AS").toCharArray().joinToString(separator = ".")}"
}
override fun matches(ide: Ide) = ide == this
enum class Kind(val shortName: String) {

View File

@@ -6,28 +6,14 @@ import org.gradle.api.Task
import org.gradle.api.artifacts.ConfigurablePublishArtifact
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationContainer
import org.gradle.api.artifacts.PublishArtifact
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.LibraryElements
import org.gradle.api.attributes.Usage
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPlugin.*
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.tasks.GenerateModuleMetadata
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.Upload
import org.gradle.api.tasks.javadoc.Javadoc
import org.gradle.jvm.tasks.Jar
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.kotlin.dsl.*
import plugins.KotlinBuildPublishingPlugin
private const val MAGIC_DO_NOT_CHANGE_TEST_JAR_TASK_NAME = "testJar"
@@ -40,7 +26,7 @@ fun Project.testsJar(body: Jar.() -> Unit = {}): Jar {
pluginManager.withPlugin("java") {
from(testSourceSet.output)
}
archiveClassifier.set("tests")
classifier = "tests"
body()
project.addArtifact(testsJarCfg, this, this)
}
@@ -70,26 +56,18 @@ fun Project.noDefaultJar() {
}
}
fun <T : Task> Project.runtimeJarArtifactBy(
task: TaskProvider<T>,
artifactRef: Any,
body: ConfigurablePublishArtifact.() -> Unit = {}
) {
fun Project.runtimeJarArtifactBy(task: Task, artifactRef: Any, body: ConfigurablePublishArtifact.() -> Unit = {}) {
addArtifact("archives", task, artifactRef, body)
addArtifact("runtimeJar", task, artifactRef, body)
configurations.findByName("runtime")?.let {
addArtifact(it.name, task, artifactRef, body)
addArtifact(it, task, artifactRef, body)
}
}
fun Project.runtimeJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> = runtimeJar(getOrCreateTask("jar", body)) { }
fun <T : Jar> Project.runtimeJar(task: TaskProvider<T>, body: T.() -> Unit = {}): TaskProvider<T> {
tasks.named<Jar>("jar").configure {
removeArtifacts(configurations.getOrCreate("archives"), this)
}
task.configure {
configurations.findByName("embedded")?.let { embedded ->
dependsOn(embedded)
@@ -98,37 +76,17 @@ fun <T : Jar> Project.runtimeJar(task: TaskProvider<T>, body: T.() -> Unit = {})
}
}
setupPublicJar(project.the<BasePluginConvention>().archivesBaseName)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
setDuplicatesStrategy(DuplicatesStrategy.EXCLUDE)
body()
project.runtimeJarArtifactBy(this, this)
}
project.runtimeJarArtifactBy(task, task)
val runtimeJar = configurations.maybeCreate("runtimeJar").apply {
isCanBeConsumed = true
isCanBeResolved = false
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY))
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR))
}
}
configurePublishedComponent {
withVariantsFromConfiguration(configurations[RUNTIME_ELEMENTS_CONFIGURATION_NAME]) { skip() }
addVariantsFromConfiguration(runtimeJar) { }
}
return task
}
fun Project.sourcesJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> {
configure<JavaPluginExtension> {
withSourcesJar()
}
fun Project.runtimeJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> = runtimeJar(getOrCreateTask("jar", body), { })
val sourcesJar = getOrCreateTask<Jar>("sourcesJar") {
fun Project.sourcesJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> {
val task = tasks.register<Jar>("sourcesJar") {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveClassifier.set("sources")
@@ -152,21 +110,13 @@ fun Project.sourcesJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> {
body()
}
addArtifact("archives", sourcesJar)
addArtifact("sources", sourcesJar)
addArtifact("archives", task)
addArtifact("sources", task)
configurePublishedComponent {
addVariantsFromConfiguration(configurations[SOURCES_ELEMENTS_CONFIGURATION_NAME]) { }
}
return sourcesJar
return task
}
fun Project.javadocJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> {
configure<JavaPluginExtension> {
withJavadocJar()
}
val javadocTask = getOrCreateTask<Jar>("javadocJar") {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveClassifier.set("javadoc")
@@ -178,40 +128,9 @@ fun Project.javadocJar(body: Jar.() -> Unit = {}): TaskProvider<Jar> {
}
addArtifact("archives", javadocTask)
configurePublishedComponent {
addVariantsFromConfiguration(configurations[JAVADOC_ELEMENTS_CONFIGURATION_NAME]) { }
}
return javadocTask
}
fun Project.modularJar(body: Jar.() -> Unit): TaskProvider<Jar> {
val modularJar = configurations.maybeCreate("modularJar").apply {
isCanBeConsumed = true
isCanBeResolved = false
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named("modular-jar"))
}
}
val modularJarTask = getOrCreateTask<Jar>("modularJar") {
archiveClassifier.set("modular")
body()
}
addArtifact("modularJar", modularJarTask)
addArtifact("archives", modularJarTask)
configurePublishedComponent {
addVariantsFromConfiguration(modularJar) { mapToMavenScope("runtime") }
}
return modularJarTask
}
fun Project.standardPublicJars() {
runtimeJar()
@@ -219,22 +138,7 @@ fun Project.standardPublicJars() {
javadocJar()
}
fun Project.publish(moduleMetadata: Boolean = false, configure: MavenPublication.() -> Unit = { }) {
apply<KotlinBuildPublishingPlugin>()
if (!moduleMetadata) {
tasks.withType<GenerateModuleMetadata> {
enabled = false
}
}
val publication = extensions.findByType<PublishingExtension>()
?.publications
?.findByName(KotlinBuildPublishingPlugin.PUBLICATION_NAME) as MavenPublication
publication.configure()
}
fun Project.publishWithLegacyMavenPlugin(body: Upload.() -> Unit = {}): Upload {
fun Project.publish(body: Upload.() -> Unit = {}): Upload {
apply<plugins.PublishedKotlinModule>()
if (artifactsRemovedDiagnosticFlag) {
@@ -251,87 +155,12 @@ fun Project.publishWithLegacyMavenPlugin(body: Upload.() -> Unit = {}): Upload {
}
}
fun Project.idePluginDependency(block: () -> Unit) {
val shouldActivate = rootProject.findProperty("publish.ide.plugin.dependencies")?.toString()?.toBoolean() == true
if (shouldActivate) {
block()
}
}
fun Project.publishProjectJars(projects: List<String>, libraryDependencies: List<String> = emptyList()) {
apply<JavaPlugin>()
val fatJarContents by configurations.creating
dependencies {
for (projectName in projects) {
fatJarContents(project(projectName)) { isTransitive = false }
}
for (libraryDependency in libraryDependencies) {
fatJarContents(libraryDependency)
}
}
publish()
val jar: Jar by tasks
jar.apply {
dependsOn(fatJarContents)
from {
fatJarContents.map(::zipTree)
}
}
sourcesJar {
from {
projects.map {
project(it).mainSourceSet.allSource
}
}
}
javadocJar()
}
fun Project.publishTestJar(projectName: String) {
apply<JavaPlugin>()
val fatJarContents by configurations.creating
dependencies {
fatJarContents(project(projectName, configuration = "tests-jar")) { isTransitive = false }
}
publish()
val jar: Jar by tasks
jar.apply {
dependsOn(fatJarContents)
from {
fatJarContents.map(::zipTree)
}
}
sourcesJar {
from {
project(projectName).testSourceSet.allSource
}
}
javadocJar()
}
fun ConfigurationContainer.getOrCreate(name: String): Configuration = findByName(name) ?: create(name)
fun Jar.setupPublicJar(baseName: String, classifier: String = "") {
val buildNumber = project.rootProject.extra["buildNumber"] as String
this.archiveBaseName.set(baseName)
this.archiveClassifier.set(classifier)
this.baseName = baseName
this.classifier = classifier
manifest.attributes.apply {
put("Implementation-Vendor", "JetBrains")
put("Implementation-Title", baseName)
@@ -350,26 +179,9 @@ fun Project.addArtifact(configuration: Configuration, task: Task, artifactRef: A
fun Project.addArtifact(configurationName: String, task: Task, artifactRef: Any, body: ConfigurablePublishArtifact.() -> Unit = {}) =
addArtifact(configurations.getOrCreate(configurationName), task, artifactRef, body)
fun <T : Task> Project.addArtifact(
configurationName: String,
task: TaskProvider<T>,
body: ConfigurablePublishArtifact.() -> Unit = {}
): PublishArtifact {
fun <T : Task> Project.addArtifact(configurationName: String, task: TaskProvider<T>, body: ConfigurablePublishArtifact.() -> Unit = {}) {
configurations.maybeCreate(configurationName)
return artifacts.add(configurationName, task, body)
}
fun <T : Task> Project.addArtifact(
configurationName: String,
task: TaskProvider<T>,
artifactRef: Any,
body: ConfigurablePublishArtifact.() -> Unit = {}
): PublishArtifact {
configurations.maybeCreate(configurationName)
return artifacts.add(configurationName, artifactRef) {
builtBy(task)
body()
}
artifacts.add(configurationName, task, body)
}
fun Project.cleanArtifacts() {
@@ -379,6 +191,3 @@ fun Project.cleanArtifacts() {
}
}
}
fun Project.configurePublishedComponent(configure: AdhocComponentWithVariants.() -> Unit) =
(components.findByName(KotlinBuildPublishingPlugin.ADHOC_COMPONENT_NAME) as AdhocComponentWithVariants?)?.apply(configure)

View File

@@ -2,34 +2,21 @@
// usages in build scripts are not tracked properly
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.AbstractCopyTask
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.project
import java.io.File
private val Project.isEAPIntellij get() = rootProject.extra["versions.intellijSdk"].toString().contains("-EAP-")
private val Project.isNightlyIntellij get() = rootProject.extra["versions.intellijSdk"].toString().endsWith("SNAPSHOT") && !isEAPIntellij
val Project.intellijRepo get() =
when {
isEAPIntellij -> "https://www.jetbrains.com/intellij-repository/snapshots"
isNightlyIntellij -> "https://www.jetbrains.com/intellij-repository/nightly"
else -> "https://www.jetbrains.com/intellij-repository/releases"
}
val Project.internalBootstrapRepo: String? get() =
when {
bootstrapKotlinRepo?.startsWith("https://buildserver.labs.intellij.net") == true ->
bootstrapKotlinRepo!!.replace("artifacts/content/maven", "artifacts/content/internal/repo")
else -> "https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_KotlinPublic_Compiler),number:$bootstrapKotlinVersion," +
"branch:default:any/artifacts/content/internal/repo/"
}
val Project.isSnapshotIntellij get() = rootProject.extra["versions.intellijSdk"].toString().endsWith("SNAPSHOT")
val Project.intellijRepo get() = "https://www.jetbrains.com/intellij-repository/" + if (isSnapshotIntellij) "snapshots" else "releases"
fun Project.commonDep(coord: String): String {
val parts = coord.split(':')
@@ -142,12 +129,6 @@ fun Project.firstFromJavaHomeThatExists(vararg paths: String, jdkHome: File = Fi
logger.warn("Cannot find file by paths: ${paths.toList()} in $jdkHome")
}
fun Project.toolsJarApi(): Any =
if (kotlinBuildProperties.isInJpsBuildIdeaSync)
files(toolsJarFile() ?: error("tools.jar is not found!"))
else
dependencies.project(":dependencies:tools-jar-api")
fun Project.toolsJar(): FileCollection = files(toolsJarFile() ?: error("tools.jar is not found!"))
fun Project.toolsJarFile(jdkHome: File = File(this.property("JDK_18") as String)): File? =

View File

@@ -11,19 +11,17 @@ import java.io.File
val kotlinEmbeddableRootPackage = "org.jetbrains.kotlin"
val packagesToRelocate =
listOf(
"com.intellij",
"com.google",
"com.sampullara",
"org.apache",
"org.jdom",
"org.picocontainer",
"org.jline",
"org.fusesource",
"net.jpountz",
"one.util.streamex",
"kotlinx.collections.immutable"
)
listOf( "com.intellij",
"com.google",
"com.sampullara",
"org.apache",
"org.jdom",
"org.picocontainer",
"org.jline",
"org.fusesource",
"kotlinx.coroutines",
"net.jpountz",
"one.util.streamex")
// The shaded compiler "dummy" is used to rewrite dependencies in projects that are used with the embeddable compiler
// on the runtime and use some shaded dependencies from the compiler

View File

@@ -30,8 +30,7 @@ import org.gradle.kotlin.dsl.register
import java.io.File
private fun Project.kotlinBuildLocalDependenciesDir(): File =
(findProperty("kotlin.build.dependencies.dir") as String?)?.let(::File)
?: rootProject.gradle.gradleUserHomeDir.resolve("kotlin-build-dependencies")
(findProperty("kotlin.build.dependencies.dir") as String?)?.let(::File) ?: project.rootDir.absoluteFile.resolve("dependencies")
private fun Project.kotlinBuildLocalRepoDir(): File = kotlinBuildLocalDependenciesDir().resolve("repo")
@@ -174,20 +173,16 @@ fun Project.runIdeTask(name: String, ideaPluginDir: File, ideaSandboxDir: File,
"-XX:ReservedCodeCacheSize=240m",
"-XX:+HeapDumpOnOutOfMemoryError",
"-ea",
"-Didea.platform.prefix=Idea",
"-Didea.debug.mode=true",
"-Didea.system.path=$ideaSandboxDir",
"-Didea.config.path=$ideaSandboxConfigDir",
"-Didea.tooling.debug=true",
"-Dapple.laf.useScreenMenuBar=true",
"-Dapple.awt.graphics.UseQuartz=true",
"-Dsun.io.useCanonCaches=false",
"-Dplugin.path=${ideaPluginDir.absolutePath}"
)
if (Platform[201].orHigher()) {
jvmArgs("-Didea.platform.prefix=Idea")
}
if (rootProject.findProperty("versions.androidStudioRelease") != null) {
jvmArgs("-Didea.platform.prefix=AndroidStudio")
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import org.gradle.api.Plugin
import org.gradle.api.Project
@Suppress("unused")
class JpsCompatiblePlugin : Plugin<Project> {
override fun apply(project: Project) {
project.configurations.maybeCreate(EmbeddedComponents.CONFIGURATION_NAME)
project.extensions.create("pill", PillExtension::class.java)
// 'jpsTest' does not require the 'tests-jar' artifact
project.configurations.create("jpsTest")
if (project == project.rootProject) {
project.tasks.create("pill") {
dependsOn(":pill:pill-importer:pill")
if (System.getProperty("pill.android.tests", "false") == "true") {
TaskUtils.useAndroidSdk(this)
TaskUtils.useAndroidJar(this)
}
}
project.tasks.create("unpill") {
dependsOn(":pill:pill-importer:unpill")
}
}
}
}

View File

@@ -1,51 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import java.io.File
import org.gradle.api.Project
open class PillExtension {
enum class Variant {
// Default variant (./gradlew pill)
BASE() {
override val includes = setOf(BASE)
},
// Full variant (./gradlew pill -Dpill.variant=full)
FULL() {
override val includes = setOf(BASE, FULL)
},
// Do not import the project to JPS model, but set some options for it
NONE() {
override val includes = emptySet<Variant>()
},
// 'BASE' if the "jps-compatible" plugin is applied, 'NONE' otherwise
DEFAULT() {
override val includes = emptySet<Variant>()
};
abstract val includes: Set<Variant>
}
open var variant: Variant = Variant.DEFAULT
open var excludedDirs: List<File> = emptyList()
@Suppress("unused")
fun Project.excludedDirs(vararg dirs: String) {
excludedDirs = excludedDirs + dirs.map { File(projectDir, it) }
}
@Suppress("unused")
fun serialize() = mapOf<String, Any?>(
"variant" to variant.name,
"excludedDirs" to excludedDirs
)
}

View File

@@ -0,0 +1,33 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import org.gradle.api.artifacts.*
import org.gradle.api.artifacts.component.*
class DependencyMapper(val predicate: (ResolvedArtifact) -> Boolean, val mapping: (ResolvedArtifact) -> MappedDependency?) {
companion object {
fun forProject(path: String, mapping: (ResolvedArtifact) -> MappedDependency?): DependencyMapper {
return DependencyMapper(
predicate = { artifact ->
val identifier = artifact.id.componentIdentifier as? ProjectComponentIdentifier
identifier?.projectPath == path
},
mapping = mapping
)
}
fun forModule(group: String, module: String, version: String?, mapping: (ResolvedArtifact) -> MappedDependency?): DependencyMapper {
return DependencyMapper(
predicate = { artifact ->
val identifier = artifact.id.componentIdentifier as? ModuleComponentIdentifier
identifier?.group == group && identifier?.module == module && (version == null || identifier?.version == version)
},
mapping = mapping
)
}
}
}
class MappedDependency(val main: PDependency?, val deferred: List<PDependency> = emptyList())
class ParserContext(val dependencyMappers: List<DependencyMapper>, val variant: PillExtension.Variant)

View File

@@ -0,0 +1,94 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import java.io.File
import org.gradle.api.Project
import org.gradle.api.tasks.SourceSet
import org.gradle.api.artifacts.*
import org.gradle.api.artifacts.component.*
data class PDependencies(val main: List<PDependency>, val deferred: List<PDependency>) {
fun join(): List<PDependency> {
return main + deferred
}
}
fun Project.resolveDependencies(
configuration: Configuration,
forTests: Boolean,
dependencyMappers: List<DependencyMapper>,
withEmbedded: Boolean = false
): PDependencies {
val dependencies = mutableListOf<PDependency>()
val deferred = mutableListOf<PDependency>()
nextArtifact@ for (artifact in configuration.resolvedConfiguration.resolvedArtifacts) {
val identifier = artifact.id.componentIdentifier
for (mapper in dependencyMappers) {
if (mapper.predicate(artifact)) {
val mapped = mapper.mapping(artifact)
if (mapped != null) {
mapped.main?.let { dependencies += it }
deferred += mapped.deferred
}
continue@nextArtifact
}
}
fun addProjectDependency(projectPath: String) {
val project = rootProject.findProject(projectPath) ?: error("Cannot find project $projectPath")
fun addSourceSet(name: String, suffix: String): Boolean {
val sourceSet = project.sourceSets?.findByName(name)?.takeIf { !it.allSource.isEmpty() } ?: return false
dependencies += PDependency.Module(project.pillModuleName + '.' + suffix)
return true
}
if (forTests && artifact.classifier == "tests") {
addSourceSet(SourceSet.TEST_SOURCE_SET_NAME, "test") || addSourceSet(SourceSet.MAIN_SOURCE_SET_NAME, "src")
} else {
addSourceSet(SourceSet.MAIN_SOURCE_SET_NAME, "src")
}
if (withEmbedded) {
val embeddedConfiguration = project.configurations.findByName(EmbeddedComponents.CONFIGURATION_NAME)
if (embeddedConfiguration != null) {
dependencies += resolveDependencies(embeddedConfiguration, forTests, dependencyMappers, withEmbedded).join()
}
}
}
when (identifier) {
is ProjectComponentIdentifier -> addProjectDependency(identifier.projectPath)
is LibraryBinaryIdentifier -> addProjectDependency(identifier.projectPath)
is ModuleComponentIdentifier -> {
val file = artifact.file
val library = PLibrary(file.name, classes = listOf(file))
dependencies += PDependency.ModuleLibrary(library)
}
}
}
val existingFiles = mutableSetOf<File>()
for (dependency in configuration.dependencies) {
if (dependency !is SelfResolvingDependency) {
continue
}
val files = dependency.resolve().filter { it !in existingFiles }.takeIf { it.isNotEmpty() } ?: continue
existingFiles.addAll(files)
val library = PLibrary(dependency.name, classes = files.toList())
deferred += PDependency.ModuleLibrary(library)
}
return PDependencies(dependencies, deferred)
}

View File

@@ -0,0 +1,39 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import java.io.File
import org.gradle.api.Project
open class PillExtension {
enum class Variant {
// Default variant (./gradlew pill)
BASE() { override val includes = setOf(BASE) },
// Full variant (./gradlew pill -Dpill.variant=full)
FULL() { override val includes = setOf(BASE, FULL) },
// Do not import the project to JPS model, but set some options for it
NONE() { override val includes = emptySet<Variant>() },
// 'BASE' if the "jps-compatible" plugin is applied, 'NONE' otherwise
DEFAULT() { override val includes = emptySet<Variant>() };
abstract val includes: Set<Variant>
}
open var variant: Variant = Variant.DEFAULT
open var importAsLibrary: Boolean = false
open var excludedDirs: List<File> = emptyList()
fun Project.excludedDirs(vararg dirs: String) {
excludedDirs = excludedDirs + dirs.map { File(projectDir, it) }
}
open var libraryPath: File? = null
set(v) {
importAsLibrary = true
field = v
}
}

View File

@@ -0,0 +1,182 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.internal.file.copy.SingleParentCopySpec
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.tasks.Copy
import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.extra
import org.jetbrains.kotlin.pill.ArtifactElement.*
import org.jetbrains.kotlin.pill.POrderRoot.*
import java.io.File
class PArtifact(val artifactName: String, val outputDir: File, private val contents: ArtifactElement.Root) {
fun render(context: PathContext) = xml("component", "name" to "ArtifactManager") {
xml("artifact", "name" to artifactName) {
xml("output-path") {
raw(context(outputDir))
}
add(contents.renderRecursively(context))
}
}
}
sealed class ArtifactElement {
private val myChildren = mutableListOf<ArtifactElement>()
val children get() = myChildren
fun add(child: ArtifactElement) {
myChildren += child
}
fun add(children: List<ArtifactElement>) {
myChildren += children
}
abstract fun render(context: PathContext): xml
fun renderRecursively(context: PathContext): xml {
return render(context).apply {
children.forEach { add(it.renderRecursively(context)) }
}
}
fun getDirectory(path: String): ArtifactElement {
if (path.isEmpty()) {
return this
}
var current: ArtifactElement = this
for (segment in path.split("/")) {
val existing = current.children.firstOrNull { it is Directory && it.name == segment }
if (existing != null) {
current = existing
continue
}
current = Directory(segment).also { current.add(it) }
}
return current
}
class Root : ArtifactElement() {
override fun render(context: PathContext) = xml("root", "id" to "root")
}
data class Directory(val name: String) : ArtifactElement() {
override fun render(context: PathContext) = xml("element", "id" to "directory", "name" to name)
}
data class Archive(val name: String) : ArtifactElement() {
override fun render(context: PathContext) = xml("element", "id" to "archive", "name" to name)
}
data class ModuleOutput(val moduleName: String) : ArtifactElement() {
override fun render(context: PathContext) = xml("element", "id" to "module-output", "name" to moduleName)
}
data class FileCopy(val source: File, val outputFileName: String? = null) : ArtifactElement() {
override fun render(context: PathContext): xml {
val args = mutableListOf("id" to "file-copy", "path" to context(source))
if (outputFileName != null) {
args += "output-file-name" to outputFileName
}
return xml("element", *args.toTypedArray())
}
}
data class DirectoryCopy(val source: File) : ArtifactElement() {
override fun render(context: PathContext) = xml("element", "id" to "dir-copy", "path" to context(source))
}
data class ProjectLibrary(val name: String) : ArtifactElement() {
override fun render(context: PathContext) = xml("element", "id" to "library", "level" to "project", "name" to name)
}
data class ExtractedDirectory(val archive: File, val pathInJar: String = "/") : ArtifactElement() {
override fun render(context: PathContext) =
xml("element", "id" to "extracted-dir", "path" to context(archive), "path-in-jar" to pathInJar)
}
}
fun generateKotlinPluginArtifactFile(rootProject: Project, dependencyMappers: List<DependencyMapper>): PFile {
val root = Root()
fun Project.getProject(name: String) = findProject(name) ?: error("Cannot find project $name")
val prepareIdeaPluginProject = rootProject.getProject(":prepare:idea-plugin")
root.add(Directory("kotlinc").apply {
val kotlincDirectory = rootProject.extra["distKotlinHomeDir"].toString()
add(DirectoryCopy(File(kotlincDirectory)))
})
root.add(Directory("lib").apply {
val librariesConfiguration = prepareIdeaPluginProject.configurations.getByName("libraries")
add(getArtifactElements(rootProject, librariesConfiguration, dependencyMappers, false))
add(Directory("jps").apply {
val prepareJpsPluginProject = rootProject.getProject(":kotlin-jps-plugin")
add(Archive(prepareJpsPluginProject.name + ".jar").apply {
val jpsPluginConfiguration = prepareIdeaPluginProject.configurations.getByName("jpsPlugin")
add(getArtifactElements(rootProject, jpsPluginConfiguration, dependencyMappers, true))
})
})
add(Archive("kotlin-plugin.jar").apply {
add(FileCopy(File(rootProject.projectDir, "resources/kotlinManifest.properties")))
val embeddedConfiguration = prepareIdeaPluginProject.configurations.getByName(EmbeddedComponents.CONFIGURATION_NAME)
add(getArtifactElements(rootProject, embeddedConfiguration, dependencyMappers, true))
})
})
val artifact = PArtifact("KotlinPlugin", File(rootProject.projectDir, "out/artifacts/Kotlin"), root)
return PFile(
File(rootProject.projectDir, ".idea/artifacts/${artifact.artifactName}.xml"),
artifact.render(ProjectContext(rootProject))
)
}
private fun getArtifactElements(
rootProject: Project,
configuration: Configuration,
dependencyMappers: List<DependencyMapper>,
extractDependencies: Boolean
): List<ArtifactElement> {
val dependencies = rootProject.resolveDependencies(configuration, false, dependencyMappers, withEmbedded = true).join()
val artifacts = mutableListOf<ArtifactElement>()
for (dependency in dependencies) {
when (dependency) {
is PDependency.Module -> {
val moduleOutput = ModuleOutput(dependency.name)
if (extractDependencies) {
artifacts += moduleOutput
} else {
artifacts += Archive(dependency.name + ".jar").apply {
add(moduleOutput)
}
}
}
is PDependency.Library -> artifacts += ProjectLibrary(dependency.name)
is PDependency.ModuleLibrary -> {
val files = dependency.library.classes
if (extractDependencies) files.mapTo(artifacts) { ExtractedDirectory(it) }
else files.mapTo(artifacts) { FileCopy(it) }
}
}
}
return artifacts
}

View File

@@ -0,0 +1,420 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import org.gradle.api.Project
import org.gradle.api.artifacts.*
import org.gradle.api.tasks.*
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.kotlin.dsl.configure
import org.gradle.plugins.ide.idea.IdeaPlugin
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.internal.HasConvention
import org.gradle.api.internal.file.copy.CopySpecInternal
import org.gradle.api.internal.file.copy.SingleParentCopySpec
import org.gradle.language.jvm.tasks.ProcessResources
import org.jetbrains.kotlin.pill.POrderRoot.*
import org.jetbrains.kotlin.pill.PSourceRoot.*
import org.jetbrains.kotlin.pill.PillExtension.*
import java.io.File
import java.util.LinkedList
data class PProject(
val name: String,
val rootDirectory: File,
val modules: List<PModule>,
val libraries: List<PLibrary>
)
data class PModule(
val name: String,
val rootDirectory: File,
val moduleFile: File,
val contentRoots: List<PContentRoot>,
val orderRoots: List<POrderRoot>,
val moduleForProductionSources: PModule? = null
)
data class PContentRoot(
val path: File,
val forTests: Boolean,
val sourceRoots: List<PSourceRoot>,
val excludedDirectories: List<File>
)
data class PSourceRoot(
val path: File,
val kind: Kind,
val kotlinOptions: PSourceRootKotlinOptions?
) {
enum class Kind { PRODUCTION, TEST, RESOURCES, TEST_RESOURCES }
}
data class PSourceRootKotlinOptions(
val noStdlib: Boolean?,
val noReflect: Boolean?,
val moduleName: String?,
val apiVersion: String?,
val languageVersion: String?,
val jvmTarget: String?,
val extraArguments: List<String>
) {
fun intersect(other: PSourceRootKotlinOptions) = PSourceRootKotlinOptions(
if (noStdlib == other.noStdlib) noStdlib else null,
if (noReflect == other.noReflect) noReflect else null,
if (moduleName == other.moduleName) moduleName else null,
if (apiVersion == other.apiVersion) apiVersion else null,
if (languageVersion == other.languageVersion) languageVersion else null,
if (jvmTarget == other.jvmTarget) jvmTarget else null,
extraArguments.intersect(other.extraArguments).toList()
)
}
data class POrderRoot(
val dependency: PDependency,
val scope: Scope,
val isExported: Boolean = false,
val isProductionOnTestDependency: Boolean = false
) {
enum class Scope { COMPILE, TEST, RUNTIME, PROVIDED }
}
sealed class PDependency {
data class Module(val name: String) : PDependency()
data class Library(val name: String) : PDependency()
data class ModuleLibrary(val library: PLibrary) : PDependency()
}
data class PLibrary(
val name: String,
val classes: List<File>,
val javadoc: List<File> = emptyList(),
val sources: List<File> = emptyList(),
val annotations: List<File> = emptyList(),
val dependencies: List<PLibrary> = emptyList(),
val originalName: String = name
) {
fun attachSource(file: File): PLibrary {
return this.copy(sources = this.sources + listOf(file))
}
}
fun parse(project: Project, libraries: List<PLibrary>, context: ParserContext): PProject = with (context) {
if (project != project.rootProject) {
error("$project is not a root project")
}
fun Project.matchesSelectedVariant(): Boolean {
val extension = this.extensions.findByType(PillExtension::class.java) ?: return true
val projectVariant = extension.variant.takeUnless { it == Variant.DEFAULT } ?: Variant.BASE
return projectVariant in context.variant.includes
}
val (includedProjects, excludedProjects) = project.allprojects
.partition { it.plugins.hasPlugin(JpsCompatiblePlugin::class.java) && it.matchesSelectedVariant() }
val modules = includedProjects.flatMap { parseModules(it, excludedProjects) }
return PProject("Kotlin", project.projectDir, modules, libraries)
}
/*
Ordering here and below is significant.
Placing 'runtime' configuration dependencies on the top make 'idea' tests to run normally.
('idea' module has 'intellij-core' as transitive dependency, and we really need to get rid of it.)
*/
private val CONFIGURATION_MAPPING = mapOf(
listOf("runtimeClasspath") to Scope.RUNTIME,
listOf("compileClasspath", "compileOnly") to Scope.PROVIDED,
listOf("embedded") to Scope.COMPILE
)
private val TEST_CONFIGURATION_MAPPING = mapOf(
listOf("runtimeClasspath", "testRuntimeClasspath") to Scope.RUNTIME,
listOf("compileClasspath", "testCompileClasspath", "compileOnly", "testCompileOnly") to Scope.PROVIDED,
listOf("jpsTest") to Scope.TEST
)
private fun ParserContext.parseModules(project: Project, excludedProjects: List<Project>): List<PModule> {
val (productionContentRoots, testContentRoots) = parseContentRoots(project).partition { !it.forTests }
val modules = mutableListOf<PModule>()
fun getJavaExcludedDirs() = project.plugins.findPlugin(IdeaPlugin::class.java)
?.model?.module?.excludeDirs?.toList() ?: emptyList()
fun getPillExcludedDirs() = project.extensions.getByType(PillExtension::class.java).excludedDirs
val allExcludedDirs = getPillExcludedDirs() + getJavaExcludedDirs() + project.buildDir +
(if (project == project.rootProject) excludedProjects.map { it.buildDir } else emptyList())
var productionSourcesModule: PModule? = null
fun getModuleFile(suffix: String = ""): File {
val relativePath = File(project.projectDir, project.pillModuleName + suffix + ".iml")
.toRelativeString(project.rootProject.projectDir)
return File(project.rootProject.projectDir, ".idea/modules/$relativePath")
}
for ((nameSuffix, roots) in mapOf(".src" to productionContentRoots, ".test" to testContentRoots)) {
if (roots.isEmpty()) {
continue
}
val mainRoot = roots.first()
var dependencies = parseDependencies(project, mainRoot.forTests)
if (productionContentRoots.isNotEmpty() && mainRoot.forTests) {
val productionModuleDependency = PDependency.Module(project.pillModuleName + ".src")
dependencies += POrderRoot(productionModuleDependency, Scope.COMPILE, true)
}
val module = PModule(
project.pillModuleName + nameSuffix,
mainRoot.path,
getModuleFile(nameSuffix),
roots,
dependencies,
productionSourcesModule
)
modules += module
if (!mainRoot.forTests) {
productionSourcesModule = module
}
}
val mainModuleFileRelativePath = when (project) {
project.rootProject -> File(project.rootProject.projectDir, project.rootProject.name + ".iml")
else -> getModuleFile()
}
modules += PModule(
project.pillModuleName,
project.projectDir,
mainModuleFileRelativePath,
listOf(PContentRoot(project.projectDir, false, emptyList(), allExcludedDirs)),
if (modules.isEmpty()) parseDependencies(project, false) else emptyList()
)
return modules
}
private fun parseContentRoots(project: Project): List<PContentRoot> {
val sourceRoots = parseSourceRoots(project).groupBy { it.kind }
fun getRoots(kind: PSourceRoot.Kind) = sourceRoots[kind] ?: emptyList()
val productionSourceRoots = getRoots(Kind.PRODUCTION) + getRoots(Kind.RESOURCES)
val testSourceRoots = getRoots(Kind.TEST) + getRoots(Kind.TEST_RESOURCES)
fun createContentRoots(sourceRoots: List<PSourceRoot>, forTests: Boolean): List<PContentRoot> {
return sourceRoots.map { PContentRoot(it.path, forTests, listOf(it), emptyList()) }
}
return createContentRoots(productionSourceRoots, forTests = false) +
createContentRoots(testSourceRoots, forTests = true)
}
private fun parseSourceRoots(project: Project): List<PSourceRoot> {
if (!project.plugins.hasPlugin(JavaPlugin::class.java)) {
return emptyList()
}
val kotlinTasksBySourceSet = project.tasks.names
.filter { it.startsWith("compile") && it.endsWith("Kotlin") }
.map { project.tasks.getByName(it) }
.associateBy { it.invokeInternal("getSourceSetName") }
val sourceRoots = mutableListOf<PSourceRoot>()
val sourceSets = project.sourceSets
if (sourceSets != null) {
for (sourceSet in sourceSets) {
val kotlinCompileTask = kotlinTasksBySourceSet[sourceSet.name]
val kind = if (sourceSet.isTestSourceSet) Kind.TEST else Kind.PRODUCTION
fun Any.getKotlin(): SourceDirectorySet {
val kotlinMethod = javaClass.getMethod("getKotlin")
val oldIsAccessible = kotlinMethod.isAccessible
try {
kotlinMethod.isAccessible = true
return kotlinMethod(this) as SourceDirectorySet
} finally {
kotlinMethod.isAccessible = oldIsAccessible
}
}
val kotlinSourceDirectories = (sourceSet as HasConvention).convention
.plugins["kotlin"]?.getKotlin()?.srcDirs
?: emptySet()
val directories = (sourceSet.java.sourceDirectories.files + kotlinSourceDirectories).toList()
.filter { it.exists() }
.takeIf { it.isNotEmpty() }
?: continue
val kotlinOptions = kotlinCompileTask?.let { getKotlinOptions(it) }
for (resourceRoot in sourceSet.resources.sourceDirectories.files) {
if (!resourceRoot.exists() || resourceRoot in directories) {
continue
}
val resourceRootKind = when (kind) {
Kind.PRODUCTION -> Kind.RESOURCES
Kind.TEST -> Kind.TEST_RESOURCES
else -> error("Invalid source root kind $kind")
}
sourceRoots += PSourceRoot(resourceRoot, resourceRootKind, kotlinOptions)
}
for (directory in directories) {
sourceRoots += PSourceRoot(directory, kind, kotlinOptions)
}
for (root in parseResourceRootsProcessedByProcessResourcesTask(project, sourceSet)) {
if (sourceRoots.none { it.path == root.path }) {
sourceRoots += root
}
}
}
}
return sourceRoots
}
private fun parseResourceRootsProcessedByProcessResourcesTask(project: Project, sourceSet: SourceSet): List<PSourceRoot> {
val isMainSourceSet = sourceSet.name == SourceSet.MAIN_SOURCE_SET_NAME
val resourceRootKind = if (sourceSet.isTestSourceSet) PSourceRoot.Kind.TEST_RESOURCES else PSourceRoot.Kind.RESOURCES
val taskNameBase = "processResources"
val taskName = if (isMainSourceSet) taskNameBase else sourceSet.name + taskNameBase.capitalize()
val task = project.tasks.findByName(taskName) as? ProcessResources ?: return emptyList()
val roots = mutableListOf<File>()
fun collectRoots(spec: CopySpecInternal) {
if (spec is SingleParentCopySpec && spec.children.none()) {
roots += spec.sourcePaths.map { File(project.projectDir, it.toString()) }.filter { it.exists() }
return
}
spec.children.forEach(::collectRoots)
}
collectRoots(task.rootSpec)
return roots.map { PSourceRoot(it, resourceRootKind, null) }
}
private val SourceSet.isTestSourceSet: Boolean
get() = name == SourceSet.TEST_SOURCE_SET_NAME
|| name.endsWith("Test")
|| name.endsWith("Tests")
private fun getKotlinOptions(kotlinCompileTask: Any): PSourceRootKotlinOptions? {
val compileArguments = run {
val method = kotlinCompileTask::class.java.getMethod("getSerializedCompilerArguments")
method.isAccessible = true
method.invoke(kotlinCompileTask) as List<String>
}
fun parseBoolean(name: String) = compileArguments.contains("-$name")
fun parseString(name: String) = compileArguments.dropWhile { it != "-$name" }.drop(1).firstOrNull()
fun isOptionForScriptingCompilerPlugin(option: String)
= option.startsWith("-Xplugin=") && option.contains("kotlin-scripting-compiler")
val extraArguments = compileArguments.filter {
it.startsWith("-X") && !isOptionForScriptingCompilerPlugin(it)
}
return PSourceRootKotlinOptions(
parseBoolean("no-stdlib"),
parseBoolean("no-reflect"),
parseString("module-name"),
parseString("api-version"),
parseString("language-version"),
parseString("jvm-target"),
extraArguments
)
}
private fun Any.invokeInternal(name: String, instance: Any = this): Any? {
val method = javaClass.methods.single { it.name.startsWith(name) && it.parameterTypes.isEmpty() }
val oldIsAccessible = method.isAccessible
try {
method.isAccessible = true
return method.invoke(instance)
} finally {
method.isAccessible = oldIsAccessible
}
}
private fun ParserContext.parseDependencies(project: Project, forTests: Boolean): List<POrderRoot> {
val configurations = project.configurations
val configurationMapping = if (forTests) TEST_CONFIGURATION_MAPPING else CONFIGURATION_MAPPING
val mainRoots = mutableListOf<POrderRoot>()
val deferredRoots = mutableListOf<POrderRoot>()
for ((configurationNames, scope) in configurationMapping) {
for (configurationName in configurationNames) {
val configuration = configurations.findByName(configurationName) ?: continue
val (main, deferred) = project.resolveDependencies(configuration, forTests, dependencyMappers)
mainRoots += main.map { POrderRoot(it, scope) }
deferredRoots += deferred.map { POrderRoot(it, scope) }
}
}
return removeDuplicates(mainRoots + deferredRoots)
}
fun removeDuplicates(roots: List<POrderRoot>): List<POrderRoot> {
val dependenciesByScope = roots.groupBy { it.scope }.mapValues { it.value.mapTo(mutableSetOf()) { it.dependency } }
fun dependenciesFor(scope: Scope) = dependenciesByScope[scope] ?: emptySet<PDependency>()
val result = mutableSetOf<POrderRoot>()
for (root in roots.distinct()) {
val scope = root.scope
val dependency = root.dependency
if (root in result) {
continue
}
if ((scope == Scope.PROVIDED || scope == Scope.RUNTIME) && dependency in dependenciesFor(Scope.COMPILE)) {
continue
}
if (scope == Scope.PROVIDED && dependency in dependenciesFor(Scope.RUNTIME)) {
result += POrderRoot(dependency, Scope.COMPILE)
continue
}
if (scope == Scope.RUNTIME && dependency in dependenciesFor(Scope.PROVIDED)) {
result += POrderRoot(dependency, Scope.COMPILE)
continue
}
result += root
}
return result.toList()
}
val Project.pillModuleName: String
get() = path.removePrefix(":").replace(':', '.')
val Project.sourceSets: SourceSetContainer?
get() {
val convention = project.convention.findPlugin(JavaPluginConvention::class.java) ?: return null
return convention.sourceSets
}

View File

@@ -0,0 +1,54 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import org.gradle.api.Project
import java.io.File
private val USER_HOME_DIR_PATH = System.getProperty("user.home").withSlash()
private fun replacePrefix(path: String, prefix: String, variableName: String): String {
if (path.startsWith(prefix)) {
return "$" + variableName + "$/" + path.drop(prefix.length)
}
return path
}
private fun simplifyUserHomeDirPath(path: String): String {
return replacePrefix(path, USER_HOME_DIR_PATH, "USER_HOME")
}
interface PathContext {
operator fun invoke(file: File): String
fun url(file: File): Pair<String, String> {
val path = when {
file.isFile && file.extension.toLowerCase() == "jar" -> "jar://" + this(file) + "!/"
else -> "file://" + this(file)
}
return Pair("url", path)
}
}
class ProjectContext private constructor(private val projectDir: File) : PathContext {
constructor(project: PProject) : this(project.rootDirectory)
constructor(project: Project) : this(project.projectDir)
override fun invoke(file: File): String {
return simplifyUserHomeDirPath(replacePrefix(file.absolutePath, projectDir.absolutePath.withSlash(), "PROJECT_DIR"))
}
}
class ModuleContext(val project: PProject, val module: PModule) : PathContext {
override fun invoke(file: File): String {
if (!file.startsWith(project.rootDirectory)) {
return simplifyUserHomeDirPath(file.absolutePath)
}
return "\$MODULE_DIR\$/" + file.toRelativeString(module.moduleFile.parentFile)
}
}
fun String.withSlash() = if (this.endsWith("/")) this else (this + "/")
fun String.withoutSlash() = this.trimEnd('/')

View File

@@ -0,0 +1,343 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.plugins.BasePluginConvention
import org.gradle.kotlin.dsl.extra
import shadow.org.jdom2.input.SAXBuilder
import shadow.org.jdom2.*
import shadow.org.jdom2.output.Format
import shadow.org.jdom2.output.XMLOutputter
import java.io.File
class PillConfigurablePlugin : Plugin<Project> {
override fun apply(project: Project) {
project.configurations.maybeCreate(EmbeddedComponents.CONFIGURATION_NAME)
project.extensions.create("pill", PillExtension::class.java)
}
}
class JpsCompatiblePlugin : Plugin<Project> {
companion object {
private fun getDependencyMappers(projectLibraries: List<PLibrary>): List<DependencyMapper> {
val mappersForKotlinLibrariesExeptStdlib = projectLibraries
.filter { it.name != "kotlin-stdlib" }
.map { DependencyMapper.forProject(it.originalName) { MappedDependency(PDependency.Library(it.name)) } }
val disabledModuleMappers = listOf(
":kotlin-stdlib-common",
":core:builtins",
":kotlin-compiler",
":kotlin-compiler-embeddable",
":kotlin-test:kotlin-test-common",
":kotlin-test:kotlin-test-annotations-common"
).map { DependencyMapper.forProject(it) { null } }
return listOf(
DependencyMapper.forProject(":kotlin-stdlib") {
MappedDependency(
PDependency.Library("kotlin-stdlib"),
listOf(PDependency.Library("annotations-13.0"))
)
},
DependencyMapper.forProject(":kotlin-test:kotlin-test-jvm") { MappedDependency(PDependency.Library("kotlin-test-jvm")) },
DependencyMapper.forProject(":kotlin-reflect-api") { MappedDependency(PDependency.Library("kotlin-reflect")) }
) + mappersForKotlinLibrariesExeptStdlib + disabledModuleMappers
}
fun getProjectLibraries(rootProject: Project): List<PLibrary> {
val distLibDir = File(rootProject.extra["distLibDir"].toString())
fun distJar(name: String) = File(rootProject.projectDir, "dist/kotlinc/lib/$name.jar")
val libraries = rootProject.allprojects
.mapNotNull { library ->
val libraryExtension = library.extensions.findByType(PillExtension::class.java)
?.takeIf { it.importAsLibrary }
?: return@mapNotNull null
val libraryPath = libraryExtension.libraryPath ?: distLibDir
val archivesBaseName = library.convention.findPlugin(BasePluginConvention::class.java)?.archivesBaseName ?: library.name
fun List<File>.filterExisting() = filter { it.exists() }
PLibrary(
library.name,
classes = listOf(File(libraryPath, "$archivesBaseName.jar")).filterExisting(),
sources = listOf(File(libraryPath, "$archivesBaseName-sources.jar")).filterExisting(),
originalName = library.path
)
}
return libraries + PLibrary("annotations-13.0", classes = listOf(distJar("annotations-13.0")))
}
}
override fun apply(project: Project) {
project.plugins.apply(PillConfigurablePlugin::class.java)
// 'jpsTest' does not require the 'tests-jar' artifact
project.configurations.create("jpsTest")
if (project == project.rootProject) {
project.tasks.create("pill") {
doLast { pill(project) }
if (System.getProperty("pill.android.tests", "false") == "true") {
TaskUtils.useAndroidSdk(this)
TaskUtils.useAndroidJar(this)
}
}
project.tasks.create("unpill") {
doLast { unpill(project) }
}
}
}
private lateinit var projectDir: File
private lateinit var platformVersion: String
private lateinit var platformBaseNumber: String
private lateinit var platformDir: File
private lateinit var intellijCoreDir: File
private var isAndroidStudioPlatform: Boolean = false
private fun initEnvironment(project: Project) {
projectDir = project.projectDir
platformVersion = project.extensions.extraProperties.get("versions.intellijSdk").toString()
platformBaseNumber = platformVersion.substringBefore(".", "").takeIf { it.isNotEmpty() }
?: platformVersion.substringBefore("-", "").takeIf { it.isNotEmpty() }
?: error("Invalid platform version: $platformVersion")
platformDir = IntellijRootUtils.getIntellijRootDir(project)
intellijCoreDir = File(platformDir.parentFile.parentFile.parentFile, "intellij-core")
isAndroidStudioPlatform = project.extensions.extraProperties.has("versions.androidStudioRelease")
}
private fun pill(rootProject: Project) {
initEnvironment(rootProject)
val variantOptionValue = System.getProperty("pill.variant", "base").toUpperCase()
val variant = PillExtension.Variant.values().firstOrNull { it.name == variantOptionValue }
?: run {
rootProject.logger.error("Invalid variant name: $variantOptionValue")
return
}
rootProject.logger.lifecycle("Pill: Setting up project for the '${variant.name.toLowerCase()}' variant...")
if (variant == PillExtension.Variant.NONE || variant == PillExtension.Variant.DEFAULT) {
rootProject.logger.error("'none' and 'default' should not be passed as a Pill variant property value")
return
}
val projectLibraries = getProjectLibraries(rootProject)
val dependencyMappers = getDependencyMappers(projectLibraries)
val parserContext = ParserContext(dependencyMappers, variant)
val jpsProject = parse(rootProject, projectLibraries, parserContext)
.mapLibraries(this::attachPlatformSources, this::attachAsmSources)
val files = render(jpsProject)
removeExistingIdeaLibrariesAndModules()
removeJpsAndPillRunConfigurations()
removeAllArtifactConfigurations()
generateKotlinPluginArtifactFile(rootProject, dependencyMappers).write()
copyRunConfigurations()
setOptionsForDefaultJunitRunConfiguration(rootProject)
files.forEach { it.write() }
}
private fun unpill(project: Project) {
initEnvironment(project)
removeExistingIdeaLibrariesAndModules()
removeJpsAndPillRunConfigurations()
removeAllArtifactConfigurations()
}
private fun removeExistingIdeaLibrariesAndModules() {
File(projectDir, ".idea/libraries").deleteRecursively()
File(projectDir, ".idea/modules").deleteRecursively()
}
private fun removeJpsAndPillRunConfigurations() {
File(projectDir, ".idea/runConfigurations")
.walk()
.filter { (it.name.startsWith("JPS_") || it.name.startsWith("Pill_")) && it.extension.toLowerCase() == "xml" }
.forEach { it.delete() }
}
private fun removeAllArtifactConfigurations() {
File(projectDir, ".idea/artifacts")
.walk()
.filter { it.extension.toLowerCase() == "xml" }
.forEach { it.delete() }
}
private fun copyRunConfigurations() {
val runConfigurationsDir = File(projectDir, "buildSrc/src/main/resources/runConfigurations")
val targetDir = File(projectDir, ".idea/runConfigurations")
val platformDirProjectRelative = "\$PROJECT_DIR\$/" + platformDir.toRelativeString(projectDir)
val additionalIdeaArgs = if (isAndroidStudioPlatform) "-Didea.platform.prefix=AndroidStudio" else ""
targetDir.mkdirs()
fun substitute(text: String): String {
return text
.replace("\$IDEA_HOME_PATH\$", platformDirProjectRelative)
.replace("\$ADDITIONAL_IDEA_ARGS\$", additionalIdeaArgs)
}
runConfigurationsDir.listFiles()
.filter { it.extension == "xml" }
.map { it.name to substitute(it.readText()) }
.forEach { File(targetDir, it.first).writeText(it.second) }
}
/*
This sets a proper (project root) working directory and a "idea.home.path" property to the default JUnit configuration,
so one does not need to make these changes manually.
*/
private fun setOptionsForDefaultJunitRunConfiguration(project: Project) {
val workspaceFile = File(projectDir, ".idea/workspace.xml")
if (!workspaceFile.exists()) {
project.logger.warn("${workspaceFile.name} does not exist, JUnit default run configuration was not modified")
return
}
val document = SAXBuilder().build(workspaceFile)
val rootElement = document.rootElement
fun Element.getOrCreateChild(name: String, vararg attributes: Pair<String, String>): Element {
for (child in getChildren(name)) {
if (attributes.all { (attribute, value) -> child.getAttributeValue(attribute) == value }) {
return child
}
}
return Element(name).apply {
for ((attributeName, value) in attributes) {
setAttribute(attributeName, value)
}
this@getOrCreateChild.addContent(this@apply)
}
}
val platformDirProjectRelative = "\$PROJECT_DIR\$/" + platformDir.toRelativeString(projectDir)
val runManagerComponent = rootElement.getOrCreateChild("component", "name" to "RunManager")
val junitConfiguration = runManagerComponent.getOrCreateChild(
"configuration",
"default" to "true",
"type" to "JUnit",
"factoryName" to "JUnit"
)
val kotlinJunitConfiguration = runManagerComponent.getOrCreateChild(
"configuration",
"default" to "true",
"type" to "KotlinJUnit",
"factoryName" to "Kotlin JUnit"
)
fun Element.applyJUnitTemplate() {
getOrCreateChild("option", "name" to "WORKING_DIRECTORY").setAttribute("value", "file://\$PROJECT_DIR\$")
getOrCreateChild("option", "name" to "VM_PARAMETERS").also { vmParams ->
var options = vmParams.getAttributeValue("value", "")
.split(' ')
.map { it.trim() }
.filter { it.isNotEmpty() }
fun addOrReplaceOptionValue(name: String, value: Any?) {
val optionsWithoutNewValue = options.filter { !it.startsWith("-D$name=") }
options = if (value == null) optionsWithoutNewValue else (optionsWithoutNewValue + listOf("-D$name=$value"))
}
if (options.none { it == "-ea" }) {
options += "-ea"
}
addOrReplaceOptionValue("idea.home.path", platformDirProjectRelative)
addOrReplaceOptionValue("ideaSdk.androidPlugin.path", platformDirProjectRelative + "/plugins/android/lib")
addOrReplaceOptionValue("use.jps", "true")
addOrReplaceOptionValue("kotlinVersion", project.rootProject.extra["kotlinVersion"].toString())
val isAndroidStudioBunch = project.findProperty("versions.androidStudioRelease") != null
addOrReplaceOptionValue("idea.platform.prefix", if (isAndroidStudioBunch) "AndroidStudio" else null)
val androidJarPath = project.configurations.findByName("androidJar")?.singleFile
val androidSdkPath = project.configurations.findByName("androidSdk")?.singleFile
if (androidJarPath != null && androidSdkPath != null) {
addOrReplaceOptionValue("android.sdk", "\$PROJECT_DIR\$/" + androidSdkPath.toRelativeString(projectDir))
addOrReplaceOptionValue("android.jar", "\$PROJECT_DIR\$/" + androidJarPath.toRelativeString(projectDir))
}
vmParams.setAttribute("value", options.joinToString(" "))
}
}
junitConfiguration.applyJUnitTemplate()
kotlinJunitConfiguration.applyJUnitTemplate()
val output = XMLOutputter().also {
it.format = Format.getPrettyFormat().apply {
setEscapeStrategy { Verifier.isHighSurrogate(it) || it == '"' }
setIndent(" ")
setTextMode(Format.TextMode.TRIM)
setOmitEncoding(false)
setOmitDeclaration(false)
}
}
val postProcessedXml = output.outputString(document)
.replace("&#x22;", "&quot;")
.replace("&#xA;", "&#10;")
.replace("&#xC;", "&#13;")
workspaceFile.writeText(postProcessedXml)
}
private fun attachPlatformSources(library: PLibrary): PLibrary {
val platformSourcesJar = File(platformDir, "../../../sources/intellij-$platformVersion-sources.jar")
if (library.classes.any { it.startsWith(platformDir) || it.startsWith(intellijCoreDir) }) {
return library.attachSource(platformSourcesJar)
}
return library
}
private fun attachAsmSources(library: PLibrary): PLibrary {
val asmSourcesJar = File(platformDir, "../asm-shaded-sources/asm-src-$platformBaseNumber.jar")
val asmAllJar = File(platformDir, "lib/asm-all.jar")
if (library.classes.any { it == asmAllJar }) {
return library.attachSource(asmSourcesJar)
}
return library
}
private fun PProject.mapLibraries(vararg mappers: (PLibrary) -> PLibrary): PProject {
fun mapLibrary(root: POrderRoot): POrderRoot {
val dependency = root.dependency
if (dependency is PDependency.ModuleLibrary) {
val newLibrary = mappers.fold(dependency.library) { lib, mapper -> mapper(lib) }
return root.copy(dependency = dependency.copy(library = newLibrary))
}
return root
}
val modules = this.modules.map { it.copy(orderRoots = it.orderRoots.map(::mapLibrary)) }
return this.copy(modules = modules)
}
}

View File

@@ -1,21 +1,17 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import java.io.File
class PFile(val path: File, private val text: String) {
constructor(path: File, xml: XmlNode) : this(path, xml.toString())
class PFile(val path: File, val text: String) {
fun write() {
path.parentFile.mkdirs()
path.writeText(text)
}
}
fun PFile(path: File, xml: xml) = PFile(path, xml.toString())
fun render(project: PProject): List<PFile> {
val files = mutableListOf<PFile>()
@@ -44,8 +40,7 @@ private fun renderModulesFile(project: PProject) = PFile(
private fun renderModule(project: PProject, module: PModule) = PFile(
module.moduleFile,
xml(
"module",
xml("module",
"type" to "JAVA_MODULE",
"version" to 4
) {
@@ -54,7 +49,12 @@ private fun renderModule(project: PProject, module: PModule) = PFile(
xml("component", "name" to "TestModuleProperties", "production-module" to moduleForProductionSources.name)
}
val kotlinCompileOptions = module.kotlinOptions
val kotlinCompileOptionsList = module.contentRoots.flatMap { it.sourceRoots }.mapNotNull { it.kotlinOptions }
var kotlinCompileOptions = kotlinCompileOptionsList.firstOrNull()
for (otherOptions in kotlinCompileOptionsList.drop(1)) {
kotlinCompileOptions = kotlinCompileOptions?.intersect(otherOptions)
}
val pathContext = ModuleContext(project, module)
val platformVersion = (kotlinCompileOptions?.jvmTarget ?: "1.8")
@@ -93,18 +93,17 @@ private fun renderModule(project: PProject, module: PModule) = PFile(
}
}
xml(
"component",
xml("component",
"name" to "NewModuleRootManager",
"LANGUAGE_LEVEL" to "JDK_${platformVersion.replace('.', '_')}",
"inherit-compiler-output" to "true"
) {
xml("exclude-output")
for (contentRoot in module.contentRoots.filter { it.path.exists() }) {
for (contentRoot in module.contentRoots) {
xml("content", pathContext.url(contentRoot.path)) {
for (sourceRoot in contentRoot.sourceRoots) {
var args = arrayOf(pathContext.url(sourceRoot.directory))
var args = arrayOf(pathContext.url(sourceRoot.path))
args += when (sourceRoot.kind) {
PSourceRoot.Kind.PRODUCTION -> ("isTestSource" to "false")
@@ -180,7 +179,7 @@ private fun renderLibrary(project: PProject, library: PLibrary): PFile {
})
}
private fun renderLibraryToXml(library: PLibrary, pathContext: PathContext, named: Boolean = true): XmlNode {
private fun renderLibraryToXml(library: PLibrary, pathContext: PathContext, named: Boolean = true): xml {
val args = if (named) arrayOf("name" to library.renderName()) else emptyArray()
return xml("library", *args) {

View File

@@ -0,0 +1,61 @@
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.pill
import shadow.org.jdom2.Document
import shadow.org.jdom2.Element
import shadow.org.jdom2.output.Format
import shadow.org.jdom2.output.XMLOutputter
class xml(val name: String, private vararg val args: Pair<String, Any>, block: xml.() -> Unit = {}) {
private companion object {
fun makeXml(name: String, vararg args: Pair<String, Any>, block: xml.() -> Unit = {}): xml {
return xml(name, *args, block = block)
}
}
private val children = mutableListOf<xml>()
private var value: Any? = null
init {
@Suppress("UNUSED_EXPRESSION")
block()
}
fun xml(name: String, vararg args: Pair<String, Any>, block: xml.() -> Unit = {}) {
children += makeXml(name, *args, block = block)
}
fun add(xml: xml) {
children += xml
}
fun raw(text: String) {
value = text
}
private fun toElement(): Element {
val element = Element(name)
for (arg in args) {
element.setAttribute(arg.first, arg.second.toString())
}
require(value == null || children.isEmpty())
value?.let { value ->
element.addContent(value.toString())
}
for (child in children) {
element.addContent(child.toElement())
}
return element
}
override fun toString(): String {
val document = Document().also { it.rootElement = toElement() }
val output = XMLOutputter().also { it.format = Format.getPrettyFormat() }
return output.outputString(document)
}
}

View File

@@ -1,68 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
import com.gradle.publish.PluginBundleExtension
import com.gradle.publish.PluginConfig
import org.gradle.api.Project
import org.gradle.api.publish.PublicationContainer
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.tasks.bundling.Jar
import org.gradle.kotlin.dsl.*
import plugins.KotlinBuildPublishingPlugin
internal const val PLUGIN_MARKER_SUFFIX = ".gradle.plugin"
fun Project.publishPluginMarkers(withEmptyJars: Boolean = true) {
val pluginDevelopment = extensions.getByType<PluginBundleExtension>()
val publishingExtension = extensions.getByType<PublishingExtension>()
val mainPublication = publishingExtension.publications[KotlinBuildPublishingPlugin.PUBLICATION_NAME] as MavenPublication
pluginDevelopment.plugins.forEach { declaration ->
val markerPublication = createMavenMarkerPublication(declaration, mainPublication, publishingExtension.publications)
if (withEmptyJars) {
addEmptyJarArtifacts(markerPublication)
}
}
}
fun Project.addEmptyJarArtifacts(publication: MavenPublication) {
val emptyJar = getOrCreateTask<Jar>("emptyJar") {
archiveBaseName.set("empty")
}
publication.artifact(emptyJar.get()) { }
publication.artifact(emptyJar.get()) { classifier = "sources" }
publication.artifact(emptyJar.get()) { classifier = "javadoc" }
}
// Based on code from `java-gradle-plugin`
// https://github.com/gradle/gradle/blob/v6.4.0/subprojects/plugin-development/src/main/java/org/gradle/plugin/devel/plugins/MavenPluginPublishPlugin.java#L84
private fun createMavenMarkerPublication(
declaration: PluginConfig,
coordinates: MavenPublication,
publications: PublicationContainer
): MavenPublication {
return publications.create<MavenPublication>(declaration.name.toString() + "PluginMarkerMaven") {
val pluginId: String = declaration.id
artifactId = pluginId + PLUGIN_MARKER_SUFFIX
groupId = pluginId
pom.withXml {
val root = asElement()
val document = root.ownerDocument
val dependencies = root.appendChild(document.createElement("dependencies"))
val dependency = dependencies.appendChild(document.createElement("dependency"))
val groupId = dependency.appendChild(document.createElement("groupId"))
groupId.textContent = coordinates.groupId
val artifactId = dependency.appendChild(document.createElement("artifactId"))
artifactId.textContent = coordinates.artifactId
val version = dependency.appendChild(document.createElement("version"))
version.textContent = coordinates.version
}
pom.name.set(declaration.displayName)
pom.description.set(declaration.description)
}
}

View File

@@ -5,12 +5,10 @@
import com.jakewharton.dex.*
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.tasks.*
import org.gradle.jvm.tasks.Jar
import java.io.File
@CacheableTask
open class DexMethodCount : DefaultTask() {
data class Counts(
@@ -21,23 +19,34 @@ open class DexMethodCount : DefaultTask() {
val byClass: Map<String, Int>
)
@Classpath
init {
outputs.upToDateWhen { !shouldPrintTeamCityStatistics } // always execute when teamCityStatistics output is required
}
@InputFile
lateinit var jarFile: File
@Optional
@Input
@Optional
var ownPackages: List<String>? = null
@Internal
// ##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}' value='62362']
@Input
@Optional
var teamCityStatistics: Boolean? = null
private val shouldPrintTeamCityStatistics = teamCityStatistics ?: project.hasProperty("teamcity")
@Input
@Optional
var artifactName: String? = null
@get:Input
val artifactOrArchiveName: String
get() = artifactName ?: project.name
private val artifactOrArchiveName get() = artifactName ?: project.name
fun from(jar: Jar) {
jarFile = jar.archiveFile.get().asFile
artifactName = jar.archiveBaseName.orNull
jarFile = jar.archivePath
artifactName = jar.baseName
dependsOn(jar)
}
@@ -45,13 +54,16 @@ open class DexMethodCount : DefaultTask() {
lateinit var counts: Counts
@get:OutputFile
val detailOutputFile: File
get() = project.buildDir.resolve("$artifactOrArchiveName-method-count.txt")
val detailOutputFile: File get() = project.buildDir.resolve("$artifactOrArchiveName-method-count.txt")
@TaskAction
fun invoke() {
val methods = dexMethods(jarFile)
val counts = methods.getCounts().also { this.counts = it }
printTotals(counts)
printTCStats(counts)
outputDetails(counts)
}
@@ -59,7 +71,7 @@ open class DexMethodCount : DefaultTask() {
val byPackage = this.groupingBy { it.`package` }.eachCount()
val byClass = this.groupingBy { it.declaringType }.eachCount()
val ownPackages = ownPackages?.map { "$it." }
val ownPackages = ownPackages?.map { it + '.' }
val byOwnPackages = if (ownPackages != null) {
this.partition { method -> ownPackages.any { method.declaringType.startsWith(it) } }.let {
it.first.size to it.second.size
@@ -75,6 +87,26 @@ open class DexMethodCount : DefaultTask() {
)
}
private fun printTotals(counts: Counts) {
logger.lifecycle("Artifact $artifactOrArchiveName, total methods: ${counts.total}")
ownPackages?.let { packages ->
logger.lifecycle("Artifact $artifactOrArchiveName, total methods from packages ${packages.joinToString { "$it.*" }}: ${counts.totalOwnPackages}")
logger.lifecycle("Artifact $artifactOrArchiveName, total methods from other packages: ${counts.totalOtherPackages}")
}
}
private fun printTCStats(counts: Counts) {
if (shouldPrintTeamCityStatistics) {
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}' value='${counts.total}']")
counts.totalOwnPackages?.let { value ->
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}_OwnPackages' value='$value']")
}
counts.totalOtherPackages?.let { value ->
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}_OtherPackages' value='$value']")
}
}
}
private fun outputDetails(counts: Counts) {
detailOutputFile.printWriter().use { writer ->
writer.println("${counts.total.padRight()}\tTotal methods")
@@ -94,67 +126,9 @@ open class DexMethodCount : DefaultTask() {
}
}
}
}
open class DexMethodCountStats : DefaultTask() {
@Internal
lateinit var from: TaskProvider<DexMethodCount>
@get:InputFile
internal val inputFile
get() = from.get().detailOutputFile
@TaskAction
private fun printStats() {
val artifactOrArchiveName = from.get().artifactOrArchiveName
inputFile.reader().useLines { lines ->
fun String.getStatValue() = substringBefore("\t").trim()
val ownPackages = from.get().ownPackages
val statsLineCount = if (ownPackages == null) 1 else 3
val stats = lines.take(statsLineCount).map { it.getStatValue() }.toList()
val total = stats[0]
logger.lifecycle("Artifact $artifactOrArchiveName, total methods: $total")
if (project.kotlinBuildProperties.isTeamcityBuild) {
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}' value='$total']")
}
ownPackages?.let { packages ->
val totalOwnPackages = stats[1]
val totalOtherPackages = stats[2]
logger.lifecycle("Artifact $artifactOrArchiveName, total methods from packages ${packages.joinToString { "$it.*" }}: $totalOwnPackages")
logger.lifecycle("Artifact $artifactOrArchiveName, total methods from other packages: $totalOtherPackages")
if (project.kotlinBuildProperties.isTeamcityBuild) {
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}_OwnPackages' value='$totalOwnPackages']")
println("##teamcity[buildStatisticValue key='DexMethodCount_${artifactOrArchiveName}_OtherPackages' value='$totalOtherPackages']")
}
}
}
}
}
fun Project.printStats(dexMethodCount: TaskProvider<DexMethodCount>) {
val dexMethodCountStats = tasks.register("dexMethodCountStats", DexMethodCountStats::class.java) {
dependsOn(dexMethodCount)
from = dexMethodCount
}
dexMethodCount.configure {
finalizedBy(dexMethodCountStats)
}
}
fun Project.dexMethodCount(action: DexMethodCount.() -> Unit): TaskProvider<DexMethodCount> {
val dexMethodCount = tasks.register("dexMethodCount", DexMethodCount::class.java, action)
printStats(dexMethodCount)
tasks.getByName("check").dependsOn(dexMethodCount)
return dexMethodCount
}
private val DexMethod.`package`: String get() = declaringType.substringBeforeLast('.')
private fun Int.padRight() = toString().padStart(5, ' ')

View File

@@ -1,155 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package plugins
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.attributes.Usage
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.component.SoftwareComponentFactory
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
import org.gradle.kotlin.dsl.*
import org.gradle.plugins.signing.SigningExtension
import org.gradle.plugins.signing.SigningPlugin
import java.util.*
import javax.inject.Inject
class KotlinBuildPublishingPlugin @Inject constructor(
private val componentFactory: SoftwareComponentFactory
) : Plugin<Project> {
override fun apply(target: Project): Unit = with(target) {
apply<MavenPublishPlugin>()
apply<SigningPlugin>()
val publishedRuntime = configurations.maybeCreate(RUNTIME_CONFIGURATION).apply {
isCanBeConsumed = false
isCanBeResolved = false
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
}
}
val publishedCompile = configurations.maybeCreate(COMPILE_CONFIGURATION).apply {
isCanBeConsumed = false
isCanBeResolved = false
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_API))
}
}
val kotlinLibraryComponent = componentFactory.adhoc(ADHOC_COMPONENT_NAME) as AdhocComponentWithVariants
components.add(kotlinLibraryComponent)
kotlinLibraryComponent.addVariantsFromConfiguration(publishedCompile) { mapToMavenScope("compile") }
kotlinLibraryComponent.addVariantsFromConfiguration(publishedRuntime) { mapToMavenScope("runtime") }
pluginManager.withPlugin("java-base") {
val runtimeElements by configurations
val apiElements by configurations
publishedRuntime.extendsFrom(runtimeElements)
publishedCompile.extendsFrom(apiElements)
kotlinLibraryComponent.addVariantsFromConfiguration(runtimeElements) {
mapToMavenScope("runtime")
if (configurationVariant.artifacts.any { JavaBasePlugin.UNPUBLISHABLE_VARIANT_ARTIFACTS.contains(it.type) }) {
skip()
}
}
}
configure<PublishingExtension> {
publications {
create<MavenPublication>(PUBLICATION_NAME) {
from(kotlinLibraryComponent)
pom {
packaging = "jar"
name.set(humanReadableName(project))
description.set(project.description ?: humanReadableName(project))
url.set("https://kotlinlang.org/")
licenses {
license {
name.set("The Apache License, Version 2.0")
url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
}
}
scm {
url.set("https://github.com/JetBrains/kotlin")
connection.set("scm:git:https://github.com/JetBrains/kotlin.git")
developerConnection.set("scm:git:https://github.com/JetBrains/kotlin.git")
}
developers {
developer {
name.set("Kotlin Team")
organization.set("JetBrains")
organizationUrl.set("https://www.jetbrains.com")
}
}
}
}
}
repositories {
maven {
name = REPOSITORY_NAME
url = file("${project.rootDir}/build/repo").toURI()
}
}
}
configure<SigningExtension> {
setRequired(provider {
project.findProperty("signingRequired")?.toString()?.toBoolean()
?: project.property("isSonatypeRelease") as Boolean
})
sign(extensions.getByType<PublishingExtension>().publications[PUBLICATION_NAME])
}
tasks.register("install") {
dependsOn(tasks.named("publishToMavenLocal"))
}
tasks.named<PublishToMavenRepository>("publish${PUBLICATION_NAME}PublicationTo${REPOSITORY_NAME}Repository") {
dependsOn(project.rootProject.tasks.named("preparePublication"))
doFirst {
val preparePublication = project.rootProject.tasks.named("preparePublication").get()
val username: String? by preparePublication.extra
val password: String? by preparePublication.extra
val repoUrl: String by preparePublication.extra
repository.apply {
url = uri(repoUrl)
if (url.scheme != "file" && username != null && password != null) {
credentials {
this.username = username
this.password = password
}
}
}
}
}
}
companion object {
const val PUBLICATION_NAME = "Main"
const val REPOSITORY_NAME = "Maven"
const val ADHOC_COMPONENT_NAME = "kotlinLibrary"
const val COMPILE_CONFIGURATION = "publishedCompile"
const val RUNTIME_CONFIGURATION = "publishedRuntime"
@UseExperimental(ExperimentalStdlibApi::class)
fun humanReadableName(project: Project) =
project.name.split("-").joinToString(separator = " ") { it.capitalize(Locale.ROOT) }
}
}

View File

@@ -31,18 +31,12 @@ open class PublishedKotlinModule : Plugin<Project> {
plugins.apply("maven")
configurations.maybeCreate("publishedRuntime").apply {
val publishedRuntime by configurations.creating {
the<MavenPluginConvention>()
.conf2ScopeMappings
.addMapping(0, this, Conf2ScopeMappingContainer.RUNTIME)
}
configurations.maybeCreate("publishedCompile").apply {
the<MavenPluginConvention>()
.conf2ScopeMappings
.addMapping(0, this, Conf2ScopeMappingContainer.COMPILE)
}
if (!project.hasProperty("prebuiltJar")) {
plugins.apply("signing")

View File

@@ -23,15 +23,3 @@ fun DependencyHandler.publishedRuntime(
): ExternalModuleDependency =
addDependencyTo(this, "publishedRuntime", dependencyNotation, dependencyConfiguration)
val NamedDomainObjectContainer<Configuration>.publishedCompile: NamedDomainObjectProvider<Configuration> get() = named("publishedCompile")
fun DependencyHandler.publishedCompile(dependencyNotation: Any): Dependency? =
add("publishedCompile", dependencyNotation)
fun DependencyHandler.publishedCompile(
dependencyNotation: String,
dependencyConfiguration: Action<ExternalModuleDependency>
): ExternalModuleDependency =
addDependencyTo(this, "publishedCompile", dependencyNotation, dependencyConfiguration)

View File

@@ -5,17 +5,14 @@ import org.jetbrains.org.objectweb.asm.*
import java.io.BufferedOutputStream
import java.io.File
import java.io.FileOutputStream
import java.util.*
import java.util.jar.JarFile
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
private val CONSTANT_TIME_FOR_ZIP_ENTRIES = GregorianCalendar(1980, 1, 1, 0, 0, 0).timeInMillis
/**
* Removes @kotlin.Metadata annotations from compiled Kotlin classes
*/
fun stripMetadata(logger: Logger, classNamePattern: String, inFile: File, outFile: File, preserveFileTimestamps: Boolean = true) {
fun stripMetadata(logger: Logger, classNamePattern: String, inFile: File, outFile: File) {
val classRegex = classNamePattern.toRegex()
assert(inFile.exists()) { "Input file not found at $inFile" }
@@ -52,9 +49,6 @@ fun stripMetadata(logger: Logger, classNamePattern: String, inFile: File, outFil
}
val newEntry = ZipEntry(entry.name)
if (!preserveFileTimestamps) {
newEntry.time = CONSTANT_TIME_FOR_ZIP_ENTRIES
}
outJar.putNextEntry(newEntry)
outJar.write(outBytes)
outJar.closeEntry()

View File

@@ -79,20 +79,21 @@ fun Project.projectTest(
}
}
if (project.findProperty("kotlin.test.instrumentation.disable")?.toString()?.toBoolean() != true) {
doFirst {
val agent = tasks.findByPath(":test-instrumenter:jar")!!.outputs.files.singleFile
val args = project.findProperty("kotlin.test.instrumentation.args")?.let { "=$it" }.orEmpty()
jvmArgs("-javaagent:$agent$args")
}
dependsOn(":test-instrumenter:jar")
doFirst {
val agent = tasks.findByPath(":test-instrumenter:jar")!!.outputs.files.singleFile
val args = project.findProperty("kotlin.test.instrumentation.args")?.let { "=$it" }.orEmpty()
jvmArgs("-javaagent:$agent$args")
}
dependsOn(":test-instrumenter:jar")
jvmArgs(
"-ea",
"-XX:+HeapDumpOnOutOfMemoryError",
"-XX:+UseCodeCacheFlushing",
"-XX:ReservedCodeCacheSize=256m",
"-XX:ReservedCodeCacheSize=128m",
"-Djna.nosys=true"
)
@@ -105,11 +106,6 @@ fun Project.projectTest(
environment("PROJECT_BUILD_DIR", buildDir)
systemProperty("jps.kotlin.home", rootProject.extra["distKotlinHomeDir"]!!)
systemProperty("kotlin.ni", if (rootProject.hasProperty("newInferenceTests")) "true" else "false")
systemProperty("org.jetbrains.kotlin.skip.muted.tests", if (rootProject.hasProperty("skipMutedTests")) "true" else "false")
if (Platform[202].orHigher()) {
systemProperty("idea.ignore.disabled.plugins", "true")
}
var subProjectTempRoot: Path? = null
doFirst {
@@ -158,10 +154,6 @@ object TaskUtils {
fun useAndroidJar(task: Task) {
task.useAndroidConfiguration(systemPropertyName = "android.jar", configName = "androidJar")
}
fun useAndroidEmulator(task: Task) {
task.useAndroidConfiguration(systemPropertyName = "android.sdk", configName = "androidEmulator")
}
}
private fun Task.useAndroidConfiguration(systemPropertyName: String, configName: String) {

View File

@@ -13,7 +13,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1250m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.jps=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1250m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.pill=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />

View File

@@ -13,7 +13,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.jps=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.pill=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="true" />

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="[Pill] IDEA" type="Application" factoryName="Application" singleton="true">
<log_file alias="idea.log" path="$PROJECT_DIR$/ideaSDK/system-idea/log/idea.log" />
<option name="MAIN_CLASS_NAME" value="com.intellij.idea.Main" />
<module name="idea-runner.main" />
<module name="idea-runner" />
<option name="VM_PARAMETERS" value="-Xmx1250m -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -ea -Didea.is.internal=true -Didea.debug.mode=true -Didea.system.path=$PROJECT_DIR$/local/ideaSandbox -Didea.config.path=$PROJECT_DIR$/local/ideaSandbox/config -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -Dsun.io.useCanonCaches=false -Dplugin.path=$PROJECT_DIR$/out/artifacts/Kotlin $ADDITIONAL_IDEA_ARGS$" />
<option name="WORKING_DIRECTORY" value="file://$IDEA_HOME_PATH$" />
<RunnerSettings RunnerId="Debug">

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="[Pill] IDEA (No ProcessCanceledException)" type="Application" factoryName="Application" singleton="true">
<log_file alias="idea.log" path="$PROJECT_DIR$/ideaSDK/system-idea/log/idea.log" />
<option name="MAIN_CLASS_NAME" value="com.intellij.idea.Main" />
<module name="idea-runner.main" />
<module name="idea-runner" />
<option name="VM_PARAMETERS" value="-Xmx1250m -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -ea -Didea.is.internal=true -Didea.debug.mode=true -Didea.system.path=$PROJECT_DIR$/local/ideaSandbox -Didea.config.path=$PROJECT_DIR$/local/ideaSandbox/config -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -Dsun.io.useCanonCaches=false -Dplugin.path=$PROJECT_DIR$/out/artifacts/Kotlin -Didea.ProcessCanceledException=disabled $ADDITIONAL_IDEA_ARGS$" />
<option name="WORKING_DIRECTORY" value="file://$IDEA_HOME_PATH$" />
<RunnerSettings RunnerId="Debug">

View File

@@ -2,7 +2,7 @@
<configuration default="false" name="[Pill] IDEA Ultimate" type="Application" factoryName="Application" singleton="true">
<log_file alias="idea.log" path="$PROJECT_DIR$/ideaSDK/system-idea/log/idea.log" />
<option name="MAIN_CLASS_NAME" value="com.intellij.idea.Main" />
<module name="kotlin-ultimate.ultimate.ultimate-runner.main" />
<module name="kotlin-ultimate.ultimate.ultimate-runner" />
<option name="VM_PARAMETERS" value="-Xmx1250m -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -ea -Didea.is.internal=true -Didea.debug.mode=true -Didea.system.path=$PROJECT_DIR$/local/ideaSandbox -Didea.config.path=$PROJECT_DIR$/local/ideaSandbox/config -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -Dsun.io.useCanonCaches=false -Dplugin.path=$PROJECT_DIR$/out/artifacts/Kotlin $ADDITIONAL_IDEA_ARGS$" />
<option name="WORKING_DIRECTORY" value="file://$IDEA_HOME_PATH$" />
<RunnerSettings RunnerId="Debug">

View File

@@ -7,7 +7,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1250m -XX:+UseCodeCacheFlushing -Djna.nosys=true -Duse.jps=true -Dkotlin.js.skipMinificationTest=false" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1250m -XX:+UseCodeCacheFlushing -Djna.nosys=true -Duse.pill=true -Dkotlin.js.skipMinificationTest=false" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="true" />

View File

@@ -13,7 +13,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.jps=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -Xmx1024m -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.pill=true -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="true" />

View File

@@ -13,7 +13,7 @@
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.jps=true -Dkotlin.colors.enabled=false -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="VM_PARAMETERS" value="-ea -XX:+HeapDumpOnOutOfMemoryError -XX:+UseCodeCacheFlushing -XX:ReservedCodeCacheSize=128m -Djna.nosys=true -Duse.pill=true -Dkotlin.colors.enabled=false -Didea.home.path=$IDEA_HOME_PATH$" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="PASS_PARENT_ENVS" value="true" />

View File

@@ -0,0 +1,21 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="[Pill] Refresh PILL Model" type="GradleRunConfiguration" factoryName="Gradle" singleton="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="pill" />
</list>
</option>
<option name="vmOptions" value="" />
</ExternalSystemSettings>
<extension name="coverage" enabled="false" merge="false" sample_coverage="true" runner="idea" />
<method />
</configuration>
</component>

View File

@@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
ext {
isD8Enabled = project.findProperty('android.enableD8').toBoolean()
}
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.android.tools.build:gradle:3.3.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply plugin: 'com.android.application'
@@ -19,7 +19,7 @@ repositories {
}
android {
compileSdkVersion 26
compileSdkVersion 19
buildToolsVersion "28.0.3"
defaultConfig {
@@ -51,7 +51,7 @@ android {
dexOptions {
dexInProcess false
javaMaxHeapSize "1500m"
javaMaxHeapSize "1200m"
maxProcessCount 4
additionalParameters "--debug"
}
@@ -60,42 +60,17 @@ android {
resultsDir = "build/test/results"
}
if (isD8Enabled) {
compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
}
flavorDimensions "box"
productFlavors {
common0 {
ktest0 {
dimension "box"
}
common1 {
ktest1 {
dimension "box"
}
common2 {
dimension "box"
}
reflect0 {
dimension "box"
}
if (isD8Enabled) {
jvm80 {
dimension "box"
}
reflectjvm80 {
dimension "box"
}
}
}
}
@@ -103,9 +78,9 @@ android {
task jarTestFolders() {
println "Jar folders..."
new File("${projectDir}/libs/").listFiles().each { File file ->
if (file.isDirectory()) {
if (file.isDirectory() && !file.name.equals("test")) {
println "Jar '${file.name}' folder..."
ant.jar(basedir: "libs/${file.name}/", destfile: "libs/" + file.name + ".jar")
ant.jar(basedir: "libs/${file.name}/", destfile: "libs/test/" + file.name + ".jar")
}
}
}
@@ -115,18 +90,10 @@ tasks.withType(JavaCompile) {
}
dependencies {
implementation fileTree(dir: 'libs', include: ['kotlin-test.jar', 'kotlin-stdlib.jar'])
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
android.applicationVariants.all { variant ->
variant.productFlavors.each {
def configuration = configurations.getByName(it.name + 'Implementation').name
add(configuration, project.fileTree(dir: 'libs', include: [it.name + ".jar"]))
if (it.name.startsWith("reflect")) {
add(configuration, project.fileTree(dir: 'libs', include: ['kotlin-reflect.jar']))
}
}
}
ktest0Implementation fileTree(dir: 'libs/test', include: ['libtest0.jar'])
ktest1Implementation fileTree(dir: 'libs/test', include: ['libtest1.jar'])
}

View File

@@ -1,3 +1,3 @@
#don't try to download android specific tools within gradle: licence acceptance will be required
android.builder.sdkDownload=false
android.enableD8=true
android.enableD8=false

View File

@@ -8,5 +8,5 @@
# For customization when using a Version Control System, please read the
# header note.
#sdk.dir=compiler/android-tests/android-module/android-sdk/android-sdk-windows
sdk.dir=../../../dependencies/android.tests.dependencies/android-sdk
sdk.dir=../../../android.tests.dependencies/android-sdk

View File

@@ -1,4 +1,3 @@
import TaskUtils.useAndroidEmulator
plugins {
kotlin("jvm")
@@ -29,12 +28,9 @@ dependencies {
testCompile(intellijDep()) { includeJars("openapi", rootProject = rootProject) }
}
testCompile(intellijDep()) { includeJars("util", "idea", "idea_rt", rootProject = rootProject) }
Platform[202].orHigher {
testCompile(intellijDep()) { includeJars("groovy", rootProject = rootProject) }
}
Platform[201].orLower {
testCompile(intellijDep()) { includeJars("groovy-all", rootProject = rootProject) }
testCompile(intellijDep()) { includeJars("util", "idea", "idea_rt", "groovy-all", rootProject = rootProject) }
Platform[191].orLower {
testCompile(intellijDep()) { includeJars("jps-builders") }
}
Platform[192].orHigher {
testCompile(intellijPluginDep("java")) { includeJars("jps-builders") }
@@ -63,10 +59,9 @@ projectTest {
}
workingDir = rootDir
useAndroidEmulator(this)
}
val generateAndroidTests by generator("org.jetbrains.kotlin.android.tests.CodegenTestsOnAndroidGenerator")
val generateTests by generator("org.jetbrains.kotlin.android.tests.CodegenTestsOnAndroidGenerator")
generateAndroidTests.workingDir = rootDir
generateAndroidTests.dependsOn(rootProject.tasks.named("dist"))
generateTests.workingDir = rootDir
generateTests.dependsOn(rootProject.tasks.named("dist"))

View File

@@ -19,8 +19,10 @@ package org.jetbrains.kotlin.android.tests
import com.intellij.util.PlatformUtils
import junit.framework.TestCase
import junit.framework.TestSuite
import org.jetbrains.kotlin.android.tests.download.SDKDownloader
import org.jetbrains.kotlin.android.tests.emulator.Emulator
import org.jetbrains.kotlin.android.tests.gradle.GradleRunner
import org.jetbrains.kotlin.android.tests.run.PermissionManager
import org.junit.Assert
import org.w3c.dom.Element
import org.xml.sax.SAXException
@@ -37,6 +39,8 @@ class CodegenTestsOnAndroidRunner private constructor(private val pathManager: P
private fun runTestsInEmulator(): TestSuite {
val rootSuite = TestSuite("Root")
downloadDependencies()
val emulatorType = if (isTeamcity) Emulator.ARM else Emulator.X86
println("Using $emulatorType emulator!")
val emulator = Emulator(pathManager, emulatorType)
@@ -52,16 +56,16 @@ class CodegenTestsOnAndroidRunner private constructor(private val pathManager: P
try {
emulator.waitEmulatorStart()
runTestsOnEmulator(gradleRunner, TestSuite("D8")).apply {
runTestsOnEmulator(gradleRunner, TestSuite("Dex")).apply {
rootSuite.addTest(this)
}
renameFlavorFolder()
enableD8(false)
runTestsOnEmulator(gradleRunner, TestSuite("DX")).apply {
enableD8(true)
runTestsOnEmulator(gradleRunner, TestSuite("D8")).apply {
(0 until this.countTestCases()).forEach {
val testCase = testAt(it) as TestCase
testCase.name += "_DX"
testCase.name += "_D8"
}
rootSuite.addTest(this)
}
@@ -102,14 +106,14 @@ class CodegenTestsOnAndroidRunner private constructor(private val pathManager: P
testCases.forEach { aCase -> suite.addTest(aCase) }
Assert.assertNotEquals("There is no test results in report", 0, testCases.size.toLong())
}
} catch (e: Throwable) {
} catch (e: Exception) {
throw RuntimeException("Can't parse test results in $reportFolder\n$resultOutput", e)
}
}
private fun renameFlavorFolder() {
val reportFolder = File(flavorFolder())
reportFolder.renameTo(File(reportFolder.parentFile, reportFolder.name + "_d8"))
reportFolder.renameTo(File(reportFolder.parentFile, reportFolder.name + "_dex"))
}
private fun flavorFolder() = pathManager.tmpFolder + "/build/test/results/connected/flavors"
@@ -130,6 +134,18 @@ class CodegenTestsOnAndroidRunner private constructor(private val pathManager: P
}
private fun downloadDependencies() {
val rootForAndroidDependencies = File(pathManager.dependenciesRoot)
if (!rootForAndroidDependencies.exists()) {
rootForAndroidDependencies.mkdirs()
}
val downloader = SDKDownloader(pathManager)
downloader.downloadAll()
downloader.unzipAll()
PermissionManager.setPermissions(pathManager)
}
companion object {
@JvmStatic

View File

@@ -16,7 +16,7 @@
package org.jetbrains.kotlin.android.tests;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.android.tests.download.SDKDownloader;
import java.io.File;
@@ -35,7 +35,7 @@ public class PathManager {
}
public String getAndroidAvdRoot() {
String androidEmulatorRoot = getAndroidSdkRoot() + "/compiler_box_test_avd";
String androidEmulatorRoot = getAndroidSdkRoot() + "/emulatoravd";
new File(androidEmulatorRoot).mkdirs();
return androidEmulatorRoot;
}
@@ -52,8 +52,12 @@ public class PathManager {
return getAndroidSdkRoot() + "/emulator";
}
public String getOutputForCompiledFiles(String flavor) {
return tmpFolder + "/libs/" + flavor;
public String getBuildToolsFolderInAndroidSdk() {
return getAndroidSdkRoot() + "/build-tools";
}
public String getOutputForCompiledFiles(int index) {
return tmpFolder + "/libs/libtest" + index;
}
public String getLibsFolderInAndroidTmpFolder() {
@@ -69,7 +73,19 @@ public class PathManager {
}
public String getAndroidSdkRoot() {
return KotlinTestUtils.getAndroidSdkSystemIndependentPath();
return getDependenciesRoot() + "/android-sdk";
}
public String getDependenciesRoot() {
return rootFolder + "/android.tests.dependencies";
}
public String getGradleBinFolder() {
return getDependenciesRoot() + "/gradle-" + SDKDownloader.GRADLE_VERSION + "/bin";
}
public String getRootForDownload() {
return getDependenciesRoot() + "/download";
}
public String getAndroidModuleRoot() {

View File

@@ -0,0 +1,269 @@
/*
* Copyright 2010-2015 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.kotlin.android.tests.download;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.kotlin.android.tests.PathManager;
import org.jetbrains.kotlin.android.tests.run.RunUtils;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class SDKDownloader {
private final String platformZipPath;
private final String armImage;
private final String x86Image;
private final String platformToolsZipPath;
private final String skdToolsZipPath;
private final String buildToolsZipPath;
private final String gradleZipPath;
private final String emulatorZipPath;
private final PathManager pathManager;
private static final String PLATFORM_TOOLS = "28.0.1";
private static final String SDK_TOOLS = "4333796"; //"26.1.1";
public static final String BUILD_TOOLS = "28.0.3";
private static final int ANDROID_VERSION = 19;
public static final String GRADLE_VERSION = "5.1.1";
public static final String EMULATOR_TOOLS_VERSION = "5264690"; //"28.0.23";
public SDKDownloader(PathManager pathManager) {
this.pathManager = pathManager;
platformZipPath = pathManager.getRootForDownload() + "/platform" + ANDROID_VERSION + ".zip";
armImage = pathManager.getRootForDownload() + "/arm-image.zip";
x86Image = pathManager.getRootForDownload() + "/x86-image.zip";
platformToolsZipPath = pathManager.getRootForDownload() + "/platform-tools" + PLATFORM_TOOLS + ".zip";
skdToolsZipPath = pathManager.getRootForDownload() + "/sdk-tools" + SDK_TOOLS + ".zip";
buildToolsZipPath = pathManager.getRootForDownload() + "/build-tools" + BUILD_TOOLS + ".zip";
gradleZipPath = pathManager.getRootForDownload() + "/gradle" + GRADLE_VERSION + ".zip";
emulatorZipPath = pathManager.getRootForDownload() + "/emulator" + EMULATOR_TOOLS_VERSION + ".zip";
}
public void downloadPlatform() {
download("https://dl-ssl.google.com/android/repository/android-" + ANDROID_VERSION + "_r04.zip", platformZipPath); //Same for all platforms
}
private void downloadAbi() {
download("https://dl.google.com/android/repository/sys-img/android/armeabi-v7a-" + ANDROID_VERSION + "_r05.zip", armImage); //Same for all platforms
download("https://dl.google.com/android/repository/sys-img/android/x86-" + ANDROID_VERSION + "_r06.zip", x86Image); //Same for all platforms
}
public void downloadPlatformTools() {
download(getDownloadUrl("https://dl-ssl.google.com/android/repository/platform-tools_r" + PLATFORM_TOOLS), platformToolsZipPath);
}
public void downloadSdkTools() {
download("https://dl.google.com/android/repository/sdk-tools-" + getPlatformName() + "-" + SDK_TOOLS + ".zip",
skdToolsZipPath);
}
public void downloadBuildTools() {
download(getDownloadUrl("https://dl.google.com/android/repository/build-tools_r" + BUILD_TOOLS), buildToolsZipPath);
}
public void downloadEmulator() {
download("https://dl.google.com/android/repository/emulator-" + getPlatformName() + "-" + EMULATOR_TOOLS_VERSION + ".zip",
emulatorZipPath);
}
public void downloadGradle() {
download("https://services.gradle.org/distributions/gradle-" + GRADLE_VERSION + "-bin.zip", gradleZipPath);
}
private static String getDownloadUrl(String prefix) {
String suffix;
if (SystemInfo.isWindows) {
suffix = "-windows.zip";
}
else if (SystemInfo.isMac) {
suffix = "-macosx.zip";
}
else if (SystemInfo.isUnix) {
suffix = "-linux.zip";
}
else {
throw new IllegalStateException("Your operating system isn't supported yet.");
}
return prefix + suffix;
}
private static String getPlatformName() {
if (SystemInfo.isWindows) {
return "windows";
}
else if (SystemInfo.isMac) {
return "darwin";
}
else if (SystemInfo.isUnix) {
return "linux";
}
else {
throw new IllegalStateException("Your operating system isn't supported yet.");
}
}
public void downloadAll() {
downloadSdkTools();
downloadAbi();
downloadPlatform();
downloadPlatformTools();
downloadBuildTools();
downloadGradle();
downloadEmulator();
}
public void unzipAll() {
String androidSdkRoot = pathManager.getAndroidSdkRoot();
unzip(platformZipPath, pathManager.getPlatformFolderInAndroidSdk());
new File(pathManager.getPlatformFolderInAndroidSdk() + "/android-4.4.2").renameTo(new File(pathManager.getPlatformFolderInAndroidSdk() + "/android-" + ANDROID_VERSION));
unzip(armImage, androidSdkRoot + "/system-images/android-" + ANDROID_VERSION + "/default/");
unzip(x86Image, androidSdkRoot + "/system-images/android-" + ANDROID_VERSION + "/default/");
unzip(platformToolsZipPath, androidSdkRoot);
unzip(skdToolsZipPath, androidSdkRoot);
unzip(gradleZipPath, pathManager.getDependenciesRoot());
//BUILD TOOLS
String buildTools = androidSdkRoot + "/build-tools/";
unzip(buildToolsZipPath, buildTools);
unzip(emulatorZipPath, androidSdkRoot);
}
public void deleteAll() {
delete(platformZipPath);
delete(platformToolsZipPath);
delete(skdToolsZipPath);
delete(buildToolsZipPath);
delete(armImage);
delete(x86Image);
delete(gradleZipPath);
}
private static void download(String urlString, String output) {
System.out.println("Start downloading: " + urlString + " to " + output);
OutputStream outStream = null;
URLConnection urlConnection;
InputStream is;
try {
URL Url;
byte[] buf;
int read;
//int written = 0;
Url = new URL(urlString);
File outputFile = new File(output);
outputFile.getParentFile().mkdirs();
if (outputFile.exists()) {
System.out.println("File was already downloaded: " + output);
return;
}
outputFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(outputFile);
outStream = new BufferedOutputStream(outputStream);
urlConnection = Url.openConnection();
is = urlConnection.getInputStream();
buf = new byte[1024];
while ((read = is.read(buf)) != -1) {
outStream.write(buf, 0, read);
//written += read;
}
}
catch (Exception e) {
throw new RuntimeException(e);
}
finally {
RunUtils.close(outStream);
}
System.out.println("Finish downloading: " + urlString + " to " + output);
}
protected void unzip(String pathToFile, String outputFolder) {
System.out.println("Start unzipping: " + pathToFile + " to " + outputFolder);
String pathToUnzip;
if (outputFolder.equals(pathManager.getPlatformFolderInAndroidSdk())) {
pathToUnzip = outputFolder;
}
else {
pathToUnzip = outputFolder + "/" + FileUtil.getNameWithoutExtension(new File(pathToFile));
}
if (new File(pathToUnzip).listFiles() != null) {
System.out.println("File was already unzipped: " + pathToFile);
return;
}
try {
byte[] buf = new byte[1024];
ZipEntry zipEntry = null;
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(pathToFile))) {
zipEntry = zipInputStream.getNextEntry();
while (zipEntry != null) {
String entryName = zipEntry.getName();
int n;
File outputFile = new File(outputFolder + "/" + entryName);
if (zipEntry.isDirectory()) {
outputFile.mkdirs();
zipInputStream.closeEntry();
zipEntry = zipInputStream.getNextEntry();
continue;
}
else {
File parentFile = outputFile.getParentFile();
if (parentFile != null && !parentFile.exists()) {
parentFile.mkdirs();
}
outputFile.createNewFile();
}
try (FileOutputStream fileOutputStream = new FileOutputStream(outputFile)) {
while ((n = zipInputStream.read(buf, 0, 1024)) > -1) {
fileOutputStream.write(buf, 0, n);
}
}
zipInputStream.closeEntry();
zipEntry = zipInputStream.getNextEntry();
}
}
catch (IOException e) {
if (zipEntry != null) {
System.err.println("Entry name: " + zipEntry.getName());
}
e.printStackTrace();
}
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("Finish unzipping: " + pathToFile + " to " + outputFolder);
}
private static void delete(String filePath) {
new File(filePath).delete();
}
}

View File

@@ -48,8 +48,8 @@ public class Emulator {
private GeneralCommandLine getCreateCommand() {
GeneralCommandLine commandLine = new GeneralCommandLine();
String androidCmdName = SystemInfo.isWindows ? "avdmanager.bat" : "avdmanager";
commandLine.setExePath(pathManager.getToolsFolderInAndroidSdk() + "/bin/" + androidCmdName);
String androidCmdName = SystemInfo.isWindows ? "android.bat" : "android";
commandLine.setExePath(pathManager.getToolsFolderInAndroidSdk() + "/" + androidCmdName);
commandLine.addParameter("create");
commandLine.addParameter("avd");
commandLine.addParameter("--force");

View File

@@ -31,8 +31,8 @@ public class GradleRunner {
public GradleRunner(PathManager pathManager) {
listOfCommands = new ArrayList<>();
String cmdName = SystemInfo.isWindows ? "gradlew.bat" : "gradlew";
listOfCommands.add(pathManager.getTmpFolder() + "/" + cmdName);
String cmdName = SystemInfo.isWindows ? "gradle.bat" : "gradle";
listOfCommands.add(pathManager.getGradleBinFolder() + "/" + cmdName);
listOfCommands.add("--no-daemon");
listOfCommands.add("--build-file");
listOfCommands.add(pathManager.getTmpFolder() + "/build.gradle");

View File

@@ -0,0 +1,64 @@
/*
* Copyright 2010-2015 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.kotlin.android.tests.run;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.openapi.util.SystemInfo;
import org.jetbrains.kotlin.android.tests.PathManager;
import org.jetbrains.kotlin.android.tests.download.SDKDownloader;
import java.io.File;
public class PermissionManager {
private PermissionManager() {
}
public static void setPermissions(PathManager pathManager) {
if (!SystemInfo.isWindows) {
setExecPermissionForSimpleNamedFiles(new File(pathManager.getToolsFolderInAndroidSdk()));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getBuildToolsFolderInAndroidSdk() + "/" + SDKDownloader.BUILD_TOOLS));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getPlatformToolsFolderInAndroidSdk()));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getToolsFolderInAndroidSdk() +"/bin"));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getEmulatorFolderInAndroidSdk()));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getEmulatorFolderInAndroidSdk() +"/bin"));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getEmulatorFolderInAndroidSdk() +"/bin64"));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getEmulatorFolderInAndroidSdk() +"/qemu/linux-x86_64"));
setExecPermissionForSimpleNamedFiles(new File(pathManager.getAndroidSdkRoot() + "/system-images/android-19/default/armeabi-v7a/"));
RunUtils.execute(generateChmodCmd(pathManager.getGradleBinFolder() + "/gradle"));
}
}
private static void setExecPermissionForSimpleNamedFiles(File folder) {
File[] files = folder.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile() && !file.getName().contains(".")) {
RunUtils.execute(generateChmodCmd(file.getAbsolutePath()));
}
}
}
}
private static GeneralCommandLine generateChmodCmd(String path) {
GeneralCommandLine commandLine = new GeneralCommandLine();
commandLine.setExePath("chmod");
commandLine.addParameter("a+x");
commandLine.addParameter(path);
return commandLine;
}
}

View File

@@ -17,10 +17,10 @@
package org.jetbrains.kotlin.android.tests
import com.intellij.openapi.util.Ref
import org.jetbrains.kotlin.codegen.CodegenTestCase
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.test.KotlinBaseTest
import java.io.File
import java.util.regex.Pattern
@@ -34,7 +34,7 @@ private data class OldPackageAndNew(val oldFqName: FqName, val newFqName: FqName
internal fun patchFilesAndAddTest(
testFile: File,
testFiles: List<KotlinBaseTest.TestFile>,
testFiles: List<CodegenTestCase.TestFile>,
filesHolder: CodegenTestsOnAndroidGenerator.FilesWriter
): FqName? {
if (testFiles.any { it.name.endsWith(".java") }) {
@@ -46,21 +46,18 @@ internal fun patchFilesAndAddTest(
val newPackagePrefix = testFile.path.replace("\\\\|-|\\.|/".toRegex(), "_")
val oldPackage = Ref<FqName>()
val isJvmName = Ref<Boolean>(false)
val isSingle = testFiles.size == 1
val resultFiles = testFiles.map {
val fileName = if (isSingle) it.name else testFile.name.substringBeforeLast(".kt") + "/" + it.name
TestClassInfo(
fileName,
changePackage(newPackagePrefix, it.content, oldPackage, isJvmName),
changePackage(newPackagePrefix, it.content, oldPackage),
oldPackage.get(),
isJvmName.get(),
getGeneratedClassName(File(fileName), it.content, newPackagePrefix, oldPackage.get())
)
}
val packages =
resultFiles.map { OldPackageAndNew(it.oldPackage, it.newPackagePartClassId.parent()) }
.sortedByDescending { it.oldFqName.asString().length }
resultFiles.map { OldPackageAndNew(it.oldPackage, it.newClassId.parent()) }.sortedByDescending { it.oldFqName.asString().length }
//If files contain any val or var declaration with same name as any package name
// then use old conservative renaming scheme, otherwise use aggressive one
@@ -97,7 +94,7 @@ internal fun patchFilesAndAddTest(
/*replace all Class.forName*/
resultFiles.forEach { file ->
file.content = resultFiles.fold(file.content) { r, param ->
patchClassForName(param.newPackagePartClassId, param.oldPackage, r, conservativeRenameScheme)
patchClassForName(param.newClassId, param.oldPackage, r, conservativeRenameScheme)
}
}
@@ -106,13 +103,6 @@ internal fun patchFilesAndAddTest(
file.content = file.content.patchSelfImports(file.newPackage)
}
//patch root package parts usages in strings
resultFiles.forEach { file ->
file.content = resultFiles.fold(file.content) { r, param ->
patchRootPartNamesInStrings(param.newPackagePartClassId, param.oldPackage, param.isJvmName, r)
}
}
val boxFiles = resultFiles.filter { hasBoxMethod(it.content) }
if (boxFiles.size != 1) {
println("Several box methods in $testFile")
@@ -120,22 +110,22 @@ internal fun patchFilesAndAddTest(
filesHolder.addTest(
resultFiles.filter { resultFile -> resultFile.name.endsWith(".kt") || resultFile.name.endsWith(".kts") },
TestInfo("", boxFiles.last().newPackagePartClassId, testFile)
TestInfo("", boxFiles.last().newClassId, testFile)
)
return boxFiles.last().newPackagePartClassId
return boxFiles.last().newClassId
}
private fun hasBoxMethod(text: String): Boolean {
return text.contains("fun box()")
}
class TestClassInfo(val name: String, var content: String, val oldPackage: FqName, val isJvmName: Boolean, val newPackagePartClassId: FqName) {
val newPackage = newPackagePartClassId.parent()
class TestClassInfo(val name: String, var content: String, val oldPackage: FqName, val newClassId: FqName) {
val newPackage = newClassId.parent()
}
private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Ref<FqName>, isJvmName: Ref<Boolean>): String {
private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Ref<FqName>): String {
val matcher = packagePattern.matcher(text)
if (matcher.find()) {
val oldPackageName = matcher.toMatchResult().group(1)
@@ -147,7 +137,6 @@ private fun changePackage(newPackagePrefix: String, text: String, oldPackage: Re
if (text.contains("@file:")) {
val index = text.lastIndexOf("@file:")
val packageDirectiveIndex = text.indexOf("\n", index)
isJvmName.set(true)
return text.substring(0, packageDirectiveIndex + 1) + packageDirective + text.substring(packageDirectiveIndex + 1)
} else {
return packageDirective + text
@@ -180,19 +169,6 @@ private fun patchClassForName(className: FqName, oldPackage: FqName, text: Strin
)
}
private fun patchRootPartNamesInStrings(
className: FqName,
oldPackage: FqName,
isJvmName: Boolean,
text: String
): String {
if (!oldPackage.isRoot || isJvmName) return text
return text.replace(
("\"" + oldPackage.child(className.shortName()).asString()).toRegex(),
"\"" + className.asString()
)
}
private fun patchPackages(newPackage: FqName, oldPackage: FqName, text: String): String {
if (oldPackage.isRoot) return text

View File

@@ -5,9 +5,7 @@
package org.jetbrains.kotlin.android.tests
import com.intellij.openapi.Disposable
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.SystemInfo
import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.util.io.FileUtilRt
import org.jetbrains.kotlin.cli.common.output.writeAllTo
@@ -19,102 +17,50 @@ import org.jetbrains.kotlin.codegen.GenerationUtils
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.*
import org.junit.Assert
import org.junit.Ignore
import java.io.File
import java.io.FileWriter
import java.io.IOException
import kotlin.test.assertTrue
data class ConfigurationKey(val kind: ConfigurationKind, val jdkKind: TestJdkKind, val configuration: String)
class CodegenTestsOnAndroidGenerator private constructor(private val pathManager: PathManager) {
@Ignore
class CodegenTestsOnAndroidGenerator private constructor(private val pathManager: PathManager) : CodegenTestCase() {
private var writtenFilesCount = 0
private var currentModuleIndex = 1
private val pathFilter: String? = System.getProperties().getProperty("kotlin.test.android.path.filter")
private val pendingUnitTestGenerators = hashMapOf<String, UnitTestFileWriter>()
private val pendingUnitTestGenerators = hashMapOf<Int, UnitTestFileWriter>()
//keep it globally to avoid test grouping on TC
private val generatedTestNames = hashSetOf<String>()
private val COMMON = FlavorConfig("common", 3);
private val REFLECT = FlavorConfig("reflect", 1);
private val JVM8 = FlavorConfig("jvm8", 1);
private val JVM8REFLECT = FlavorConfig("reflectjvm8", 1);
class FlavorConfig(private val prefix: String, val limit: Int) {
private var writtenFilesCount = 0
fun printStatistics() {
println("FlavorTestCompiler: $prefix, generated file count: $writtenFilesCount")
}
fun getFlavorForNewFiles(newFilesCount: Int): String {
writtenFilesCount += newFilesCount
//2500 files per folder that would be used by flavor to avoid multidex usage,
// each folder would be jared by build.gradle script
val index = writtenFilesCount / 2500
return getFlavorName(index, prefix).also {
assertTrue("Please Add new flavor in build.gradle for $it") { index < limit }
}
}
private fun getFlavorName(index: Int, prefix: String): String {
return prefix + index
}
fun getFlavorUnitTestFilePath(index: Int): String {
return pathManager.srcFolderInAndroidTmpFolder + "/androidTestKtest$index/java/" + testClassPackage.replace(
".",
"/"
) + "/" + testClassName + "$index.java"
}
private fun prepareAndroidModuleAndGenerateTests(skipSdkDirWriting: Boolean) {
prepareAndroidModule(skipSdkDirWriting)
private fun prepareAndroidModuleAndGenerateTests() {
prepareAndroidModule()
generateTestsAndFlavourSuites()
}
private fun prepareAndroidModule(skipSdkDirWriting: Boolean) {
private fun prepareAndroidModule() {
FileUtil.copyDir(File(pathManager.androidModuleRoot), File(pathManager.tmpFolder))
if (!skipSdkDirWriting) {
writeAndroidSkdToLocalProperties(pathManager)
}
writeAndroidSkdToLocalProperties(pathManager)
println("Copying kotlin-stdlib.jar and kotlin-reflect.jar in android module...")
copyKotlinRuntimeJars()
copyGradleWrapperAndPatch()
}
private fun copyGradleWrapperAndPatch() {
val projectRoot = File(pathManager.tmpFolder)
val target = File(projectRoot, "gradle/wrapper")
File("./gradle/wrapper/").copyRecursively(target)
val gradlew = File(projectRoot, "gradlew")
File("./gradlew").copyTo(gradlew).also {
if (!SystemInfo.isWindows) {
it.setExecutable(true)
}
}
File("./gradlew.bat").copyTo(File(projectRoot, "gradlew.bat"));
val file = File(target, "gradle-wrapper.properties")
file.readLines().map {
when {
it.startsWith("distributionUrl") -> "distributionUrl=https\\://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip"
it.startsWith("distributionSha256Sum") -> "distributionSha256Sum=$GRADLE_SHA_256"
else -> it
}
}.let { lines ->
FileWriter(file).use { fw ->
lines.forEach { line ->
fw.write("$line\n")
}
}
}
}
private fun copyKotlinRuntimeJars() {
FileUtil.copy(
ForTestCompileRuntime.runtimeJarForTests(),
@@ -150,15 +96,9 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
holders.values.forEach {
it.writeFilesOnDisk()
}
COMMON.printStatistics()
REFLECT.printStatistics()
JVM8.printStatistics()
JVM8REFLECT.printStatistics()
}
internal inner class FilesWriter(
private val flavorConfig: FlavorConfig,
private val configuration: CompilerConfiguration
) {
private val rawFiles = arrayListOf<TestClassInfo>()
@@ -173,40 +113,38 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
}
fun writeFilesOnDisk() {
val disposable = Disposer.newDisposable()
val disposable = TestDisposable()
val environment = KotlinCoreEnvironment.createForTests(
disposable,
configuration.copy().apply { put(CommonConfigurationKeys.MODULE_NAME, "android-module-" + currentModuleIndex++) },
EnvironmentConfigFiles.JVM_CONFIG_FILES
)
try {
writeFiles(
rawFiles.map {
try {
CodegenTestFiles.create(it.name, it.content, environment.project).psiFile
} catch (e: Throwable) {
throw RuntimeException("Error on processing ${it.name}:\n${it.content}", e)
}
}, environment, unitTestDescriptions
)
} finally {
rawFiles.clear()
unitTestDescriptions.clear()
Disposer.dispose(disposable)
}
writeFiles(
rawFiles.map {
try {
CodegenTestFiles.create(it.name, it.content, environment.project).psiFile
} catch (e: Throwable) {
throw RuntimeException("Error on processing ${it.name}:\n${it.content}", e)
}
}, environment
)
Disposer.dispose(disposable)
rawFiles.clear()
unitTestDescriptions.clear()
}
private fun writeFiles(
filesToCompile: List<KtFile>,
environment: KotlinCoreEnvironment,
unitTestDescriptions: ArrayList<TestInfo>
) {
private fun writeFiles(filesToCompile: List<KtFile>, environment: KotlinCoreEnvironment) {
if (filesToCompile.isEmpty()) return
val flavorName = flavorConfig.getFlavorForNewFiles(filesToCompile.size)
//3000 files per folder that would be used by flavor to avoid multidex usage,
// each folder would be jared by build.gradle script
writtenFilesCount += filesToCompile.size
val index = writtenFilesCount / 3000
val outputDir = File(pathManager.getOutputForCompiledFiles(index))
assertTrue("Add flavors for ktest$index", index < 2)
val outputDir = File(pathManager.getOutputForCompiledFiles(flavorName))
println("Generating ${filesToCompile.size} files into ${outputDir.name}, configuration: '${environment.configuration}'...")
val outputFiles = GenerationUtils.compileFiles(filesToCompile, environment).run { destroy(); factory }
@@ -215,10 +153,10 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
outputDir.mkdirs()
}
Assert.assertTrue("Cannot create directory for compiled files", outputDir.exists())
val unitTestFileWriter = pendingUnitTestGenerators.getOrPut(flavorName) {
val unitTestFileWriter = pendingUnitTestGenerators.getOrPut(index) {
UnitTestFileWriter(
getFlavorUnitTestFolder(flavorName),
flavorName,
getFlavorUnitTestFilePath(index),
index,
generatedTestNames
)
}
@@ -226,12 +164,6 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
outputFiles.writeAllTo(outputDir)
}
private fun getFlavorUnitTestFolder(flavourName: String): String {
return pathManager.srcFolderInAndroidTmpFolder +
"/androidTest${flavourName.capitalize()}/java/" +
testClassPackage.replace(".", "/") + "/"
}
fun addTest(testFiles: List<TestClassInfo>, info: TestInfo) {
rawFiles.addAll(testFiles)
unitTestDescriptions.add(info)
@@ -248,6 +180,9 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
}
for (file in files) {
if (SpecialFiles.getExcludedFiles().contains(file.name)) {
continue
}
if (file.isDirectory) {
val listFiles = file.listFiles()
if (listFiles != null) {
@@ -260,9 +195,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
continue
}
if (!InTextDirectivesUtils.isPassingTarget(TargetBackend.JVM, file) ||
InTextDirectivesUtils.isIgnoredTarget(TargetBackend.ANDROID, file)
) {
if (!InTextDirectivesUtils.isPassingTarget(TargetBackend.JVM, file)) {
continue
}
@@ -278,32 +211,23 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
if (fullFileText.contains("@file:JvmPackageName(")) continue
// TODO: Support jvm assertions
if (fullFileText.contains("// KOTLIN_CONFIGURATION_FLAGS: ASSERTIONS_MODE=jvm")) continue
val targets = InTextDirectivesUtils.findLinesWithPrefixesRemoved(fullFileText, "// JVM_TARGET:")
.also { it.remove(JvmTarget.JVM_1_6.description) }
val isJvm8Target =
if (targets.isEmpty()) false
else if (targets.contains(JvmTarget.JVM_1_8.description) && targets.size == 1) true
else continue //TODO: support other targets on Android
// TODO: support JVM 8 test with D8
if (fullFileText.contains("// JVM_TARGET")) continue
// TODO: support SKIP_JDK6 on new platforms
if (fullFileText.contains("// SKIP_JDK6")) continue
if (hasBoxMethod(fullFileText)) {
val testFiles = createTestFiles(file, fullFileText)
val kind = KotlinBaseTest.extractConfigurationKind(testFiles)
val jdkKind = KotlinBaseTest.getTestJdkKind(testFiles)
val kind = extractConfigurationKind(testFiles)
val jdkKind = getJdkKind(testFiles)
val keyConfiguration = CompilerConfiguration()
CodegenTestCase.updateConfigurationByDirectivesInTestFiles(testFiles, keyConfiguration)
updateConfigurationByDirectivesInTestFiles(testFiles, keyConfiguration)
val key = ConfigurationKey(kind, jdkKind, keyConfiguration.toString())
val compiler = if (isJvm8Target) {
if (kind.withReflection) JVM8REFLECT else JVM8
} else if (kind.withReflection) REFLECT else COMMON
val filesHolder = holders.getOrPut(key) {
FilesWriter(compiler, KotlinTestUtils.newConfiguration(kind, jdkKind, KotlinTestUtils.getAnnotationsJar()).apply {
FilesWriter(KotlinTestUtils.newConfiguration(kind, jdkKind, KotlinTestUtils.getAnnotationsJar()).apply {
println("Creating new configuration by $key")
CodegenTestCase.updateConfigurationByDirectivesInTestFiles(testFiles, this)
updateConfigurationByDirectivesInTestFiles(testFiles, this)
})
}
@@ -313,12 +237,19 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
}
}
private fun createTestFiles(file: File, expectedText: String): List<KotlinBaseTest.TestFile> =
CodegenTestCase.createTestFilesFromFile(file, expectedText, "kotlin.coroutines", false, TargetBackend.JVM)
private fun createTestFiles(file: File, expectedText: String): List<TestFile> =
TestFiles.createTestFiles(
file.name,
expectedText,
object : TestFiles.TestFileFactoryNoModules<TestFile>() {
override fun create(fileName: String, text: String, directives: Map<String, String>): TestFile {
return TestFile(fileName, text)
}
}, false,
"kotlin.coroutines"
)
companion object {
const val GRADLE_VERSION = "5.6.4" // update GRADLE_SHA_256 on change
const val GRADLE_SHA_256 = "1f3067073041bc44554d0efe5d402a33bc3d3c93cc39ab684f308586d732a80d"
const val testClassPackage = "org.jetbrains.kotlin.android.tests"
const val testClassName = "CodegenTestCaseOnAndroid"
const val baseTestClassPackage = "org.jetbrains.kotlin.android.tests"
@@ -326,11 +257,10 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
const val generatorName = "CodegenTestsOnAndroidGenerator"
@JvmOverloads
@JvmStatic
@Throws(Throwable::class)
fun generate(pathManager: PathManager, skipSdkDirWriting: Boolean = false) {
CodegenTestsOnAndroidGenerator(pathManager).prepareAndroidModuleAndGenerateTests(skipSdkDirWriting)
fun generate(pathManager: PathManager) {
CodegenTestsOnAndroidGenerator(pathManager).prepareAndroidModuleAndGenerateTests()
}
private fun hasBoxMethod(text: String): Boolean {
@@ -339,7 +269,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
@Throws(IOException::class)
internal fun writeAndroidSkdToLocalProperties(pathManager: PathManager) {
val sdkRoot = KotlinTestUtils.getAndroidSdkSystemIndependentPath()
val sdkRoot = File(pathManager.androidSdkRoot).invariantSeparatorsPath
println("Writing android sdk to local.properties: $sdkRoot")
val file = File(pathManager.tmpFolder + "/local.properties")
FileWriter(file).use { fw -> fw.write("sdk.dir=$sdkRoot") }
@@ -351,8 +281,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager
println("Created temporary folder for android tests: " + tmpFolder.absolutePath)
val rootFolder = File("")
val pathManager = PathManager(rootFolder.absolutePath, tmpFolder.absolutePath)
generate(pathManager, true)
println("Android test project is generated into " + tmpFolder.absolutePath + " folder")
generate(pathManager)
}
}
}

View File

@@ -0,0 +1,90 @@
/*
* Copyright 2010-2017 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.kotlin.android.tests;
import java.util.HashSet;
import java.util.Set;
public class SpecialFiles {
private static final Set<String> excludedFiles = new HashSet<>();
static {
fillExcludedFiles();
}
public static Set<String> getExcludedFiles() {
return excludedFiles;
}
private static void fillExcludedFiles() {
// Reflection
excludedFiles.add("enclosing");
excludedFiles.add("kt10259.kt");
excludedFiles.add("simpleClassLiteral.kt");
//UnsatisfiedLinkError
excludedFiles.add("nativePropertyAccessors.kt");
excludedFiles.add("topLevel.kt");
//Test with no reflection at runtime
excludedFiles.add("noReflectAtRuntime");
excludedFiles.add("noReflect");
excludedFiles.add("functionNtoStringNoReflect.kt");
excludedFiles.add("getDelegateWithoutReflection.kt");
// "IOOBE: Invalid index 4, size is 4" for java.lang.reflect.ParameterizedType on Android
excludedFiles.add("innerGenericTypeArgument.kt");
// Cannot change package name
excludedFiles.add("kt6990.kt");
excludedFiles.add("typeParameters.kt");
excludedFiles.add("kt13133.kt");
// StackOverflow with StringBuilder (escape())
excludedFiles.add("kt684.kt");
// Wrong enclosing info or signature after package renaming
excludedFiles.add("enclosingInfo");
excludedFiles.add("signature");
// Some classes are not visible on android
excludedFiles.add("classpath.kt");
// Out of memory
excludedFiles.add("manyNumbers.kt");
// Native methods
excludedFiles.add("external");
// Additional nested class in 'Thread' class on Android
excludedFiles.add("nestedClasses.kt");
// KT-8120
excludedFiles.add("closureOfInnerLocalClass.kt");
excludedFiles.add("closureWithSelfInstantiation.kt");
excludedFiles.add("quotedClassName.kt");
//wrong function resolution after package renaming
excludedFiles.add("apiVersionAtLeast1.kt");
//special symbols in names
excludedFiles.add("nameWithWhitespace.kt");
}
private SpecialFiles() {
}
}

View File

@@ -15,11 +15,7 @@ import java.io.FileWriter
class TestInfo(val name: String, val fqName: FqName, val file: File)
class UnitTestFileWriter(
private val flavourFolder: String,
private val flavourName: String,
private val generatedTestNames: MutableSet<String>
) {
class UnitTestFileWriter(private val fileName: String, private val index: Int, private val generatedTestNames: MutableSet<String>) {
private val infos = arrayListOf<TestInfo>()
fun addTests(info: List<TestInfo>) {
@@ -27,7 +23,7 @@ class UnitTestFileWriter(
}
fun generate() {
FileWriter(File(flavourFolder, flavourName.capitalize() + ".java").also { it.parentFile.mkdirs() }).use { suite ->
FileWriter(File(fileName).also { it.parentFile.mkdirs() }).use { suite ->
val p = Printer(suite)
p.println(
"""package ${CodegenTestsOnAndroidGenerator.testClassPackage};
@@ -35,7 +31,7 @@ class UnitTestFileWriter(
|import ${CodegenTestsOnAndroidGenerator.baseTestClassPackage}.${CodegenTestsOnAndroidGenerator.baseTestClassName};
|
|/* This class is generated by ${CodegenTestsOnAndroidGenerator.generatorName}. DO NOT MODIFY MANUALLY */
|public class ${flavourName.capitalize()} extends ${CodegenTestsOnAndroidGenerator.baseTestClassName} {
|public class ${CodegenTestsOnAndroidGenerator.testClassName}$index extends ${CodegenTestsOnAndroidGenerator.baseTestClassName} {
|
""".trimMargin()
)

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