From 557450677f246f96c53adf28df01611568f2a06c Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 24 Jul 2015 11:50:42 +0300 Subject: [PATCH] Rename, convert and optimize CompositeTypeSubstitution - Get rid of storing array of inner substituions - Rename is important as it wasn't actually composition --- .../impl/LazySubstitutingClassDescriptor.java | 2 +- .../kotlin/types/DescriptorSubstitutor.java | 2 +- .../DisjointKeysUnionTypeSubstitution.kt | 47 +++++-------------- .../kotlin/types/TypeSubstitutor.java | 4 +- 4 files changed, 17 insertions(+), 38 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java index fcb5372501f..7ff817722f0 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/LazySubstitutingClassDescriptor.java @@ -170,7 +170,7 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { @Override public ClassDescriptor substitute(@NotNull TypeSubstitutor substitutor) { if (substitutor.isEmpty()) return this; - return new LazySubstitutingClassDescriptor(this, TypeSubstitutor.create(substitutor.getSubstitution(), getSubstitutor().getSubstitution())); + return new LazySubstitutingClassDescriptor(this, TypeSubstitutor.createChainedSubstitutor(substitutor.getSubstitution(), getSubstitutor().getSubstitution())); } @Override diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/DescriptorSubstitutor.java b/core/descriptors/src/org/jetbrains/kotlin/types/DescriptorSubstitutor.java index 6ad0fd36e1b..4a77ed3ed59 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/DescriptorSubstitutor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/DescriptorSubstitutor.java @@ -61,7 +61,7 @@ public class DescriptorSubstitutor { result.add(substituted); } - TypeSubstitutor substitutor = TypeSubstitutor.create( + TypeSubstitutor substitutor = TypeSubstitutor.createChainedSubstitutor( originalSubstitution, TypeConstructorSubstitution.createByConstructorsMap(mutableSubstitution) ); diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/DisjointKeysUnionTypeSubstitution.kt b/core/descriptors/src/org/jetbrains/kotlin/types/DisjointKeysUnionTypeSubstitution.kt index 59373320558..fc860181966 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/DisjointKeysUnionTypeSubstitution.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/DisjointKeysUnionTypeSubstitution.kt @@ -17,45 +17,24 @@ package org.jetbrains.kotlin.types; import org.jetbrains.annotations.NotNull; +import kotlin.platform.platformStatic -public class CompositeTypeSubstitution extends TypeSubstitution { - private final TypeSubstitution[] inner; +public class DisjointKeysUnionTypeSubstitution private constructor( + private val first: TypeSubstitution, + private val second: TypeSubstitution +) : TypeSubstitution() { + companion object { + platformStatic public fun create(first: TypeSubstitution, second: TypeSubstitution): TypeSubstitution { + if (first.isEmpty()) return second + if (second.isEmpty()) return first - public CompositeTypeSubstitution(@NotNull TypeSubstitution... inner) { - this.inner = inner; - } - - @Override - public TypeProjection get(@NotNull JetType key) { - for (TypeSubstitution substitution : inner) { - TypeProjection value = substitution.get(key); - if (value != null) return value; + return DisjointKeysUnionTypeSubstitution(first, second) } - return null; } - @Override - public boolean isEmpty() { - for (TypeSubstitution substitution : inner) { - if (!substitution.isEmpty()) return false; - } - return true; - } + override fun get(key: JetType) = first[key] ?: second[key] - @Override - public boolean approximateCapturedTypes() { - for (TypeSubstitution substitution : inner) { - if (substitution.approximateCapturedTypes()) return true; - } - return false; - } + override fun isEmpty() = false - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - for (TypeSubstitution substitution : inner) { - builder.append(substitution).append(" * "); - } - return builder.toString(); - } + override fun approximateCapturedTypes() = first.approximateCapturedTypes() || second.approximateCapturedTypes() } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java index b551ba6f38a..99af5c145f5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeSubstitutor.java @@ -46,8 +46,8 @@ public class TypeSubstitutor { } @NotNull - public static TypeSubstitutor create(@NotNull TypeSubstitution... substitutions) { - return create(new CompositeTypeSubstitution(substitutions)); + public static TypeSubstitutor createChainedSubstitutor(@NotNull TypeSubstitution first, @NotNull TypeSubstitution second) { + return create(DisjointKeysUnionTypeSubstitution.create(first, second)); } @NotNull