diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index eb7f20ff1d6..332594093d8 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -80,7 +80,7 @@ public class ClosureCodegen extends GenerationStateAware { interfaceFunction = getInvokeFunction(funDescriptor); } else { - interfaceFunction = SingleAbstractMethodUtils.getAbstractMethodOfFunctionalInterface(samInterface); + interfaceFunction = SingleAbstractMethodUtils.getAbstractMethodOfSamInterface(samInterface); } SignatureWriter signatureWriter = new SignatureWriter(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 5ee8a86b7a7..759f7f1b32b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1882,10 +1882,10 @@ public class ExpressionCodegen extends JetVisitor implem } else { if (funDescriptor instanceof SimpleFunctionDescriptor) { - ClassDescriptor samTrait = bindingContext.get( - BindingContext.SAM_CONSTRUCTOR_TO_TRAIT, ((SimpleFunctionDescriptor) funDescriptor).getOriginal()); + ClassDescriptor samInterface = bindingContext.get( + BindingContext.SAM_CONSTRUCTOR_TO_INTERFACE, ((SimpleFunctionDescriptor) funDescriptor).getOriginal()); - if (samTrait != null) { + if (samInterface != null) { ResolvedValueArgument argument = resolvedCall.getValueArgumentsByIndex().get(0); if (!(argument instanceof ExpressionValueArgument)) { throw new IllegalStateException( @@ -1896,7 +1896,7 @@ public class ExpressionCodegen extends JetVisitor implem JetExpression argumentExpression = valueArgument.getArgumentExpression(); if (argumentExpression instanceof JetFunctionLiteralExpression) { - return genClosure(((JetFunctionLiteralExpression) argumentExpression).getFunctionLiteral(), samTrait); + return genClosure(((JetFunctionLiteralExpression) argumentExpression).getFunctionLiteral(), samInterface); } else { throw new UnsupportedOperationException(); // TODO 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 89481ef1815..e9294a2925e 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 @@ -94,8 +94,8 @@ public final class MembersCache { if (JetClassAnnotation.get(psiClass).kind() == JvmStdlibNames.FLAG_CLASS_KIND_OBJECT) { processObjectClass(psiClass); } - if (!DescriptorResolverUtils.isKotlinClass(psiClass) && isFunctionalInterface(psiClass)) { - processFunctionalInterface(psiClass); + if (!DescriptorResolverUtils.isKotlinClass(psiClass) && isSamInterface(psiClass)) { + processSamInterface(psiClass); } } } @@ -111,9 +111,9 @@ public final class MembersCache { } } - private void processFunctionalInterface(@NotNull PsiClass psiClass) { + private void processSamInterface(@NotNull PsiClass psiClass) { NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(psiClass.getName())); - namedMembers.setFunctionalInterface(psiClass); + namedMembers.setSamInterface(psiClass); } } @@ -307,9 +307,9 @@ public final class MembersCache { return; } for (PsiClass nested : psiClass.getPsiClass().getInnerClasses()) { - if (isFunctionalInterface(nested)) { + if (isSamInterface(nested)) { NamedMembers namedMembers = getOrCreateEmpty(Name.identifier(nested.getName())); - namedMembers.setFunctionalInterface(nested); + namedMembers.setSamInterface(nested); } } } @@ -335,7 +335,7 @@ public final class MembersCache { return OBJECT_METHODS.contains(formattedMethod); } - public static boolean isFunctionalInterface(@NotNull PsiClass psiClass) { + public static boolean isSamInterface(@NotNull PsiClass psiClass) { if (!psiClass.isInterface()) { return false; } 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 4c1aa9c99a1..843e3af02d9 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 @@ -42,7 +42,7 @@ public final class NamedMembers { private final List propertyPsiDataElements = Lists.newArrayList(); @Nullable - private PsiClass functionalInterface; + private PsiClass samInterface; void addMethod(@NotNull PsiMethodWrapper method) { methods.add(method); @@ -52,8 +52,8 @@ public final class NamedMembers { propertyPsiDataElements.add(propertyPsiDataElement); } - void setFunctionalInterface(@NotNull PsiClass functionalInterface) { - this.functionalInterface = functionalInterface; + void setSamInterface(@NotNull PsiClass samInterface) { + this.samInterface = samInterface; } @NotNull @@ -72,7 +72,7 @@ public final class NamedMembers { } @Nullable - public PsiClass getFunctionalInterface() { - return functionalInterface; + public PsiClass getSamInterface() { + return samInterface; } } 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 00011f027b8..d7c0cb5b2ed 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 @@ -18,7 +18,6 @@ package org.jetbrains.jet.lang.resolve.java.resolver; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiMethod; @@ -358,12 +357,13 @@ public final class JavaFunctionResolver { @NotNull NamespaceDescriptor ownerDescriptor, @NotNull NamedMembers namedMembers ) { - PsiClass functionalInterface = namedMembers.getFunctionalInterface(); - if (functionalInterface != null) { + PsiClass samInterface = namedMembers.getSamInterface(); + if (samInterface != null) { ClassDescriptor klass = findClassInNamespace(ownerDescriptor, namedMembers.getName()); - if (klass != null && SingleAbstractMethodUtils.isFunctionalInterface(klass)) { - SimpleFunctionDescriptor constructorFunction = SingleAbstractMethodUtils.createConstructorFunction(ownerDescriptor, klass); - trace.record(BindingContext.SAM_CONSTRUCTOR_TO_TRAIT, constructorFunction, klass); + if (klass != null && SingleAbstractMethodUtils.isSamInterface(klass)) { + SimpleFunctionDescriptor constructorFunction = SingleAbstractMethodUtils.createSamConstructorFunction(ownerDescriptor, + klass); + trace.record(BindingContext.SAM_CONSTRUCTOR_TO_INTERFACE, constructorFunction, klass); return constructorFunction; } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index ae972e7feb8..dc57160d19e 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -221,7 +221,7 @@ public final class JavaNamespaceResolver { } for (PsiClass nestedClass : psiClass.getInnerClasses()) { - if (MembersCache.isFunctionalInterface(nestedClass)) { + if (MembersCache.isSamInterface(nestedClass)) { return true; } if (nestedClass.hasModifierProperty(PsiModifier.STATIC) && hasStaticMembers(nestedClass)) { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java index 24bbcbfd4f1..fb72b5a5161 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/sam/SingleAbstractMethodUtils.java @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; public class SingleAbstractMethodUtils { - public static boolean isFunctionalInterface(@NotNull ClassDescriptor klass) { + public static boolean isSamInterface(@NotNull ClassDescriptor klass) { if (klass.getKind() != ClassKind.TRAIT) { return false; } @@ -63,7 +63,7 @@ public class SingleAbstractMethodUtils { } @NotNull - private static JetType getFunctionalTypeForFunction(@NotNull FunctionDescriptor function) { + private static JetType getFunctionTypeForFunction(@NotNull FunctionDescriptor function) { JetType returnType = function.getReturnType(); assert returnType != null : "function is not initialized: " + function; List parameterTypes = Lists.newArrayList(); @@ -73,25 +73,28 @@ public class SingleAbstractMethodUtils { return KotlinBuiltIns.getInstance().getFunctionType(Collections.emptyList(), null, parameterTypes, returnType); } - public static SimpleFunctionDescriptor createConstructorFunction(@NotNull ClassOrNamespaceDescriptor owner, @NotNull ClassDescriptor klass) { + public static SimpleFunctionDescriptor createSamConstructorFunction( + @NotNull ClassOrNamespaceDescriptor owner, + @NotNull ClassDescriptor samInterface + ) { SimpleFunctionDescriptorImpl result = new SimpleFunctionDescriptorImpl( owner, - klass.getAnnotations(), - klass.getName(), + samInterface.getAnnotations(), + samInterface.getName(), CallableMemberDescriptor.Kind.SYNTHESIZED ); Map traitToFunTypeParameters = - SignaturesUtil.recreateTypeParametersAndReturnMapping(klass.getTypeConstructor().getParameters(), result); + SignaturesUtil.recreateTypeParametersAndReturnMapping(samInterface.getTypeConstructor().getParameters(), result); TypeSubstitutor typeParametersSubstitutor = SignaturesUtil.createSubstitutorForTypeParameters(traitToFunTypeParameters); - JetType parameterTypeUnsubstituted = getFunctionalTypeForFunction(getAbstractMethodOfFunctionalInterface(klass)); + JetType parameterTypeUnsubstituted = getFunctionTypeForFunction(getAbstractMethodOfSamInterface(samInterface)); JetType parameterType = typeParametersSubstitutor.substitute(parameterTypeUnsubstituted, Variance.IN_VARIANCE); assert parameterType != null : "couldn't substitute type: " + parameterType + ", substitutor = " + typeParametersSubstitutor; ValueParameterDescriptor parameter = new ValueParameterDescriptorImpl( result, 0, Collections.emptyList(), Name.identifier("function"), parameterType, false, null); - JetType returnType = typeParametersSubstitutor.substitute(klass.getDefaultType(), Variance.OUT_VARIANCE); + JetType returnType = typeParametersSubstitutor.substitute(samInterface.getDefaultType(), Variance.OUT_VARIANCE); assert returnType != null : "couldn't substitute type: " + returnType + ", substitutor = " + typeParametersSubstitutor; for (Map.Entry mapEntry : traitToFunTypeParameters.entrySet()) { @@ -114,7 +117,7 @@ public class SingleAbstractMethodUtils { Arrays.asList(parameter), returnType, Modality.FINAL, - klass.getVisibility(), + samInterface.getVisibility(), false ); @@ -122,8 +125,8 @@ public class SingleAbstractMethodUtils { } @NotNull - public static SimpleFunctionDescriptor getAbstractMethodOfFunctionalInterface(@NotNull ClassDescriptor klass) { - return (SimpleFunctionDescriptor) getAbstractMembers(klass).get(0); + public static SimpleFunctionDescriptor getAbstractMethodOfSamInterface(@NotNull ClassDescriptor samInterface) { + return (SimpleFunctionDescriptor) getAbstractMembers(samInterface).get(0); } private SingleAbstractMethodUtils() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index 5e14109b930..4aa98e3fb5b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -255,7 +255,7 @@ public interface BindingContext { new BasicWritableSlice>(Slices.ONLY_REWRITE_TO_EQUAL, true); WritableSlice IS_DECLARED_IN_JAVA = Slices.createSimpleSlice(); - WritableSlice SAM_CONSTRUCTOR_TO_TRAIT = Slices.createSimpleSlice(); + WritableSlice SAM_CONSTRUCTOR_TO_INTERFACE = Slices.createSimpleSlice(); @SuppressWarnings("UnusedDeclaration") @Deprecated // This field is needed only for the side effects of its initializer