KT-8394 ReplaceWith for Delegates.lazy fails outside of stdlib

#KT-8394 Fixed
This commit is contained in:
Valentin Kipyatkov
2015-07-10 21:53:02 +03:00
parent 1346d98bf3
commit d32ba08cb7
20 changed files with 199 additions and 90 deletions
@@ -33,9 +33,6 @@ public interface ClassDescriptorWithResolutionScopes extends ClassDescriptor {
@NotNull
JetScope getScopeForInitializerResolution();
@NotNull
JetScope getScopeForMemberLookup();
@Nullable
@Override
ClassDescriptorWithResolutionScopes getCompanionObjectDescriptor();
@@ -51,7 +51,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
// This scope contains type parameters but does not contain inner classes
private final WritableScope scopeForSupertypeResolution;
private JetScope scopeForInitializers; //contains members + primary constructor value parameters + map for backing fields
private final JetScope scopeForMemberLookup;
private final JetScope unsubstitutedMemberScope;
private final JetScope staticScope = new StaticScopeForKotlinClass(this);
public MutableClassDescriptor(
@@ -70,7 +70,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
RedeclarationHandler redeclarationHandler = RedeclarationHandler.DO_NOTHING;
this.scopeForMemberLookup = new WritableScopeImpl(JetScope.Empty.INSTANCE$, this, redeclarationHandler, "MemberLookup", null, this)
this.unsubstitutedMemberScope = new WritableScopeImpl(JetScope.Empty.INSTANCE$, this, redeclarationHandler, "MemberLookup", null, this)
.changeLockLevel(WritableScope.LockLevel.BOTH);
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler, "SupertypeResolution")
.changeLockLevel(WritableScope.LockLevel.BOTH);
@@ -256,8 +256,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
@Override
@NotNull
public JetScope getScopeForMemberLookup() {
return scopeForMemberLookup;
public JetScope getUnsubstitutedMemberScope() {
return unsubstitutedMemberScope;
}
@NotNull
@@ -61,7 +61,7 @@ public class DeclarationResolver {
public fun checkRedeclarations(c: TopDownAnalysisContext) {
for (classDescriptor in c.getDeclaredClasses().values()) {
val descriptorMap = HashMultimap.create<Name, DeclarationDescriptor>()
for (desc in classDescriptor.getScopeForMemberLookup().getOwnDeclaredDescriptors()) {
for (desc in classDescriptor.getUnsubstitutedMemberScope().getOwnDeclaredDescriptors()) {
if (desc is ClassDescriptor || desc is PropertyDescriptor) {
descriptorMap.put(desc.getName(), desc)
}
@@ -0,0 +1,68 @@
/*
* Copyright 2010-2015 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.kotlin.resolve.lazy.descriptors
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.resolve.scopes.*
import org.jetbrains.kotlin.storage.StorageManager
class ClassResolutionScopesSupport(
private val classDescriptor: ClassDescriptor,
storageManager: StorageManager,
private val getOuterScope: () -> JetScope
) {
private val staticScope = StaticScopeForKotlinClass(classDescriptor)
private val scopeForClassHeaderResolution = storageManager.createLazyValue { computeScopeForClassHeaderResolution() }
private val scopeForMemberDeclarationResolution = storageManager.createLazyValue { computeScopeForMemberDeclarationResolution() }
fun getStaticScope(): JetScope = staticScope
fun getScopeForClassHeaderResolution(): JetScope = scopeForClassHeaderResolution()
fun getScopeForMemberDeclarationResolution(): JetScope = scopeForMemberDeclarationResolution()
private fun computeScopeForClassHeaderResolution(): JetScope {
val scope = WritableScopeImpl(JetScope.Empty, classDescriptor, RedeclarationHandler.DO_NOTHING, "Scope with type parameters for " + classDescriptor.getName())
for (typeParameterDescriptor in classDescriptor.getTypeConstructor().getParameters()) {
scope.addClassifierDescriptor(typeParameterDescriptor)
}
scope.changeLockLevel(WritableScope.LockLevel.READING)
return ChainedScope(classDescriptor, "ScopeForClassHeaderResolution: " + classDescriptor.getName(), scope, getOuterScope())
}
private fun computeScopeForMemberDeclarationResolution(): JetScope {
val thisScope = WritableScopeImpl(JetScope.Empty, classDescriptor, RedeclarationHandler.DO_NOTHING,
"Scope with 'this' for " + classDescriptor.getName(), classDescriptor.getThisAsReceiverParameter(), classDescriptor)
thisScope.changeLockLevel(WritableScope.LockLevel.READING)
return ChainedScope(
classDescriptor,
"ScopeForMemberDeclarationResolution: " + classDescriptor.getName(),
thisScope,
classDescriptor.getUnsubstitutedMemberScope(),
getScopeForClassHeaderResolution(),
getCompanionObjectScope(),
classDescriptor.getStaticScope())
}
private fun getCompanionObjectScope(): JetScope {
val companionObjectDescriptor = classDescriptor.getCompanionObjectDescriptor()
return if ((companionObjectDescriptor != null)) CompanionObjectMixinScope(companionObjectDescriptor) else JetScope.Empty
}
}
@@ -87,15 +87,14 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
private final MemoizedFunctionToNotNull<JetObjectDeclaration, ClassDescriptor> extraCompanionObjectDescriptors;
private final LazyClassMemberScope unsubstitutedMemberScope;
private final JetScope staticScope = new StaticScopeForKotlinClass(this);
private final NotNullLazyValue<JetScope> scopeForClassHeaderResolution;
private final NotNullLazyValue<JetScope> scopeForMemberDeclarationResolution;
private final NotNullLazyValue<JetScope> scopeForPropertyInitializerResolution;
private final NullableLazyValue<Void> forceResolveAllContents;
private final boolean isCompanionObject;
private final ClassResolutionScopesSupport resolutionScopesSupport;
public LazyClassDescriptor(
@NotNull LazyClassContext c,
@NotNull DeclarationDescriptor containingDeclaration,
@@ -193,18 +192,6 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
return computeCompanionObjectDescriptor(companionObject);
}
});
this.scopeForClassHeaderResolution = storageManager.createLazyValue(new Function0<JetScope>() {
@Override
public JetScope invoke() {
return computeScopeForClassHeaderResolution();
}
});
this.scopeForMemberDeclarationResolution = storageManager.createLazyValue(new Function0<JetScope>() {
@Override
public JetScope invoke() {
return computeScopeForMemberDeclarationResolution();
}
});
this.scopeForPropertyInitializerResolution = storageManager.createLazyValue(new Function0<JetScope>() {
@Override
public JetScope invoke() {
@@ -218,6 +205,13 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
return null;
}
}, null);
this.resolutionScopesSupport = new ClassResolutionScopesSupport(this, storageManager, new Function0<JetScope>() {
@Override
public JetScope invoke() {
return getOuterScope();
}
});
}
// NOTE: Called from constructor!
@@ -231,25 +225,14 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@NotNull
@Override
public JetScope getScopeForMemberLookup() {
public JetScope getUnsubstitutedMemberScope() {
return unsubstitutedMemberScope;
}
@Override
@NotNull
public JetScope getScopeForClassHeaderResolution() {
return scopeForClassHeaderResolution.invoke();
}
@NotNull
private JetScope computeScopeForClassHeaderResolution() {
WritableScopeImpl scope = new WritableScopeImpl(JetScope.Empty.INSTANCE$, this, RedeclarationHandler.DO_NOTHING, "Scope with type parameters for " + getName());
for (TypeParameterDescriptor typeParameterDescriptor : getTypeConstructor().getParameters()) {
scope.addClassifierDescriptor(typeParameterDescriptor);
}
scope.changeLockLevel(WritableScope.LockLevel.READING);
return new ChainedScope(this, "ScopeForClassHeaderResolution: " + getName(), scope, getOuterScope());
return resolutionScopesSupport.getScopeForClassHeaderResolution();
}
@NotNull
@@ -260,29 +243,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override
@NotNull
public JetScope getScopeForMemberDeclarationResolution() {
return scopeForMemberDeclarationResolution.invoke();
}
@NotNull
private JetScope computeScopeForMemberDeclarationResolution() {
WritableScopeImpl thisScope = new WritableScopeImpl(JetScope.Empty.INSTANCE$, this, RedeclarationHandler.DO_NOTHING,
"Scope with 'this' for " + getName(), this.getThisAsReceiverParameter(), this);
thisScope.changeLockLevel(WritableScope.LockLevel.READING);
return new ChainedScope(
this,
"ScopeForMemberDeclarationResolution: " + getName(),
thisScope,
getScopeForMemberLookup(),
getScopeForClassHeaderResolution(),
getCompanionObjectScope(),
getStaticScope()
);
}
private JetScope getCompanionObjectScope() {
ClassDescriptor companionObjectDescriptor = getCompanionObjectDescriptor();
return (companionObjectDescriptor != null) ? new CompanionObjectMixinScope(companionObjectDescriptor) : JetScope.Empty.INSTANCE$;
return resolutionScopesSupport.getScopeForMemberDeclarationResolution();
}
@Override
@@ -331,7 +292,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@NotNull
@Override
public JetScope getStaticScope() {
return staticScope;
return resolutionScopesSupport.getStaticScope();
}
@NotNull
@@ -388,7 +349,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
}
Name name = ((JetClassOrObjectInfo) companionObjectInfo).getName();
assert name != null;
getScopeForMemberLookup().getClassifier(name);
getUnsubstitutedMemberScope().getClassifier(name);
ClassDescriptor companionObjectDescriptor = c.getTrace().get(BindingContext.CLASS, companionObject);
if (companionObjectDescriptor instanceof LazyClassDescriptor) {
assert DescriptorUtils.isCompanionObject(companionObjectDescriptor) : "Not a companion object: " + companionObjectDescriptor;
@@ -481,7 +442,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
ForceResolveUtil.forceResolveAllContents(getConstructors());
ForceResolveUtil.forceResolveAllContents(getDescriptorsForExtraCompanionObjects());
ForceResolveUtil.forceResolveAllContents(getScopeForMemberLookup());
ForceResolveUtil.forceResolveAllContents(getUnsubstitutedMemberScope());
ForceResolveUtil.forceResolveAllContents(getTypeConstructor());
}
@@ -503,7 +464,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
getOriginal();
getScopeForClassHeaderResolution();
getScopeForMemberDeclarationResolution();
getScopeForMemberLookup().getAllDescriptors();
getUnsubstitutedMemberScope().getAllDescriptors();
getScopeForInitializerResolution();
getUnsubstitutedInnerClassesScope();
getTypeConstructor().getSupertypes();
@@ -54,8 +54,8 @@ public class LazyScriptClassDescriptor extends LazyClassDescriptor {
@NotNull
@Override
public LazyScriptClassMemberScope getScopeForMemberLookup() {
return (LazyScriptClassMemberScope) super.getScopeForMemberLookup();
public LazyScriptClassMemberScope getUnsubstitutedMemberScope() {
return (LazyScriptClassMemberScope) super.getUnsubstitutedMemberScope();
}
@NotNull
@@ -65,7 +65,7 @@ public class LazyScriptDescriptor(
override fun getClassDescriptor() = resolveSession.getClassDescriptorForScript(jetScript) as LazyScriptClassDescriptor
override fun getScriptResultProperty(): PropertyDescriptor = getClassDescriptor().getScopeForMemberLookup().getScriptResultProperty()
override fun getScriptResultProperty(): PropertyDescriptor = getClassDescriptor().getUnsubstitutedMemberScope().getScriptResultProperty()
private val scriptCodeDescriptor = resolveSession.getStorageManager().createLazyValue {
val result = ScriptCodeDescriptor(this)