Refactor frontend components

Make dependencies more explicit
Move components out of ExpressionTypingServices
Make ExpressionTypingUtils a true utility class, refactor stuff out
Extract new components: FakeCallResolver, MultiDeclarationResolver, ValueParameterResolver
This commit is contained in:
Pavel V. Talanov
2015-04-14 20:39:37 +03:00
parent 50ae8182b8
commit 1a5efacbf3
43 changed files with 1019 additions and 967 deletions
@@ -26,28 +26,30 @@ import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap;
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory;
import org.jetbrains.kotlin.resolve.lazy.ResolveSession;
import org.jetbrains.kotlin.resolve.lazy.ScopeProvider;
import org.jetbrains.kotlin.resolve.validation.DefaultSymbolUsageValidator;
import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzerForTopLevel;
import org.jetbrains.kotlin.js.resolve.KotlinJsCheckerProvider;
import org.jetbrains.kotlin.resolve.validation.SymbolUsageValidator;
import org.jetbrains.kotlin.types.DynamicTypesAllowed;
import org.jetbrains.kotlin.resolve.AnnotationResolver;
import org.jetbrains.kotlin.resolve.calls.CallResolver;
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver;
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices;
import org.jetbrains.kotlin.types.expressions.ExpressionTypingComponents;
import org.jetbrains.kotlin.resolve.calls.CallExpressionResolver;
import org.jetbrains.kotlin.types.expressions.ControlStructureTypingUtils;
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils;
import org.jetbrains.kotlin.types.expressions.ForLoopConventionsChecker;
import org.jetbrains.kotlin.types.expressions.LocalClassifierAnalyzer;
import org.jetbrains.kotlin.resolve.DescriptorResolver;
import org.jetbrains.kotlin.resolve.DelegatedPropertyResolver;
import org.jetbrains.kotlin.resolve.TypeResolver;
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver;
import org.jetbrains.kotlin.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.kotlin.context.TypeLazinessToken;
import org.jetbrains.kotlin.types.expressions.ForLoopConventionsChecker;
import org.jetbrains.kotlin.types.expressions.FakeCallResolver;
import org.jetbrains.kotlin.resolve.FunctionDescriptorResolver;
import org.jetbrains.kotlin.types.expressions.LocalClassifierAnalyzer;
import org.jetbrains.kotlin.types.expressions.MultiDeclarationResolver;
import org.jetbrains.kotlin.builtins.ReflectionTypes;
import org.jetbrains.kotlin.resolve.calls.CallExpressionResolver;
import org.jetbrains.kotlin.types.expressions.ValueParameterResolver;
import org.jetbrains.kotlin.resolve.StatementFilter;
import org.jetbrains.kotlin.resolve.calls.CallCompleter;
import org.jetbrains.kotlin.resolve.calls.CandidateResolver;
@@ -84,28 +86,30 @@ public class InjectorForTopDownAnalyzerForJs {
private final DeclarationProviderFactory declarationProviderFactory;
private final ResolveSession resolveSession;
private final ScopeProvider scopeProvider;
private final DefaultSymbolUsageValidator defaultSymbolUsageValidator;
private final LazyTopDownAnalyzerForTopLevel lazyTopDownAnalyzerForTopLevel;
private final KotlinJsCheckerProvider kotlinJsCheckerProvider;
private final SymbolUsageValidator symbolUsageValidator;
private final DynamicTypesAllowed dynamicTypesAllowed;
private final AnnotationResolver annotationResolver;
private final CallResolver callResolver;
private final ArgumentTypeResolver argumentTypeResolver;
private final ExpressionTypingServices expressionTypingServices;
private final ExpressionTypingComponents expressionTypingComponents;
private final CallExpressionResolver callExpressionResolver;
private final ControlStructureTypingUtils controlStructureTypingUtils;
private final ExpressionTypingUtils expressionTypingUtils;
private final ForLoopConventionsChecker forLoopConventionsChecker;
private final LocalClassifierAnalyzer localClassifierAnalyzer;
private final DescriptorResolver descriptorResolver;
private final DelegatedPropertyResolver delegatedPropertyResolver;
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final TypeLazinessToken typeLazinessToken;
private final ForLoopConventionsChecker forLoopConventionsChecker;
private final FakeCallResolver fakeCallResolver;
private final FunctionDescriptorResolver functionDescriptorResolver;
private final LocalClassifierAnalyzer localClassifierAnalyzer;
private final MultiDeclarationResolver multiDeclarationResolver;
private final ReflectionTypes reflectionTypes;
private final CallExpressionResolver callExpressionResolver;
private final ValueParameterResolver valueParameterResolver;
private final StatementFilter statementFilter;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
@@ -143,28 +147,30 @@ public class InjectorForTopDownAnalyzerForJs {
this.declarationProviderFactory = declarationProviderFactory;
this.resolveSession = new ResolveSession(project, globalContext, getModule(), declarationProviderFactory, bindingTrace);
this.scopeProvider = new ScopeProvider(getResolveSession());
this.defaultSymbolUsageValidator = DefaultSymbolUsageValidator.INSTANCE$;
this.lazyTopDownAnalyzerForTopLevel = new LazyTopDownAnalyzerForTopLevel();
this.kotlinJsCheckerProvider = KotlinJsCheckerProvider.INSTANCE$;
this.symbolUsageValidator = kotlinJsCheckerProvider.getSymbolUsageValidator();
this.dynamicTypesAllowed = new DynamicTypesAllowed();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
this.argumentTypeResolver = new ArgumentTypeResolver();
this.expressionTypingComponents = new ExpressionTypingComponents();
this.expressionTypingServices = new ExpressionTypingServices(expressionTypingComponents);
this.controlStructureTypingUtils = new ControlStructureTypingUtils(expressionTypingServices);
this.expressionTypingUtils = new ExpressionTypingUtils(expressionTypingServices, callResolver, kotlinBuiltIns);
this.forLoopConventionsChecker = new ForLoopConventionsChecker();
this.callExpressionResolver = new CallExpressionResolver(callResolver);
this.controlStructureTypingUtils = new ControlStructureTypingUtils(callResolver);
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeLazinessToken = new TypeLazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModule(), flexibleTypeCapabilitiesProvider, storageManager, typeLazinessToken, dynamicTypesAllowed);
this.forLoopConventionsChecker = new ForLoopConventionsChecker();
this.fakeCallResolver = new FakeCallResolver(project, callResolver);
this.functionDescriptorResolver = new FunctionDescriptorResolver(typeResolver, descriptorResolver, annotationResolver, storageManager, expressionTypingServices, kotlinBuiltIns);
this.localClassifierAnalyzer = new LocalClassifierAnalyzer(descriptorResolver, functionDescriptorResolver, typeResolver, annotationResolver);
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.multiDeclarationResolver = new MultiDeclarationResolver(fakeCallResolver, descriptorResolver, typeResolver, symbolUsageValidator);
this.reflectionTypes = new ReflectionTypes(getModule());
this.callExpressionResolver = new CallExpressionResolver();
this.valueParameterResolver = new ValueParameterResolver(kotlinJsCheckerProvider, expressionTypingServices);
this.statementFilter = new StatementFilter();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -205,6 +211,7 @@ public class InjectorForTopDownAnalyzerForJs {
annotationResolver.setStorageManager(storageManager);
annotationResolver.setTypeResolver(typeResolver);
callResolver.setAdditionalCheckerProvider(kotlinJsCheckerProvider);
callResolver.setArgumentTypeResolver(argumentTypeResolver);
callResolver.setCallCompleter(callCompleter);
callResolver.setCandidateResolver(candidateResolver);
@@ -216,34 +223,29 @@ public class InjectorForTopDownAnalyzerForJs {
argumentTypeResolver.setExpressionTypingServices(expressionTypingServices);
argumentTypeResolver.setTypeResolver(typeResolver);
expressionTypingServices.setAnnotationResolver(annotationResolver);
expressionTypingServices.setBuiltIns(kotlinBuiltIns);
expressionTypingServices.setCallExpressionResolver(callExpressionResolver);
expressionTypingServices.setCallResolver(callResolver);
expressionTypingServices.setDescriptorResolver(descriptorResolver);
expressionTypingServices.setFunctionDescriptorResolver(functionDescriptorResolver);
expressionTypingServices.setProject(project);
expressionTypingServices.setStatementFilter(statementFilter);
expressionTypingServices.setTypeResolver(typeResolver);
expressionTypingComponents.setAdditionalCheckerProvider(kotlinJsCheckerProvider);
expressionTypingComponents.setAnnotationResolver(annotationResolver);
expressionTypingComponents.setBuiltIns(kotlinBuiltIns);
expressionTypingComponents.setCallExpressionResolver(callExpressionResolver);
expressionTypingComponents.setCallResolver(callResolver);
expressionTypingComponents.setControlStructureTypingUtils(controlStructureTypingUtils);
expressionTypingComponents.setDescriptorResolver(descriptorResolver);
expressionTypingComponents.setDynamicTypesSettings(dynamicTypesAllowed);
expressionTypingComponents.setExpressionTypingServices(expressionTypingServices);
expressionTypingComponents.setExpressionTypingUtils(expressionTypingUtils);
expressionTypingComponents.setForLoopConventionsChecker(forLoopConventionsChecker);
expressionTypingComponents.setFunctionDescriptorResolver(functionDescriptorResolver);
expressionTypingComponents.setGlobalContext(globalContext);
expressionTypingComponents.setLocalClassifierAnalyzer(localClassifierAnalyzer);
expressionTypingComponents.setMultiDeclarationResolver(multiDeclarationResolver);
expressionTypingComponents.setPlatformToKotlinClassMap(platformToKotlinClassMap);
expressionTypingComponents.setReflectionTypes(reflectionTypes);
expressionTypingComponents.setSymbolUsageValidator(defaultSymbolUsageValidator);
expressionTypingComponents.setSymbolUsageValidator(symbolUsageValidator);
expressionTypingComponents.setTypeResolver(typeResolver);
expressionTypingComponents.setValueParameterResolver(valueParameterResolver);
forLoopConventionsChecker.setBuiltIns(kotlinBuiltIns);
forLoopConventionsChecker.setExpressionTypingServices(expressionTypingServices);
forLoopConventionsChecker.setExpressionTypingUtils(expressionTypingUtils);
forLoopConventionsChecker.setProject(project);
callExpressionResolver.setExpressionTypingServices(expressionTypingServices);
descriptorResolver.setAnnotationResolver(annotationResolver);
descriptorResolver.setBuiltIns(kotlinBuiltIns);
@@ -252,13 +254,16 @@ public class InjectorForTopDownAnalyzerForJs {
descriptorResolver.setStorageManager(storageManager);
descriptorResolver.setTypeResolver(typeResolver);
delegatedPropertyResolver.setAdditionalCheckerProvider(kotlinJsCheckerProvider);
delegatedPropertyResolver.setBuiltIns(kotlinBuiltIns);
delegatedPropertyResolver.setCallResolver(callResolver);
delegatedPropertyResolver.setExpressionTypingServices(expressionTypingServices);
qualifiedExpressionResolver.setSymbolUsageValidator(defaultSymbolUsageValidator);
qualifiedExpressionResolver.setSymbolUsageValidator(symbolUsageValidator);
callExpressionResolver.setExpressionTypingServices(expressionTypingServices);
forLoopConventionsChecker.setBuiltIns(kotlinBuiltIns);
forLoopConventionsChecker.setFakeCallResolver(fakeCallResolver);
forLoopConventionsChecker.setSymbolUsageValidator(symbolUsageValidator);
candidateResolver.setArgumentTypeResolver(argumentTypeResolver);
@@ -269,6 +274,7 @@ public class InjectorForTopDownAnalyzerForJs {
declarationScopeProvider.setFileScopeProvider(scopeProvider);
scriptBodyResolver.setAdditionalCheckerProvider(kotlinJsCheckerProvider);
scriptBodyResolver.setExpressionTypingServices(expressionTypingServices);
lazyTopDownAnalyzer.setBodyResolver(bodyResolver);
@@ -283,6 +289,7 @@ public class InjectorForTopDownAnalyzerForJs {
lazyTopDownAnalyzer.setTrace(bindingTrace);
lazyTopDownAnalyzer.setVarianceChecker(varianceChecker);
bodyResolver.setAdditionalCheckerProvider(kotlinJsCheckerProvider);
bodyResolver.setAnnotationResolver(annotationResolver);
bodyResolver.setCallResolver(callResolver);
bodyResolver.setControlFlowAnalyzer(controlFlowAnalyzer);
@@ -292,6 +299,7 @@ public class InjectorForTopDownAnalyzerForJs {
bodyResolver.setFunctionAnalyzerExtension(functionAnalyzerExtension);
bodyResolver.setScriptBodyResolverResolver(scriptBodyResolver);
bodyResolver.setTrace(bindingTrace);
bodyResolver.setValueParameterResolver(valueParameterResolver);
controlFlowAnalyzer.setTrace(bindingTrace);
@@ -22,5 +22,6 @@ import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider
public object KotlinJsCheckerProvider : AdditionalCheckerProvider(
additionalDeclarationCheckers = listOf(NativeInvokeChecker(), NativeGetterChecker(), NativeSetterChecker(), ClassDeclarationChecker()),
additionalCallCheckers = listOf(JsCallChecker()),
additionalTypeCheckers = listOf()
additionalTypeCheckers = listOf(),
additionalSymbolUsageValidators = listOf()
)