Refactoring: hide fact of using injector inside lazy resolve session

This commit is contained in:
Nikolay Krasko
2014-01-22 13:41:50 +04:00
parent 36d5e580b4
commit b8ddb658fb
9 changed files with 63 additions and 39 deletions
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -93,7 +93,7 @@ public class LazyImportScope implements JetScope {
directiveUnderResolve = directive; directiveUnderResolve = directive;
try { try {
resolveSession.getInjector().getQualifiedExpressionResolver().processImportReference( resolveSession.getQualifiedExpressionResolver().processImportReference(
directive, directive,
rootScope, rootScope,
packageDescriptor.getMemberScope(), packageDescriptor.getMemberScope(),
@@ -30,8 +30,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.di.InjectorForLazyResolve; import org.jetbrains.jet.di.InjectorForLazyResolve;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo;
import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.lazy.declarations.DeclarationProviderFactory;
import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.lazy.declarations.PackageMemberDeclarationProvider;
@@ -70,7 +69,6 @@ public class ResolveSession implements KotlinCodeAnalyzer {
private final Predicate<FqNameUnsafe> specialClasses; private final Predicate<FqNameUnsafe> specialClasses;
private final InjectorForLazyResolve injector; private final InjectorForLazyResolve injector;
private final Function<FqName, Name> classifierAliases; private final Function<FqName, Name> classifierAliases;
@@ -122,6 +120,8 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return packageDescriptor.getDeclarationProvider().getAllDeclaredPackages(); return packageDescriptor.getDeclarationProvider().getAllDeclaredPackages();
} }
}; };
// TODO: parameter modification
rootDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider); rootDescriptor.addFragmentProvider(DependencyKind.SOURCES, packageFragmentProvider);
} }
@@ -147,11 +147,6 @@ public class ResolveSession implements KotlinCodeAnalyzer {
return new LazyPackageDescriptor(module, fqName, this, provider); return new LazyPackageDescriptor(module, fqName, this, provider);
} }
@NotNull
public InjectorForLazyResolve getInjector() {
return injector;
}
public boolean isClassSpecial(@NotNull FqNameUnsafe fqName) { public boolean isClassSpecial(@NotNull FqNameUnsafe fqName) {
return specialClasses.apply(fqName); return specialClasses.apply(fqName);
} }
@@ -177,7 +172,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
if (classOrObject.getParent() instanceof JetClassObject) { if (classOrObject.getParent() instanceof JetClassObject) {
return getClassObjectDescriptor((JetClassObject) classOrObject.getParent()); return getClassObjectDescriptor((JetClassObject) classOrObject.getParent());
} }
JetScope resolutionScope = getInjector().getScopeProvider().getResolutionScopeForDeclaration(classOrObject); JetScope resolutionScope = getScopeProvider().getResolutionScopeForDeclaration(classOrObject);
Name name = safeNameForLazyResolve(classOrObject.getNameAsName()); Name name = safeNameForLazyResolve(classOrObject.getNameAsName());
// Why not use the result here. Because it may be that there is a redeclaration: // Why not use the result here. Because it may be that there is a redeclaration:
@@ -310,7 +305,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
@Override @Override
public DeclarationDescriptor visitNamedFunction(@NotNull JetNamedFunction function, Void data) { public DeclarationDescriptor visitNamedFunction(@NotNull JetNamedFunction function, Void data) {
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(function); JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(function);
scopeForDeclaration.getFunctions(safeNameForLazyResolve(function)); scopeForDeclaration.getFunctions(safeNameForLazyResolve(function));
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function); return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, function);
} }
@@ -338,7 +333,7 @@ public class ResolveSession implements KotlinCodeAnalyzer {
@Override @Override
public DeclarationDescriptor visitProperty(@NotNull JetProperty property, Void data) { public DeclarationDescriptor visitProperty(@NotNull JetProperty property, Void data) {
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(property); JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(property);
scopeForDeclaration.getProperties(safeNameForLazyResolve(property)); scopeForDeclaration.getProperties(safeNameForLazyResolve(property));
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property); return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
} }
@@ -393,4 +388,34 @@ public class ResolveSession implements KotlinCodeAnalyzer {
ForceResolveUtil.forceResolveAllContents(lazyPackage); ForceResolveUtil.forceResolveAllContents(lazyPackage);
} }
} }
@NotNull
public ScopeProvider getScopeProvider() {
return injector.getScopeProvider();
}
@NotNull
public JetImportsFactory getJetImportsFactory() {
return injector.getJetImportsFactory();
}
@NotNull
public AnnotationResolver getAnnotationResolver() {
return injector.getAnnotationResolver();
}
@NotNull
public DescriptorResolver getDescriptorResolver() {
return injector.getDescriptorResolver();
}
@NotNull
public TypeResolver getTypeResolver() {
return injector.getTypeResolver();
}
@NotNull
public QualifiedExpressionResolver getQualifiedExpressionResolver() {
return injector.getQualifiedExpressionResolver();
}
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -92,7 +92,7 @@ public class ScopeProvider {
throw new IllegalStateException("Root package not found"); throw new IllegalStateException("Root package not found");
} }
JetImportsFactory importsFactory = resolveSession.getInjector().getJetImportsFactory(); JetImportsFactory importsFactory = resolveSession.getJetImportsFactory();
List<ImportPath> defaultImports = resolveSession.getModuleDescriptor().getDefaultImports(); List<ImportPath> defaultImports = resolveSession.getModuleDescriptor().getDefaultImports();
Collection<JetImportDirective> defaultImportDirectives = importsFactory.createImportDirectives(defaultImports); Collection<JetImportDirective> defaultImportDirectives = importsFactory.createImportDirectives(defaultImports);
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -126,7 +126,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
Collection<JetNamedFunction> declarations = declarationProvider.getFunctionDeclarations(name); Collection<JetNamedFunction> declarations = declarationProvider.getFunctionDeclarations(name);
for (JetNamedFunction functionDeclaration : declarations) { for (JetNamedFunction functionDeclaration : declarations) {
JetScope resolutionScope = getScopeForMemberDeclarationResolution(functionDeclaration); JetScope resolutionScope = getScopeForMemberDeclarationResolution(functionDeclaration);
result.add(resolveSession.getInjector().getDescriptorResolver().resolveFunctionDescriptorWithAnnotationArguments( result.add(resolveSession.getDescriptorResolver().resolveFunctionDescriptorWithAnnotationArguments(
thisDescriptor, resolutionScope, thisDescriptor, resolutionScope,
functionDeclaration, functionDeclaration,
resolveSession.getTrace(), resolveSession.getTrace(),
@@ -160,7 +160,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
for (JetProperty propertyDeclaration : declarations) { for (JetProperty propertyDeclaration : declarations) {
JetScope resolutionScope = getScopeForMemberDeclarationResolution(propertyDeclaration); JetScope resolutionScope = getScopeForMemberDeclarationResolution(propertyDeclaration);
PropertyDescriptor propertyDescriptor = PropertyDescriptor propertyDescriptor =
resolveSession.getInjector().getDescriptorResolver().resolvePropertyDescriptor( resolveSession.getDescriptorResolver().resolvePropertyDescriptor(
thisDescriptor, resolutionScope, thisDescriptor, resolutionScope,
propertyDeclaration, propertyDeclaration,
resolveSession.getTrace(), resolveSession.getTrace(),
@@ -168,7 +168,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
// thus doesn't have a surrounding data flow // thus doesn't have a surrounding data flow
DataFlowInfo.EMPTY); DataFlowInfo.EMPTY);
result.add(propertyDescriptor); result.add(propertyDescriptor);
resolveSession.getInjector().getAnnotationResolver().resolveAnnotationsArguments(propertyDescriptor, resolveSession.getTrace(), resolutionScope); resolveSession.getAnnotationResolver().resolveAnnotationsArguments(propertyDescriptor, resolveSession.getTrace(), resolutionScope);
} }
getNonDeclaredProperties(name, result); getNonDeclaredProperties(name, result);
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -302,7 +302,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo(); JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo();
JetModifierList modifierList = classInfo.getModifierList(); JetModifierList modifierList = classInfo.getModifierList();
if (modifierList != null) { if (modifierList != null) {
AnnotationResolver annotationResolver = resolveSession.getInjector().getAnnotationResolver(); AnnotationResolver annotationResolver = resolveSession.getAnnotationResolver();
JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(classInfo.getScopeAnchor()); JetScope scopeForDeclaration = getScopeProvider().getResolutionScopeForDeclaration(classInfo.getScopeAnchor());
return annotationResolver.resolveAnnotationsWithArguments(scopeForDeclaration, modifierList, resolveSession.getTrace()); return annotationResolver.resolveAnnotationsWithArguments(scopeForDeclaration, modifierList, resolveSession.getTrace());
} }
@@ -361,7 +361,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
return Collections.singleton(KotlinBuiltIns.getInstance().getAnyType()); return Collections.singleton(KotlinBuiltIns.getInstance().getAnyType());
} }
List<JetType> allSupertypes = resolveSession.getInjector().getDescriptorResolver() List<JetType> allSupertypes = resolveSession.getDescriptorResolver()
.resolveSupertypes(getScopeForClassHeaderResolution(), LazyClassDescriptor.this, classOrObject, .resolveSupertypes(getScopeForClassHeaderResolution(), LazyClassDescriptor.this, classOrObject,
resolveSession.getTrace()); resolveSession.getTrace());
@@ -468,6 +468,6 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
@NotNull @NotNull
private ScopeProvider getScopeProvider() { private ScopeProvider getScopeProvider() {
return resolveSession.getInjector().getScopeProvider(); return resolveSession.getScopeProvider();
} }
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -235,7 +235,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex());
if (parameter.getValOrVarNode() != null && name.equals(parameter.getNameAsName())) { if (parameter.getValOrVarNode() != null && name.equals(parameter.getNameAsName())) {
PropertyDescriptor propertyDescriptor = PropertyDescriptor propertyDescriptor =
resolveSession.getInjector().getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty( resolveSession.getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty(
thisDescriptor, thisDescriptor,
valueParameterDescriptor, valueParameterDescriptor,
thisDescriptor.getScopeForClassHeaderResolution(), thisDescriptor.getScopeForClassHeaderResolution(),
@@ -271,7 +271,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@Nullable @Nullable
@Override @Override
public JetType resolve(@NotNull JetTypeReference reference) { public JetType resolve(@NotNull JetTypeReference reference) {
return resolveSession.getInjector().getTypeResolver().resolveType( return resolveSession.getTypeResolver().resolveType(
thisDescriptor.getScopeForClassHeaderResolution(), thisDescriptor.getScopeForClassHeaderResolution(),
reference, reference,
resolveSession.getTrace(), resolveSession.getTrace(),
@@ -359,7 +359,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject(); JetClassOrObject classOrObject = declarationProvider.getOwnerInfo().getCorrespondingClassOrObject();
if (!thisDescriptor.getKind().isSingleton()) { if (!thisDescriptor.getKind().isSingleton()) {
JetClass jetClass = (JetClass) classOrObject; JetClass jetClass = (JetClass) classOrObject;
ConstructorDescriptorImpl constructor = resolveSession.getInjector().getDescriptorResolver() ConstructorDescriptorImpl constructor = resolveSession.getDescriptorResolver()
.resolvePrimaryConstructorDescriptor(thisDescriptor.getScopeForClassHeaderResolution(), .resolvePrimaryConstructorDescriptor(thisDescriptor.getScopeForClassHeaderResolution(),
thisDescriptor, thisDescriptor,
jetClass, jetClass,
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -54,7 +54,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragm
@NotNull @NotNull
@Override @Override
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) { protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
return resolveSession.getInjector().getScopeProvider().getFileScope((JetFile) declaration.getContainingFile()); return resolveSession.getScopeProvider().getFileScope((JetFile) declaration.getContainingFile());
} }
@Override @Override
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -101,7 +101,7 @@ public class LazyTypeParameterDescriptor extends AbstractLazyTypeParameterDescri
} }
private JetType resolveBoundType(@NotNull JetTypeReference boundTypeReference) { private JetType resolveBoundType(@NotNull JetTypeReference boundTypeReference) {
return resolveSession.getInjector().getTypeResolver() return resolveSession.getTypeResolver()
.resolveType(getContainingDeclaration().getScopeForClassHeaderResolution(), boundTypeReference, .resolveType(getContainingDeclaration().getScopeForClassHeaderResolution(), boundTypeReference,
resolveSession.getTrace(), false); resolveSession.getTrace(), false);
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2013 JetBrains s.r.o. * Copyright 2010-2014 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -142,7 +142,7 @@ public class ResolveElementCache {
} }
else if (resolveElement instanceof JetImportDirective) { else if (resolveElement instanceof JetImportDirective) {
JetImportDirective importDirective = (JetImportDirective) resolveElement; JetImportDirective importDirective = (JetImportDirective) resolveElement;
JetScope scope = resolveSession.getInjector().getScopeProvider().getFileScope((JetFile) importDirective.getContainingFile()); JetScope scope = resolveSession.getScopeProvider().getFileScope((JetFile) importDirective.getContainingFile());
// Get all descriptors to force resolving all imports // Get all descriptors to force resolving all imports
scope.getAllDescriptors(); scope.getAllDescriptors();
@@ -242,8 +242,7 @@ public class ResolveElementCache {
} }
private static void propertyAdditionalResolve(ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) { private static void propertyAdditionalResolve(ResolveSession resolveSession, final JetProperty jetProperty, BindingTrace trace, JetFile file) {
final JetScope propertyResolutionScope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration( final JetScope propertyResolutionScope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(jetProperty);
jetProperty);
BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy( BodyResolveContextForLazy bodyResolveContext = new BodyResolveContextForLazy(
resolveSession.getStorageManager(), resolveSession.getStorageManager(),
@@ -279,7 +278,7 @@ public class ResolveElementCache {
) { ) {
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(resolveSession.getStorageManager(), BodyResolver bodyResolver = createBodyResolverWithEmptyContext(resolveSession.getStorageManager(),
trace, file, resolveSession.getModuleDescriptor()); trace, file, resolveSession.getModuleDescriptor());
JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(namedFunction); JetScope scope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(namedFunction);
FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(namedFunction); FunctionDescriptor functionDescriptor = (FunctionDescriptor) resolveSession.resolveToDescriptor(namedFunction);
bodyResolver.resolveFunctionBody(trace, namedFunction, functionDescriptor, scope); bodyResolver.resolveFunctionBody(trace, namedFunction, functionDescriptor, scope);
} }
@@ -292,7 +291,7 @@ public class ResolveElementCache {
) { ) {
BodyResolver bodyResolver = createBodyResolverWithEmptyContext(resolveSession.getStorageManager(), BodyResolver bodyResolver = createBodyResolverWithEmptyContext(resolveSession.getStorageManager(),
trace, file, resolveSession.getModuleDescriptor()); trace, file, resolveSession.getModuleDescriptor());
JetScope scope = resolveSession.getInjector().getScopeProvider().getResolutionScopeForDeclaration(klass); JetScope scope = resolveSession.getScopeProvider().getResolutionScopeForDeclaration(klass);
ClassDescriptor classDescriptor = (ClassDescriptor) resolveSession.resolveToDescriptor(klass); ClassDescriptor classDescriptor = (ClassDescriptor) resolveSession.resolveToDescriptor(klass);
ConstructorDescriptor constructorDescriptor = classDescriptor.getUnsubstitutedPrimaryConstructor(); ConstructorDescriptor constructorDescriptor = classDescriptor.getUnsubstitutedPrimaryConstructor();
@@ -336,7 +335,7 @@ public class ResolveElementCache {
} }
private static JetScope getExpressionResolutionScope(@NotNull ResolveSession resolveSession, @NotNull JetExpression expression) { private static JetScope getExpressionResolutionScope(@NotNull ResolveSession resolveSession, @NotNull JetExpression expression) {
ScopeProvider provider = resolveSession.getInjector().getScopeProvider(); ScopeProvider provider = resolveSession.getScopeProvider();
JetDeclaration parentDeclaration = PsiTreeUtil.getParentOfType(expression, JetDeclaration.class); JetDeclaration parentDeclaration = PsiTreeUtil.getParentOfType(expression, JetDeclaration.class);
if (parentDeclaration == null) { if (parentDeclaration == null) {
return provider.getFileScope((JetFile) expression.getContainingFile()); return provider.getFileScope((JetFile) expression.getContainingFile());
@@ -349,7 +348,7 @@ public class ResolveElementCache {
resolveSession.getBindingContext(), "trace to resolve a member scope of expression", expression)); resolveSession.getBindingContext(), "trace to resolve a member scope of expression", expression));
if (BindingContextUtils.isExpressionWithValidReference(expression, resolveSession.getBindingContext())) { if (BindingContextUtils.isExpressionWithValidReference(expression, resolveSession.getBindingContext())) {
QualifiedExpressionResolver qualifiedExpressionResolver = resolveSession.getInjector().getQualifiedExpressionResolver(); QualifiedExpressionResolver qualifiedExpressionResolver = resolveSession.getQualifiedExpressionResolver();
// In some type declaration // In some type declaration
if (expression.getParent() instanceof JetUserType) { if (expression.getParent() instanceof JetUserType) {