get rid of WritableScopeWithImports
This commit is contained in:
+6
-5
@@ -48,7 +48,8 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
|
|||||||
private final Set<PropertyDescriptor> properties = Sets.newLinkedHashSet();
|
private final Set<PropertyDescriptor> properties = Sets.newLinkedHashSet();
|
||||||
private final Set<SimpleFunctionDescriptor> functions = Sets.newLinkedHashSet();
|
private final Set<SimpleFunctionDescriptor> functions = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
private final WritableScope scopeForMemberResolution;
|
private final WritableScope writableScopeForMemberResolution;
|
||||||
|
private final JetScope scopeForMemberResolution;
|
||||||
// This scope contains type parameters but does not contain inner classes
|
// This scope contains type parameters but does not contain inner classes
|
||||||
private final WritableScope scopeForSupertypeResolution;
|
private final WritableScope scopeForSupertypeResolution;
|
||||||
private WritableScope scopeForInitializers; //contains members + primary constructor value parameters + map for backing fields
|
private WritableScope scopeForInitializers; //contains members + primary constructor value parameters + map for backing fields
|
||||||
@@ -75,15 +76,15 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
|
|||||||
.changeLockLevel(WritableScope.LockLevel.BOTH));
|
.changeLockLevel(WritableScope.LockLevel.BOTH));
|
||||||
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler, "SupertypeResolution")
|
this.scopeForSupertypeResolution = new WritableScopeImpl(outerScope, this, redeclarationHandler, "SupertypeResolution")
|
||||||
.changeLockLevel(WritableScope.LockLevel.BOTH);
|
.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
this.scopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler, "MemberResolution")
|
this.writableScopeForMemberResolution = new WritableScopeImpl(scopeForSupertypeResolution, this, redeclarationHandler, "MemberResolution")
|
||||||
.changeLockLevel(WritableScope.LockLevel.BOTH);
|
.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
|
|
||||||
if (kind == ClassKind.INTERFACE) {
|
if (kind == ClassKind.INTERFACE) {
|
||||||
setUpScopeForInitializers(this);
|
setUpScopeForInitializers(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
scopeForMemberResolution.importScope(staticScope);
|
this.scopeForMemberResolution = new ChainedScope(this, "MemberResolutionWithStatic", writableScopeForMemberResolution, staticScope);
|
||||||
scopeForMemberResolution.addLabeledDeclaration(this);
|
writableScopeForMemberResolution.addLabeledDeclaration(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -227,7 +228,7 @@ public class MutableClassDescriptor extends ClassDescriptorBase implements Class
|
|||||||
for (FunctionDescriptor functionDescriptor : getConstructors()) {
|
for (FunctionDescriptor functionDescriptor : getConstructors()) {
|
||||||
((ConstructorDescriptorImpl) functionDescriptor).setReturnType(getDefaultType());
|
((ConstructorDescriptorImpl) functionDescriptor).setReturnType(getDefaultType());
|
||||||
}
|
}
|
||||||
scopeForMemberResolution.setImplicitReceiver(getThisAsReceiverParameter());
|
writableScopeForMemberResolution.setImplicitReceiver(getThisAsReceiverParameter());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -37,8 +37,6 @@ public trait WritableScope : JetScope {
|
|||||||
|
|
||||||
public fun addClassifierDescriptor(classifierDescriptor: ClassifierDescriptor)
|
public fun addClassifierDescriptor(classifierDescriptor: ClassifierDescriptor)
|
||||||
|
|
||||||
public fun importScope(imported: JetScope)
|
|
||||||
|
|
||||||
public fun setImplicitReceiver(implicitReceiver: ReceiverParameterDescriptor)
|
public fun setImplicitReceiver(implicitReceiver: ReceiverParameterDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,15 +28,14 @@ import com.intellij.util.SmartList
|
|||||||
// Reads from:
|
// Reads from:
|
||||||
// 1. Maps
|
// 1. Maps
|
||||||
// 2. Worker
|
// 2. Worker
|
||||||
// 3. Imports
|
|
||||||
|
|
||||||
// Writes to: maps
|
// Writes to: maps
|
||||||
|
|
||||||
public class WritableScopeImpl(scope: JetScope,
|
public class WritableScopeImpl(override val workerScope: JetScope,
|
||||||
private val ownerDeclarationDescriptor: DeclarationDescriptor,
|
private val ownerDeclarationDescriptor: DeclarationDescriptor,
|
||||||
redeclarationHandler: RedeclarationHandler,
|
protected val redeclarationHandler: RedeclarationHandler,
|
||||||
debugName: String)
|
private val debugName: String)
|
||||||
: WritableScopeWithImports(scope, redeclarationHandler, debugName) {
|
: AbstractScopeAdapter(), WritableScope {
|
||||||
|
|
||||||
private val explicitlyAddedDescriptors = SmartList<DeclarationDescriptor>()
|
private val explicitlyAddedDescriptors = SmartList<DeclarationDescriptor>()
|
||||||
private val declaredDescriptorsAccessibleBySimpleName = HashMultimap.create<Name, DeclarationDescriptor>()
|
private val declaredDescriptorsAccessibleBySimpleName = HashMultimap.create<Name, DeclarationDescriptor>()
|
||||||
@@ -53,11 +52,30 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
|
|
||||||
private var implicitReceiver: ReceiverParameterDescriptor? = null
|
private var implicitReceiver: ReceiverParameterDescriptor? = null
|
||||||
|
|
||||||
|
private var implicitReceiverHierarchy: List<ReceiverParameterDescriptor>? = null
|
||||||
|
|
||||||
override fun getContainingDeclaration(): DeclarationDescriptor = ownerDeclarationDescriptor
|
override fun getContainingDeclaration(): DeclarationDescriptor = ownerDeclarationDescriptor
|
||||||
|
|
||||||
override fun importScope(imported: JetScope) {
|
private var lockLevel: WritableScope.LockLevel = WritableScope.LockLevel.WRITING
|
||||||
checkMayWrite()
|
|
||||||
super.importScope(imported)
|
override fun changeLockLevel(lockLevel: WritableScope.LockLevel): WritableScope {
|
||||||
|
if (lockLevel.ordinal() < this.lockLevel.ordinal()) {
|
||||||
|
throw IllegalStateException("cannot lower lock level from " + this.lockLevel + " to " + lockLevel + " at " + toString())
|
||||||
|
}
|
||||||
|
this.lockLevel = lockLevel
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun checkMayRead() {
|
||||||
|
if (lockLevel != WritableScope.LockLevel.READING && lockLevel != WritableScope.LockLevel.BOTH) {
|
||||||
|
throw IllegalStateException("cannot read with lock level " + lockLevel + " at " + toString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun checkMayWrite() {
|
||||||
|
if (lockLevel != WritableScope.LockLevel.WRITING && lockLevel != WritableScope.LockLevel.BOTH) {
|
||||||
|
throw IllegalStateException("cannot write with lock level " + lockLevel + " at " + toString())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDescriptors(kindFilter: DescriptorKindFilter,
|
override fun getDescriptors(kindFilter: DescriptorKindFilter,
|
||||||
@@ -68,7 +86,6 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
val result = ArrayList<DeclarationDescriptor>()
|
val result = ArrayList<DeclarationDescriptor>()
|
||||||
result.addAll(explicitlyAddedDescriptors)
|
result.addAll(explicitlyAddedDescriptors)
|
||||||
result.addAll(workerScope.getDescriptors(kindFilter, nameFilter))
|
result.addAll(workerScope.getDescriptors(kindFilter, nameFilter))
|
||||||
getImports().flatMapTo(result) { it.getDescriptors(kindFilter, nameFilter) }
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,9 +99,8 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
override fun getDeclarationsByLabel(labelName: Name): Collection<DeclarationDescriptor> {
|
override fun getDeclarationsByLabel(labelName: Name): Collection<DeclarationDescriptor> {
|
||||||
checkMayRead()
|
checkMayRead()
|
||||||
|
|
||||||
val superResult = super.getDeclarationsByLabel(labelName)
|
val superResult = super<AbstractScopeAdapter>.getDeclarationsByLabel(labelName)
|
||||||
val declarationDescriptors = getLabelsToDescriptors()[labelName]
|
val declarationDescriptors = labelsToDescriptors?.get(labelName) ?: return superResult
|
||||||
if (declarationDescriptors == null) return superResult
|
|
||||||
if (superResult.isEmpty()) return declarationDescriptors
|
if (superResult.isEmpty()) return declarationDescriptors
|
||||||
return declarationDescriptors + superResult
|
return declarationDescriptors + superResult
|
||||||
}
|
}
|
||||||
@@ -137,15 +153,13 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
addToDeclared(variableDescriptor)
|
addToDeclared(variableDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getProperties(name: Name): Set<VariableDescriptor> {
|
override fun getProperties(name: Name): Collection<VariableDescriptor> {
|
||||||
checkMayRead()
|
checkMayRead()
|
||||||
|
|
||||||
val result = Sets.newLinkedHashSet(getPropertyGroups().get(name))
|
val propertyGroupsByName = propertyGroups?.get(name) ?: return workerScope.getProperties(name)
|
||||||
|
|
||||||
|
val result = Sets.newLinkedHashSet(propertyGroupsByName)
|
||||||
result.addAll(workerScope.getProperties(name))
|
result.addAll(workerScope.getProperties(name))
|
||||||
|
|
||||||
result.addAll(super.getProperties(name))
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,7 +171,7 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
return descriptor
|
return descriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
return workerScope.getLocalVariable(name) ?: super.getLocalVariable(name)
|
return workerScope.getLocalVariable(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getPropertyGroups(): SetMultimap<Name, VariableDescriptor> {
|
private fun getPropertyGroups(): SetMultimap<Name, VariableDescriptor> {
|
||||||
@@ -184,12 +198,10 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
override fun getFunctions(name: Name): Collection<FunctionDescriptor> {
|
override fun getFunctions(name: Name): Collection<FunctionDescriptor> {
|
||||||
checkMayRead()
|
checkMayRead()
|
||||||
|
|
||||||
val result = Sets.newLinkedHashSet(getFunctionGroups().get(name))
|
val functionGroupByName = functionGroups?.get(name) ?: return workerScope.getFunctions(name)
|
||||||
|
|
||||||
|
val result = Sets.newLinkedHashSet(functionGroupByName)
|
||||||
result.addAll(workerScope.getFunctions(name))
|
result.addAll(workerScope.getFunctions(name))
|
||||||
|
|
||||||
result.addAll(super.getFunctions(name))
|
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,7 +240,6 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
|
|
||||||
return getVariableOrClassDescriptors()[name] as? ClassifierDescriptor
|
return getVariableOrClassDescriptors()[name] as? ClassifierDescriptor
|
||||||
?: workerScope.getClassifier(name)
|
?: workerScope.getClassifier(name)
|
||||||
?: super.getClassifier(name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getPackage(name: Name): PackageViewDescriptor? {
|
override fun getPackage(name: Name): PackageViewDescriptor? {
|
||||||
@@ -236,7 +247,6 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
|
|
||||||
return getPackageAliases().get(name)
|
return getPackageAliases().get(name)
|
||||||
?: workerScope.getPackage(name)
|
?: workerScope.getPackage(name)
|
||||||
?: super.getPackage(name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setImplicitReceiver(implicitReceiver: ReceiverParameterDescriptor) {
|
override fun setImplicitReceiver(implicitReceiver: ReceiverParameterDescriptor) {
|
||||||
@@ -248,11 +258,20 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
this.implicitReceiver = implicitReceiver
|
this.implicitReceiver = implicitReceiver
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun computeImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> {
|
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> {
|
||||||
|
checkMayRead()
|
||||||
|
|
||||||
|
if (implicitReceiverHierarchy == null) {
|
||||||
|
implicitReceiverHierarchy = computeImplicitReceiversHierarchy()
|
||||||
|
}
|
||||||
|
return implicitReceiverHierarchy!!
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun computeImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> {
|
||||||
return if (implicitReceiver != null)
|
return if (implicitReceiver != null)
|
||||||
listOf(implicitReceiver!!) + super.computeImplicitReceiversHierarchy()
|
listOf(implicitReceiver!!) + super<AbstractScopeAdapter>.getImplicitReceiversHierarchy()
|
||||||
else
|
else
|
||||||
super.computeImplicitReceiversHierarchy()
|
super<AbstractScopeAdapter>.getImplicitReceiversHierarchy()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addToDeclared(descriptor: DeclarationDescriptor) {
|
private fun addToDeclared(descriptor: DeclarationDescriptor) {
|
||||||
@@ -262,6 +281,20 @@ public class WritableScopeImpl(scope: JetScope,
|
|||||||
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor>
|
override fun getOwnDeclaredDescriptors(): Collection<DeclarationDescriptor>
|
||||||
= declaredDescriptorsAccessibleBySimpleName.values()
|
= declaredDescriptorsAccessibleBySimpleName.values()
|
||||||
|
|
||||||
override fun printAdditionalScopeStructure(p: Printer) {
|
override fun toString(): String {
|
||||||
|
return javaClass.getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this)) + " " + debugName + " for " + getContainingDeclaration()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun printScopeStructure(p: Printer) {
|
||||||
|
p.println(javaClass.getSimpleName(), ": ", debugName, " for ", getContainingDeclaration(), " {")
|
||||||
|
p.pushIndent()
|
||||||
|
|
||||||
|
p.println("lockLevel = ", lockLevel)
|
||||||
|
|
||||||
|
p.print("worker = ")
|
||||||
|
workerScope.printScopeStructure(p.withholdIndentOnce())
|
||||||
|
|
||||||
|
p.popIndent()
|
||||||
|
p.println("}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-190
@@ -1,190 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.scopes
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists
|
|
||||||
import com.google.common.collect.Sets
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
|
||||||
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
public abstract class WritableScopeWithImports(override val workerScope: JetScope,
|
|
||||||
protected val redeclarationHandler: RedeclarationHandler,
|
|
||||||
private val debugName: String) : AbstractScopeAdapter(), WritableScope {
|
|
||||||
|
|
||||||
private var imports: MutableList<JetScope>? = null
|
|
||||||
private var currentIndividualImportScope: WritableScope? = null
|
|
||||||
private var implicitReceiverHierarchy: List<ReceiverParameterDescriptor>? = null
|
|
||||||
|
|
||||||
|
|
||||||
private var lockLevel: WritableScope.LockLevel = WritableScope.LockLevel.WRITING
|
|
||||||
|
|
||||||
override fun changeLockLevel(lockLevel: WritableScope.LockLevel): WritableScope {
|
|
||||||
if (lockLevel.ordinal() < this.lockLevel.ordinal()) {
|
|
||||||
throw IllegalStateException("cannot lower lock level from " + this.lockLevel + " to " + lockLevel + " at " + toString())
|
|
||||||
}
|
|
||||||
this.lockLevel = lockLevel
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun checkMayRead() {
|
|
||||||
if (lockLevel != WritableScope.LockLevel.READING && lockLevel != WritableScope.LockLevel.BOTH) {
|
|
||||||
throw IllegalStateException("cannot read with lock level " + lockLevel + " at " + toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun checkMayWrite() {
|
|
||||||
if (lockLevel != WritableScope.LockLevel.WRITING && lockLevel != WritableScope.LockLevel.BOTH) {
|
|
||||||
throw IllegalStateException("cannot write with lock level " + lockLevel + " at " + toString())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected fun getImports(): MutableList<JetScope> {
|
|
||||||
if (imports == null) {
|
|
||||||
imports = ArrayList<JetScope>()
|
|
||||||
}
|
|
||||||
return imports!!
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun importScope(imported: JetScope) {
|
|
||||||
if (imported == this) {
|
|
||||||
throw IllegalStateException("cannot import scope into self")
|
|
||||||
}
|
|
||||||
|
|
||||||
checkMayWrite()
|
|
||||||
|
|
||||||
getImports().add(0, imported)
|
|
||||||
currentIndividualImportScope = null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
if (implicitReceiverHierarchy == null) {
|
|
||||||
implicitReceiverHierarchy = computeImplicitReceiversHierarchy()
|
|
||||||
}
|
|
||||||
return implicitReceiverHierarchy!!
|
|
||||||
}
|
|
||||||
|
|
||||||
protected open fun computeImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> {
|
|
||||||
val implicitReceiverHierarchy = Lists.newArrayList<ReceiverParameterDescriptor>()
|
|
||||||
// Imported scopes come with their receivers
|
|
||||||
// Example: class member resolution scope imports a scope of it's companion object
|
|
||||||
// members of the companion object must be able to find it as an implicit receiver
|
|
||||||
for (scope in getImports()) {
|
|
||||||
implicitReceiverHierarchy.addAll(scope.getImplicitReceiversHierarchy())
|
|
||||||
}
|
|
||||||
implicitReceiverHierarchy.addAll(super<AbstractScopeAdapter>.getImplicitReceiversHierarchy())
|
|
||||||
return implicitReceiverHierarchy
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getProperties(name: Name): Set<VariableDescriptor> {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
val properties = Sets.newLinkedHashSet<VariableDescriptor>()
|
|
||||||
for (imported in getImports()) {
|
|
||||||
properties.addAll(imported.getProperties(name))
|
|
||||||
}
|
|
||||||
return properties
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getLocalVariable(name: Name): VariableDescriptor? {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
// Meaningful lookup goes here
|
|
||||||
for (imported in getImports()) {
|
|
||||||
val importedDescriptor = imported.getLocalVariable(name)
|
|
||||||
if (importedDescriptor != null) {
|
|
||||||
return importedDescriptor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getFunctions(name: Name): Collection<FunctionDescriptor> {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
if (getImports().isEmpty()) {
|
|
||||||
return setOf()
|
|
||||||
}
|
|
||||||
val result = Sets.newLinkedHashSet<FunctionDescriptor>()
|
|
||||||
for (imported in getImports()) {
|
|
||||||
result.addAll(imported.getFunctions(name))
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getClassifier(name: Name): ClassifierDescriptor? {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
for (imported in getImports()) {
|
|
||||||
val importedClassifier = imported.getClassifier(name)
|
|
||||||
if (importedClassifier != null) {
|
|
||||||
return importedClassifier
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getPackage(name: Name): PackageViewDescriptor? {
|
|
||||||
checkMayRead()
|
|
||||||
|
|
||||||
for (imported in getImports()) {
|
|
||||||
val importedDescriptor = imported.getPackage(name)
|
|
||||||
if (importedDescriptor != null) {
|
|
||||||
return importedDescriptor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String {
|
|
||||||
return javaClass.getSimpleName() + "@" + Integer.toHexString(System.identityHashCode(this)) + " " + debugName + " for " + getContainingDeclaration()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun printScopeStructure(p: Printer) {
|
|
||||||
p.println(javaClass.getSimpleName(), ": ", debugName, " for ", getContainingDeclaration(), " {")
|
|
||||||
p.pushIndent()
|
|
||||||
|
|
||||||
p.println("lockLevel = ", lockLevel)
|
|
||||||
|
|
||||||
printAdditionalScopeStructure(p)
|
|
||||||
|
|
||||||
p.print("worker = ")
|
|
||||||
workerScope.printScopeStructure(p.withholdIndentOnce())
|
|
||||||
|
|
||||||
if (getImports().isEmpty()) {
|
|
||||||
p.println("imports = {}")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
p.println("imports = {")
|
|
||||||
p.pushIndent()
|
|
||||||
for (anImport in getImports()) {
|
|
||||||
anImport.printScopeStructure(p)
|
|
||||||
}
|
|
||||||
p.popIndent()
|
|
||||||
p.println("}")
|
|
||||||
}
|
|
||||||
|
|
||||||
p.popIndent()
|
|
||||||
p.println("}")
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract fun printAdditionalScopeStructure(p: Printer)
|
|
||||||
}
|
|
||||||
+18
-14
@@ -33,10 +33,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||||
import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder
|
import org.jetbrains.kotlin.renderer.DescriptorRendererBuilder
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope
|
import org.jetbrains.kotlin.resolve.scopes.*
|
||||||
import org.jetbrains.kotlin.resolve.scopes.RedeclarationHandler
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.WritableScope
|
|
||||||
import org.jetbrains.kotlin.resolve.scopes.WritableScopeImpl
|
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
|
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
|
||||||
import org.jetbrains.kotlin.test.*
|
import org.jetbrains.kotlin.test.*
|
||||||
import org.jetbrains.kotlin.test.JetTestUtils.TestFileFactoryNoModules
|
import org.jetbrains.kotlin.test.JetTestUtils.TestFileFactoryNoModules
|
||||||
@@ -133,14 +130,12 @@ public abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdi
|
|||||||
private fun createReflectedPackageView(classLoader: URLClassLoader): SyntheticPackageViewForTest {
|
private fun createReflectedPackageView(classLoader: URLClassLoader): SyntheticPackageViewForTest {
|
||||||
val module = RuntimeModuleData.create(classLoader).module
|
val module = RuntimeModuleData.create(classLoader).module
|
||||||
|
|
||||||
// Since runtime package view descriptor doesn't support getAllDescriptors(), we construct a synthetic package view here.
|
|
||||||
// It has in its scope descriptors for all the classes and top level members generated by the compiler
|
|
||||||
val actual = SyntheticPackageViewForTest(module)
|
|
||||||
val scope = actual.getMemberScope()
|
|
||||||
|
|
||||||
val generatedPackageDir = File(tmpdir, LoadDescriptorUtil.TEST_PACKAGE_FQNAME.pathSegments().single().asString())
|
val generatedPackageDir = File(tmpdir, LoadDescriptorUtil.TEST_PACKAGE_FQNAME.pathSegments().single().asString())
|
||||||
val allClassFiles = FileUtil.findFilesByMask(Pattern.compile(".*\\.class"), generatedPackageDir)
|
val allClassFiles = FileUtil.findFilesByMask(Pattern.compile(".*\\.class"), generatedPackageDir)
|
||||||
|
|
||||||
|
val packageScopes = arrayListOf<JetScope>()
|
||||||
|
val classes = arrayListOf<ClassDescriptor>()
|
||||||
for (classFile in allClassFiles) {
|
for (classFile in allClassFiles) {
|
||||||
val className = tmpdir.relativePath(classFile).substringBeforeLast(".class").replace('/', '.').replace('\\', '.')
|
val className = tmpdir.relativePath(classFile).substringBeforeLast(".class").replace('/', '.').replace('\\', '.')
|
||||||
|
|
||||||
@@ -148,8 +143,8 @@ public abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdi
|
|||||||
val header = ReflectKotlinClass.create(klass)?.getClassHeader()
|
val header = ReflectKotlinClass.create(klass)?.getClassHeader()
|
||||||
|
|
||||||
if (header?.kind == KotlinClassHeader.Kind.PACKAGE_FACADE) {
|
if (header?.kind == KotlinClassHeader.Kind.PACKAGE_FACADE) {
|
||||||
val packageView = module.getPackage(actual.getFqName()).sure { "Couldn't resolve package ${actual.getFqName()}" }
|
val packageView = module.getPackage(LoadDescriptorUtil.TEST_PACKAGE_FQNAME).sure { "Couldn't resolve package ${LoadDescriptorUtil.TEST_PACKAGE_FQNAME}" }
|
||||||
scope.importScope(packageView.getMemberScope())
|
packageScopes.add(packageView.getMemberScope())
|
||||||
}
|
}
|
||||||
else if (header == null ||
|
else if (header == null ||
|
||||||
(header.kind == KotlinClassHeader.Kind.CLASS && header.classKind == JvmAnnotationNames.KotlinClass.Kind.CLASS)) {
|
(header.kind == KotlinClassHeader.Kind.CLASS && header.classKind == JvmAnnotationNames.KotlinClass.Kind.CLASS)) {
|
||||||
@@ -158,11 +153,15 @@ public abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdi
|
|||||||
if (!classId.isLocal()) {
|
if (!classId.isLocal()) {
|
||||||
val classDescriptor = module.findClassAcrossModuleDependencies(classId).sure { "Couldn't resolve class $className" }
|
val classDescriptor = module.findClassAcrossModuleDependencies(classId).sure { "Couldn't resolve class $className" }
|
||||||
if (DescriptorUtils.isTopLevelDeclaration(classDescriptor)) {
|
if (DescriptorUtils.isTopLevelDeclaration(classDescriptor)) {
|
||||||
scope.addClassifierDescriptor(classDescriptor)
|
classes.add(classDescriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Since runtime package view descriptor doesn't support getAllDescriptors(), we construct a synthetic package view here.
|
||||||
|
// It has in its scope descriptors for all the classes and top level members generated by the compiler
|
||||||
|
val actual = SyntheticPackageViewForTest(module, packageScopes, classes)
|
||||||
return actual
|
return actual
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,11 +179,16 @@ public abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdi
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SyntheticPackageViewForTest(private val module: ModuleDescriptor) : PackageViewDescriptor {
|
private class SyntheticPackageViewForTest(private val module: ModuleDescriptor,
|
||||||
private val scope = WritableScopeImpl(JetScope.Empty, this, RedeclarationHandler.THROW_EXCEPTION, "runtime descriptor loader test")
|
packageScopes: List<JetScope>,
|
||||||
|
classes: List<ClassifierDescriptor>) : PackageViewDescriptor {
|
||||||
|
private val scope: JetScope
|
||||||
|
|
||||||
init {
|
init {
|
||||||
scope.changeLockLevel(WritableScope.LockLevel.BOTH)
|
val writableScope = WritableScopeImpl(JetScope.Empty, this, RedeclarationHandler.THROW_EXCEPTION, "runtime descriptor loader test")
|
||||||
|
classes.forEach { writableScope.addClassifierDescriptor(it) }
|
||||||
|
writableScope.changeLockLevel(WritableScope.LockLevel.READING)
|
||||||
|
scope = ChainedScope(null, "", *(listOf(writableScope) + packageScopes).toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFqName() = LoadDescriptorUtil.TEST_PACKAGE_FQNAME
|
override fun getFqName() = LoadDescriptorUtil.TEST_PACKAGE_FQNAME
|
||||||
|
|||||||
@@ -591,7 +591,7 @@ public class JetTypeCheckerTest extends JetLiteFixture {
|
|||||||
assertEquals(expectedType, type);
|
assertEquals(expectedType, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private WritableScope getDeclarationsScope(String path) throws IOException {
|
private JetScope getDeclarationsScope(String path) throws IOException {
|
||||||
ModuleDescriptor moduleDescriptor = LazyResolveTestUtil.resolve(
|
ModuleDescriptor moduleDescriptor = LazyResolveTestUtil.resolve(
|
||||||
getProject(),
|
getProject(),
|
||||||
Collections.singletonList(JetTestUtils.loadJetFile(getProject(), new File(path)))
|
Collections.singletonList(JetTestUtils.loadJetFile(getProject(), new File(path)))
|
||||||
@@ -604,15 +604,18 @@ public class JetTypeCheckerTest extends JetLiteFixture {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("ConstantConditions")
|
@SuppressWarnings("ConstantConditions")
|
||||||
private WritableScopeImpl addImports(JetScope scope) {
|
private JetScope addImports(JetScope scope) {
|
||||||
WritableScopeImpl writableScope = new WritableScopeImpl(
|
WritableScopeImpl writableScope = new WritableScopeImpl(
|
||||||
scope, scope.getContainingDeclaration(), RedeclarationHandler.DO_NOTHING, "JetTypeCheckerTest.addImports"
|
scope, scope.getContainingDeclaration(), RedeclarationHandler.DO_NOTHING, "JetTypeCheckerTest.addImports"
|
||||||
);
|
);
|
||||||
|
List<JetScope> scopeChain = new ArrayList<JetScope>();
|
||||||
|
scopeChain.add(writableScope);
|
||||||
|
|
||||||
ModuleDescriptor module = LazyResolveTestUtil.resolveProject(getProject());
|
ModuleDescriptor module = LazyResolveTestUtil.resolveProject(getProject());
|
||||||
for (ImportPath defaultImport : module.getDefaultImports()) {
|
for (ImportPath defaultImport : module.getDefaultImports()) {
|
||||||
FqName fqName = defaultImport.fqnPart();
|
FqName fqName = defaultImport.fqnPart();
|
||||||
if (defaultImport.isAllUnder()) {
|
if (defaultImport.isAllUnder()) {
|
||||||
writableScope.importScope(module.getPackage(fqName).getMemberScope());
|
scopeChain.add(module.getPackage(fqName).getMemberScope());
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Name shortName = fqName.shortName();
|
Name shortName = fqName.shortName();
|
||||||
@@ -620,9 +623,9 @@ public class JetTypeCheckerTest extends JetLiteFixture {
|
|||||||
writableScope.addClassifierDescriptor(module.getPackage(fqName.parent()).getMemberScope().getClassifier(shortName));
|
writableScope.addClassifierDescriptor(module.getPackage(fqName.parent()).getMemberScope().getClassifier(shortName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
writableScope.importScope(module.getPackage(FqName.ROOT).getMemberScope());
|
scopeChain.add(module.getPackage(FqName.ROOT).getMemberScope());
|
||||||
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
writableScope.changeLockLevel(WritableScope.LockLevel.BOTH);
|
||||||
return writableScope;
|
return new ChainedScope(scope.getContainingDeclaration(), "", scopeChain.toArray(new JetScope[scopeChain.size()]));
|
||||||
}
|
}
|
||||||
|
|
||||||
private JetType makeType(String typeStr) {
|
private JetType makeType(String typeStr) {
|
||||||
|
|||||||
Reference in New Issue
Block a user