diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index ec28b2426b0..1052cfba56c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -45,6 +45,7 @@ import org.jetbrains.jet.rt.signature.JetSignatureAdapter; import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter; import org.jetbrains.jet.rt.signature.JetSignatureReader; import org.jetbrains.jet.rt.signature.JetSignatureVisitor; +import org.jetbrains.jet.utils.ExceptionUtils; import javax.inject.Inject; import java.util.*; @@ -1221,12 +1222,14 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes if (namedMembers.functionDescriptors != null) { return; } - + + TemporaryBindingTrace tempTrace = TemporaryBindingTrace.create(trace); + final Set functions = new HashSet(); Set functionsFromCurrent = Sets.newHashSet(); for (PsiMethodWrapper method : namedMembers.methods) { - FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(psiClass, method, scopeData); + FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(psiClass, method, scopeData, tempTrace); if (function != null) { functionsFromCurrent.add((SimpleFunctionDescriptor) function); } @@ -1254,7 +1257,13 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes functions.addAll(functionsFromCurrent); - namedMembers.functionDescriptors = functions; + try { + namedMembers.functionDescriptors = functions; + tempTrace.commit(); + } catch (Throwable e) { + assert false : "No errors are expected while saving state"; + throw ExceptionUtils.rethrow(e); + } } private Set getFunctionsFromSupertypes(ResolverScopeData scopeData, Name methodName) { @@ -1343,7 +1352,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes @Nullable private FunctionDescriptorImpl resolveMethodToFunctionDescriptor( @NotNull final PsiClass psiClass, final PsiMethodWrapper method, - @NotNull ResolverScopeData scopeData) { + @NotNull ResolverScopeData scopeData, BindingTrace tempTrace) { getResolverScopeData(scopeData); @@ -1418,8 +1427,9 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes resolveVisibility(method.getPsiMethod(), method.getJetMethod()), /*isInline = */ false ); - trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl); - BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, method.getPsiMethod(), functionDescriptorImpl); + + BindingContextUtils.recordFunctionDeclarationToDescriptor(tempTrace, method.getPsiMethod(), functionDescriptorImpl); + FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl; if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) { throw new IllegalStateException("non-static method in subclass"); @@ -1513,7 +1523,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes for (Map.Entry entry : scopeData.namedMembersMap.entrySet()) { Name methodName = entry.getKey(); NamedMembers namedMembers = entry.getValue(); - resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, substitutorForGenericSupertypes, namedMembers, methodName, scopeData); + resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, substitutorForGenericSupertypes, + namedMembers, methodName, scopeData); functions.addAll(namedMembers.functionDescriptors); }