Interface ClassDescriptorWithResolutionScopes extracted for both lazy and mutable classes

This commit is contained in:
Andrey Breslav
2014-02-05 13:45:32 +01:00
parent 9a8a8364dd
commit ac94dc5411
12 changed files with 76 additions and 38 deletions
@@ -166,8 +166,8 @@ public class BodyResolver {
MutableClassDescriptor descriptor = entry.getValue();
resolveDelegationSpecifierList(classOrObject, descriptor,
descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForSupertypeResolution(),
descriptor.getScopeForMemberResolution());
descriptor.getScopeForClassHeaderResolution(),
descriptor.getScopeForMemberDeclarationResolution());
}
}
@@ -342,7 +342,7 @@ public class BodyResolver {
private void resolveClassAnnotations() {
for (Map.Entry<JetClassOrObject, MutableClassDescriptor> entry : context.getClasses().entrySet()) {
resolveAnnotationArguments(entry.getValue().getScopeForSupertypeResolution(), entry.getKey());
resolveAnnotationArguments(entry.getValue().getScopeForClassHeaderResolution(), entry.getKey());
}
}
@@ -351,7 +351,7 @@ public class BodyResolver {
JetClassOrObject classOrObject = entry.getKey();
MutableClassDescriptor descriptor = entry.getValue();
resolveAnonymousInitializers(classOrObject, descriptor.getUnsubstitutedPrimaryConstructor(),
descriptor.getScopeForInitializers());
descriptor.getScopeForInitializerResolution());
}
}
@@ -394,10 +394,10 @@ public class BodyResolver {
MutableClassDescriptor classDescriptor = entry.getValue();
ConstructorDescriptor unsubstitutedPrimaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor();
annotationResolver.resolveAnnotationsArguments(classDescriptor.getScopeForSupertypeResolution(), klass.getPrimaryConstructorModifierList(), trace);
annotationResolver.resolveAnnotationsArguments(classDescriptor.getScopeForClassHeaderResolution(), klass.getPrimaryConstructorModifierList(), trace);
if (unsubstitutedPrimaryConstructor != null) {
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForSupertypeResolution(), unsubstitutedPrimaryConstructor);
WritableScope parameterScope = getPrimaryConstructorParametersScope(classDescriptor.getScopeForClassHeaderResolution(), unsubstitutedPrimaryConstructor);
expressionTypingServices.resolveValueParameters(klass.getPrimaryConstructorParameters(), unsubstitutedPrimaryConstructor.getValueParameters(),
parameterScope, context.getOuterDataFlowInfo(), trace, context.completeAnalysisNeeded(klass));
}
@@ -447,7 +447,7 @@ public class BodyResolver {
JetExpression delegateExpression = property.getDelegateExpression();
if (delegateExpression != null) {
assert initializer == null : "Initializer should be null for delegated property : " + property.getText();
resolvePropertyDelegate(property, propertyDescriptor, delegateExpression, classDescriptor.getScopeForMemberResolution(), propertyScope);
resolvePropertyDelegate(property, propertyDescriptor, delegateExpression, classDescriptor.getScopeForMemberDeclarationResolution(), propertyScope);
}
resolveAnnotationArguments(propertyScope, property);
@@ -155,7 +155,7 @@ public class DeclarationResolver {
if (modifierList != null) {
MutableClassDescriptor descriptor = entry.getValue();
descriptor.addAnnotations(annotationResolver.resolveAnnotationsWithoutArguments(
descriptor.getScopeForSupertypeResolution(), modifierList, trace));
descriptor.getScopeForClassHeaderResolution(), modifierList, trace));
}
}
}
@@ -178,8 +178,8 @@ public class DeclarationResolver {
}
resolveFunctionAndPropertyHeaders(
classOrObject.getDeclarations(), classDescriptor.getScopeForMemberResolution(),
classDescriptor.getScopeForInitializers(), classDescriptor.getScopeForMemberResolution(),
classOrObject.getDeclarations(), classDescriptor.getScopeForMemberDeclarationResolution(),
classDescriptor.getScopeForInitializerResolution(), classDescriptor.getScopeForMemberDeclarationResolution(),
classDescriptor.getBuilder());
}
@@ -283,7 +283,7 @@ public class DeclarationResolver {
boolean isAnnotationClass = DescriptorUtils.isAnnotationClass(classDescriptor);
// TODO : not all the parameters are real properties
JetScope memberScope = classDescriptor.getScopeForSupertypeResolution();
JetScope memberScope = classDescriptor.getScopeForClassHeaderResolution();
ConstructorDescriptor constructorDescriptor = descriptorResolver.resolvePrimaryConstructorDescriptor(memberScope, classDescriptor, klass, trace);
if (constructorDescriptor != null) {
List<ValueParameterDescriptor> valueParameterDescriptors = constructorDescriptor.getValueParameters();
@@ -133,7 +133,7 @@ public class DescriptorResolver {
@NotNull MutableClassDescriptor descriptor,
BindingTrace trace
) {
for (JetType supertype : resolveSupertypes(descriptor.getScopeForSupertypeResolution(), descriptor, jetClass, trace)) {
for (JetType supertype : resolveSupertypes(descriptor.getScopeForClassHeaderResolution(), descriptor, jetClass, trace)) {
descriptor.addSupertype(supertype);
}
}
@@ -215,7 +215,7 @@ public class TypeHierarchyResolver {
if (classOrObject instanceof JetClass) {
MutableClassDescriptor descriptor = entry.getValue();
//noinspection unchecked
descriptorResolver.resolveGenericBounds((JetClass) classOrObject, descriptor.getScopeForSupertypeResolution(),
descriptorResolver.resolveGenericBounds((JetClass) classOrObject, descriptor.getScopeForClassHeaderResolution(),
(List) descriptor.getTypeConstructor().getParameters(), trace);
}
}
@@ -610,7 +610,7 @@ public class TypeHierarchyResolver {
createClassObjectForEnumClass(mutableClassDescriptor);
JetScope classScope = mutableClassDescriptor.getScopeForMemberResolution();
JetScope classScope = mutableClassDescriptor.getScopeForMemberDeclarationResolution();
prepareForDeferredCall(classScope, mutableClassDescriptor, klass);
@@ -625,7 +625,7 @@ public class TypeHierarchyResolver {
) {
MutableClassDescriptor descriptor = new MutableClassDescriptor(owner.getOwnerForChildren(), outerScope, kind, false, name);
prepareForDeferredCall(descriptor.getScopeForMemberResolution(), descriptor, declaration);
prepareForDeferredCall(descriptor.getScopeForMemberDeclarationResolution(), descriptor, declaration);
createPrimaryConstructorForObject(declaration, descriptor);
trace.record(BindingContext.CLASS, declaration, descriptor);
@@ -139,7 +139,7 @@ public class ScopeProvider {
JetClassOrObject classOrObject = (JetClassOrObject) parentDeclaration;
LazyClassDescriptor classDescriptor = (LazyClassDescriptor) resolveSession.getClassDescriptor(classOrObject);
if (jetDeclaration instanceof JetClassInitializer || jetDeclaration instanceof JetProperty) {
return classDescriptor.getScopeForPropertyInitializerResolution();
return classDescriptor.getScopeForInitializerResolution();
}
return classDescriptor.getScopeForMemberDeclarationResolution();
}
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.descriptors.impl.ClassDescriptorBase;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.AnnotationResolver;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.descriptors.ClassDescriptorWithResolutionScopes;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyEntity;
@@ -56,7 +57,7 @@ import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isSyntheticClassObj
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.*;
import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName;
public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEntity, ClassDescriptor {
public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEntity, ClassDescriptorWithResolutionScopes {
private static final Predicate<JetType> VALID_SUPERTYPE = new Predicate<JetType>() {
@Override
public boolean apply(JetType type) {
@@ -157,6 +158,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
return unsubstitutedMemberScope;
}
@Override
@NotNull
public JetScope getScopeForClassHeaderResolution() {
return scopeForClassHeaderResolution.invoke();
@@ -177,6 +179,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
getScopeProvider().getResolutionScopeForDeclaration(scopeAnchor));
}
@Override
@NotNull
public JetScope getScopeForMemberDeclarationResolution() {
return scopeForMemberDeclarationResolution.invoke();
@@ -200,8 +203,9 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
classObjectAdapterScope);
}
@Override
@NotNull
public JetScope getScopeForPropertyInitializerResolution() {
public JetScope getScopeForInitializerResolution() {
return scopeForPropertyInitializerResolution.invoke();
}
@@ -332,7 +336,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements LazyEnti
getScopeForClassHeaderResolution();
getScopeForMemberDeclarationResolution();
ForceResolveUtil.forceResolveAllContents(getScopeForMemberLookup());
getScopeForPropertyInitializerResolution();
getScopeForInitializerResolution();
getUnsubstitutedInnerClassesScope();
ForceResolveUtil.forceResolveAllContents(getTypeConstructor());
getUnsubstitutedPrimaryConstructor();
@@ -94,7 +94,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@Override
protected JetScope getScopeForMemberDeclarationResolution(JetDeclaration declaration) {
if (declaration instanceof JetProperty) {
return thisDescriptor.getScopeForPropertyInitializerResolution();
return thisDescriptor.getScopeForInitializerResolution();
}
return thisDescriptor.getScopeForMemberDeclarationResolution();
}
@@ -3,42 +3,42 @@
<class-object-for-Class>.classObjFunc:SimpleFunctionDescriptor
<class-object-for-Class>.classObjProp:PropertyDescriptor
<class-object-for-Class>.this:ReceiverParameterDescriptor
<class-object-for-Class>:ClassDescriptor
<class-object-for-Class>:ClassDescriptorWithResolutionScopes
<class-object-for-NestedClass>.<init>():ConstructorDescriptor
<class-object-for-NestedClass>.nestedClassObjFunc:SimpleFunctionDescriptor
<class-object-for-NestedClass>.this:ReceiverParameterDescriptor
<class-object-for-NestedClass>:ClassDescriptor
<class-object-for-NestedClass>:ClassDescriptorWithResolutionScopes
<class-object-for-NestedObject>.<init>():ConstructorDescriptor
<class-object-for-NestedObject>.this:ReceiverParameterDescriptor
<class-object-for-NestedObject>:ClassDescriptor
<class-object-for-NestedObject>:ClassDescriptorWithResolutionScopes
<class-object-for-Object>.<init>():ConstructorDescriptor
<class-object-for-Object>.this:ReceiverParameterDescriptor
<class-object-for-Object>:ClassDescriptor
<class-object-for-Object>:ClassDescriptorWithResolutionScopes
<set-?>:ValueParameterDescriptor
Class.<get-classProp>:PropertyGetterDescriptor
Class.<init>():ConstructorDescriptor
Class.classFunc:SimpleFunctionDescriptor
Class.classProp:PropertyDescriptor
Class.this:ReceiverParameterDescriptor
Class:ClassDescriptor
Class:ClassDescriptorWithResolutionScopes
NestedClass.<init>():ConstructorDescriptor
NestedClass.this:ReceiverParameterDescriptor
NestedClass:ClassDescriptor
NestedClass:ClassDescriptorWithResolutionScopes
NestedObject.<init>():ConstructorDescriptor
NestedObject.nestedFunc:SimpleFunctionDescriptor
NestedObject.this:ReceiverParameterDescriptor
NestedObject:ClassDescriptor
NestedObject:ClassDescriptorWithResolutionScopes
NestedTrait.nestedTraitFun:SimpleFunctionDescriptor
NestedTrait.this:ReceiverParameterDescriptor
NestedTrait:ClassDescriptor
NestedTrait:ClassDescriptorWithResolutionScopes
Object.<get-objProp>:PropertyGetterDescriptor
Object.<init>():ConstructorDescriptor
Object.objFunc:SimpleFunctionDescriptor
Object.objProp:PropertyDescriptor
Object.this:ReceiverParameterDescriptor
Object:ClassDescriptor
Object:ClassDescriptorWithResolutionScopes
Outer.this:ReceiverParameterDescriptor
Outer:ClassDescriptor
Outer:ClassDescriptorWithResolutionScopes
T1:TypeParameterDescriptor
T2:TypeParameterDescriptor
T3:TypeParameterDescriptor
@@ -48,7 +48,7 @@ Trait.<get-traitProp>:PropertyGetterDescriptor
Trait.this:ReceiverParameterDescriptor
Trait.traitFunc:SimpleFunctionDescriptor
Trait.traitProp:PropertyDescriptor
Trait:ClassDescriptor
Trait:ClassDescriptorWithResolutionScopes
a:ValueParameterDescriptor
fake <class-object-for-NestedObject>.nestedFunc:SimpleFunctionDescriptor
fake <class-object-for-Object>.<get-objProp>:PropertyGetterDescriptor
@@ -67,4 +67,4 @@ innerTest.propVar:PropertyDescriptor
innerTest:PackageViewDescriptor
prop.this:ReceiverParameterDescriptor
prop.this:ReceiverParameterDescriptor
test:PackageViewDescriptor
test:PackageViewDescriptor
@@ -0,0 +1,31 @@
/*
* 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.descriptors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
@NotNull
JetScope getScopeForClassHeaderResolution();
@NotNull
JetScope getScopeForMemberDeclarationResolution();
@NotNull
JetScope getScopeForInitializerResolution();
}
@@ -27,7 +27,7 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
public class MutableClassDescriptor extends MutableClassDescriptorLite {
public class MutableClassDescriptor extends MutableClassDescriptorLite implements ClassDescriptorWithResolutionScopes {
private final Set<ConstructorDescriptor> constructors = Sets.newLinkedHashSet();
private ConstructorDescriptor primaryConstructor;
@@ -137,13 +137,15 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
scopeForMemberResolution.setImplicitReceiver(getThisAsReceiverParameter());
}
@Override
@NotNull
public JetScope getScopeForSupertypeResolution() {
public JetScope getScopeForClassHeaderResolution() {
return scopeForSupertypeResolution;
}
@Override
@NotNull
public JetScope getScopeForMemberResolution() {
public JetScope getScopeForMemberDeclarationResolution() {
return scopeForMemberResolution;
}
@@ -154,8 +156,9 @@ public class MutableClassDescriptor extends MutableClassDescriptorLite {
return scopeForInitializers;
}
@Override
@NotNull
public JetScope getScopeForInitializers() {
public JetScope getScopeForInitializerResolution() {
return getWritableScopeForInitializers();
}
@@ -312,7 +312,7 @@ public class ResolveElementCache {
JetClassOrObject classOrObject = PsiTreeUtil.getParentOfType(classInitializer, JetClassOrObject.class);
LazyClassDescriptor classOrObjectDescriptor = (LazyClassDescriptor) resolveSession.resolveToDescriptor(classOrObject);
bodyResolver.resolveAnonymousInitializers(classOrObject, classOrObjectDescriptor.getUnsubstitutedPrimaryConstructor(),
classOrObjectDescriptor.getScopeForPropertyInitializerResolution());
classOrObjectDescriptor.getScopeForInitializerResolution());
return true;
}
@@ -670,7 +670,7 @@ public class CreateFunctionFromUsageFix extends CreateFromUsageFixBase {
scope = currentFileModule.getPackage(JetPsiUtil.getFQName(currentFile)).getMemberScope();
} else {
assert ownerClassDescriptor instanceof MutableClassDescriptor;
scope = ((MutableClassDescriptor) ownerClassDescriptor).getScopeForMemberResolution();
scope = ((MutableClassDescriptor) ownerClassDescriptor).getScopeForMemberDeclarationResolution();
}
// figure out type substitutions for type parameters