Avoid rewrites between script body checking and class members
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
+8
-4
@@ -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);
|
||||
|
||||
+14
-6
@@ -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() {
|
||||
|
||||
+16
-16
@@ -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() {
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+4
-1
@@ -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")
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user