From e6117be4d52e10e609152e2b1924f87b818c9f44 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 18 May 2011 21:23:17 +0400 Subject: [PATCH] Getting ready for receiver-functions: got rid of MutableFunctionDescriptor --- .../jet/lang/cfg/JetControlFlowProcessor.java | 1 + .../lang/descriptors/FunctionDescriptor.java | 4 ++++ .../descriptors/FunctionDescriptorImpl.java | 12 +---------- .../MutableFunctionDescriptor.java | 13 ------------ .../descriptors/PropertyGetterDescriptor.java | 13 +----------- .../descriptors/PropertySetterDescriptor.java | 11 +--------- .../lang/resolve/ClassDescriptorResolver.java | 8 +++++-- .../jet/lang/resolve/TopDownAnalyzer.java | 21 ++++--------------- 8 files changed, 18 insertions(+), 65 deletions(-) delete mode 100644 idea/src/org/jetbrains/jet/lang/descriptors/MutableFunctionDescriptor.java diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 9b821e77295..3b62afcb70a 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -666,6 +666,7 @@ public class JetControlFlowProcessor { builder.bindLabel(nextLabel); nextLabel = builder.createUnboundLabel(); } + // TODO : if there's else, no error can happen builder.jumpToError(null); builder.bindLabel(doneLabel); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java index cbbd9db4228..fec4fb5048c 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptor.java @@ -1,6 +1,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.TypeSubstitutor; @@ -15,6 +16,9 @@ public interface FunctionDescriptor extends DeclarationDescriptor { @NotNull DeclarationDescriptor getContainingDeclaration(); +// @Nullable +// JetType getReceiverType(); + @NotNull List getTypeParameters(); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java index c9e2bc1b0c2..5a0d13ddbe7 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/FunctionDescriptorImpl.java @@ -13,7 +13,7 @@ import java.util.Set; /** * @author abreslav */ -public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements MutableFunctionDescriptor { +public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements FunctionDescriptor { private List typeParameters; private List unsubstitutedValueParameters; @@ -59,16 +59,6 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements overriddenFunctions.add(overriddenFunction); } - @Override - public void setUnsubstitutedReturnType(@NotNull JetType unsubstitutedReturnType) { - this.unsubstitutedReturnType = unsubstitutedReturnType; - } - - @Override - public boolean isReturnTypeSet() { - return unsubstitutedReturnType != null; - } - @Override @NotNull public List getTypeParameters() { diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableFunctionDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableFunctionDescriptor.java deleted file mode 100644 index 093e50beb58..00000000000 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableFunctionDescriptor.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.jetbrains.jet.lang.descriptors; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.types.JetType; - -/** - * @author abreslav - */ -public interface MutableFunctionDescriptor extends FunctionDescriptor { - void setUnsubstitutedReturnType(@NotNull JetType type); - - boolean isReturnTypeSet(); -} diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java index 527c90c8a8b..faf9cf56240 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertyGetterDescriptor.java @@ -12,7 +12,7 @@ import java.util.Set; /** * @author abreslav */ -public class PropertyGetterDescriptor extends PropertyAccessorDescriptor implements MutableFunctionDescriptor { +public class PropertyGetterDescriptor extends PropertyAccessorDescriptor { private final Set overriddenGetters = Sets.newHashSet(); private JetType returnType; @@ -43,17 +43,6 @@ public class PropertyGetterDescriptor extends PropertyAccessorDescriptor impleme return returnType; } - @Override - public void setUnsubstitutedReturnType(@NotNull JetType type) { - assert this.returnType == null : this.returnType; - this.returnType = type; - } - - @Override - public boolean isReturnTypeSet() { - return returnType != null; - } - @Override public R accept(DeclarationDescriptorVisitor visitor, D data) { return visitor.visitPropertyGetterDescriptor(this, data); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java index 03b5af83753..19c4ca2f39d 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/PropertySetterDescriptor.java @@ -12,7 +12,7 @@ import java.util.Set; /** * @author abreslav */ -public class PropertySetterDescriptor extends PropertyAccessorDescriptor implements MutableFunctionDescriptor { +public class PropertySetterDescriptor extends PropertyAccessorDescriptor { private MutableValueParameterDescriptor parameter; private final Set overriddenSetters = Sets.newHashSet(); @@ -57,13 +57,4 @@ public class PropertySetterDescriptor extends PropertyAccessorDescriptor impleme return visitor.visitPropertySetterDescriptor(this, data); } - @Override - public void setUnsubstitutedReturnType(@NotNull JetType type) { - throw new UnsupportedOperationException("Can't set return type for a setter"); - } - - @Override - public boolean isReturnTypeSet() { - return true; - } } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 063407b16ce..db22ba28712 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -179,7 +179,7 @@ public class ClassDescriptorResolver { List valueParameterDescriptors = resolveValueParameters(functionDescriptor, innerScope, function.getValueParameters()); JetTypeReference returnTypeRef = function.getReturnTypeRef(); - JetType returnType = null; + JetType returnType; if (returnTypeRef != null) { returnType = typeResolver.resolveType(innerScope, returnTypeRef); } @@ -194,6 +194,10 @@ public class ClassDescriptorResolver { } }); } + else { + trace.getErrorHandler().genericError(function.asElement().getNode(), "This function must either declare a return type or have a body element"); + returnType = ErrorUtils.createErrorType("No type, no body"); + } } functionDescriptor.initialize( @@ -206,7 +210,7 @@ public class ClassDescriptorResolver { } @NotNull - private List resolveValueParameters(MutableFunctionDescriptor functionDescriptor, WritableScope parameterScope, List valueParameters) { + private List resolveValueParameters(FunctionDescriptor functionDescriptor, WritableScope parameterScope, List valueParameters) { List result = new ArrayList(); for (int i = 0, valueParametersSize = valueParameters.size(); i < valueParametersSize; i++) { JetParameter valueParameter = valueParameters.get(i); diff --git a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 23b74db5170..486677fcda6 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -664,7 +664,7 @@ public class TopDownAnalyzer { private void resolveFunctionBody( @NotNull BindingTrace trace, @NotNull JetDeclarationWithBody function, - @NotNull MutableFunctionDescriptor functionDescriptor, + @NotNull FunctionDescriptor functionDescriptor, @NotNull JetScope declaringScope) { JetExpression bodyExpression = function.getBodyExpression(); @@ -674,16 +674,7 @@ public class TopDownAnalyzer { assert readyToProcessExpressions : "Must be ready collecting types"; - if (functionDescriptor.isReturnTypeSet()) { - typeInferrer.checkFunctionReturnType(declaringScope, function, functionDescriptor); - } - else { - JetType returnType = typeInferrer.getFunctionReturnType(declaringScope, function, functionDescriptor); - if (returnType == null) { - returnType = ErrorUtils.createErrorType("Unable to infer body type"); - } - functionDescriptor.setUnsubstitutedReturnType(returnType); - } + typeInferrer.checkFunctionReturnType(declaringScope, function, functionDescriptor); List unreachableElements = new ArrayList(); flowInformationProvider.collectUnreachableExpressions(function.asElement(), unreachableElements); @@ -699,12 +690,8 @@ public class TopDownAnalyzer { trace.getErrorHandler().genericError(element.getNode(), "Unreachable code"); } } - else { - if (!functionDescriptor.isReturnTypeSet()) { - trace.getErrorHandler().genericError(function.asElement().getNode(), "This function must either declare a return type or have a body element"); - functionDescriptor.setUnsubstitutedReturnType(ErrorUtils.createErrorType("No type, no body")); - } - } + + assert functionDescriptor.getUnsubstitutedReturnType() != null; } }