Do not run partial body resolve if full body resolve already cached

This commit is contained in:
Valentin Kipyatkov
2015-03-23 19:57:50 +03:00
parent 6aad2b2d65
commit 7a414336c1
5 changed files with 25 additions and 6 deletions
@@ -139,9 +139,8 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
this.module = rootDescriptor;
this.packages =
storageManager.createMemoizedFunctionWithNullableValues(new MemoizedFunctionToNullable<FqName, LazyPackageDescriptor>() {
storageManager.createMemoizedFunctionWithNullableValues(new Function1<FqName, LazyPackageDescriptor>() {
@Nullable
@Override
public LazyPackageDescriptor invoke(FqName fqName) {
return createPackage(fqName);
}
@@ -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<K, V> extends MapBasedMemoizedFunction<K, V> implements MemoizedFunctionToNotNull<K, V> {
@@ -16,8 +16,13 @@
package org.jetbrains.kotlin.storage
public trait MemoizedFunctionToNotNull<P, R : Any> : Function1<P, R>
public trait MemoizedFunctionToNullable<P, R : Any> : Function1<P, R?>
public trait MemoizedFunctionToNotNull<P, R : Any> : Function1<P, R> {
public fun isComputed(key: P): Boolean
}
public trait MemoizedFunctionToNullable<P, R : Any> : Function1<P, R?> {
public fun isComputed(key: P): Boolean
}
public trait NotNullLazyValue<T : Any> : Function0<T> {
public fun isComputed(): Boolean
@@ -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);
}
@@ -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) {