Forced resolution of all contents enhanced

This commit is contained in:
Andrey Breslav
2013-09-26 13:13:24 -07:00
committed by Nikolay Krasko
parent 7c26271500
commit 783258d91a
4 changed files with 85 additions and 21 deletions
@@ -16,30 +16,49 @@
package org.jetbrains.jet.lang.resolve.lazy; package org.jetbrains.jet.lang.resolve.lazy;
import com.intellij.openapi.diagnostic.Logger;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeConstructor; import org.jetbrains.jet.lang.types.TypeConstructor;
import org.jetbrains.jet.lang.types.TypeProjection;
import java.util.Collection;
public class ForceResolveUtil { public class ForceResolveUtil {
private static final Logger LOG = Logger.getInstance(ForceResolveUtil.class);
private ForceResolveUtil() {} private ForceResolveUtil() {}
public static void forceResolveAllContents(@NotNull DeclarationDescriptor descriptor) { public static void forceResolveAllContents(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof LazyEntity) { LOG.debug("descriptor: " + descriptor);
LazyEntity lazyEntity = (LazyEntity) descriptor; doForceResolveAllContents(descriptor);
lazyEntity.forceResolveAllContents(); LOG.debug("<<< " + descriptor);
}
} }
public static void forceResolveAllContents(@NotNull JetScope scope) { public static void forceResolveAllContents(@NotNull JetScope scope) {
for (DeclarationDescriptor descriptor : scope.getAllDescriptors()) { forceResolveAllContents(scope.getAllDescriptors());
}
public static void forceResolveAllContents(@NotNull Iterable<? extends DeclarationDescriptor> descriptors) {
for (DeclarationDescriptor descriptor : descriptors) {
forceResolveAllContents(descriptor); forceResolveAllContents(descriptor);
} }
} }
public static void forceResolveAllContents(@NotNull Collection<JetType> types) {
for (JetType type : types) {
forceResolveAllContents(type);
}
}
public static void forceResolveAllContents(@NotNull TypeConstructor typeConstructor) { public static void forceResolveAllContents(@NotNull TypeConstructor typeConstructor) {
LOG.debug("descriptor: " + typeConstructor);
doForceResolveAllContents(typeConstructor); doForceResolveAllContents(typeConstructor);
LOG.debug("<<< " + typeConstructor);
} }
public static void forceResolveAllContents(@NotNull Annotations annotations) { public static void forceResolveAllContents(@NotNull Annotations annotations) {
@@ -48,8 +67,17 @@ public class ForceResolveUtil {
private static void doForceResolveAllContents(Object object) { private static void doForceResolveAllContents(Object object) {
if (object instanceof LazyEntity) { if (object instanceof LazyEntity) {
LazyEntity lazyConstructor = (LazyEntity) object; LazyEntity lazyEntity = (LazyEntity) object;
lazyConstructor.forceResolveAllContents(); lazyEntity.forceResolveAllContents();
}
}
public static void forceResolveAllContents(@Nullable JetType type) {
if (type == null) return;
forceResolveAllContents(type.getConstructor());
for (TypeProjection projection : type.getArguments()) {
forceResolveAllContents(projection.getType());
} }
} }
} }
@@ -84,6 +84,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
private final NotNullLazyValue<JetScope> scopeForMemberDeclarationResolution; private final NotNullLazyValue<JetScope> scopeForMemberDeclarationResolution;
private final NotNullLazyValue<JetScope> scopeForPropertyInitializerResolution; private final NotNullLazyValue<JetScope> scopeForPropertyInitializerResolution;
private final NullableLazyValue<Void> forceResolveAllContents;
public LazyClassDescriptor( public LazyClassDescriptor(
@NotNull ResolveSession resolveSession, @NotNull ResolveSession resolveSession,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@@ -151,6 +153,13 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
return computeScopeForPropertyInitializerResolution(); return computeScopeForPropertyInitializerResolution();
} }
}); });
this.forceResolveAllContents = storageManager.createRecursionTolerantNullableLazyValue(new Function0<Void>() {
@Override
public Void invoke() {
doForceResolveAllContents();
return null;
}
}, null);
} }
@NotNull @NotNull
@@ -340,10 +349,19 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
@Override @Override
public void forceResolveAllContents() { public void forceResolveAllContents() {
forceResolveAllContents.invoke();
}
private void doForceResolveAllContents() {
ForceResolveUtil.forceResolveAllContents(getAnnotations()); ForceResolveUtil.forceResolveAllContents(getAnnotations());
getClassObjectDescriptor();
ClassDescriptor classObjectDescriptor = getClassObjectDescriptor();
if (classObjectDescriptor != null) {
ForceResolveUtil.forceResolveAllContents(classObjectDescriptor);
}
getClassObjectType(); getClassObjectType();
getConstructors(); ForceResolveUtil.forceResolveAllContents(getConstructors());
getContainingDeclaration(); getContainingDeclaration();
getThisAsReceiverParameter(); getThisAsReceiverParameter();
getKind(); getKind();
@@ -401,7 +419,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
findAndDisconnectLoopsInTypeHierarchy(supertypes); findAndDisconnectLoopsInTypeHierarchy(supertypes);
return Unit.VALUE; return Unit.VALUE;
} }
}); }
);
private final NotNullLazyValue<List<TypeParameterDescriptor>> parameters = resolveSession.getStorageManager().createLazyValue(new Function0<List<TypeParameterDescriptor>>() { private final NotNullLazyValue<List<TypeParameterDescriptor>> parameters = resolveSession.getStorageManager().createLazyValue(new Function0<List<TypeParameterDescriptor>>() {
@Override @Override
@@ -418,6 +437,15 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
} }
}); });
private final NullableLazyValue<Void> forceResolveAllContents =
resolveSession.getStorageManager().createRecursionTolerantNullableLazyValue(new Function0<Void>() {
@Override
public Void invoke() {
doForceResolveAllContents();
return null;
}
}, null);
@NotNull @NotNull
@Override @Override
public List<TypeParameterDescriptor> getParameters() { public List<TypeParameterDescriptor> getParameters() {
@@ -481,9 +509,13 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
@Override @Override
public void forceResolveAllContents() { public void forceResolveAllContents() {
forceResolveAllContents.invoke();
}
private void doForceResolveAllContents() {
ForceResolveUtil.forceResolveAllContents(getAnnotations()); ForceResolveUtil.forceResolveAllContents(getAnnotations());
getSupertypes(); ForceResolveUtil.forceResolveAllContents(getSupertypes());
getParameters(); ForceResolveUtil.forceResolveAllContents(getParameters());
} }
} }
@@ -115,14 +115,14 @@ public class LazyTypeParameterDescriptor extends AbstractLazyTypeParameterDescri
@Override @Override
public void forceResolveAllContents() { public void forceResolveAllContents() {
ForceResolveUtil.forceResolveAllContents(getAnnotations()); ForceResolveUtil.forceResolveAllContents(getAnnotations());
getClassObjectType(); ForceResolveUtil.forceResolveAllContents(getClassObjectType());
getContainingDeclaration(); getContainingDeclaration();
getDefaultType(); getDefaultType();
getIndex(); getIndex();
getLowerBounds(); getLowerBounds();
getLowerBoundsAsType(); getLowerBoundsAsType();
getOriginal(); getOriginal();
getTypeConstructor(); ForceResolveUtil.forceResolveAllContents(getTypeConstructor());
getUpperBounds(); getUpperBounds();
getUpperBoundsAsType(); getUpperBoundsAsType();
getVariance(); getVariance();
@@ -32,10 +32,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration; import org.jetbrains.jet.asJava.KotlinLightClassForExplicitDeclaration;
import org.jetbrains.jet.asJava.LightClassConstructionContext; import org.jetbrains.jet.asJava.LightClassConstructionContext;
import org.jetbrains.jet.asJava.LightClassGenerationSupport; import org.jetbrains.jet.asJava.LightClassGenerationSupport;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
@@ -132,14 +129,14 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
for (JetDeclaration declaration : file.getDeclarations()) { for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetClassOrObject) { if (declaration instanceof JetClassOrObject) {
ClassDescriptor descriptor = session.getClassDescriptor((JetClassOrObject) declaration); ClassDescriptor descriptor = session.getClassDescriptor((JetClassOrObject) declaration);
ForceResolveUtil.forceResolveAllContents(descriptor); forceResolveAllContents(descriptor);
} }
else if (declaration instanceof JetFunction) { else if (declaration instanceof JetFunction) {
JetFunction jetFunction = (JetFunction) declaration; JetFunction jetFunction = (JetFunction) declaration;
Name name = jetFunction.getNameAsSafeName(); Name name = jetFunction.getNameAsSafeName();
Collection<FunctionDescriptor> functions = packageDescriptor.getMemberScope().getFunctions(name); Collection<FunctionDescriptor> functions = packageDescriptor.getMemberScope().getFunctions(name);
for (FunctionDescriptor descriptor : functions) { for (FunctionDescriptor descriptor : functions) {
ForceResolveUtil.forceResolveAllContents(descriptor); forceResolveAllContents(descriptor);
} }
} }
else if (declaration instanceof JetProperty) { else if (declaration instanceof JetProperty) {
@@ -147,7 +144,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
Name name = jetProperty.getNameAsSafeName(); Name name = jetProperty.getNameAsSafeName();
Collection<VariableDescriptor> properties = packageDescriptor.getMemberScope().getProperties(name); Collection<VariableDescriptor> properties = packageDescriptor.getMemberScope().getProperties(name);
for (VariableDescriptor descriptor : properties) { for (VariableDescriptor descriptor : properties) {
ForceResolveUtil.forceResolveAllContents(descriptor); forceResolveAllContents(descriptor);
} }
} }
else { else {
@@ -157,6 +154,13 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
} }
} }
private static void forceResolveAllContents(DeclarationDescriptor descriptor) {
ForceResolveUtil.forceResolveAllContents(descriptor);
if (LOG.isDebugEnabled()) {
LOG.debug("done: " + descriptor);
}
}
@NotNull @NotNull
@Override @Override
public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) { public LightClassConstructionContext analyzeRelevantCode(@NotNull JetClassOrObject classOrObject) {