From 15061ff125a3f769ca7ca83ca3ba9a68e52b5bf3 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Tue, 29 Nov 2016 05:53:20 +0300 Subject: [PATCH] Add known methods of collections and maps. --- .../predefinedEnhancementInfo.kt | 128 ++++++++++++++---- 1 file changed, 103 insertions(+), 25 deletions(-) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/predefinedEnhancementInfo.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/predefinedEnhancementInfo.kt index d7a617f6cda..ed811c9ac6f 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/predefinedEnhancementInfo.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhancement/predefinedEnhancementInfo.kt @@ -40,9 +40,12 @@ private val NOT_NULLABLE = JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, nul val PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE = signatures { val JLObject = javaLang("Object") val JFPredicate = javaFunction("Predicate") + val JFFunction = javaFunction("Function") val JFConsumer = javaFunction("Consumer") val JFBiFunction = javaFunction("BiFunction") - val JFFunction = javaFunction("Function") + val JFBiConsumer = javaFunction("BiConsumer") + val JFUnaryOperator = javaFunction("UnaryOperator") + val JUStream = javaUtil("stream/Stream") val JUOptional = javaUtil("Optional") enhancement { @@ -51,13 +54,69 @@ val PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE = signatures { parameter(JFConsumer, NOT_PLATFORM, NOT_PLATFORM) } } + forClass(javaLang("Iterable")) { + function("spliterator") { + returns(javaUtil("Spliterator"), NOT_PLATFORM, NOT_PLATFORM) + } + } forClass(javaUtil("Collection")) { function("removeIf") { parameter(JFPredicate, NOT_PLATFORM, NOT_PLATFORM) returns(BOOLEAN) } + function("stream") { + returns(JUStream, NOT_PLATFORM, NOT_PLATFORM) + } + function("parallelStream") { + returns(JUStream, NOT_PLATFORM, NOT_PLATFORM) + } + } + forClass(javaUtil("List")) { + function("replaceAll") { + parameter(JFUnaryOperator, NOT_PLATFORM, NOT_PLATFORM) + } } forClass(javaUtil("Map")) { + function("forEach") { + parameter(JFBiConsumer, NOT_PLATFORM, NOT_PLATFORM, NOT_PLATFORM) + } + function("putIfAbsent") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + returns(JLObject, NULLABLE) + } + function("replace") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + returns(JLObject, NULLABLE) + + } + function("replace") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + returns(BOOLEAN) + } + function("replaceAll") { + parameter(JFBiFunction, NOT_PLATFORM, NOT_PLATFORM, NOT_PLATFORM, NOT_PLATFORM) + } + function("compute") { + parameter(JLObject, NOT_PLATFORM) + parameter(JFBiFunction, NOT_PLATFORM, NOT_PLATFORM, NULLABLE, NULLABLE) + returns(JLObject, NULLABLE) + } + // while it is possible to return nullable value from lambda in computeIfAbsent, + // we deliberately make it just NOT_PLATFORM V in order to have the return type V and not V? + function("computeIfAbsent") { + parameter(JLObject, NOT_PLATFORM) + parameter(JFFunction, NOT_PLATFORM, NOT_PLATFORM, NOT_PLATFORM) + returns(JLObject, NOT_PLATFORM) + } + function("computeIfPresent") { + parameter(JLObject, NOT_PLATFORM) + parameter(JFBiFunction, NOT_PLATFORM, NOT_PLATFORM, NOT_NULLABLE, NULLABLE) + returns(JLObject, NULLABLE) + } function("merge") { parameter(JLObject, NOT_PLATFORM) parameter(JLObject, NOT_NULLABLE) @@ -65,30 +124,6 @@ val PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE = signatures { returns(JLObject, NULLABLE) } } - forClass(JFConsumer) { - function("accept") { - parameter(JLObject, NOT_PLATFORM) - } - } - forClass(JFPredicate) { - function("test") { - parameter(JLObject, NOT_PLATFORM) - returns(BOOLEAN) - } - } - forClass(JFFunction) { - function("apply") { - parameter(JLObject, NOT_PLATFORM) - returns(JLObject, NOT_PLATFORM) - } - } - forClass(JFBiFunction) { - function("apply") { - parameter(JLObject, NOT_PLATFORM) - parameter(JLObject, NOT_PLATFORM) - returns(JLObject, NOT_PLATFORM) - } - } forClass(JUOptional) { function("empty") { returns(JUOptional, NOT_PLATFORM, NOT_NULLABLE) @@ -108,6 +143,49 @@ val PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE = signatures { parameter(JFConsumer, NOT_PLATFORM, NOT_NULLABLE) } } + + forClass(JFPredicate) { + function("test") { + parameter(JLObject, NOT_PLATFORM) + returns(BOOLEAN) + } + } + forClass(javaFunction("BiPredicate")) { + function("test") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + returns(BOOLEAN) + } + } + forClass(JFConsumer) { + function("accept") { + parameter(JLObject, NOT_PLATFORM) + } + } + forClass(JFBiConsumer) { + function("accept") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + } + } + forClass(JFFunction) { + function("apply") { + parameter(JLObject, NOT_PLATFORM) + returns(JLObject, NOT_PLATFORM) + } + } + forClass(JFBiFunction) { + function("apply") { + parameter(JLObject, NOT_PLATFORM) + parameter(JLObject, NOT_PLATFORM) + returns(JLObject, NOT_PLATFORM) + } + } + forClass(javaFunction("Supplier")) { + function("get") { + returns(JLObject, NOT_PLATFORM) + } + } } }