diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index 0103d3e9a28..ffb9f9a89c8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -139,9 +139,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { this.module = rootDescriptor; this.packages = - storageManager.createMemoizedFunctionWithNullableValues(new MemoizedFunctionToNullable() { + storageManager.createMemoizedFunctionWithNullableValues(new Function1() { @Nullable - @Override public LazyPackageDescriptor invoke(FqName fqName) { return createPackage(fqName); } diff --git a/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java b/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java index 550ca3024f2..04578aa6006 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java +++ b/core/util.runtime/src/org/jetbrains/kotlin/storage/LockBasedStorageManager.java @@ -411,6 +411,12 @@ public class LockBasedStorageManager implements StorageManager { lock.unlock(); } } + + @Override + public boolean isComputed(K key) { + Object value = cache.get(key); + return value != null && value != NotValue.COMPUTING; + } } private class MapBasedMemoizedFunctionToNotNull extends MapBasedMemoizedFunction implements MemoizedFunctionToNotNull { diff --git a/core/util.runtime/src/org/jetbrains/kotlin/storage/storage.kt b/core/util.runtime/src/org/jetbrains/kotlin/storage/storage.kt index 9db570efed8..df12a52d943 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/storage/storage.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/storage/storage.kt @@ -16,8 +16,13 @@ package org.jetbrains.kotlin.storage -public trait MemoizedFunctionToNotNull : Function1 -public trait MemoizedFunctionToNullable : Function1 +public trait MemoizedFunctionToNotNull : Function1 { + public fun isComputed(key: P): Boolean +} + +public trait MemoizedFunctionToNullable : Function1 { + public fun isComputed(key: P): Boolean +} public trait NotNullLazyValue : Function0 { public fun isComputed(): Boolean diff --git a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.java b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.java index d0fde7b24f2..0540b60adec 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.java +++ b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/ElementResolver.java @@ -61,6 +61,10 @@ public abstract class ElementResolver { return elementAdditionalResolve(jetElement, jetElement, BodyResolveMode.FULL); } + public boolean hasElementAdditionalResolveCached(@NotNull JetElement jetElement) { + return false; + } + @NotNull public BindingContext resolveToElement(@NotNull JetElement jetElement) { return resolveToElement(jetElement, BodyResolveMode.FULL); @@ -95,8 +99,7 @@ public abstract class ElementResolver { elementOfAdditionalResolve = jetElement; } - if (bodyResolveMode != BodyResolveMode.FULL) { - //TODO: do not resolve with filter if whole body resolve cached already + if (bodyResolveMode != BodyResolveMode.FULL && !hasElementAdditionalResolveCached(jetElement)) { return elementAdditionalResolve(elementOfAdditionalResolve, jetElement, bodyResolveMode); } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java index 1a55b9deb42..5cfc06d6604 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.java @@ -76,6 +76,12 @@ public class ResolveElementCache extends ElementResolver { return additionalResolveCache.getValue().invoke(jetElement); } + @Override + public boolean hasElementAdditionalResolveCached(@NotNull JetElement jetElement) { + if (!additionalResolveCache.hasUpToDateValue()) return false; + return additionalResolveCache.getValue().isComputed(jetElement); + } + @NotNull @Override public AdditionalCheckerProvider getAdditionalCheckerProvider(@NotNull JetFile jetFile) {