Thread-safe lazy values used in lazy resolve
This commit is contained in:
+8
-8
@@ -34,7 +34,6 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
|||||||
import org.jetbrains.jet.lang.types.DeferredType;
|
import org.jetbrains.jet.lang.types.DeferredType;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValueImpl;
|
|
||||||
import org.jetbrains.jet.storage.NullableLazyValue;
|
import org.jetbrains.jet.storage.NullableLazyValue;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -378,13 +377,14 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setDeferredReturnType(@NotNull ConstructorDescriptorImpl descriptor) {
|
private void setDeferredReturnType(@NotNull ConstructorDescriptorImpl descriptor) {
|
||||||
descriptor.setReturnType(DeferredType.create(resolveSession.getTrace(), new NotNullLazyValueImpl<JetType>() {
|
descriptor.setReturnType(DeferredType.create(resolveSession.getTrace(), resolveSession.getStorageManager().createLazyValue(
|
||||||
@NotNull
|
new Computable<JetType>() {
|
||||||
@Override
|
@Override
|
||||||
protected JetType doCompute() {
|
public JetType compute() {
|
||||||
return thisDescriptor.getDefaultType();
|
return thisDescriptor.getDefaultType();
|
||||||
}
|
}
|
||||||
}));
|
})
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
import org.jetbrains.jet.lang.resolve.BindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValueImpl;
|
import org.jetbrains.jet.storage.NotNullLazyValue;
|
||||||
import org.jetbrains.jet.util.Box;
|
|
||||||
import org.jetbrains.jet.storage.ReenteringLazyValueComputationException;
|
import org.jetbrains.jet.storage.ReenteringLazyValueComputationException;
|
||||||
|
import org.jetbrains.jet.util.Box;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -30,15 +30,15 @@ import static org.jetbrains.jet.lang.resolve.BindingContext.DEFERRED_TYPE;
|
|||||||
|
|
||||||
public class DeferredType implements JetType {
|
public class DeferredType implements JetType {
|
||||||
|
|
||||||
public static DeferredType create(BindingTrace trace, NotNullLazyValueImpl<JetType> lazyValue) {
|
public static DeferredType create(BindingTrace trace, NotNullLazyValue<JetType> lazyValue) {
|
||||||
DeferredType deferredType = new DeferredType(lazyValue);
|
DeferredType deferredType = new DeferredType(lazyValue);
|
||||||
trace.record(DEFERRED_TYPE, new Box<DeferredType>(deferredType));
|
trace.record(DEFERRED_TYPE, new Box<DeferredType>(deferredType));
|
||||||
return deferredType;
|
return deferredType;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final NotNullLazyValueImpl<JetType> lazyValue;
|
private final NotNullLazyValue<JetType> lazyValue;
|
||||||
|
|
||||||
private DeferredType(NotNullLazyValueImpl<JetType> lazyValue) {
|
private DeferredType(NotNullLazyValue<JetType> lazyValue) {
|
||||||
this.lazyValue = lazyValue;
|
this.lazyValue = lazyValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-11
@@ -31,7 +31,6 @@ import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
|||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValue;
|
import org.jetbrains.jet.storage.NotNullLazyValue;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValueImpl;
|
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
import org.jetbrains.jet.storage.StorageManager;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -53,7 +52,7 @@ public abstract class AbstractLazyTypeParameterDescriptor implements TypeParamet
|
|||||||
private final NotNullLazyValue<JetType> upperBoundsAsType;
|
private final NotNullLazyValue<JetType> upperBoundsAsType;
|
||||||
|
|
||||||
public AbstractLazyTypeParameterDescriptor(
|
public AbstractLazyTypeParameterDescriptor(
|
||||||
@NotNull StorageManager storageManager,
|
@NotNull final StorageManager storageManager,
|
||||||
@NotNull DeclarationDescriptor containingDeclaration,
|
@NotNull DeclarationDescriptor containingDeclaration,
|
||||||
@NotNull Name name,
|
@NotNull Name name,
|
||||||
@NotNull Variance variance,
|
@NotNull Variance variance,
|
||||||
@@ -75,7 +74,7 @@ public abstract class AbstractLazyTypeParameterDescriptor implements TypeParamet
|
|||||||
this.defaultType = storageManager.createLazyValue(new Computable<JetType>() {
|
this.defaultType = storageManager.createLazyValue(new Computable<JetType>() {
|
||||||
@Override
|
@Override
|
||||||
public JetType compute() {
|
public JetType compute() {
|
||||||
return createDefaultType();
|
return createDefaultType(storageManager);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.upperBounds = storageManager.createLazyValue(new Computable<Set<JetType>>() {
|
this.upperBounds = storageManager.createLazyValue(new Computable<Set<JetType>>() {
|
||||||
@@ -197,14 +196,15 @@ public abstract class AbstractLazyTypeParameterDescriptor implements TypeParamet
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private JetType createDefaultType() {
|
private JetType createDefaultType(@NotNull StorageManager storageManager) {
|
||||||
return new JetTypeImpl(getTypeConstructor(), new LazyScopeAdapter(new NotNullLazyValueImpl<JetScope>() {
|
return new JetTypeImpl(getTypeConstructor(), new LazyScopeAdapter(storageManager.createLazyValue(
|
||||||
@NotNull
|
new Computable<JetScope>() {
|
||||||
@Override
|
@Override
|
||||||
protected JetScope doCompute() {
|
public JetScope compute() {
|
||||||
return getUpperBoundsAsType().getMemberScope();
|
return getUpperBoundsAsType().getMemberScope();
|
||||||
}
|
}
|
||||||
}));
|
}
|
||||||
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user