Avoid rewrites between script body checking and class members

This commit is contained in:
Andrey Breslav
2014-03-28 13:14:09 +04:00
parent 6ac2e2da8a
commit 7933f07bdd
6 changed files with 45 additions and 31 deletions
@@ -16,18 +16,17 @@
package org.jetbrains.jet.lang.resolve;
import com.google.common.base.Predicate;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.util.slicedmap.WritableSlice;
public class TemporaryBindingTrace extends DelegatingBindingTrace {
@NotNull
public static TemporaryBindingTrace create(@NotNull BindingTrace trace, String debugName) {
return new TemporaryBindingTrace(trace, debugName);
}
@NotNull
public static TemporaryBindingTrace create(@NotNull BindingTrace trace, String debugName, @Nullable Object resolutionSubjectForMessage) {
return create(trace, AnalyzingUtils.formDebugNameForBindingTrace(debugName, resolutionSubjectForMessage));
}
@@ -25,6 +25,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.data.JetClassInfoUtil;
@@ -43,6 +44,7 @@ import static org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils.safeNameFo
public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, DP extends DeclarationProvider> implements JetScope {
protected final ResolveSession resolveSession;
protected final BindingTrace trace;
protected final DP declarationProvider;
protected final D thisDescriptor;
@@ -57,9 +59,11 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
protected AbstractLazyMemberScope(
@NotNull ResolveSession resolveSession,
@NotNull DP declarationProvider,
@NotNull D thisDescriptor
@NotNull D thisDescriptor,
@NotNull BindingTrace trace
) {
this.resolveSession = resolveSession;
this.trace = trace;
this.declarationProvider = declarationProvider;
this.thisDescriptor = thisDescriptor;
@@ -136,7 +140,7 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
result.add(resolveSession.getDescriptorResolver().resolveFunctionDescriptorWithAnnotationArguments(
thisDescriptor, resolutionScope,
functionDeclaration,
resolveSession.getTrace(),
trace,
// this relies on the assumption that a lazily resolved declaration is not a local one,
// thus doesn't have a surrounding data flow
DataFlowInfo.EMPTY)
@@ -170,12 +174,12 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
resolveSession.getDescriptorResolver().resolvePropertyDescriptor(
thisDescriptor, resolutionScope,
propertyDeclaration,
resolveSession.getTrace(),
trace,
// this relies on the assumption that a lazily resolved declaration is not a local one,
// thus doesn't have a surrounding data flow
DataFlowInfo.EMPTY);
result.add(propertyDescriptor);
resolveSession.getAnnotationResolver().resolveAnnotationsArguments(propertyDescriptor, resolveSession.getTrace(), resolutionScope);
resolveSession.getAnnotationResolver().resolveAnnotationsArguments(propertyDescriptor, trace, resolutionScope);
}
getNonDeclaredProperties(name, result);
@@ -31,10 +31,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
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.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.lazy.LazyEntity;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
@@ -69,6 +66,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
}
};
private final ResolveSession resolveSession;
private final JetClassLikeInfo originalClassInfo;
private final ClassMemberDeclarationProvider declarationProvider;
@@ -93,7 +91,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@NotNull ResolveSession resolveSession,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull Name name,
@NotNull JetClassLikeInfo classLikeInfo
@NotNull JetClassLikeInfo classLikeInfo,
@NotNull BindingTrace traceForMembers // = resolveSession.getTrace()
) {
super(resolveSession.getStorageManager(), containingDeclaration, name);
this.resolveSession = resolveSession;
@@ -106,7 +105,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
this.originalClassInfo = classLikeInfo;
this.declarationProvider = resolveSession.getDeclarationProviderFactory().getClassMemberDeclarationProvider(classLikeInfo);
this.unsubstitutedMemberScope = new LazyClassMemberScope(resolveSession, declarationProvider, this);
this.unsubstitutedMemberScope = new LazyClassMemberScope(resolveSession, declarationProvider, this, traceForMembers);
this.typeConstructor = new LazyClassTypeConstructor();
@@ -165,6 +164,15 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
}, null);
}
public LazyClassDescriptor(
@NotNull ResolveSession resolveSession,
@NotNull DeclarationDescriptor containingDeclaration,
@NotNull Name name,
@NotNull JetClassLikeInfo classLikeInfo
) {
this(resolveSession, containingDeclaration, name, classLikeInfo, resolveSession.getTrace());
}
@NotNull
@Override
public JetScope getScopeForMemberLookup() {
@@ -76,9 +76,10 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
public LazyClassMemberScope(
@NotNull ResolveSession resolveSession,
@NotNull ClassMemberDeclarationProvider declarationProvider,
@NotNull LazyClassDescriptor thisClass
@NotNull LazyClassDescriptor thisClass,
@NotNull BindingTrace trace
) {
super(resolveSession, declarationProvider, thisClass);
super(resolveSession, declarationProvider, thisClass, trace);
this.primaryConstructor = resolveSession.getStorageManager().createNullableLazyValue(new Function0<ConstructorDescriptor>() {
@Override
public ConstructorDescriptor invoke() {
@@ -120,7 +121,6 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
@Override
public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
BindingTrace trace = resolveSession.getTrace();
JetDeclaration declaration = (JetDeclaration) BindingContextUtils.descriptorToDeclaration(trace.getBindingContext(),
fromCurrent);
assert declaration != null : "fromCurrent can not be a fake override";
@@ -129,7 +129,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
}
}
);
OverrideResolver.resolveUnknownVisibilities(result, resolveSession.getTrace());
OverrideResolver.resolveUnknownVisibilities(result, trace);
}
@NotNull
@@ -139,7 +139,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
Set<FunctionDescriptor> functions = super.getFunctions(name);
for (FunctionDescriptor functionDescriptor : functions) {
if (functionDescriptor.getKind() != FAKE_OVERRIDE && functionDescriptor.getKind() != DELEGATION) {
OverrideResolver.resolveUnknownVisibilityForMember(functionDescriptor, resolveSession.getTrace());
OverrideResolver.resolveUnknownVisibilityForMember(functionDescriptor, trace);
}
}
return functions;
@@ -176,7 +176,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
if (name.equals(Name.identifier(DescriptorResolver.COMPONENT_FUNCTION_NAME_PREFIX + parameterIndex))) {
SimpleFunctionDescriptor functionDescriptor =
DescriptorResolver.createComponentFunctionDescriptor(parameterIndex, property,
parameter, thisDescriptor, resolveSession.getTrace());
parameter, thisDescriptor, trace);
result.add(functionDescriptor);
break;
}
@@ -184,7 +184,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
if (!constructor.getValueParameters().isEmpty() && name.equals(DescriptorResolver.COPY_METHOD_NAME)) {
SimpleFunctionDescriptor copyFunctionDescriptor = DescriptorResolver.createCopyFunctionDescriptor(
constructor.getValueParameters(),
thisDescriptor, resolveSession.getTrace());
thisDescriptor, trace);
result.add(copyFunctionDescriptor);
}
}
@@ -194,12 +194,12 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
if (name.equals(DescriptorFactory.VALUES_METHOD_NAME)) {
SimpleFunctionDescriptor valuesMethod = DescriptorResolver
.createEnumClassObjectValuesMethod(thisDescriptor, resolveSession.getTrace());
.createEnumClassObjectValuesMethod(thisDescriptor, trace);
result.add(valuesMethod);
}
else if (name.equals(DescriptorFactory.VALUE_OF_METHOD_NAME)) {
SimpleFunctionDescriptor valueOfMethod = DescriptorResolver
.createEnumClassObjectValueOfMethod(thisDescriptor, resolveSession.getTrace());
.createEnumClassObjectValueOfMethod(thisDescriptor, trace);
result.add(valueOfMethod);
}
}
@@ -212,7 +212,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
for (VariableDescriptor variableDescriptor : properties) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) variableDescriptor;
if (propertyDescriptor.getKind() == FAKE_OVERRIDE || propertyDescriptor.getKind() == DELEGATION) continue;
OverrideResolver.resolveUnknownVisibilityForMember(propertyDescriptor, resolveSession.getTrace());
OverrideResolver.resolveUnknownVisibilityForMember(propertyDescriptor, trace);
}
return properties;
}
@@ -236,7 +236,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
thisDescriptor,
valueParameterDescriptor,
thisDescriptor.getScopeForClassHeaderResolution(),
parameter, resolveSession.getTrace()
parameter, trace
);
result.add(propertyDescriptor);
}
@@ -271,7 +271,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
return resolveSession.getTypeResolver().resolveType(
thisDescriptor.getScopeForClassHeaderResolution(),
reference,
resolveSession.getTrace(),
trace,
false);
}
};
@@ -282,7 +282,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
return extractor.extract(type, name);
}
};
return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, resolveSession.getTrace(), lazyMemberExtractor,
return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor,
lazyTypeResolver);
}
@@ -365,13 +365,13 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
.resolvePrimaryConstructorDescriptor(thisDescriptor.getScopeForClassHeaderResolution(),
thisDescriptor,
jetClass,
resolveSession.getTrace());
trace);
primaryConstructor = constructor;
setDeferredReturnType(constructor);
}
else {
ConstructorDescriptorImpl constructor =
DescriptorResolver.createAndRecordPrimaryConstructorForObject(classOrObject, thisDescriptor, resolveSession.getTrace());
DescriptorResolver.createAndRecordPrimaryConstructorForObject(classOrObject, thisDescriptor, trace);
setDeferredReturnType(constructor);
primaryConstructor = constructor;
}
@@ -380,7 +380,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
}
private void setDeferredReturnType(@NotNull ConstructorDescriptorImpl descriptor) {
descriptor.setReturnType(DeferredType.create(resolveSession.getStorageManager(), resolveSession.getTrace(),
descriptor.setReturnType(DeferredType.create(resolveSession.getStorageManager(), trace,
new Function0<JetType>() {
@Override
public JetType invoke() {
@@ -36,7 +36,7 @@ public class LazyPackageMemberScope extends AbstractLazyMemberScope<PackageFragm
public LazyPackageMemberScope(@NotNull ResolveSession resolveSession,
@NotNull PackageMemberDeclarationProvider declarationProvider,
@NotNull PackageFragmentDescriptor thisPackage) {
super(resolveSession, declarationProvider, thisPackage);
super(resolveSession, declarationProvider, thisPackage, resolveSession.getTrace());
}
@Nullable
@@ -48,6 +48,8 @@ import org.jetbrains.jet.lang.psi.JetTypeParameter
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler
import org.jetbrains.jet.lang.psi.JetCallableDeclaration
import org.jetbrains.jet.lang.resolve.scopes.WritableScope
import org.jetbrains.jet.lang.resolve.BindingTrace
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace
public class LazyScriptDescriptor(
val resolveSession: ResolveSession,
@@ -93,7 +95,8 @@ public class LazyScriptDescriptor(
override fun getClassKind() = ClassKind.CLASS
override fun getDeclarations() = jetScript.getDeclarations()
.filter { ScriptBodyResolver.shouldBeScriptClassMember(it) }
}
},
TemporaryBindingTrace.create(resolveSession.getTrace(), "A trace for script class, needed to avoid rewrites on members")
)
}