LazinessTokens introduced to enable/disable building lazy types

This commit is contained in:
Andrey Breslav
2014-11-01 19:07:02 +02:00
parent 2334bf4c70
commit 7d9be42969
18 changed files with 65 additions and 21 deletions
@@ -37,6 +37,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationRe
import org.jetbrains.jet.lang.resolve.java.structure.impl.JavaPropertyInitializerEvaluatorImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.JavaSourceElementFactoryImpl;
import org.jetbrains.jet.lang.resolve.java.JavaFlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazyResolveToken;
import org.jetbrains.jet.lang.resolve.AdditionalCheckerProvider;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
@@ -94,6 +95,7 @@ public class InjectorForLazyResolveWithJava {
private final JavaPropertyInitializerEvaluatorImpl javaPropertyInitializerEvaluator;
private final JavaSourceElementFactoryImpl javaSourceElementFactory;
private final JavaFlexibleTypeCapabilitiesProvider javaFlexibleTypeCapabilitiesProvider;
private final LazyResolveToken lazyResolveToken;
private final AdditionalCheckerProvider additionalCheckerProvider;
private final AnnotationResolver annotationResolver;
private final CallResolver callResolver;
@@ -157,6 +159,7 @@ public class InjectorForLazyResolveWithJava {
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, module);
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, module);
this.javaFlexibleTypeCapabilitiesProvider = new JavaFlexibleTypeCapabilitiesProvider();
this.lazyResolveToken = new LazyResolveToken();
this.additionalCheckerProvider = org.jetbrains.jet.lang.resolve.kotlin.JavaDeclarationCheckerProvider.INSTANCE$;
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
@@ -171,7 +174,7 @@ public class InjectorForLazyResolveWithJava {
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, module, javaFlexibleTypeCapabilitiesProvider, storageManager);
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, module, javaFlexibleTypeCapabilitiesProvider, storageManager, lazyResolveToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -55,6 +55,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorResolver;
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.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
@@ -123,6 +124,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final DelegatedPropertyResolver delegatedPropertyResolver;
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
@@ -196,7 +198,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), javaFlexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), javaFlexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -40,4 +40,16 @@ public open class GlobalContextImpl(
public fun GlobalContext(): GlobalContextImpl {
val tracker = ExceptionTracker()
return GlobalContextImpl(LockBasedStorageManager.createWithExceptionHandling(tracker), tracker)
}
deprecated("Used temporarily while we are in transition from to lazy resolve")
public open class LazinessToken {
deprecated("Used temporarily while we are in transition from to lazy resolve")
public open fun isLazy(): Boolean = false
}
deprecated("Used temporarily while we are in transition from to lazy resolve")
public class LazyResolveToken : LazinessToken() {
deprecated("Used temporarily while we are in transition from to lazy resolve")
override fun isLazy() = true
}
@@ -39,6 +39,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.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
@@ -77,6 +78,7 @@ public class InjectorForBodyResolve {
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
@@ -115,7 +117,8 @@ public class InjectorForBodyResolve {
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFacto
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.AdditionalCheckerProvider;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.context.LazyResolveToken;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolver;
import org.jetbrains.jet.lang.resolve.calls.ArgumentTypeResolver;
@@ -62,6 +63,7 @@ public class InjectorForLazyResolve {
private final BindingTrace bindingTrace;
private final AdditionalCheckerProvider additionalCheckerProvider;
private final ResolveSession resolveSession;
private final LazyResolveToken lazyResolveToken;
private final AnnotationResolver annotationResolver;
private final CallResolver callResolver;
private final ArgumentTypeResolver argumentTypeResolver;
@@ -101,6 +103,7 @@ public class InjectorForLazyResolve {
this.bindingTrace = bindingTrace;
this.additionalCheckerProvider = additionalCheckerProvider;
this.resolveSession = new ResolveSession(project, globalContext, moduleDescriptor, declarationProviderFactory, bindingTrace);
this.lazyResolveToken = new LazyResolveToken();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
this.argumentTypeResolver = new ArgumentTypeResolver();
@@ -115,7 +118,7 @@ public class InjectorForLazyResolve {
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager);
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazyResolveToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.AnnotationResolver;
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.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
import org.jetbrains.jet.lang.resolve.DelegatedPropertyResolver;
@@ -60,6 +61,7 @@ public class InjectorForMacros {
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallExpressionResolver callExpressionResolver;
private final DescriptorResolver descriptorResolver;
private final DelegatedPropertyResolver delegatedPropertyResolver;
@@ -88,7 +90,8 @@ public class InjectorForMacros {
this.annotationResolver = new AnnotationResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callExpressionResolver = new CallExpressionResolver();
this.descriptorResolver = new DescriptorResolver();
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
@@ -42,6 +42,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.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
@@ -90,6 +91,7 @@ public class InjectorForTopDownAnalyzerBasic {
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
@@ -138,7 +140,8 @@ public class InjectorForTopDownAnalyzerBasic {
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);
@@ -115,7 +115,7 @@ public class BodyResolver {
resolvePropertyDeclarationBodies(c);
if (!c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (!c.getTopDownAnalysisParameters().isLazy()) {
resolveClassAnnotations(c);
}
resolveAnonymousInitializers(c);
@@ -322,7 +322,7 @@ public class BodyResolver {
}
private void resolveAnonymousInitializers(@NotNull BodiesResolveContext c) {
if (c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (c.getTopDownAnalysisParameters().isLazy()) {
for (Map.Entry<JetClassInitializer, ClassDescriptorWithResolutionScopes> entry : c.getAnonymousInitializers().entrySet()) {
JetClassInitializer initializer = entry.getKey();
ClassDescriptorWithResolutionScopes descriptor = entry.getValue();
@@ -586,7 +586,7 @@ public class BodyResolver {
JetScope declaringScope = c.getDeclaringScopes().apply(declaration);
assert declaringScope != null;
if (!c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (!c.getTopDownAnalysisParameters().isLazy()) {
resolveAnnotationArguments(declaringScope, declaration);
}
resolveFunctionBody(c, trace, declaration, descriptor, declaringScope);
@@ -267,7 +267,7 @@ public class DeclarationsChecker {
private void checkClass(BodiesResolveContext c, JetClass aClass, ClassDescriptorWithResolutionScopes classDescriptor) {
checkOpenMembers(classDescriptor);
if (c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (c.getTopDownAnalysisParameters().isLazy()) {
checkTypeParameters(aClass);
}
if (aClass.isTrait()) {
@@ -124,7 +124,7 @@ public class DescriptorResolver {
}
int index = 0;
for (JetTypeParameter typeParameter : typeParameters) {
if (!topDownAnalysisParameters.isLazyTopDownAnalysis()) {
if (!topDownAnalysisParameters.isLazy()) {
// TODO: Support
AnnotationResolver.reportUnsupportedAnnotationForTypeParameter(typeParameter, trace);
}
@@ -99,7 +99,7 @@ public class LazyTopDownAnalyzer {
@NotNull TopDownAnalysisParameters topDownAnalysisParameters,
@NotNull Collection<? extends PsiElement> declarations
) {
assert topDownAnalysisParameters.isLazyTopDownAnalysis() : "Lazy analyzer is run in non-lazy mode";
assert topDownAnalysisParameters.isLazy() : "Lazy analyzer is run in non-lazy mode";
final TopDownAnalysisContext c = new TopDownAnalysisContext(topDownAnalysisParameters);
final Multimap<FqName, JetElement> topLevelFqNames = HashMultimap.create();
@@ -62,7 +62,7 @@ public class ScriptBodyResolver {
JetScript declaration = e.getKey();
ScriptDescriptor descriptor = e.getValue();
if (c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (c.getTopDownAnalysisParameters().isLazy()) {
ForceResolveUtil.forceResolveAllContents(descriptor);
continue;
}
@@ -20,13 +20,14 @@ import com.google.common.base.Predicate;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.storage.ExceptionTracker;
import org.jetbrains.jet.storage.StorageManager;
/**
* Various junk that cannot be placed into context (yet).
*/
public class TopDownAnalysisParameters implements GlobalContext {
public class TopDownAnalysisParameters extends LazinessToken implements GlobalContext {
private static boolean LAZY;
static {
@@ -118,8 +119,9 @@ public class TopDownAnalysisParameters implements GlobalContext {
}
// Used temporarily while we are transitioning from eager to lazy analysis of headers in the IDE
@Override
@Deprecated
public boolean isLazyTopDownAnalysis() {
public boolean isLazy() {
return lazyTopDownAnalysis;
}
}
@@ -133,7 +133,7 @@ public class TopDownAnalyzer {
// c.enableDebugOutput();
c.debug("Enter");
if (c.getTopDownAnalysisParameters().isLazyTopDownAnalysis()) {
if (c.getTopDownAnalysisParameters().isLazy()) {
ResolveSession resolveSession = new InjectorForLazyResolve(
project,
new GlobalContextImpl((LockBasedStorageManager) c.getStorageManager(), c.getExceptionTracker()), // TODO
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.types.Variance.*
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider
import kotlin.platform.platformStatic
import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.context.LazinessToken
import javax.inject.Inject
public class TypeResolver(
@@ -38,7 +39,8 @@ public class TypeResolver(
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
private val moduleDescriptor: ModuleDescriptor,
private val flexibleTypeCapabilitiesProvider: FlexibleTypeCapabilitiesProvider,
private val storageManager: StorageManager
private val storageManager: StorageManager,
private val lazinessToken: LazinessToken
) {
public open class FlexibleTypeCapabilitiesProvider {
@@ -61,7 +63,7 @@ public class TypeResolver(
val cachedType = c.trace.getBindingContext().get(BindingContext.TYPE, typeReference)
if (cachedType != null) return type(cachedType)
if (!c.allowBareTypes) {
if (!c.allowBareTypes && lazinessToken.isLazy()) {
// Bare types can be allowed only inside expressions; lazy type resolution is only relevant for declarations
class LazyKotlinType : DelegatingType() {
private val _delegate = storageManager.createLazyValue { doResolvePossiblyBareType(c, typeReference).getActualType() }
@@ -40,6 +40,7 @@ import org.jetbrains.jet.lang.resolve.calls.CallExpressionResolver;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver;
import org.jetbrains.jet.lang.resolve.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -71,6 +72,7 @@ public class InjectorForTests {
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
public InjectorForTests(
@NotNull Project project,
@@ -89,7 +91,8 @@ public class InjectorForTests {
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.globalContext = org.jetbrains.jet.context.ContextPackage.GlobalContext();
this.storageManager = globalContext.getStorageManager();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, moduleDescriptor, flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.additionalCheckerProvider = org.jetbrains.jet.lang.resolve.kotlin.JavaDeclarationCheckerProvider.INSTANCE$;
this.argumentTypeResolver = new ArgumentTypeResolver();
this.candidateResolver = new CandidateResolver();
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinderFactory
import org.jetbrains.jet.lang.resolve.java.TopDownAnalyzerFacadeForJVM
import org.jetbrains.jet.lang.resolve.kotlin.JavaDeclarationCheckerProvider
import org.jetbrains.jet.lang.resolve.java.JavaFlexibleTypeCapabilitiesProvider
import org.jetbrains.jet.context.LazyResolveToken
// NOTE: After making changes, you need to re-generate the injectors.
// To do that, you can run main in this file.
@@ -188,7 +189,8 @@ private fun generatorForLazyResolveWithJava() =
javaClass<PsiBasedExternalAnnotationResolver>(),
javaClass<JavaPropertyInitializerEvaluatorImpl>(),
javaClass<JavaSourceElementFactoryImpl>(),
javaClass<JavaFlexibleTypeCapabilitiesProvider>()
javaClass<JavaFlexibleTypeCapabilitiesProvider>(),
javaClass<LazyResolveToken>()
)
field(javaClass<AdditionalCheckerProvider>(),
init = GivenExpression(javaClass<JavaDeclarationCheckerProvider>().getName() + ".INSTANCE$"))
@@ -250,6 +252,8 @@ private fun generatorForLazyResolve() =
parameter(javaClass<AdditionalCheckerProvider>())
publicField(javaClass<ResolveSession>())
field(javaClass<LazyResolveToken>())
}
private fun generator(
@@ -42,6 +42,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.TypeResolver.FlexibleTypeCapabilitiesProvider;
import org.jetbrains.jet.context.LazinessToken;
import org.jetbrains.jet.lang.resolve.calls.CallResolverExtensionProvider;
import org.jetbrains.jet.lang.resolve.calls.CallCompleter;
import org.jetbrains.jet.lang.resolve.calls.CandidateResolver;
@@ -90,6 +91,7 @@ public class InjectorForTopDownAnalyzerForJs {
private final TypeResolver typeResolver;
private final QualifiedExpressionResolver qualifiedExpressionResolver;
private final FlexibleTypeCapabilitiesProvider flexibleTypeCapabilitiesProvider;
private final LazinessToken lazinessToken;
private final CallResolverExtensionProvider callResolverExtensionProvider;
private final CallCompleter callCompleter;
private final CandidateResolver candidateResolver;
@@ -137,7 +139,8 @@ public class InjectorForTopDownAnalyzerForJs {
this.delegatedPropertyResolver = new DelegatedPropertyResolver();
this.qualifiedExpressionResolver = new QualifiedExpressionResolver();
this.flexibleTypeCapabilitiesProvider = new FlexibleTypeCapabilitiesProvider();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager);
this.lazinessToken = new LazinessToken();
this.typeResolver = new TypeResolver(annotationResolver, qualifiedExpressionResolver, getModuleDescriptor(), flexibleTypeCapabilitiesProvider, storageManager, lazinessToken);
this.callResolverExtensionProvider = new CallResolverExtensionProvider();
this.candidateResolver = new CandidateResolver();
this.callCompleter = new CallCompleter(argumentTypeResolver, candidateResolver);