Better injecting of partial body resolve filter

This commit is contained in:
Valentin Kipyatkov
2014-11-21 15:10:29 +03:00
parent 0b56760910
commit ddc60ac5dd
16 changed files with 111 additions and 62 deletions
@@ -55,6 +55,7 @@ import org.jetbrains.jet.lang.resolve.DelegatedPropertyResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -115,6 +116,7 @@ public class InjectorForLazyResolveWithJava {
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -181,6 +183,7 @@ public class InjectorForLazyResolveWithJava {
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, module, javaFlexibleTypeCapabilitiesProvider, storageManager, lazyResolveToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -234,6 +237,7 @@ public class InjectorForLazyResolveWithJava {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -58,6 +58,7 @@ import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -129,6 +130,7 @@ public class InjectorForTopDownAnalyzerForJvm {
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -206,6 +208,7 @@ public class InjectorForTopDownAnalyzerForJvm {
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), javaFlexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -287,6 +290,7 @@ public class InjectorForTopDownAnalyzerForJvm {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.AdditionalCheckerProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.BodyResolver;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
@@ -63,6 +64,7 @@ public class InjectorForBodyResolve {
private final ModuleDescriptor moduleDescriptor;
private final PlatformToKotlinClassMap platformToKotlinClassMap;
private final AdditionalCheckerProvider additionalCheckerProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final BodyResolver bodyResolver;
private final AnnotationResolver annotationResolver;
private final CallResolver callResolver;
@@ -95,7 +97,8 @@ public class InjectorForBodyResolve {
@NotNull GlobalContext globalContext,
@NotNull BindingTrace bindingTrace,
@NotNull ModuleDescriptor moduleDescriptor,
@NotNull AdditionalCheckerProvider additionalCheckerProvider
@NotNull AdditionalCheckerProvider additionalCheckerProvider,
@NotNull PartialBodyResolveProvider partialBodyResolveProvider
) {
this.project = project;
this.globalContext = globalContext;
@@ -104,6 +107,7 @@ public class InjectorForBodyResolve {
this.moduleDescriptor = moduleDescriptor;
this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap();
this.additionalCheckerProvider = additionalCheckerProvider;
this.partialBodyResolveProvider = partialBodyResolveProvider;
this.bodyResolver = new BodyResolver();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
@@ -160,6 +164,7 @@ public class InjectorForBodyResolve {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -89,6 +90,7 @@ public class InjectorForLazyBodyResolve {
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -136,6 +138,7 @@ public class InjectorForLazyBodyResolve {
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -186,6 +189,7 @@ public class InjectorForLazyBodyResolve {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.TypeResolver;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -81,6 +82,7 @@ public class InjectorForLazyResolve {
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -122,6 +124,7 @@ public class InjectorForLazyResolve {
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazyResolveToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -156,6 +159,7 @@ public class InjectorForLazyResolve {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -34,6 +34,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.DelegatedPropertyResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.types.expressions.ControlStructureTypingUtils;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils;
import org.jetbrains.jet.lang.types.expressions.ForLoopConventionsChecker;
@@ -67,6 +68,7 @@ public class InjectorForMacros {
private final DescriptorResolver descriptorResolver;
private final DelegatedPropertyResolver delegatedPropertyResolver;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final ControlStructureTypingUtils controlStructureTypingUtils;
private final ExpressionTypingUtils expressionTypingUtils;
private final ForLoopConventionsChecker forLoopConventionsChecker;
@@ -98,6 +100,7 @@ public class InjectorForMacros {
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.controlStructureTypingUtils = new ControlStructureTypingUtils(getExpressionTypingServices());
this.expressionTypingUtils = new ExpressionTypingUtils(getExpressionTypingServices(), getCallResolver());
this.forLoopConventionsChecker = new ForLoopConventionsChecker();
@@ -112,6 +115,7 @@ public class InjectorForMacros {
this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
this.expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
this.expressionTypingServices.setProject(project);
this.expressionTypingServices.setTypeResolver(typeResolver);
@@ -44,6 +44,7 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -94,6 +95,7 @@ public class InjectorForTopDownAnalyzerBasic {
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -145,6 +147,7 @@ public class InjectorForTopDownAnalyzerBasic {
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -209,6 +212,7 @@ public class InjectorForTopDownAnalyzerBasic {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.resolve
import org.jetbrains.jet.lang.psi.JetElement
public open class PartialBodyResolveProvider {
public open val filter: ((JetElement) -> Boolean)?
get() = null
class object {
public val NONE: PartialBodyResolveProvider = PartialBodyResolveProvider()
}
}
@@ -18,12 +18,9 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.base.Predicate;
import com.intellij.psi.PsiFile;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.storage.ExceptionTracker;
import org.jetbrains.jet.storage.StorageManager;
@@ -45,7 +42,7 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
boolean analyzingBootstrapLibrary,
boolean declaredLocally
) {
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, null, analyzingBootstrapLibrary,
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, analyzingBootstrapLibrary,
declaredLocally, LAZY);
}
@@ -57,7 +54,7 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
boolean analyzingBootstrapLibrary,
boolean declaredLocally
) {
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, null, analyzingBootstrapLibrary,
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, analyzingBootstrapLibrary,
declaredLocally, true);
}
@@ -67,23 +64,12 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
@NotNull ExceptionTracker exceptionTracker,
@NotNull Predicate<PsiFile> analyzeCompletely
) {
return createForLocalDeclarations(storageManager, exceptionTracker, analyzeCompletely, null);
}
@NotNull
public static TopDownAnalysisParameters createForLocalDeclarations(
@NotNull StorageManager storageManager,
@NotNull ExceptionTracker exceptionTracker,
@NotNull Predicate<PsiFile> analyzeCompletely,
@Nullable Function1<JetElement, Boolean> statementFilter
) {
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, statementFilter, false, true, false);
return new TopDownAnalysisParameters(storageManager, exceptionTracker, analyzeCompletely, false, true, false);
}
@NotNull private final StorageManager storageManager;
@NotNull private final ExceptionTracker exceptionTracker;
@NotNull private final Predicate<PsiFile> analyzeCompletely;
@Nullable private final Function1<JetElement, Boolean> statementFilter;
private final boolean analyzingBootstrapLibrary;
private final boolean declaredLocally;
private final boolean lazyTopDownAnalysis;
@@ -92,7 +78,6 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
@NotNull StorageManager storageManager,
@NotNull ExceptionTracker exceptionTracker,
@NotNull Predicate<PsiFile> analyzeCompletely,
@Nullable Function1<JetElement, Boolean> statementFilter,
boolean analyzingBootstrapLibrary,
boolean declaredLocally,
boolean lazyTopDownAnalysis
@@ -100,7 +85,6 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
this.storageManager = storageManager;
this.exceptionTracker = exceptionTracker;
this.analyzeCompletely = analyzeCompletely;
this.statementFilter = statementFilter;
this.analyzingBootstrapLibrary = analyzingBootstrapLibrary;
this.declaredLocally = declaredLocally;
this.lazyTopDownAnalysis = lazyTopDownAnalysis;
@@ -123,11 +107,6 @@ public class TopDownAnalysisParameters extends LazinessToken implements GlobalCo
return analyzeCompletely;
}
@Nullable
public Function1<JetElement, Boolean> getStatementFilter() {
return statementFilter;
}
public boolean isAnalyzingBootstrapLibrary() {
return analyzingBootstrapLibrary;
}
@@ -24,7 +24,6 @@ import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.analyzer.AnalyzerPackage;
import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
@@ -76,6 +75,8 @@ public class ExpressionTypingServices {
private AnnotationResolver annotationResolver;
@NotNull
private CallResolverExtensionProvider extensionProvider;
@NotNull
private PartialBodyResolveProvider partialBodyResolveProvider;
@NotNull
public Project getProject() {
@@ -142,10 +143,14 @@ public class ExpressionTypingServices {
this.extensionProvider = extensionProvider;
}
@Nullable
private Function1<JetElement, Boolean> getStatementFilter() {
GlobalContext context = expressionTypingComponents.globalContext;
return context instanceof TopDownAnalysisParameters ? ((TopDownAnalysisParameters) context).getStatementFilter() : null;
@NotNull
private PartialBodyResolveProvider getPartialBodyResolveProvider() {
return partialBodyResolveProvider;
}
@Inject
public void setPartialBodyResolveProvider(@NotNull PartialBodyResolveProvider partialBodyResolveProvider) {
this.partialBodyResolveProvider = partialBodyResolveProvider;
}
public ExpressionTypingServices(@NotNull ExpressionTypingComponents components) {
@@ -215,7 +220,7 @@ public class ExpressionTypingServices {
) {
List<JetElement> block = expression.getStatements();
Function1<JetElement, Boolean> filter = getStatementFilter();
Function1<JetElement, Boolean> filter = getPartialBodyResolveProvider().getFilter();
if (filter != null && !(expression instanceof JetPsiUtil.JetExpressionWrapper)) {
block = KotlinPackage.filter(block, filter);
}
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.types.expressions.ForLoopConventionsChecker;
import org.jetbrains.jet.lang.reflect.ReflectionTypes;
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
@@ -72,6 +73,7 @@ public class InjectorForTests {
private final ReflectionTypes reflectionTypes;
private final CallExpressionResolver callExpressionResolver;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
@@ -106,6 +108,7 @@ public class InjectorForTests {
this.reflectionTypes = new ReflectionTypes(moduleDescriptor);
this.callExpressionResolver = new CallExpressionResolver();
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.descriptorResolver.setAnnotationResolver(annotationResolver);
this.descriptorResolver.setDelegatedPropertyResolver(delegatedPropertyResolver);
@@ -118,6 +121,7 @@ public class InjectorForTests {
this.expressionTypingServices.setCallResolver(callResolver);
this.expressionTypingServices.setDescriptorResolver(descriptorResolver);
this.expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
this.expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
this.expressionTypingServices.setProject(project);
this.expressionTypingServices.setTypeResolver(typeResolver);
@@ -258,6 +258,7 @@ private fun generatorForBodyResolve() =
parameter(javaClass<BindingTrace>())
parameter(javaClass<ModuleDescriptor>(), useAsContext = true)
parameter(javaClass<AdditionalCheckerProvider>())
parameter(javaClass<org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider>())
publicField(javaClass<BodyResolver>())
}
@@ -22,9 +22,7 @@ import com.google.common.base.Predicates;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.analyzer.AnalyzerPackage;
import org.jetbrains.jet.di.InjectorForBodyResolve;
import org.jetbrains.jet.lang.cfg.JetFlowInformationProvider;
@@ -61,7 +59,7 @@ public abstract class ElementResolver {
@NotNull
public BindingContext getElementAdditionalResolve(@NotNull JetElement jetElement) {
return elementAdditionalResolve(jetElement, null);
return elementAdditionalResolve(jetElement, PartialBodyResolveProvider.NONE);
}
@NotNull
@@ -97,7 +95,7 @@ public abstract class ElementResolver {
if (partialBodyResolve && elementOfAdditionalResolve instanceof JetDeclaration) {
//TODO: do not resolve with filter if whole body resolve cached already
Function1<JetElement, Boolean> filter = new PartialBodyResolveFilter(
PartialBodyResolveFilter filter = new PartialBodyResolveFilter(
jetElement,
(JetDeclaration) elementOfAdditionalResolve, probablyNothingCallableNames());
return elementAdditionalResolve(elementOfAdditionalResolve, filter);
@@ -129,7 +127,7 @@ public abstract class ElementResolver {
@NotNull
protected BindingContext elementAdditionalResolve(
@NotNull JetElement resolveElement,
@Nullable Function1<JetElement, Boolean> bodyResolveFilter
@NotNull PartialBodyResolveProvider partialResolveProvider
) {
// All additional resolve should be done to separate trace
BindingTrace trace = resolveSession.getStorageManager().createSafeTrace(
@@ -138,13 +136,13 @@ public abstract class ElementResolver {
JetFile file = resolveElement.getContainingJetFile();
if (resolveElement instanceof JetNamedFunction) {
functionAdditionalResolve(resolveSession, (JetNamedFunction) resolveElement, trace, file, bodyResolveFilter);
functionAdditionalResolve(resolveSession, (JetNamedFunction) resolveElement, trace, file, partialResolveProvider);
}
else if (resolveElement instanceof JetClassInitializer) {
initializerAdditionalResolve(resolveSession, (JetClassInitializer) resolveElement, trace, file, bodyResolveFilter);
initializerAdditionalResolve(resolveSession, (JetClassInitializer) resolveElement, trace, file, partialResolveProvider);
}
else if (resolveElement instanceof JetProperty) {
propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file, bodyResolveFilter);
propertyAdditionalResolve(resolveSession, (JetProperty) resolveElement, trace, file, partialResolveProvider);
}
else if (resolveElement instanceof JetDelegationSpecifierList) {
delegationSpecifierAdditionalResolve(resolveSession, (JetDelegationSpecifierList) resolveElement, trace, file);
@@ -158,7 +156,7 @@ public abstract class ElementResolver {
annotationAdditionalResolve(resolveSession, (JetAnnotationEntry) resolveElement);
}
else if (resolveElement instanceof JetClass) {
constructorAdditionalResolve(resolveSession, (JetClass) resolveElement, trace, file, bodyResolveFilter);
constructorAdditionalResolve(resolveSession, (JetClass) resolveElement, trace, file, partialResolveProvider);
}
else if (resolveElement instanceof JetTypeParameter) {
typeParameterAdditionalResolve(resolveSession, (JetTypeParameter) resolveElement);
@@ -316,7 +314,7 @@ public abstract class ElementResolver {
// Activate resolving of supertypes
ForceResolveUtil.forceResolveAllContents(descriptor.getTypeConstructor().getSupertypes());
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, null);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, PartialBodyResolveProvider.NONE);
bodyResolver.resolveDelegationSpecifierList(createEmptyContext(resolveSession), classOrObject, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForClassHeaderResolution(),
@@ -328,11 +326,12 @@ public abstract class ElementResolver {
final JetProperty jetProperty,
BindingTrace trace,
JetFile file,
@Nullable Function1<JetElement, Boolean> bodyResolveFilter) {
@NotNull PartialBodyResolveProvider partialResolveProvider
) {
JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty);
BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy(
createParameters(resolveSession, null),
createParameters(resolveSession),
new Function<JetDeclaration, JetScope>() {
@Override
public JetScope apply(JetDeclaration declaration) {
@@ -341,7 +340,7 @@ public abstract class ElementResolver {
return resolveSession.getScopeProvider().getResolutionScopeForDeclaration(declaration);
}
});
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, bodyResolveFilter);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, partialResolveProvider);
PropertyDescriptor descriptor = (PropertyDescriptor) resolveSession.resolveToDescriptor(jetProperty);
ForceResolveUtil.forceResolveAllContents(descriptor);
@@ -367,13 +366,13 @@ public abstract class ElementResolver {
JetNamedFunction namedFunction,
BindingTrace trace,
JetFile file,
@Nullable Function1<JetElement, Boolean> bodyResolveFilter
@NotNull PartialBodyResolveProvider partialResolveProvider
) {
JetScope scope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(namedFunction);
FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(namedFunction);
ForceResolveUtil.forceResolveAllContents(functionDescriptor);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, bodyResolveFilter);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, partialResolveProvider);
bodyResolver.resolveFunctionBody(createEmptyContext(resolveSession), trace, namedFunction, functionDescriptor, scope);
}
@@ -382,7 +381,7 @@ public abstract class ElementResolver {
JetClass klass,
BindingTrace trace,
JetFile file,
@Nullable Function1<JetElement, Boolean> bodyResolveFilter
@NotNull PartialBodyResolveProvider partialResolveProvider
) {
JetScope scope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(klass);
@@ -393,7 +392,7 @@ public abstract class ElementResolver {
classDescriptor,
JetPsiUtil.getElementTextWithContext(klass));
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, bodyResolveFilter);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, partialResolveProvider);
bodyResolver.resolveConstructorParameterDefaultValuesAndAnnotations(createEmptyContext(resolveSession), trace, klass,
constructorDescriptor, scope);
}
@@ -403,36 +402,36 @@ public abstract class ElementResolver {
JetClassInitializer classInitializer,
BindingTrace trace,
JetFile file,
@Nullable Function1<JetElement, Boolean> filter
@NotNull PartialBodyResolveProvider partialResolveProvider
) {
JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(classInitializer, JetClassOrObject.class);
LazyClassDescriptor classOrObjectDescriptor = (LazyClassDescriptor) resolveSession.resolveToDescriptor(classOrObject);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, filter);
BodyResolver bodyResolver = createBodyResolver(resolveSession, trace, file, partialResolveProvider);
bodyResolver.resolveAnonymousInitializer(createEmptyContext(resolveSession), classInitializer, classOrObjectDescriptor);
}
private BodyResolver createBodyResolver(ResolveSession resolveSession, BindingTrace trace, JetFile file, @Nullable Function1<JetElement, Boolean> statementFilter) {
private BodyResolver createBodyResolver(ResolveSession resolveSession, BindingTrace trace, JetFile file, @NotNull PartialBodyResolveProvider partialResolveProvider) {
InjectorForBodyResolve bodyResolve = new InjectorForBodyResolve(
file.getProject(),
createParameters(resolveSession, statementFilter),
createParameters(resolveSession),
trace,
resolveSession.getModuleDescriptor(),
getAdditionalCheckerProvider(file)
getAdditionalCheckerProvider(file),
partialResolveProvider
);
return bodyResolve.getBodyResolver();
}
private static TopDownAnalysisParameters createParameters(@NotNull ResolveSession resolveSession, @Nullable Function1<JetElement, Boolean> statementFilter) {
private static TopDownAnalysisParameters createParameters(@NotNull ResolveSession resolveSession) {
return TopDownAnalysisParameters.createForLocalDeclarations(
resolveSession.getStorageManager(), resolveSession.getExceptionTracker(),
Predicates.<PsiFile>alwaysTrue(),
statementFilter);
Predicates.<PsiFile>alwaysTrue());
}
@NotNull
private static BodyResolveContextForLazy createEmptyContext(@NotNull ResolveSession resolveSession) {
return new BodyResolveContextForLazy(createParameters(resolveSession, null), Functions.<JetScope>constant(null));
return new BodyResolveContextForLazy(createParameters(resolveSession), Functions.<JetScope>constant(null));
}
private static JetScope getExpressionResolutionScope(@NotNull ResolveSession resolveSession, @NotNull JetExpression expression) {
@@ -35,13 +35,15 @@ class PartialBodyResolveFilter(
elementToResolve: JetElement,
private val declaration: JetDeclaration,
probablyNothingCallableNames: ProbablyNothingCallableNames
) : (JetElement) -> Boolean {
) : org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider() {
private val statementTree = StatementTree()
private val nothingFunctionNames = HashSet(probablyNothingCallableNames.functionNames())
private val nothingPropertyNames = probablyNothingCallableNames.propertyNames()
override val filter: ((JetElement) -> Boolean)? = { it is JetExpression && statementTree.statementMark(it) != MarkLevel.NONE }
;{
assert(declaration.isAncestor(elementToResolve))
@@ -130,9 +132,6 @@ class PartialBodyResolveFilter(
return nameFilter
}
override fun invoke(statement: JetElement)
= statement is JetExpression && statementTree.statementMark(statement) != MarkLevel.NONE
/**
* Finds places within the given statement that may affect smart-casts after it.
* That is, such places whose containing statements must be left in code to keep the smart-casts.
@@ -28,6 +28,7 @@ import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.AdditionalCheckerProvider;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.lazy.DefaultNothingCallableNames;
import org.jetbrains.jet.lang.resolve.lazy.ElementResolver;
import org.jetbrains.jet.lang.resolve.lazy.ProbablyNothingCallableNames;
@@ -61,7 +62,7 @@ public class ResolveElementCache extends ElementResolver {
manager.createWeaklyRetainedMemoizedFunction(new Function1<JetElement, BindingContext>() {
@Override
public BindingContext invoke(JetElement jetElement) {
return elementAdditionalResolve(jetElement, null);
return elementAdditionalResolve(jetElement, PartialBodyResolveProvider.NONE);
}
});
@@ -44,6 +44,7 @@ import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.PartialBodyResolveProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
@@ -94,6 +95,7 @@ public class InjectorForTopDownAnalyzerForJs {
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final PartialBodyResolveProvider partialBodyResolveProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
private final TaskPrioritizer taskPrioritizer;
@@ -144,6 +146,7 @@ public class InjectorForTopDownAnalyzerForJs {
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.partialBodyResolveProvider = new PartialBodyResolveProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
this.taskPrioritizer = new TaskPrioritizer(storageManager);
@@ -208,6 +211,7 @@ public class InjectorForTopDownAnalyzerForJs {
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setExtensionProvider(callResolverExtensionProvider);
expressionTypingServices.setPartialBodyResolveProvider(partialBodyResolveProvider);
expressionTypingServices.setProject(project);
expressionTypingServices.setTypeResolver(typeResolver);