diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java index c6e1d5a9a13..d9b7535a3f6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java @@ -207,11 +207,11 @@ public abstract class CodegenContext { if(accessor != null) return accessor; - if(descriptor instanceof FunctionDescriptor) { - FunctionDescriptorImpl myAccessor = new FunctionDescriptorImpl(contextType, + if(descriptor instanceof NamedFunctionDescriptor) { + NamedFunctionDescriptorImpl myAccessor = new NamedFunctionDescriptorImpl(contextType, Collections.emptyList(), descriptor.getName() + "$bridge$" + accessors.size()); - FunctionDescriptor fd = (FunctionDescriptor) descriptor; + FunctionDescriptor fd = (NamedFunctionDescriptor) descriptor; myAccessor.initialize(fd.getReceiverParameter().exists() ? fd.getReceiverParameter().getType() : null, fd.getExpectedThisObject(), fd.getTypeParameters(), diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 2a2fcf34ea4..176502c3e82 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -85,9 +85,9 @@ public class CodegenUtil { return hasDerivedTypeInfoField(type); } - public static FunctionDescriptor createInvoke(ExpressionAsFunctionDescriptor fd) { + public static NamedFunctionDescriptor createInvoke(ExpressionAsFunctionDescriptor fd) { int arity = fd.getValueParameters().size(); - FunctionDescriptorImpl invokeDescriptor = new FunctionDescriptorImpl( + NamedFunctionDescriptorImpl invokeDescriptor = new NamedFunctionDescriptorImpl( fd.getExpectedThisObject().exists() ? JetStandardClasses.getReceiverFunction(arity) : JetStandardClasses.getFunction(arity), Collections.emptyList(), "invoke"); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 75f29f34539..18687a13775 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1218,7 +1218,7 @@ public class ExpressionCodegen extends JetVisitor { callableMethod = ClosureCodegen.asCallableMethod((FunctionDescriptor) fd); } else if (fd instanceof ExpressionAsFunctionDescriptor) { - FunctionDescriptor invoke = CodegenUtil.createInvoke((ExpressionAsFunctionDescriptor) fd); + NamedFunctionDescriptor invoke = CodegenUtil.createInvoke((ExpressionAsFunctionDescriptor) fd); callableMethod = ClosureCodegen.asCallableMethod(invoke); } else if (fd instanceof FunctionDescriptor) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java index 43ecd6939a8..83337012490 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java @@ -40,7 +40,7 @@ public class FunctionCodegen { } public void gen(JetNamedFunction f) { - final FunctionDescriptor functionDescriptor = state.getBindingContext().get(BindingContext.FUNCTION, f); + final NamedFunctionDescriptor functionDescriptor = state.getBindingContext().get(BindingContext.FUNCTION, f); assert functionDescriptor != null; JvmMethodSignature method = typeMapper.mapToCallableMethod(functionDescriptor, false, owner.getContextKind()).getSignature(); generateMethod(f, method, functionDescriptor); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 7c98cd97d68..13b7ffd40ff 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -445,8 +445,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { HashSet overridden = new HashSet(); for (JetDeclaration declaration : myClass.getDeclarations()) { - if (declaration instanceof JetFunction) { - FunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration); + if (declaration instanceof JetNamedFunction) { + NamedFunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, declaration); assert functionDescriptor != null; overridden.addAll(functionDescriptor.getOverriddenDescriptors()); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java index 3b2da090884..372e4a4f3c1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethods.java @@ -158,8 +158,8 @@ public class IntrinsicMethods { } ); for (DeclarationDescriptor stringMember : stringMembers) { - if (stringMember instanceof FunctionDescriptor) { - final FunctionDescriptor stringMethod = (FunctionDescriptor) stringMember; + if (stringMember instanceof NamedFunctionDescriptor) { + final NamedFunctionDescriptor stringMethod = (NamedFunctionDescriptor) stringMember; final PsiMethod[] methods = stringPsiClass != null? stringPsiClass.findMethodsByName(stringMember.getName(), false) : new PsiMethod[]{}; for (PsiMethod method : methods) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/PsiMethodCall.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/PsiMethodCall.java index d7681a08590..b112f94615a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/PsiMethodCall.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/PsiMethodCall.java @@ -5,7 +5,7 @@ import org.jetbrains.jet.codegen.CallableMethod; import org.jetbrains.jet.codegen.ExpressionCodegen; import org.jetbrains.jet.codegen.OwnerKind; import org.jetbrains.jet.codegen.StackValue; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; +import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptor; import org.jetbrains.jet.lang.psi.JetCallExpression; import org.jetbrains.jet.lang.psi.JetExpression; import org.objectweb.asm.Type; @@ -18,9 +18,9 @@ import java.util.List; * @author alex.tkachman */ public class PsiMethodCall implements IntrinsicMethod { - private final FunctionDescriptor myMethod; + private final NamedFunctionDescriptor myMethod; - public PsiMethodCall(FunctionDescriptor method) { + public PsiMethodCall(NamedFunctionDescriptor method) { myMethod = method; } 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 7157bf005e6..1160483008f 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 @@ -1112,7 +1112,7 @@ public class JavaDescriptorResolver { return null; } PsiParameter[] parameters = method.getParameterList().getParameters(); - FunctionDescriptorImpl functionDescriptorImpl = new FunctionDescriptorImpl( + NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl( owner, Collections.emptyList(), // TODO method.getName() diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index 490b9f889b1..b41e489a52a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -22,20 +22,20 @@ import static org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor /** * @author abreslav */ -public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements FunctionDescriptor { +public abstract class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements FunctionDescriptor { - private List typeParameters; - private List unsubstitutedValueParameters; - private JetType unsubstitutedReturnType; + protected List typeParameters; + protected List unsubstitutedValueParameters; + protected JetType unsubstitutedReturnType; private ReceiverDescriptor receiver; - private ReceiverDescriptor expectedThisObject; + protected ReceiverDescriptor expectedThisObject; - private Modality modality; - private Visibility visibility; + protected Modality modality; + protected Visibility visibility; private final Set overriddenFunctions = Sets.newLinkedHashSet(); private final FunctionDescriptor original; - public FunctionDescriptorImpl( + protected FunctionDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, @NotNull String name) { @@ -43,7 +43,7 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements this.original = this; } - public FunctionDescriptorImpl( + protected FunctionDescriptorImpl( @NotNull FunctionDescriptor original, @NotNull List annotations, @NotNull String name) { @@ -182,32 +182,11 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements return substitutedDescriptor; } - protected FunctionDescriptorImpl createSubstitutedCopy() { - return new FunctionDescriptorImpl( - this, - // TODO : safeSubstitute - getAnnotations(), - getName()); - } + protected abstract FunctionDescriptorImpl createSubstitutedCopy(); @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitFunctionDescriptor(this, data); } - @NotNull - @Override - public FunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { - FunctionDescriptorImpl copy = new FunctionDescriptorImpl(newOwner, Lists.newArrayList(getAnnotations()), getName()); - copy.initialize( - getReceiverParameter().exists() ? getReceiverParameter().getType() : null, - expectedThisObject, - DescriptorUtils.copyTypeParameters(copy, typeParameters), - DescriptorUtils.copyValueParameters(copy, unsubstitutedValueParameters), - unsubstitutedReturnType, - DescriptorUtils.convertModality(modality, makeNonAbstract), - visibility - ); - return copy; - } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 5fb10e4db9a..1f47e1bf3d5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -27,7 +27,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private final Set constructors = Sets.newLinkedHashSet(); private final Set callableMembers = Sets.newHashSet(); private final Set properties = Sets.newHashSet(); - private final Set functions = Sets.newHashSet(); + private final Set functions = Sets.newHashSet(); private List typeParameters = Lists.newArrayList(); private Collection supertypes = Lists.newArrayList(); private Map innerClasses = Maps.newHashMap(); @@ -152,7 +152,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme } @Override - public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) { + public void addFunctionDescriptor(@NotNull NamedFunctionDescriptor functionDescriptor) { functions.add(functionDescriptor); callableMembers.add(functionDescriptor); scopeForMemberLookup.addFunctionDescriptor(functionDescriptor); @@ -160,7 +160,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme } @NotNull - public Set getFunctions() { + public Set getFunctions() { return functions; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptor.java new file mode 100644 index 00000000000..803b2d0ade8 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptor.java @@ -0,0 +1,13 @@ +package org.jetbrains.jet.lang.descriptors; + +import org.jetbrains.annotations.NotNull; + +/** + * @author Stepan Koltsov + */ +public interface NamedFunctionDescriptor extends FunctionDescriptor { + + @NotNull + @Override + NamedFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java new file mode 100644 index 00000000000..842fde848c7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamedFunctionDescriptorImpl.java @@ -0,0 +1,47 @@ +package org.jetbrains.jet.lang.descriptors; + +import com.google.common.collect.Lists; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; + +import java.util.List; + +/** + * @author Stepan Koltsov + */ +public class NamedFunctionDescriptorImpl extends FunctionDescriptorImpl implements NamedFunctionDescriptor { + + public NamedFunctionDescriptorImpl(@NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, @NotNull String name) { + super(containingDeclaration, annotations, name); + } + + private NamedFunctionDescriptorImpl(@NotNull NamedFunctionDescriptor original, @NotNull List annotations, @NotNull String name) { + super(original, annotations, name); + } + + @Override + protected FunctionDescriptorImpl createSubstitutedCopy() { + return new NamedFunctionDescriptorImpl( + this, + // TODO : safeSubstitute + getAnnotations(), + getName()); + } + + @NotNull + @Override + public NamedFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { + NamedFunctionDescriptorImpl copy = new NamedFunctionDescriptorImpl(newOwner, Lists.newArrayList(getAnnotations()), getName()); + copy.initialize( + getReceiverParameter().exists() ? getReceiverParameter().getType() : null, + expectedThisObject, + DescriptorUtils.copyTypeParameters(copy, typeParameters), + DescriptorUtils.copyValueParameters(copy, unsubstitutedValueParameters), + unsubstitutedReturnType, + DescriptorUtils.convertModality(modality, makeNonAbstract), + visibility + ); + return copy; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java index 1ebe3a7e1b7..8c0252afe9e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceDescriptorImpl.java @@ -49,7 +49,7 @@ public class NamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl imp } @Override - public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) { + public void addFunctionDescriptor(@NotNull NamedFunctionDescriptor functionDescriptor) { memberScope.addFunctionDescriptor(functionDescriptor); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLike.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLike.java index 9ccf55baba4..6f74641d910 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLike.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/NamespaceLike.java @@ -67,7 +67,7 @@ public interface NamespaceLike extends DeclarationDescriptor { void addObjectDescriptor(@NotNull MutableClassDescriptor objectDescriptor); - void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor); + void addFunctionDescriptor(@NotNull NamedFunctionDescriptor functionDescriptor); void addPropertyDescriptor(@NotNull PropertyDescriptor propertyDescriptor); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java index 59670106531..744bb7729f0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/VariableAsFunctionDescriptor.java @@ -34,4 +34,9 @@ public class VariableAsFunctionDescriptor extends FunctionDescriptorImpl { public VariableAsFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { throw new UnsupportedOperationException("Should not be copied for overriding"); } + + @Override + protected FunctionDescriptorImpl createSubstitutedCopy() { + throw new IllegalStateException(); + } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 8e450cce0f8..9ddef1b5dbc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -126,11 +126,11 @@ public interface Errors { return super.on(elementToBlame, nodeToMark, s, classDescriptor, modifierListOwner).add(DiagnosticParameters.CLASS, modifierListOwner); } }; - PsiElementOnlyDiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract"); - PsiElementOnlyDiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Method {0} without a body must be abstract"); - PsiElementOnlyDiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function {0} is not a class or trait member and cannot be abstract"); + PsiElementOnlyDiagnosticFactory1 ABSTRACT_FUNCTION_WITH_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "A function {0} with body cannot be abstract"); + PsiElementOnlyDiagnosticFactory1 NON_ABSTRACT_FUNCTION_WITH_NO_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Method {0} without a body must be abstract"); + PsiElementOnlyDiagnosticFactory1 NON_MEMBER_ABSTRACT_FUNCTION = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function {0} is not a class or trait member and cannot be abstract"); - PsiElementOnlyDiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function {0} must have a body"); + PsiElementOnlyDiagnosticFactory1 NON_MEMBER_FUNCTION_NO_BODY = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function {0} must have a body"); DiagnosticWithParameterFactory NON_FINAL_MEMBER_IN_FINAL_CLASS = DiagnosticWithParameterFactory.create(ERROR, "Non final member in a final class", DiagnosticParameters.CLASS); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java index 6ed05150f5f..3edb5e6a0ae 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AnalyzingUtils.java @@ -122,7 +122,7 @@ public class AnalyzingUtils { } @Override - public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) { + public void addFunctionDescriptor(@NotNull NamedFunctionDescriptor functionDescriptor) { scope.addFunctionDescriptor(functionDescriptor); } 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 4cc757284ef..a0fe615ff63 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -117,7 +117,7 @@ public interface BindingContext { WritableSlice NAMESPACE = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); WritableSlice CLASS = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); WritableSlice TYPE_PARAMETER = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); - WritableSlice FUNCTION = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); + WritableSlice FUNCTION = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); WritableSlice CONSTRUCTOR = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); WritableSlice VARIABLE = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); WritableSlice VALUE_PARAMETER = Slices.sliceBuilder().setOpposite((WritableSlice) DESCRIPTOR_TO_DECLARATION).build(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 171a69870b3..a0c94512896 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -467,9 +467,9 @@ public class BodyResolver { } private void resolveFunctionBodies() { - for (Map.Entry entry : this.context.getFunctions().entrySet()) { + for (Map.Entry entry : this.context.getFunctions().entrySet()) { JetNamedFunction declaration = entry.getKey(); - FunctionDescriptor descriptor = entry.getValue(); + NamedFunctionDescriptor descriptor = entry.getValue(); computeDeferredType(descriptor.getReturnType()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java index d56355f1331..47bbf55705d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java @@ -34,9 +34,9 @@ public class ControlFlowAnalyzer { if (!context.completeAnalysisNeeded(objectDeclaration)) continue; checkClassOrObject(objectDeclaration); } - for (Map.Entry entry : context.getFunctions().entrySet()) { + for (Map.Entry entry : context.getFunctions().entrySet()) { JetNamedFunction function = entry.getKey(); - FunctionDescriptorImpl functionDescriptor = entry.getValue(); + NamedFunctionDescriptor functionDescriptor = entry.getValue(); if (!context.completeAnalysisNeeded(function)) continue; final JetType expectedReturnType = !function.hasBlockBody() && !function.hasDeclaredReturnType() ? NO_EXPECTED_TYPE diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 47071e7a1d9..9cb35b42de3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -103,7 +103,7 @@ public class DeclarationResolver { declaration.accept(new JetVisitorVoid() { @Override public void visitNamedFunction(JetNamedFunction function) { - FunctionDescriptorImpl functionDescriptor = context.getDescriptorResolver().resolveFunctionDescriptor(namespaceLike, scopeForFunctions, function); + NamedFunctionDescriptor functionDescriptor = context.getDescriptorResolver().resolveFunctionDescriptor(namespaceLike, scopeForFunctions, function); namespaceLike.addFunctionDescriptor(functionDescriptor); context.getFunctions().put(function, functionDescriptor); context.getDeclaringScopes().put(function, scopeForFunctions); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java index 94ea67e824e..a96b6c41d82 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationsChecker.java @@ -55,10 +55,10 @@ public class DeclarationsChecker { checkObject(objectDeclaration, objectDescriptor); } - Map functions = context.getFunctions(); - for (Map.Entry entry : functions.entrySet()) { + Map functions = context.getFunctions(); + for (Map.Entry entry : functions.entrySet()) { JetNamedFunction function = entry.getKey(); - FunctionDescriptorImpl functionDescriptor = entry.getValue(); + NamedFunctionDescriptor functionDescriptor = entry.getValue(); if (!context.completeAnalysisNeeded(function)) continue; checkFunction(function, functionDescriptor); @@ -254,7 +254,7 @@ public class DeclarationsChecker { } } - protected void checkFunction(JetNamedFunction function, FunctionDescriptor functionDescriptor) { + protected void checkFunction(JetNamedFunction function, NamedFunctionDescriptor functionDescriptor) { DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration(); PsiElement nameIdentifier = function.getNameIdentifier(); JetModifierList modifierList = function.getModifierList(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java index 9fb7350d280..1fae05541a9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.lang.resolve; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.MutableClassDescriptor; +import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.types.JetType; @@ -49,10 +50,10 @@ public class DelegationResolver { context.getTrace().record(DELEGATED, copy); } } - else if (declarationDescriptor instanceof FunctionDescriptor) { - FunctionDescriptor functionDescriptor = (FunctionDescriptor) declarationDescriptor; + else if (declarationDescriptor instanceof NamedFunctionDescriptor) { + NamedFunctionDescriptor functionDescriptor = (NamedFunctionDescriptor) declarationDescriptor; if (functionDescriptor.getModality().isOverridable()) { - FunctionDescriptor copy = functionDescriptor.copy(classDescriptor, true); + NamedFunctionDescriptor copy = functionDescriptor.copy(classDescriptor, true); classDescriptor.addFunctionDescriptor(copy); context.getTrace().record(DELEGATED, copy); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 707a8f758dd..c0fb1809e95 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -139,8 +139,8 @@ public class DescriptorResolver { } @NotNull - public FunctionDescriptorImpl resolveFunctionDescriptor(DeclarationDescriptor containingDescriptor, final JetScope scope, final JetNamedFunction function) { - final FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl( + public NamedFunctionDescriptor resolveFunctionDescriptor(DeclarationDescriptor containingDescriptor, final JetScope scope, final JetNamedFunction function) { + final NamedFunctionDescriptorImpl functionDescriptor = new NamedFunctionDescriptorImpl( containingDescriptor, annotationResolver.resolveAnnotations(scope, function.getModifierList()), JetPsiUtil.safeName(function.getName()) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java index 3fd237d3cac..c6143bc21e8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverloadResolver.java @@ -86,7 +86,7 @@ public class OverloadResolver { MultiMap functionsByName = MultiMap.create(); - for (FunctionDescriptorImpl function : context.getFunctions().values()) { + for (NamedFunctionDescriptor function : context.getFunctions().values()) { DeclarationDescriptor containingDeclaration = function.getContainingDeclaration(); if (containingDeclaration instanceof NamespaceDescriptor) { NamespaceDescriptor namespaceDescriptor = (NamespaceDescriptor) containingDeclaration; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java index db01ad8461b..d0b691bb4ca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalysisContext.java @@ -34,7 +34,7 @@ import java.util.Set; protected final Map namespaceDescriptors = Maps.newHashMap(); private final Map declaringScopes = Maps.newHashMap(); - private final Map functions = Maps.newLinkedHashMap(); + private final Map functions = Maps.newLinkedHashMap(); private final Map constructors = Maps.newLinkedHashMap(); private final Map properties = Maps.newLinkedHashMap(); private final Set primaryConstructorParameterProperties = Sets.newHashSet(); @@ -138,7 +138,7 @@ import java.util.Set; return declaringScopes; } - public Map getFunctions() { + public Map getFunctions() { return functions; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 6cf99701e37..30e3f7e9a35 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -139,7 +139,7 @@ public class TopDownAnalyzer { } @Override - public void addFunctionDescriptor(@NotNull FunctionDescriptor functionDescriptor) { + public void addFunctionDescriptor(@NotNull NamedFunctionDescriptor functionDescriptor) { throw new UnsupportedOperationException(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java index ba4d91f3983..9b38282eb41 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ExpressionAsFunctionDescriptor.java @@ -18,4 +18,15 @@ public class ExpressionAsFunctionDescriptor extends FunctionDescriptorImpl { public ExpressionAsFunctionDescriptor(DeclarationDescriptor containingDeclaration, String name) { super(containingDeclaration, Collections.emptyList(), name); } + + @Override + protected FunctionDescriptorImpl createSubstitutedCopy() { + throw new IllegalStateException(); + } + + @NotNull + @Override + public FunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract) { + throw new IllegalStateException(); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 3f0628f248a..87c02bed6d3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -126,7 +126,7 @@ public class ErrorUtils { private static final Set ERROR_PROPERTY_GROUP = Collections.singleton(ERROR_PROPERTY); private static FunctionDescriptor createErrorFunction(List typeParameters, List positionedValueArgumentTypes) { - FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), ""); + FunctionDescriptorImpl functionDescriptor = new NamedFunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), ""); return functionDescriptor.initialize( null, ReceiverDescriptor.NO_RECEIVER, @@ -139,7 +139,7 @@ public class ErrorUtils { } public static FunctionDescriptor createErrorFunction(int typeParameterCount, List positionedValueParameterTypes) { - return new FunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), "").initialize( + return new NamedFunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), "").initialize( null, ReceiverDescriptor.NO_RECEIVER, Collections.emptyList(), // TODO diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java index 52622522ba4..0df6d9c4af1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java @@ -68,7 +68,7 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { JetType expectedType = context.expectedType; boolean functionTypeExpected = expectedType != TypeUtils.NO_EXPECTED_TYPE && JetStandardClasses.isFunctionType(expectedType); - FunctionDescriptorImpl functionDescriptor = createFunctionDescriptor(expression, context, functionTypeExpected); + NamedFunctionDescriptorImpl functionDescriptor = createFunctionDescriptor(expression, context, functionTypeExpected); List parameterTypes = Lists.newArrayList(); List valueParameters = functionDescriptor.getValueParameters(); @@ -108,10 +108,10 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { return DataFlowUtils.checkType(JetStandardClasses.getFunctionType(Collections.emptyList(), receiver, parameterTypes, safeReturnType), expression, context); } - private FunctionDescriptorImpl createFunctionDescriptor(JetFunctionLiteralExpression expression, ExpressionTypingContext context, boolean functionTypeExpected) { + private NamedFunctionDescriptorImpl createFunctionDescriptor(JetFunctionLiteralExpression expression, ExpressionTypingContext context, boolean functionTypeExpected) { JetFunctionLiteral functionLiteral = expression.getFunctionLiteral(); JetTypeReference receiverTypeRef = functionLiteral.getReceiverTypeRef(); - FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl( + NamedFunctionDescriptorImpl functionDescriptor = new NamedFunctionDescriptorImpl( context.scope.getContainingDeclaration(), Collections.emptyList(), ""); List valueParameterDescriptors = createValueParameterDescriptors(context, functionLiteral, functionDescriptor, functionTypeExpected); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index b4eabb934a0..d9684f96950 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -105,7 +105,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito @Override public JetType visitNamedFunction(JetNamedFunction function, ExpressionTypingContext context) { - FunctionDescriptorImpl functionDescriptor = context.getDescriptorResolver().resolveFunctionDescriptor(scope.getContainingDeclaration(), scope, function); + NamedFunctionDescriptor functionDescriptor = context.getDescriptorResolver().resolveFunctionDescriptor(scope.getContainingDeclaration(), scope, function); scope.addFunctionDescriptor(functionDescriptor); JetScope functionInnerScope = FunctionDescriptorUtil.getFunctionInnerScope(context.scope, functionDescriptor, context.trace); context.getServices().checkFunctionReturnType(functionInnerScope, function, functionDescriptor, context.dataFlowInfo); diff --git a/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java b/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java index 932cdda3086..9a0534638b6 100644 --- a/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java +++ b/compiler/tests/org/jetbrains/jet/types/JetDefaultModalityModifiersTest.java @@ -74,7 +74,7 @@ public class JetDefaultModalityModifiersTest extends JetLiteFixture { List declarations = aClass.getDeclarations(); JetNamedFunction function = (JetNamedFunction) declarations.get(0); - FunctionDescriptorImpl functionDescriptor = descriptorResolver.resolveFunctionDescriptor(classDescriptor, scope, function); + NamedFunctionDescriptor functionDescriptor = descriptorResolver.resolveFunctionDescriptor(classDescriptor, scope, function); assertEquals(expectedFunctionModality, functionDescriptor.getModality()); } diff --git a/idea/src/org/jetbrains/jet/plugin/annotations/JetLineMarkerProvider.java b/idea/src/org/jetbrains/jet/plugin/annotations/JetLineMarkerProvider.java index 34c3e769c4e..8bf5236702c 100644 --- a/idea/src/org/jetbrains/jet/plugin/annotations/JetLineMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/annotations/JetLineMarkerProvider.java @@ -64,7 +64,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider { if (element instanceof JetNamedFunction) { JetNamedFunction jetFunction = (JetNamedFunction) element; - final FunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, jetFunction); + final NamedFunctionDescriptor functionDescriptor = bindingContext.get(BindingContext.FUNCTION, jetFunction); if (functionDescriptor == null) return null; final Set overriddenFunctions = functionDescriptor.getOverriddenDescriptors(); Icon icon = isMember(functionDescriptor) ? (overriddenFunctions.isEmpty() ? PlatformIcons.METHOD_ICON : OVERRIDING_FUNCTION) : PlatformIcons.FUNCTION_ICON; @@ -182,7 +182,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider { ); } - private boolean isMember(@NotNull FunctionDescriptor functionDescriptor) { + private boolean isMember(@NotNull NamedFunctionDescriptor functionDescriptor) { return functionDescriptor.getContainingDeclaration().getOriginal() instanceof ClassifierDescriptor; } diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java index ddc4aa1dfe4..f3c8838cae5 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/OverrideImplementMethodsHandler.java @@ -54,8 +54,8 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns } for (DescriptorClassMember selectedElement : selectedElements) { final DeclarationDescriptor descriptor = selectedElement.getDescriptor(); - if (descriptor instanceof FunctionDescriptor) { - JetElement target = overrideFunction(project, (FunctionDescriptor) descriptor); + if (descriptor instanceof NamedFunctionDescriptor) { + JetElement target = overrideFunction(project, (NamedFunctionDescriptor) descriptor); body.addBefore(target, body.getRBrace()); } else if (descriptor instanceof PropertyDescriptor) { @@ -84,7 +84,7 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns return JetPsiFactory.createProperty(project, bodyBuilder.toString()); } - private static JetElement overrideFunction(Project project, FunctionDescriptor descriptor) { + private static JetElement overrideFunction(Project project, NamedFunctionDescriptor descriptor) { StringBuilder bodyBuilder = new StringBuilder("override fun "); bodyBuilder.append(descriptor.getName()); bodyBuilder.append("(");