From e4fcb756a31f57ecdf9af4b985c01e07c02a1cb3 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 17 Mar 2011 17:50:39 +0300 Subject: [PATCH] Deep ErrorType implementation --- .../jetbrains/jet/lang/types/ErrorType.java | 70 ++++++++++++++++--- .../lang/types/FunctionDescriptorImpl.java | 3 +- .../jet/lang/types/JetTypeChecker.java | 3 + .../jet/lang/types/JetTypeInferrer.java | 4 +- 4 files changed, 69 insertions(+), 11 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/types/ErrorType.java b/idea/src/org/jetbrains/jet/lang/types/ErrorType.java index cb59e76d75e..893bff495ff 100644 --- a/idea/src/org/jetbrains/jet/lang/types/ErrorType.java +++ b/idea/src/org/jetbrains/jet/lang/types/ErrorType.java @@ -3,6 +3,8 @@ package org.jetbrains.jet.lang.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.resolve.JetScope; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -10,52 +12,104 @@ import java.util.List; * @author abreslav */ public class ErrorType { + + private static final ModuleDescriptor ERROR_MODULE = new ModuleDescriptor(""); private static final JetScope ERROR_SCOPE = new JetScope() { + @Override public ClassDescriptor getClass(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return ERROR_CLASS; } @Override public PropertyDescriptor getProperty(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return ERROR_PROPERTY; } @Override public ExtensionDescriptor getExtension(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return null; // TODO : review } @Override public NamespaceDescriptor getNamespace(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return null; // TODO : review } @Override public TypeParameterDescriptor getTypeParameter(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return null; // TODO : review } @NotNull @Override public JetType getThisType() { - throw new UnsupportedOperationException(); // TODO + return createErrorType(""); } @NotNull @Override public FunctionGroup getFunctionGroup(@NotNull String name) { - throw new UnsupportedOperationException(); // TODO + return ERROR_FUNCTION_GROUP; } @NotNull @Override public DeclarationDescriptor getContainingDeclaration() { - throw new UnsupportedOperationException(); // TODO + return ERROR_MODULE; } }; + private static final ClassDescriptor ERROR_CLASS = new ClassDescriptorImpl(ERROR_MODULE, Collections.emptyList(), "").initialize( + true, Collections.emptyList(), Collections.emptyList(), getErrorScope() + ); + + private static JetScope getErrorScope() { + return ERROR_SCOPE; + } + + private static final PropertyDescriptor ERROR_PROPERTY = new PropertyDescriptorImpl(ERROR_CLASS, Collections.emptyList(), "", createErrorType("")); + private static final FunctionGroup ERROR_FUNCTION_GROUP = new FunctionGroup() { + @NotNull + @Override + public String getName() { + return ""; + } + + @NotNull + @Override + public Collection getPossiblyApplicableFunctions(@NotNull List typeArguments, @NotNull List positionedValueArgumentTypes) { + FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(ERROR_CLASS, Collections.emptyList(), ""); + return Collections.singletonList(functionDescriptor.initialize( + Collections.emptyList(), + getValueParameters(functionDescriptor, positionedValueArgumentTypes), + createErrorType("") + )); + } + + private List getValueParameters(FunctionDescriptor functionDescriptor, List argumentTypes) { + List result = new ArrayList(); + for (int i = 0, argumentTypesSize = argumentTypes.size(); i < argumentTypesSize; i++) { + JetType argumentType = argumentTypes.get(i); + result.add(new ValueParameterDescriptorImpl( + functionDescriptor, + i, + Collections.emptyList(), + "", + createErrorType(""), + false, + false)); + } + return result; + } + + @Override + public boolean isEmpty() { + return false; + } + }; + private ErrorType() {} public static JetType createErrorType(String debugMessage) { diff --git a/idea/src/org/jetbrains/jet/lang/types/FunctionDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/types/FunctionDescriptorImpl.java index cf503725432..05c6e25af04 100644 --- a/idea/src/org/jetbrains/jet/lang/types/FunctionDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/types/FunctionDescriptorImpl.java @@ -32,13 +32,14 @@ public class FunctionDescriptorImpl extends DeclarationDescriptorImpl implements this.original = original; } - public final void initialize( + public final FunctionDescriptor initialize( @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @NotNull JetType unsubstitutedReturnType) { this.typeParameters = typeParameters; this.unsubstitutedValueParameters = unsubstitutedValueParameters; this.unsubstitutedReturnType = unsubstitutedReturnType; + return this; } @Override diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java index b46abb64ea2..347874d78e9 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeChecker.java @@ -303,6 +303,9 @@ public class JetTypeChecker { } public boolean isSubtypeOf(@NotNull JetType subtype, @NotNull JetType supertype) { + if (ErrorType.isErrorType(subtype) || ErrorType.isErrorType(supertype)) { + return true; + } if (!supertype.isNullable() && subtype.isNullable()) { return false; } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index d83c9628b67..398f52c49df 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -860,9 +860,9 @@ public class JetTypeInferrer { return resultType; } - private boolean isBoolean(@NotNull JetType resultType) { + private boolean isBoolean(@NotNull JetType type) { TypeConstructor booleanTypeConstructor = semanticServices.getStandardLibrary().getBoolean().getTypeConstructor(); - return resultType.getConstructor().equals(booleanTypeConstructor); + return type.getConstructor().equals(booleanTypeConstructor) || ErrorType.isErrorType(type); } @Override