Common logic extracted from lazy type implementations
This commit is contained in:
+1
-25
@@ -28,7 +28,6 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
|
||||||
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValue;
|
import org.jetbrains.jet.storage.NotNullLazyValue;
|
||||||
import org.jetbrains.jet.storage.StorageManager;
|
import org.jetbrains.jet.storage.StorageManager;
|
||||||
@@ -198,7 +197,7 @@ public class TypeDeserializer {
|
|||||||
return debugName;
|
return debugName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DeserializedType implements JetType {
|
private class DeserializedType extends AbstractJetType {
|
||||||
private final ProtoBuf.Type typeProto;
|
private final ProtoBuf.Type typeProto;
|
||||||
private final NotNullLazyValue<TypeConstructor> constructor;
|
private final NotNullLazyValue<TypeConstructor> constructor;
|
||||||
private final List<TypeProjection> arguments;
|
private final List<TypeProjection> arguments;
|
||||||
@@ -265,28 +264,5 @@ public class TypeDeserializer {
|
|||||||
public List<AnnotationDescriptor> getAnnotations() {
|
public List<AnnotationDescriptor> getAnnotations() {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return TypeUtils.toString(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (!(o instanceof JetType)) return false;
|
|
||||||
|
|
||||||
JetType type = (JetType) o;
|
|
||||||
|
|
||||||
return isNullable() == type.isNullable() && JetTypeChecker.INSTANCE.equalTypes(this, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = getConstructor().hashCode();
|
|
||||||
result = 31 * result + getArguments().hashCode();
|
|
||||||
result = 31 * result + (isNullable() ? 1 : 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2013 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.lang.types;
|
||||||
|
|
||||||
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class AbstractJetType implements JetType {
|
||||||
|
@Override
|
||||||
|
public final int hashCode() {
|
||||||
|
int result = getConstructor().hashCode();
|
||||||
|
result = 31 * result + getArguments().hashCode();
|
||||||
|
result = 31 * result + (isNullable() ? 1 : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean equals(Object obj) {
|
||||||
|
if (this == obj) return true;
|
||||||
|
if (!(obj instanceof JetType)) return false;
|
||||||
|
|
||||||
|
JetType type = (JetType) obj;
|
||||||
|
|
||||||
|
return isNullable() == type.isNullable() && JetTypeChecker.INSTANCE.equalTypes(this, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final String toString() {
|
||||||
|
List<TypeProjection> arguments = getArguments();
|
||||||
|
return getConstructor() + (arguments.isEmpty() ? "" : "<" + argumentsToString(arguments) + ">") + (isNullable() ? "?" : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static StringBuilder argumentsToString(List<TypeProjection> arguments) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
for (Iterator<TypeProjection> iterator = arguments.iterator(); iterator.hasNext();) {
|
||||||
|
TypeProjection argument = iterator.next();
|
||||||
|
stringBuilder.append(argument);
|
||||||
|
if (iterator.hasNext()) {
|
||||||
|
stringBuilder.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stringBuilder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,23 +18,22 @@ package org.jetbrains.jet.lang.types;
|
|||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotatedImpl;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public final class JetTypeImpl extends AnnotatedImpl implements JetType {
|
public final class JetTypeImpl extends AbstractJetType {
|
||||||
|
|
||||||
private final TypeConstructor constructor;
|
private final TypeConstructor constructor;
|
||||||
private final List<? extends TypeProjection> arguments;
|
private final List<? extends TypeProjection> arguments;
|
||||||
private final boolean nullable;
|
private final boolean nullable;
|
||||||
private final JetScope memberScope;
|
private final JetScope memberScope;
|
||||||
|
private final List<AnnotationDescriptor> annotations;
|
||||||
|
|
||||||
public JetTypeImpl(List<AnnotationDescriptor> annotations, TypeConstructor constructor, boolean nullable, @NotNull List<? extends TypeProjection> arguments, JetScope memberScope) {
|
public JetTypeImpl(List<AnnotationDescriptor> annotations, TypeConstructor constructor, boolean nullable, @NotNull List<? extends TypeProjection> arguments, JetScope memberScope) {
|
||||||
super(annotations);
|
this.annotations = annotations;
|
||||||
|
|
||||||
if (memberScope instanceof ErrorUtils.ErrorScope) {
|
if (memberScope instanceof ErrorUtils.ErrorScope) {
|
||||||
throw new IllegalStateException("JetTypeImpl should not be created for error type: " + memberScope + "\n" + constructor);
|
throw new IllegalStateException("JetTypeImpl should not be created for error type: " + memberScope + "\n" + constructor);
|
||||||
@@ -58,6 +57,11 @@ public final class JetTypeImpl extends AnnotatedImpl implements JetType {
|
|||||||
classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList()));
|
classDescriptor.getMemberScope(Collections.<TypeProjection>emptyList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<AnnotationDescriptor> getAnnotations() {
|
||||||
|
return annotations;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public TypeConstructor getConstructor() {
|
public TypeConstructor getConstructor() {
|
||||||
@@ -86,27 +90,4 @@ public final class JetTypeImpl extends AnnotatedImpl implements JetType {
|
|||||||
public boolean isError() {
|
public boolean isError() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return TypeUtils.toString(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (!(o instanceof JetType)) return false;
|
|
||||||
|
|
||||||
JetType type = (JetType) o;
|
|
||||||
|
|
||||||
return nullable == type.isNullable() && JetTypeChecker.INSTANCE.equalTypes(this, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = constructor.hashCode();
|
|
||||||
result = 31 * result + arguments.hashCode();
|
|
||||||
result = 31 * result + (nullable ? 1 : 0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import com.intellij.util.Processor;
|
|||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.ReadOnly;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
@@ -221,24 +220,6 @@ public class TypeUtils {
|
|||||||
new ChainedScope(null, scopes)); // TODO : check intersectibility, don't use a chanied scope
|
new ChainedScope(null, scopes)); // TODO : check intersectibility, don't use a chanied scope
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static String toString(@NotNull JetType type) {
|
|
||||||
List<TypeProjection> arguments = type.getArguments();
|
|
||||||
return type.getConstructor() + (arguments.isEmpty() ? "" : "<" + argumentsToString(arguments) + ">") + (type.isNullable() ? "?" : "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static StringBuilder argumentsToString(List<TypeProjection> arguments) {
|
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
|
||||||
for (Iterator<TypeProjection> iterator = arguments.iterator(); iterator.hasNext();) {
|
|
||||||
TypeProjection argument = iterator.next();
|
|
||||||
stringBuilder.append(argument);
|
|
||||||
if (iterator.hasNext()) {
|
|
||||||
stringBuilder.append(", ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return stringBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class TypeUnifier {
|
private static class TypeUnifier {
|
||||||
private static class TypeParameterUsage {
|
private static class TypeParameterUsage {
|
||||||
private final TypeParameterDescriptor typeParameterDescriptor;
|
private final TypeParameterDescriptor typeParameterDescriptor;
|
||||||
@@ -742,7 +723,7 @@ public class TypeUtils {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static abstract class AbstractTypeWithKnownNullability implements JetType {
|
private static abstract class AbstractTypeWithKnownNullability extends AbstractJetType {
|
||||||
private final JetType delegate;
|
private final JetType delegate;
|
||||||
|
|
||||||
private AbstractTypeWithKnownNullability(@NotNull JetType delegate) {
|
private AbstractTypeWithKnownNullability(@NotNull JetType delegate) {
|
||||||
@@ -757,7 +738,6 @@ public class TypeUtils {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
@ReadOnly
|
|
||||||
public List<TypeProjection> getArguments() {
|
public List<TypeProjection> getArguments() {
|
||||||
return delegate.getArguments();
|
return delegate.getArguments();
|
||||||
}
|
}
|
||||||
@@ -781,21 +761,6 @@ public class TypeUtils {
|
|||||||
public List<AnnotationDescriptor> getAnnotations() {
|
public List<AnnotationDescriptor> getAnnotations() {
|
||||||
return delegate.getAnnotations();
|
return delegate.getAnnotations();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object other) {
|
|
||||||
return TypeUtils.equals(this, other);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return TypeUtils.hashCode(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return TypeUtils.toString(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class NullableType extends AbstractTypeWithKnownNullability {
|
private static class NullableType extends AbstractTypeWithKnownNullability {
|
||||||
|
|||||||
Reference in New Issue
Block a user