Moved SAM function creation to JavaFunctionResolver.

This commit is contained in:
Evgeny Gerashchenko
2013-03-12 19:22:40 +04:00
parent dad2ba34aa
commit f4551da18b
5 changed files with 59 additions and 15 deletions
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.resolver.*;
import org.jetbrains.jet.lang.resolve.name.FqName;
@@ -254,6 +255,15 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return functionResolver.resolveFunctionGroup(methodName, scopeData, ownerDescriptor);
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroup(
@NotNull Name methodName,
@NotNull PackagePsiDeclarationProvider scopeData,
@NotNull NamespaceDescriptor ownerDescriptor
) {
return functionResolver.resolveFunctionGroup(methodName, scopeData, ownerDescriptor);
}
@NotNull
public List<ClassDescriptor> resolveInnerClasses(@NotNull ClassPsiDeclarationProvider declarationProvider) {
return innerClassResolver.resolveInnerClasses(declarationProvider);
@@ -106,7 +106,8 @@ public final class MembersCache {
}
private void processFunctionalInterface(@NotNull PsiClass psiClass) {
getOrCreateEmpty(Name.identifier(psiClass.getName()));
NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(psiClass.getName()));
namedMembers.setFunctionalInterface(psiClass);
}
}
@@ -17,7 +17,9 @@
package org.jetbrains.jet.lang.resolve.java.provider;
import com.google.common.collect.Lists;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.wrapper.PropertyPsiDataElement;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -39,6 +41,9 @@ public final class NamedMembers {
@NotNull
private final List<PropertyPsiDataElement> propertyPsiDataElements = Lists.newArrayList();
@Nullable
private PsiClass functionalInterface;
void addMethod(@NotNull PsiMethodWrapper method) {
methods.add(method);
}
@@ -47,9 +52,8 @@ public final class NamedMembers {
propertyPsiDataElements.add(propertyPsiDataElement);
}
@NotNull
public List<PsiMethodWrapper> getMethods() {
return methods;
void setFunctionalInterface(@NotNull PsiClass functionalInterface) {
this.functionalInterface = functionalInterface;
}
@NotNull
@@ -57,8 +61,18 @@ public final class NamedMembers {
return name;
}
@NotNull
public List<PsiMethodWrapper> getMethods() {
return methods;
}
@NotNull
public List<PropertyPsiDataElement> getPropertyPsiDataElements() {
return propertyPsiDataElements;
}
@Nullable
public PsiClass getFunctionalInterface() {
return functionalInterface;
}
}
@@ -35,7 +35,9 @@ import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagation
import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.*;
@@ -326,6 +328,32 @@ public final class JavaFunctionResolver {
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName, scopeData);
}
@NotNull
public Set<FunctionDescriptor> resolveFunctionGroup(
@NotNull Name functionName,
@NotNull PackagePsiDeclarationProvider scopeData,
@NotNull NamespaceDescriptor ownerDescriptor
) {
NamedMembers namedMembers = scopeData.getMembersCache().get(functionName);
if (namedMembers == null) {
return Collections.emptySet();
}
PsiClass functionalInterface = namedMembers.getFunctionalInterface();
if (functionalInterface != null) {
ClassifierDescriptor classifier = ownerDescriptor.getMemberScope().getClassifier(functionName);
if (classifier instanceof ClassDescriptor && SingleAbstractMethodUtils.isFunctionalInterface((ClassDescriptor) classifier)) {
SimpleFunctionDescriptor constructorFunction =
SingleAbstractMethodUtils.createConstructorFunction((ClassDescriptor) classifier);
return Collections.<FunctionDescriptor>singleton(constructorFunction);
}
}
return Collections.emptySet();
}
@NotNull
private JetType makeReturnType(
PsiType returnType, PsiMethodWrapper method,
@@ -18,12 +18,10 @@ package org.jetbrains.jet.lang.resolve.java.scope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
@@ -44,15 +42,8 @@ public final class JavaPackageScopeWithoutMembers extends JavaPackageScope {
@Override
@NotNull
protected Set<FunctionDescriptor> computeFunctionDescriptor(@NotNull Name name) {
ClassifierDescriptor classifier = getClassifier(name);
if (classifier instanceof ClassDescriptor && SingleAbstractMethodUtils.isFunctionalInterface((ClassDescriptor) classifier)) {
FunctionDescriptor constructorFunction = SingleAbstractMethodUtils.createConstructorFunction((ClassDescriptor) classifier);
return Collections.singleton(constructorFunction);
}
return Collections.emptySet();
return getResolver().resolveFunctionGroup(
name, (PackagePsiDeclarationProvider) declarationProvider, (NamespaceDescriptor) descriptor);
}
@NotNull