correctly check if we need to process deferred types in body resolver
This commit is contained in:
@@ -511,7 +511,8 @@ public class BodyResolver {
|
|||||||
AnnotationResolver.resolveAnnotationsArguments(klass.getPrimaryConstructorModifierList(), trace);
|
AnnotationResolver.resolveAnnotationsArguments(klass.getPrimaryConstructorModifierList(), trace);
|
||||||
|
|
||||||
if (unsubstitutedPrimaryConstructor != null) {
|
if (unsubstitutedPrimaryConstructor != null) {
|
||||||
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForClassHeaderResolution(), unsubstitutedPrimaryConstructor);
|
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForClassHeaderResolution(),
|
||||||
|
unsubstitutedPrimaryConstructor);
|
||||||
valueParameterResolver.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
|
valueParameterResolver.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
|
||||||
parameterScope, c.getOuterDataFlowInfo(), trace);
|
parameterScope, c.getOuterDataFlowInfo(), trace);
|
||||||
}
|
}
|
||||||
@@ -799,30 +800,30 @@ public class BodyResolver {
|
|||||||
|
|
||||||
private void computeDeferredTypes() {
|
private void computeDeferredTypes() {
|
||||||
Collection<Box<DeferredType>> deferredTypes = trace.getKeys(DEFERRED_TYPE);
|
Collection<Box<DeferredType>> deferredTypes = trace.getKeys(DEFERRED_TYPE);
|
||||||
if (deferredTypes != null) {
|
if (deferredTypes.isEmpty()) {
|
||||||
// +1 is a work around agains new Queue(0).addLast(...) bug // stepan.koltsov@ 2011-11-21
|
return;
|
||||||
final Queue<DeferredType> queue = new Queue<DeferredType>(deferredTypes.size() + 1);
|
}
|
||||||
trace.addHandler(DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler<Box<DeferredType>, Boolean>() {
|
// +1 is a work around against new Queue(0).addLast(...) bug // stepan.koltsov@ 2011-11-21
|
||||||
@Override
|
final Queue<DeferredType> queue = new Queue<DeferredType>(deferredTypes.size() + 1);
|
||||||
public void handleRecord(WritableSlice<Box<DeferredType>, Boolean> deferredTypeKeyDeferredTypeWritableSlice, Box<DeferredType> key, Boolean value) {
|
trace.addHandler(DEFERRED_TYPE, new ObservableBindingTrace.RecordHandler<Box<DeferredType>, Boolean>() {
|
||||||
queue.addLast(key.getData());
|
@Override
|
||||||
}
|
public void handleRecord(WritableSlice<Box<DeferredType>, Boolean> deferredTypeKeyDeferredTypeWritableSlice, Box<DeferredType> key, Boolean value) {
|
||||||
});
|
queue.addLast(key.getData());
|
||||||
for (Box<DeferredType> deferredType : deferredTypes) {
|
|
||||||
queue.addLast(deferredType.getData());
|
|
||||||
}
|
}
|
||||||
while (!queue.isEmpty()) {
|
});
|
||||||
DeferredType deferredType = queue.pullFirst();
|
for (Box<DeferredType> deferredType : deferredTypes) {
|
||||||
if (!deferredType.isComputed()) {
|
queue.addLast(deferredType.getData());
|
||||||
try {
|
}
|
||||||
deferredType.getDelegate(); // to compute
|
while (!queue.isEmpty()) {
|
||||||
}
|
DeferredType deferredType = queue.pullFirst();
|
||||||
catch (ReenteringLazyValueComputationException e) {
|
if (!deferredType.isComputed()) {
|
||||||
// A problem should be reported while computing the type
|
try {
|
||||||
}
|
deferredType.getDelegate(); // to compute
|
||||||
|
}
|
||||||
|
catch (ReenteringLazyValueComputationException e) {
|
||||||
|
// A problem should be reported while computing the type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user