From f4551da18b6e5107974d1793a69437e61cab61ac Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 12 Mar 2013 19:22:40 +0400 Subject: [PATCH] Moved SAM function creation to JavaFunctionResolver. --- .../resolve/java/JavaDescriptorResolver.java | 10 +++++++ .../resolve/java/provider/MembersCache.java | 3 +- .../resolve/java/provider/NamedMembers.java | 20 +++++++++++-- .../java/resolver/JavaFunctionResolver.java | 28 +++++++++++++++++++ .../scope/JavaPackageScopeWithoutMembers.java | 13 ++------- 5 files changed, 59 insertions(+), 15 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index d5f2f26fb9c..660b4856c30 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -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 resolveFunctionGroup( + @NotNull Name methodName, + @NotNull PackagePsiDeclarationProvider scopeData, + @NotNull NamespaceDescriptor ownerDescriptor + ) { + return functionResolver.resolveFunctionGroup(methodName, scopeData, ownerDescriptor); + } + @NotNull public List resolveInnerClasses(@NotNull ClassPsiDeclarationProvider declarationProvider) { return innerClassResolver.resolveInnerClasses(declarationProvider); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java index 89621ecb9d3..51b7b559c11 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/MembersCache.java @@ -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); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/NamedMembers.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/NamedMembers.java index 1545127a3dc..4c1aa9c99a1 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/NamedMembers.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/NamedMembers.java @@ -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 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 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 getMethods() { + return methods; + } + @NotNull public List getPropertyPsiDataElements() { return propertyPsiDataElements; } + + @Nullable + public PsiClass getFunctionalInterface() { + return functionalInterface; + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index 5912a57ed03..30342d33eda 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -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 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.singleton(constructorFunction); + } + } + + return Collections.emptySet(); + } + @NotNull private JetType makeReturnType( PsiType returnType, PsiMethodWrapper method, diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java index 5b4c2992b58..183cf6f9f2d 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java @@ -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 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