Forced resolution of all contents enhanced
This commit is contained in:
committed by
Nikolay Krasko
parent
7c26271500
commit
783258d91a
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+37
-5
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -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();
|
||||||
|
|||||||
+11
-7
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user