correctly check if we need to process deferred types in body resolver

This commit is contained in:
Dmitry Jemerov
2015-06-01 21:34:47 +02:00
parent 22168aa026
commit cb6ddc5db3
@@ -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
} }
} }
} }
} }
} }