Rewrote CallableDescriptorCollectors to Kotlin

This commit is contained in:
Svetlana Isakova
2014-10-03 13:32:09 +04:00
parent dfd88b8f24
commit cd3dc5998f
5 changed files with 130 additions and 244 deletions
@@ -20,6 +20,7 @@ import com.google.common.collect.Lists;
import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor; import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
@@ -36,6 +37,7 @@ public class LibrarySourceHacks {
public static final Key<Boolean> SKIP_TOP_LEVEL_MEMBERS = Key.create("SKIP_TOP_LEVEL_MEMBERS"); // used when analyzing library source public static final Key<Boolean> SKIP_TOP_LEVEL_MEMBERS = Key.create("SKIP_TOP_LEVEL_MEMBERS"); // used when analyzing library source
@NotNull
public static <D extends CallableDescriptor> List<D> filterOutMembersFromLibrarySource(Collection<D> members) { public static <D extends CallableDescriptor> List<D> filterOutMembersFromLibrarySource(Collection<D> members) {
List<D> filteredMembers = Lists.newArrayList(); List<D> filteredMembers = Lists.newArrayList();
for (D member : members) { for (D member : members) {
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsImp
import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler; import org.jetbrains.jet.lang.resolve.calls.results.ResolutionResultsHandler;
import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.smartcasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.tasks.*; import org.jetbrains.jet.lang.resolve.calls.tasks.*;
import org.jetbrains.jet.lang.resolve.calls.tasks.collectors.CallableDescriptorCollectors;
import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker;
import org.jetbrains.jet.lang.resolve.calls.util.DelegatingCall; import org.jetbrains.jet.lang.resolve.calls.util.DelegatingCall;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -1,37 +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.calls.tasks;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.JetType;
import java.util.Collection;
public interface CallableDescriptorCollector<D extends CallableDescriptor> {
@NotNull
Collection<D> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace);
@NotNull
Collection<D> getMembersByName(@NotNull JetType receiver, Name name, @NotNull BindingTrace bindingTrace);
@NotNull
Collection<D> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace);
}
@@ -14,221 +14,139 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.jet.lang.resolve.calls.tasks; package org.jetbrains.jet.lang.resolve.calls.tasks.collectors
import com.google.common.collect.Lists; import org.jetbrains.jet.lang.descriptors.*
import com.google.common.collect.Sets; import org.jetbrains.jet.lang.resolve.BindingTrace
import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject; import org.jetbrains.jet.lang.types.ErrorUtils
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import java.util.*; import org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource
import static org.jetbrains.jet.lang.resolve.LibrarySourceHacks.filterOutMembersFromLibrarySource; public trait CallableDescriptorCollector<D : CallableDescriptor> {
@SuppressWarnings("unchecked") public fun getNonExtensionsByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<D>
public class CallableDescriptorCollectors<D extends CallableDescriptor> implements Iterable<CallableDescriptorCollector<D>> {
private static final CallableDescriptorCollector<FunctionDescriptor> FUNCTIONS_COLLECTOR =
new FilteredCollector<FunctionDescriptor>(new FunctionCollector());
private static final CallableDescriptorCollector<VariableDescriptor> VARIABLES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new VariableCollector());
private static final CallableDescriptorCollector<VariableDescriptor> PROPERTIES_COLLECTOR =
new FilteredCollector<VariableDescriptor>(new PropertyCollector());
public static final CallableDescriptorCollectors<CallableDescriptor> FUNCTIONS_AND_VARIABLES = public fun getMembersByName(receiver: JetType, name: Name, bindingTrace: BindingTrace): Collection<D>
new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR, VARIABLES_COLLECTOR);
public static final CallableDescriptorCollectors<CallableDescriptor> FUNCTIONS =
new CallableDescriptorCollectors(FUNCTIONS_COLLECTOR);
public static final CallableDescriptorCollectors<VariableDescriptor> VARIABLES =
new CallableDescriptorCollectors(VARIABLES_COLLECTOR);
public static final CallableDescriptorCollectors<VariableDescriptor> PROPERTIES =
new CallableDescriptorCollectors(PROPERTIES_COLLECTOR);
private static class FunctionCollector implements CallableDescriptorCollector<FunctionDescriptor> { public fun getNonMembersByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<D>
}
@NotNull private val FUNCTIONS_COLLECTOR = FilteredCollector(FunctionCollector)
@Override private val VARIABLES_COLLECTOR = FilteredCollector(VariableCollector)
public Collection<FunctionDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) { private val PROPERTIES_COLLECTOR = FilteredCollector(PropertyCollector)
Set<FunctionDescriptor> functions = Sets.newLinkedHashSet();
for (FunctionDescriptor function : scope.getFunctions(name)) {
if (function.getExtensionReceiverParameter() == null) {
functions.add(function);
}
}
addConstructors(scope, name, functions);
return functions;
}
@NotNull public class CallableDescriptorCollectors<D : CallableDescriptor>(vararg collectors: CallableDescriptorCollector<D>) : Iterable<CallableDescriptorCollector<D>> {
@Override private val collectors = collectors.toList()
public Collection<FunctionDescriptor> getMembersByName(@NotNull JetType receiverType, Name name, @NotNull BindingTrace bindingTrace) { override fun iterator(): Iterator<CallableDescriptorCollector<D>> = collectors.iterator()
JetScope receiverScope = receiverType.getMemberScope();
Set<FunctionDescriptor> members = Sets.newHashSet(receiverScope.getFunctions(name));
addConstructors(receiverScope, name, members);
return members;
}
@NotNull [suppress("UNCHECKED_CAST")]
@Override class object {
public Collection<FunctionDescriptor> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) { public val FUNCTIONS_AND_VARIABLES: CallableDescriptorCollectors<CallableDescriptor> =
return scope.getFunctions(name); CallableDescriptorCollectors(FUNCTIONS_COLLECTOR as CallableDescriptorCollector<CallableDescriptor>,
} VARIABLES_COLLECTOR as CallableDescriptorCollector<CallableDescriptor>)
public val FUNCTIONS: CallableDescriptorCollectors<CallableDescriptor> =
private static void addConstructors(JetScope scope, Name name, Collection<FunctionDescriptor> functions) { CallableDescriptorCollectors(FUNCTIONS_COLLECTOR as CallableDescriptorCollector<CallableDescriptor>)
ClassifierDescriptor classifier = scope.getClassifier(name); public val VARIABLES: CallableDescriptorCollectors<VariableDescriptor> = CallableDescriptorCollectors(VARIABLES_COLLECTOR)
if (!(classifier instanceof ClassDescriptor) || ErrorUtils.isError(classifier)) return; public val PROPERTIES: CallableDescriptorCollectors<VariableDescriptor> = CallableDescriptorCollectors(PROPERTIES_COLLECTOR)
ClassDescriptor classDescriptor = (ClassDescriptor) classifier; }
if (classDescriptor.getKind().isSingleton()) { }
// Constructors of singletons shouldn't be callable from the code
return; private object FunctionCollector : CallableDescriptorCollector<FunctionDescriptor> {
}
functions.addAll(classDescriptor.getConstructors()); override fun getNonExtensionsByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<FunctionDescriptor> {
} return scope.getFunctions(name).filter { it.getExtensionReceiverParameter() == null } + getConstructors(scope, name)
}
@Override
public String toString() { override fun getMembersByName(receiver: JetType, name: Name, bindingTrace: BindingTrace): Collection<FunctionDescriptor> {
return "FUNCTIONS"; val receiverScope = receiver.getMemberScope()
} return receiverScope.getFunctions(name) + getConstructors(receiverScope, name)
} }
private static class VariableCollector implements CallableDescriptorCollector<VariableDescriptor> { override fun getNonMembersByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<FunctionDescriptor> {
return scope.getFunctions(name)
private static void addFakeDescriptorForObject(JetScope scope, Name name, Collection<VariableDescriptor> variables) { }
ClassifierDescriptor classifier = scope.getClassifier(name);
if (!(classifier instanceof ClassDescriptor)) return; private fun getConstructors(scope: JetScope, name: Name): Collection<FunctionDescriptor> {
JetType classObjectType = classifier.getClassObjectType(); val classifier = scope.getClassifier(name)
if (classObjectType == null) return; if (classifier !is ClassDescriptor || ErrorUtils.isError(classifier)
// Constructors of singletons shouldn't be callable from the code
variables.add(new FakeCallableDescriptorForObject((ClassDescriptor) classifier)); || classifier.getKind().isSingleton()) {
} return listOf()
}
@NotNull return classifier.getConstructors()
@Override }
public Collection<VariableDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
VariableDescriptor localVariable = scope.getLocalVariable(name); override fun toString() = "FUNCTIONS"
if (localVariable != null) { }
return Collections.singleton(localVariable);
} private object VariableCollector : CallableDescriptorCollector<VariableDescriptor> {
Set<VariableDescriptor> variables = Sets.newLinkedHashSet(); private fun getFakeDescriptorForObject(scope: JetScope, name: Name): VariableDescriptor? {
for (VariableDescriptor variable : scope.getProperties(name)) { val classifier = scope.getClassifier(name)
if (variable.getExtensionReceiverParameter() == null) { if (classifier !is ClassDescriptor || classifier.getClassObjectType() == null) return null
variables.add(variable);
} return FakeCallableDescriptorForObject(classifier as ClassDescriptor)
} }
addFakeDescriptorForObject(scope, name, variables);
return variables; override fun getNonExtensionsByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
} val localVariable = scope.getLocalVariable(name)
if (localVariable != null) {
@NotNull return setOf(localVariable)
@Override }
public Collection<VariableDescriptor> getMembersByName(@NotNull JetType receiverType, Name name, @NotNull BindingTrace bindingTrace) { return (scope.getProperties(name).filter { it.getExtensionReceiverParameter() == null } + getFakeDescriptorForObject(scope, name))
JetScope memberScope = receiverType.getMemberScope(); .filterNotNull()
Collection<VariableDescriptor> members = Lists.newArrayList(); }
members.addAll(memberScope.getProperties(name));
addFakeDescriptorForObject(memberScope, name, members); override fun getMembersByName(receiver: JetType, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
return members; val memberScope = receiver.getMemberScope()
} return (memberScope.getProperties(name) + getFakeDescriptorForObject(memberScope, name)).filterNotNull()
}
@NotNull
@Override override fun getNonMembersByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
public Collection<VariableDescriptor> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) { return (listOf(scope.getLocalVariable(name)) + scope.getProperties(name)).filterNotNull()
Collection<VariableDescriptor> result = Sets.newLinkedHashSet(); }
VariableDescriptor localVariable = scope.getLocalVariable(name); override fun toString() = "VARIABLES"
if (localVariable != null) { }
result.add(localVariable);
} private object PropertyCollector : CallableDescriptorCollector<VariableDescriptor> {
result.addAll(scope.getProperties(name)); private fun filterProperties(variableDescriptors: Collection<VariableDescriptor>) =
return result; variableDescriptors.filter { it is PropertyDescriptor }
}
override fun getNonExtensionsByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
@Override return filterProperties(VARIABLES_COLLECTOR.getNonExtensionsByName(scope, name, bindingTrace))
public String toString() { }
return "VARIABLES";
} override fun getMembersByName(receiver: JetType, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
} return filterProperties(VARIABLES_COLLECTOR.getMembersByName(receiver, name, bindingTrace))
}
private static class PropertyCollector implements CallableDescriptorCollector<VariableDescriptor> {
private static Collection<VariableDescriptor> filterProperties(Collection<? extends VariableDescriptor> variableDescriptors) { override fun getNonMembersByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<VariableDescriptor> {
List<VariableDescriptor> properties = Lists.newArrayList(); return filterProperties(VARIABLES_COLLECTOR.getNonMembersByName(scope, name, bindingTrace))
for (VariableDescriptor descriptor : variableDescriptors) { }
if (descriptor instanceof PropertyDescriptor) {
properties.add(descriptor); override fun toString() = "PROPERTIES"
} }
}
return properties; private class FilteredCollector<D : CallableDescriptor>(private val delegate: CallableDescriptorCollector<D>) : CallableDescriptorCollector<D> {
}
override fun getNonExtensionsByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<D> {
@NotNull return filterOutMembersFromLibrarySource(delegate.getNonExtensionsByName(scope, name, bindingTrace))
@Override }
public Collection<VariableDescriptor> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterProperties(VARIABLES_COLLECTOR.getNonExtensionsByName(scope, name, bindingTrace)); override fun getMembersByName(receiver: JetType, name: Name, bindingTrace: BindingTrace): Collection<D> {
} return filterOutMembersFromLibrarySource(delegate.getMembersByName(receiver, name, bindingTrace))
}
@NotNull
@Override override fun getNonMembersByName(scope: JetScope, name: Name, bindingTrace: BindingTrace): Collection<D> {
public Collection<VariableDescriptor> getMembersByName(@NotNull JetType receiver, Name name, @NotNull BindingTrace bindingTrace) { return filterOutMembersFromLibrarySource(delegate.getNonMembersByName(scope, name, bindingTrace))
return filterProperties(VARIABLES_COLLECTOR.getMembersByName(receiver, name, bindingTrace)); }
}
override fun toString(): String {
@NotNull return delegate.toString()
@Override
public Collection<VariableDescriptor> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterProperties(VARIABLES_COLLECTOR.getNonMembersByName(scope, name, bindingTrace));
}
@Override
public String toString() {
return "PROPERTIES";
}
}
private static class FilteredCollector<D extends CallableDescriptor> implements CallableDescriptorCollector<D> {
private final CallableDescriptorCollector<D> delegate;
private FilteredCollector(CallableDescriptorCollector<D> delegate) {
this.delegate = delegate;
}
@NotNull
@Override
public Collection<D> getNonExtensionsByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterOutMembersFromLibrarySource(delegate.getNonExtensionsByName(scope, name, bindingTrace));
}
@NotNull
@Override
public Collection<D> getMembersByName(@NotNull JetType receiver, Name name, @NotNull BindingTrace bindingTrace) {
return filterOutMembersFromLibrarySource(delegate.getMembersByName(receiver, name, bindingTrace));
}
@NotNull
@Override
public Collection<D> getNonMembersByName(JetScope scope, Name name, @NotNull BindingTrace bindingTrace) {
return filterOutMembersFromLibrarySource(delegate.getNonMembersByName(scope, name, bindingTrace));
}
@Override
public String toString() {
return delegate.toString();
}
}
private final Collection<CallableDescriptorCollector<D>> collectors;
private CallableDescriptorCollectors(CallableDescriptorCollector<D>... collectors) {
this.collectors = Lists.newArrayList(collectors);
}
@NotNull
@Override
public Iterator<CallableDescriptorCollector<D>> iterator() {
return collectors.iterator();
} }
} }
@@ -27,6 +27,8 @@ import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.jet.lang.psi.JetSuperExpression; import org.jetbrains.jet.lang.psi.JetSuperExpression;
import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext; import org.jetbrains.jet.lang.resolve.calls.context.BasicCallResolutionContext;
import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils; import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils;
import org.jetbrains.jet.lang.resolve.calls.tasks.collectors.CallableDescriptorCollector;
import org.jetbrains.jet.lang.resolve.calls.tasks.collectors.CallableDescriptorCollectors;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.resolve.scopes.JetScopeUtils; import org.jetbrains.jet.lang.resolve.scopes.JetScopeUtils;