OverloadingConflictResolver made singleton

This commit is contained in:
Svetlana Isakova
2012-11-08 15:20:46 +04:00
parent adcb9e6e8a
commit e7750c6dc7
10 changed files with 20 additions and 85 deletions
@@ -39,8 +39,6 @@ import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver;
@@ -88,8 +86,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private ExpressionTypingServices expressionTypingServices; private ExpressionTypingServices expressionTypingServices;
private TypeResolver typeResolver; private TypeResolver typeResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
private ImportsResolver importsResolver; private ImportsResolver importsResolver;
private ScriptHeaderResolver scriptHeaderResolver; private ScriptHeaderResolver scriptHeaderResolver;
private OverloadResolver overloadResolver; private OverloadResolver overloadResolver;
@@ -138,8 +134,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.expressionTypingServices = new ExpressionTypingServices(); this.expressionTypingServices = new ExpressionTypingServices();
this.typeResolver = new TypeResolver(); this.typeResolver = new TypeResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.importsResolver = new ImportsResolver(); this.importsResolver = new ImportsResolver();
this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptHeaderResolver = new ScriptHeaderResolver();
this.overloadResolver = new OverloadResolver(); this.overloadResolver = new OverloadResolver();
@@ -221,7 +215,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
@@ -237,8 +230,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
typeResolver.setModuleConfiguration(moduleConfiguration); typeResolver.setModuleConfiguration(moduleConfiguration);
typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
importsResolver.setConfiguration(moduleConfiguration); importsResolver.setConfiguration(moduleConfiguration);
importsResolver.setContext(topDownAnalysisContext); importsResolver.setContext(topDownAnalysisContext);
importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
@@ -30,8 +30,6 @@ import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer; import org.jetbrains.jet.lang.resolve.ControlFlowAnalyzer;
import org.jetbrains.jet.lang.resolve.DeclarationsChecker; import org.jetbrains.jet.lang.resolve.DeclarationsChecker;
import org.jetbrains.jet.lang.resolve.ScriptBodyResolver; import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
@@ -55,8 +53,6 @@ public class InjectorForBodyResolve {
private AnnotationResolver annotationResolver; private AnnotationResolver annotationResolver;
private TypeResolver typeResolver; private TypeResolver typeResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
private ControlFlowAnalyzer controlFlowAnalyzer; private ControlFlowAnalyzer controlFlowAnalyzer;
private DeclarationsChecker declarationsChecker; private DeclarationsChecker declarationsChecker;
private ScriptBodyResolver scriptBodyResolver; private ScriptBodyResolver scriptBodyResolver;
@@ -82,8 +78,6 @@ public class InjectorForBodyResolve {
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
this.typeResolver = new TypeResolver(); this.typeResolver = new TypeResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.controlFlowAnalyzer = new ControlFlowAnalyzer(); this.controlFlowAnalyzer = new ControlFlowAnalyzer();
this.declarationsChecker = new DeclarationsChecker(); this.declarationsChecker = new DeclarationsChecker();
this.scriptBodyResolver = new ScriptBodyResolver(); this.scriptBodyResolver = new ScriptBodyResolver();
@@ -101,7 +95,6 @@ public class InjectorForBodyResolve {
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
@@ -124,8 +117,6 @@ public class InjectorForBodyResolve {
typeResolver.setModuleConfiguration(moduleConfiguration); typeResolver.setModuleConfiguration(moduleConfiguration);
typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters); controlFlowAnalyzer.setTopDownAnalysisParameters(topDownAnalysisParameters);
controlFlowAnalyzer.setTrace(bindingTrace); controlFlowAnalyzer.setTrace(bindingTrace);
@@ -29,8 +29,6 @@ import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver; import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -49,8 +47,6 @@ public class InjectorForLazyResolve {
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private CallResolver callResolver; private CallResolver callResolver;
private CandidateResolver candidateResolver; private CandidateResolver candidateResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
public InjectorForLazyResolve( public InjectorForLazyResolve(
@NotNull Project project, @NotNull Project project,
@@ -70,8 +66,6 @@ public class InjectorForLazyResolve {
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.callResolver = new CallResolver(); this.callResolver = new CallResolver();
this.candidateResolver = new CandidateResolver(); this.candidateResolver = new CandidateResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.descriptorResolver.setAnnotationResolver(annotationResolver); this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
@@ -92,14 +86,11 @@ public class InjectorForLazyResolve {
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
candidateResolver.setTypeResolver(typeResolver); candidateResolver.setTypeResolver(typeResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
} }
@PreDestroy @PreDestroy
@@ -26,8 +26,6 @@ import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver; import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -43,8 +41,6 @@ public class InjectorForMacros {
private AnnotationResolver annotationResolver; private AnnotationResolver annotationResolver;
private DescriptorResolver descriptorResolver; private DescriptorResolver descriptorResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
public InjectorForMacros( public InjectorForMacros(
@NotNull Project project, @NotNull Project project,
@@ -59,8 +55,6 @@ public class InjectorForMacros {
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
this.descriptorResolver = new DescriptorResolver(); this.descriptorResolver = new DescriptorResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.expressionTypingServices.setCallResolver(callResolver); this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setDescriptorResolver(descriptorResolver); this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
@@ -69,7 +63,6 @@ public class InjectorForMacros {
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
@@ -87,8 +80,6 @@ public class InjectorForMacros {
descriptorResolver.setExpressionTypingServices(expressionTypingServices); descriptorResolver.setExpressionTypingServices(expressionTypingServices);
descriptorResolver.setTypeResolver(typeResolver); descriptorResolver.setTypeResolver(typeResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
} }
@PreDestroy @PreDestroy
@@ -37,8 +37,6 @@ import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver;
@@ -71,8 +69,6 @@ public class InjectorForTopDownAnalyzerBasic {
private ExpressionTypingServices expressionTypingServices; private ExpressionTypingServices expressionTypingServices;
private TypeResolver typeResolver; private TypeResolver typeResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
private ImportsResolver importsResolver; private ImportsResolver importsResolver;
private ScriptHeaderResolver scriptHeaderResolver; private ScriptHeaderResolver scriptHeaderResolver;
private OverloadResolver overloadResolver; private OverloadResolver overloadResolver;
@@ -107,8 +103,6 @@ public class InjectorForTopDownAnalyzerBasic {
this.expressionTypingServices = new ExpressionTypingServices(); this.expressionTypingServices = new ExpressionTypingServices();
this.typeResolver = new TypeResolver(); this.typeResolver = new TypeResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.importsResolver = new ImportsResolver(); this.importsResolver = new ImportsResolver();
this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptHeaderResolver = new ScriptHeaderResolver();
this.overloadResolver = new OverloadResolver(); this.overloadResolver = new OverloadResolver();
@@ -164,7 +158,6 @@ public class InjectorForTopDownAnalyzerBasic {
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
@@ -180,8 +173,6 @@ public class InjectorForTopDownAnalyzerBasic {
typeResolver.setModuleConfiguration(moduleConfiguration); typeResolver.setModuleConfiguration(moduleConfiguration);
typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
importsResolver.setConfiguration(moduleConfiguration); importsResolver.setConfiguration(moduleConfiguration);
importsResolver.setContext(topDownAnalysisContext); importsResolver.setContext(topDownAnalysisContext);
importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
@@ -63,8 +63,6 @@ import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
public class CallResolver { public class CallResolver {
private final JetTypeChecker typeChecker = JetTypeChecker.INSTANCE; private final JetTypeChecker typeChecker = JetTypeChecker.INSTANCE;
@NotNull
private ResolutionResultsHandler resolutionResultsHandler;
@NotNull @NotNull
private ExpressionTypingServices expressionTypingServices; private ExpressionTypingServices expressionTypingServices;
@NotNull @NotNull
@@ -72,11 +70,6 @@ public class CallResolver {
@NotNull @NotNull
private CandidateResolver candidateResolver; private CandidateResolver candidateResolver;
@Inject
public void setResolutionResultsHandler(@NotNull ResolutionResultsHandler resolutionResultsHandler) {
this.resolutionResultsHandler = resolutionResultsHandler;
}
@Inject @Inject
public void setExpressionTypingServices(@NotNull ExpressionTypingServices expressionTypingServices) { public void setExpressionTypingServices(@NotNull ExpressionTypingServices expressionTypingServices) {
this.expressionTypingServices = expressionTypingServices; this.expressionTypingServices = expressionTypingServices;
@@ -331,7 +324,7 @@ public class CallResolver {
candidateResolver.completeTypeInferenceDependentOnExpectedTypeForCall( candidateResolver.completeTypeInferenceDependentOnExpectedTypeForCall(
CallResolutionContext.create(context, tracing, resolvedCall), successful, failed); CallResolutionContext.create(context, tracing, resolvedCall), successful, failed);
} }
OverloadResolutionResultsImpl<D> results = resolutionResultsHandler.computeResultAndReportErrors(context.trace, tracing, successful, OverloadResolutionResultsImpl<D> results = ResolutionResultsHandler.INSTANCE.computeResultAndReportErrors(context.trace, tracing, successful,
failed); failed);
if (!results.isSingleResult()) { if (!results.isSingleResult()) {
candidateResolver.checkTypesWithNoCallee(context); candidateResolver.checkTypesWithNoCallee(context);
@@ -505,7 +498,7 @@ public class CallResolver {
} }
} }
OverloadResolutionResultsImpl<F> results = resolutionResultsHandler.computeResultAndReportErrors( OverloadResolutionResultsImpl<F> results = ResolutionResultsHandler.INSTANCE.computeResultAndReportErrors(
task.trace, task.tracing, task.getResolvedCalls()); task.trace, task.tracing, task.getResolvedCalls());
if (!results.isSingleResult() && !results.isIncomplete()) { if (!results.isSingleResult() && !results.isIncomplete()) {
candidateResolver.checkTypesWithNoCallee(task.toBasic()); candidateResolver.checkTypesWithNoCallee(task.toBasic());
@@ -40,6 +40,10 @@ import java.util.Set;
*/ */
public class OverloadingConflictResolver { public class OverloadingConflictResolver {
public static OverloadingConflictResolver INSTANCE = new OverloadingConflictResolver();
private OverloadingConflictResolver() {}
@Nullable @Nullable
public <D extends CallableDescriptor> ResolvedCallWithTrace<D> findMaximallySpecific( public <D extends CallableDescriptor> ResolvedCallWithTrace<D> findMaximallySpecific(
@NotNull Set<ResolvedCallWithTrace<D>> candidates, @NotNull Set<ResolvedCallWithTrace<D>> candidates,
@@ -79,7 +83,11 @@ public class OverloadingConflictResolver {
* Int < Long * Int < Long
* Int < Short < Byte * Int < Short < Byte
*/ */
private <Descriptor extends CallableDescriptor> boolean moreSpecific(Descriptor f, Descriptor g, boolean discriminateGenericDescriptors) { private <Descriptor extends CallableDescriptor> boolean moreSpecific(
Descriptor f,
Descriptor g,
boolean discriminateGenericDescriptors
) {
if (f.getContainingDeclaration() instanceof ScriptDescriptor && g.getContainingDeclaration() instanceof ScriptDescriptor) { if (f.getContainingDeclaration() instanceof ScriptDescriptor && g.getContainingDeclaration() instanceof ScriptDescriptor) {
ScriptDescriptor fs = (ScriptDescriptor) f.getContainingDeclaration(); ScriptDescriptor fs = (ScriptDescriptor) f.getContainingDeclaration();
ScriptDescriptor gs = (ScriptDescriptor) g.getContainingDeclaration(); ScriptDescriptor gs = (ScriptDescriptor) g.getContainingDeclaration();
@@ -24,7 +24,6 @@ import org.jetbrains.jet.lang.resolve.OverridingUtil;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace;
import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy; import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy;
import javax.inject.Inject;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Iterator; import java.util.Iterator;
@@ -37,19 +36,16 @@ import static org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus.STRO
import static org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus.UNKNOWN_STATUS; import static org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus.UNKNOWN_STATUS;
public class ResolutionResultsHandler { public class ResolutionResultsHandler {
@NotNull public static ResolutionResultsHandler INSTANCE = new ResolutionResultsHandler();
private OverloadingConflictResolver overloadingConflictResolver;
@Inject private ResolutionResultsHandler() {}
public void setOverloadingConflictResolver(@NotNull OverloadingConflictResolver overloadingConflictResolver) {
this.overloadingConflictResolver = overloadingConflictResolver;
}
@NotNull @NotNull
public <D extends CallableDescriptor> OverloadResolutionResultsImpl<D> computeResultAndReportErrors( public <D extends CallableDescriptor> OverloadResolutionResultsImpl<D> computeResultAndReportErrors(
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull TracingStrategy tracing, @NotNull TracingStrategy tracing,
@NotNull Set<ResolvedCallWithTrace<D>> candidates) { @NotNull Set<ResolvedCallWithTrace<D>> candidates
) {
Set<ResolvedCallWithTrace<D>> successfulCandidates = Sets.newLinkedHashSet(); Set<ResolvedCallWithTrace<D>> successfulCandidates = Sets.newLinkedHashSet();
Set<ResolvedCallWithTrace<D>> failedCandidates = Sets.newLinkedHashSet(); Set<ResolvedCallWithTrace<D>> failedCandidates = Sets.newLinkedHashSet();
for (ResolvedCallWithTrace<D> candidateCall : candidates) { for (ResolvedCallWithTrace<D> candidateCall : candidates) {
@@ -72,7 +68,8 @@ public class ResolutionResultsHandler {
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull TracingStrategy tracing, @NotNull TracingStrategy tracing,
@NotNull Set<ResolvedCallWithTrace<D>> successfulCandidates, @NotNull Set<ResolvedCallWithTrace<D>> successfulCandidates,
@NotNull Set<ResolvedCallWithTrace<D>> failedCandidates) { @NotNull Set<ResolvedCallWithTrace<D>> failedCandidates
) {
// TODO : maybe it's better to filter overrides out first, and only then look for the maximally specific // TODO : maybe it's better to filter overrides out first, and only then look for the maximally specific
if (successfulCandidates.size() > 0) { if (successfulCandidates.size() > 0) {
@@ -137,7 +134,7 @@ public class ResolutionResultsHandler {
} }
} }
private static <D extends CallableDescriptor> boolean allClean(Collection<ResolvedCallWithTrace<D>> results) { private <D extends CallableDescriptor> boolean allClean(Collection<ResolvedCallWithTrace<D>> results) {
for (ResolvedCallWithTrace<D> result : results) { for (ResolvedCallWithTrace<D> result : results) {
if (result.isDirty()) return false; if (result.isDirty()) return false;
} }
@@ -161,13 +158,13 @@ public class ResolutionResultsHandler {
if (cleanCandidates.isEmpty()) { if (cleanCandidates.isEmpty()) {
cleanCandidates = candidates; cleanCandidates = candidates;
} }
ResolvedCallWithTrace<D> maximallySpecific = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, false); ResolvedCallWithTrace<D> maximallySpecific = OverloadingConflictResolver.INSTANCE.findMaximallySpecific(cleanCandidates, false);
if (maximallySpecific != null) { if (maximallySpecific != null) {
return OverloadResolutionResultsImpl.success(maximallySpecific); return OverloadResolutionResultsImpl.success(maximallySpecific);
} }
if (discriminateGenerics) { if (discriminateGenerics) {
ResolvedCallWithTrace<D> maximallySpecificGenericsDiscriminated = overloadingConflictResolver.findMaximallySpecific(cleanCandidates, true); ResolvedCallWithTrace<D> maximallySpecificGenericsDiscriminated = OverloadingConflictResolver.INSTANCE.findMaximallySpecific(cleanCandidates, true);
if (maximallySpecificGenericsDiscriminated != null) { if (maximallySpecificGenericsDiscriminated != null) {
return OverloadResolutionResultsImpl.success(maximallySpecificGenericsDiscriminated); return OverloadResolutionResultsImpl.success(maximallySpecificGenericsDiscriminated);
} }
@@ -27,8 +27,6 @@ import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.resolve.AnnotationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver; import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@@ -45,8 +43,6 @@ public class InjectorForTests {
private AnnotationResolver annotationResolver; private AnnotationResolver annotationResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private CandidateResolver candidateResolver; private CandidateResolver candidateResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
public InjectorForTests( public InjectorForTests(
@NotNull Project project @NotNull Project project
@@ -61,8 +57,6 @@ public class InjectorForTests {
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.candidateResolver = new CandidateResolver(); this.candidateResolver = new CandidateResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.descriptorResolver.setAnnotationResolver(annotationResolver); this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setExpressionTypingServices(expressionTypingServices); this.descriptorResolver.setExpressionTypingServices(expressionTypingServices);
@@ -80,7 +74,6 @@ public class InjectorForTests {
this.callResolver.setCandidateResolver(candidateResolver); this.callResolver.setCandidateResolver(candidateResolver);
this.callResolver.setExpressionTypingServices(expressionTypingServices); this.callResolver.setExpressionTypingServices(expressionTypingServices);
this.callResolver.setResolutionResultsHandler(resolutionResultsHandler);
this.callResolver.setTypeResolver(typeResolver); this.callResolver.setTypeResolver(typeResolver);
annotationResolver.setCallResolver(callResolver); annotationResolver.setCallResolver(callResolver);
@@ -89,8 +82,6 @@ public class InjectorForTests {
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
candidateResolver.setTypeResolver(typeResolver); candidateResolver.setTypeResolver(typeResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
} }
@PreDestroy @PreDestroy
@@ -37,8 +37,6 @@ import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices; import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import org.jetbrains.jet.lang.resolve.TypeResolver; import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver; import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.results.OverloadingConflictResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver; import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver; import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver; import org.jetbrains.jet.lang.resolve.OverloadResolver;
@@ -71,8 +69,6 @@ public class InjectorForTopDownAnalyzerForJs {
private ExpressionTypingServices expressionTypingServices; private ExpressionTypingServices expressionTypingServices;
private TypeResolver typeResolver; private TypeResolver typeResolver;
private QualifiedExpressionResolver qualifiedExpressionResolver; private QualifiedExpressionResolver qualifiedExpressionResolver;
private ResolutionResultsHandler resolutionResultsHandler;
private OverloadingConflictResolver overloadingConflictResolver;
private ImportsResolver importsResolver; private ImportsResolver importsResolver;
private ScriptHeaderResolver scriptHeaderResolver; private ScriptHeaderResolver scriptHeaderResolver;
private OverloadResolver overloadResolver; private OverloadResolver overloadResolver;
@@ -107,8 +103,6 @@ public class InjectorForTopDownAnalyzerForJs {
this.expressionTypingServices = new ExpressionTypingServices(); this.expressionTypingServices = new ExpressionTypingServices();
this.typeResolver = new TypeResolver(); this.typeResolver = new TypeResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver(); this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.resolutionResultsHandler = new ResolutionResultsHandler();
this.overloadingConflictResolver = new OverloadingConflictResolver();
this.importsResolver = new ImportsResolver(); this.importsResolver = new ImportsResolver();
this.scriptHeaderResolver = new ScriptHeaderResolver(); this.scriptHeaderResolver = new ScriptHeaderResolver();
this.overloadResolver = new OverloadResolver(); this.overloadResolver = new OverloadResolver();
@@ -164,7 +158,6 @@ public class InjectorForTopDownAnalyzerForJs {
callResolver.setCandidateResolver(candidateResolver); callResolver.setCandidateResolver(candidateResolver);
callResolver.setExpressionTypingServices(expressionTypingServices); callResolver.setExpressionTypingServices(expressionTypingServices);
callResolver.setResolutionResultsHandler(resolutionResultsHandler);
callResolver.setTypeResolver(typeResolver); callResolver.setTypeResolver(typeResolver);
candidateResolver.setExpressionTypingServices(expressionTypingServices); candidateResolver.setExpressionTypingServices(expressionTypingServices);
@@ -180,8 +173,6 @@ public class InjectorForTopDownAnalyzerForJs {
typeResolver.setModuleConfiguration(moduleConfiguration); typeResolver.setModuleConfiguration(moduleConfiguration);
typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); typeResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);
resolutionResultsHandler.setOverloadingConflictResolver(overloadingConflictResolver);
importsResolver.setConfiguration(moduleConfiguration); importsResolver.setConfiguration(moduleConfiguration);
importsResolver.setContext(topDownAnalysisContext); importsResolver.setContext(topDownAnalysisContext);
importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver); importsResolver.setQualifiedExpressionResolver(qualifiedExpressionResolver);