diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java deleted file mode 100644 index e09b2c66fe2..00000000000 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2010-2013 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.jet.lang.resolve.scopes; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.TypeSubstitutor; -import org.jetbrains.jet.utils.Printer; -import org.jetbrains.jet.utils.UtilsPackage; - -import java.util.*; - -public class SubstitutingScope implements JetScope { - - private final JetScope workerScope; - private final TypeSubstitutor substitutor; - - private Map substitutedDescriptors = null; - private Collection allDescriptors = null; - - public SubstitutingScope(JetScope workerScope, @NotNull TypeSubstitutor substitutor) { - this.workerScope = workerScope; - this.substitutor = substitutor; - } - - @Nullable - private D substitute(@Nullable D descriptor) { - if (descriptor == null) return null; - if (substitutor.isEmpty()) return descriptor; - - if (substitutedDescriptors == null) { - substitutedDescriptors = new HashMap(); - } - - DeclarationDescriptor substituted = substitutedDescriptors.get(descriptor); - if (substituted == null && !substitutedDescriptors.containsKey(descriptor)) { - substituted = descriptor.substitute(substitutor); - - //noinspection ConstantConditions - substitutedDescriptors.put(descriptor, substituted); - } - - //noinspection unchecked - return (D) substituted; - } - - @NotNull - private Collection substitute(@NotNull Collection descriptors) { - if (substitutor.isEmpty()) return descriptors; - if (descriptors.isEmpty()) return descriptors; - - Set result = UtilsPackage.newHashSetWithExpectedSize(descriptors.size()); - for (D descriptor : descriptors) { - D substitute = substitute(descriptor); - if (substitute != null) { - result.add(substitute); - } - } - - return result; - } - - @NotNull - @Override - public Collection getProperties(@NotNull Name name) { - return substitute(workerScope.getProperties(name)); - } - - @Override - public VariableDescriptor getLocalVariable(@NotNull Name name) { - return substitute(workerScope.getLocalVariable(name)); - } - - @Override - public ClassifierDescriptor getClassifier(@NotNull Name name) { - return substitute(workerScope.getClassifier(name)); - } - - @NotNull - @Override - public Collection getFunctions(@NotNull Name name) { - return substitute(workerScope.getFunctions(name)); - } - - @Override - public PackageViewDescriptor getPackage(@NotNull Name name) { - return workerScope.getPackage(name); - } - - @NotNull - @Override - public List getImplicitReceiversHierarchy() { - throw new UnsupportedOperationException(); // TODO - } - - @NotNull - @Override - public DeclarationDescriptor getContainingDeclaration() { - return workerScope.getContainingDeclaration(); - } - - @NotNull - @Override - public Collection getDeclarationsByLabel(@NotNull Name labelName) { - throw new UnsupportedOperationException(); // TODO - } - - @NotNull - @Override - public Collection getAllDescriptors() { - if (allDescriptors == null) { - allDescriptors = substitute(workerScope.getAllDescriptors()); - } - return allDescriptors; - } - - @NotNull - @Override - public Collection getOwnDeclaredDescriptors() { - return substitute(workerScope.getOwnDeclaredDescriptors()); - } - - @Override - public void printScopeStructure(@NotNull Printer p) { - p.println(getClass().getSimpleName(), " {"); - p.pushIndent(); - - p.println("substitutor = "); - p.pushIndent(); - p.println(substitutor); - p.popIndent(); - - p.print("workerScope = "); - workerScope.printScopeStructure(p.withholdIndentOnce()); - - p.popIndent(); - p.println("}"); - } -} diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt new file mode 100644 index 00000000000..8e6fb62009f --- /dev/null +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.kt @@ -0,0 +1,113 @@ +/* + * Copyright 2010-2014 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.jet.lang.resolve.scopes + +import org.jetbrains.jet.lang.descriptors.* +import org.jetbrains.jet.lang.resolve.name.Name +import org.jetbrains.jet.lang.types.TypeSubstitutor +import org.jetbrains.jet.utils.Printer +import org.jetbrains.jet.utils.* + +import java.util.* +import kotlin.Map +import kotlin.Collection +import kotlin.List + +public class SubstitutingScope(private val workerScope: JetScope, private val substitutor: TypeSubstitutor) : JetScope { + + private var substitutedDescriptors: MutableMap? = null + private var allDescriptors: Collection? = null + + private fun substitute(descriptor: D?): D? { + if (descriptor == null) return null + if (substitutor.isEmpty()) return descriptor + + if (substitutedDescriptors == null) { + substitutedDescriptors = HashMap() + } + + var substituted: DeclarationDescriptor? = substitutedDescriptors!!.get(descriptor) + if (substituted == null && !substitutedDescriptors!!.containsKey(descriptor)) { + substituted = descriptor.substitute(substitutor) + + substitutedDescriptors!!.put(descriptor, substituted) + } + + [suppress("UNCHECKED_CAST")] + return substituted as D? + } + + private fun substitute(descriptors: Collection): Collection { + if (substitutor.isEmpty()) return descriptors + if (descriptors.isEmpty()) return descriptors + + val result = newHashSetWithExpectedSize(descriptors.size()) + for (descriptor in descriptors) { + val substitute = substitute(descriptor) + if (substitute != null) { + result.add(substitute) + } + } + + return result + } + + override fun getProperties(name: Name) = substitute(workerScope.getProperties(name)) + + override fun getLocalVariable(name: Name) = substitute(workerScope.getLocalVariable(name)) + + override fun getClassifier(name: Name) = substitute(workerScope.getClassifier(name)) + + override fun getFunctions(name: Name) = substitute(workerScope.getFunctions(name)) + + override fun getPackage(name: Name) = workerScope.getPackage(name) + + override fun getImplicitReceiversHierarchy(): List { + throw UnsupportedOperationException() // TODO + } + + override fun getContainingDeclaration() = workerScope.getContainingDeclaration() + + override fun getDeclarationsByLabel(labelName: Name): Collection { + throw UnsupportedOperationException() // TODO + } + + override fun getAllDescriptors(): Collection { + if (allDescriptors == null) { + allDescriptors = substitute(workerScope.getAllDescriptors()) + } + return allDescriptors!! + } + + override fun getOwnDeclaredDescriptors() = substitute(workerScope.getOwnDeclaredDescriptors()) + + override fun printScopeStructure(p: Printer) { + p.println(javaClass.getSimpleName(), " {") + p.pushIndent() + + p.println("substitutor = ") + p.pushIndent() + p.println(substitutor) + p.popIndent() + + p.print("workerScope = ") + workerScope.printScopeStructure(p.withholdIndentOnce()) + + p.popIndent() + p.println("}") + } +}