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