001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.jet.lang.resolve.calls.inference;
018
019 import com.google.common.collect.Sets;
020 import org.jetbrains.annotations.NotNull;
021 import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
022 import org.jetbrains.jet.lang.types.JetType;
023 import org.jetbrains.jet.lang.types.Variance;
024
025 import java.util.Set;
026
027 public class TypeValue implements BoundsOwner {
028 private final Set<TypeValue> upperBounds = Sets.newLinkedHashSet();
029 private final Set<TypeValue> lowerBounds = Sets.newLinkedHashSet();
030
031 private final Variance positionVariance;
032 private final TypeParameterDescriptor typeParameterDescriptor; // Null for known types
033 private final JetType originalType;
034 private JetType value; // For an unknown - the value found by constraint resolution, for a known - just it's value
035
036 // Unknown type
037 public TypeValue(@NotNull TypeParameterDescriptor typeParameterDescriptor, @NotNull Variance positionVariance) {
038 this.positionVariance = positionVariance;
039 this.typeParameterDescriptor = typeParameterDescriptor;
040 this.originalType = typeParameterDescriptor.getDefaultType();
041 }
042
043 // Known type
044 public TypeValue(@NotNull JetType knownType) {
045 this.positionVariance = null;
046 this.typeParameterDescriptor = null;
047 this.originalType = knownType;
048 this.value = knownType;
049 }
050
051 public boolean isKnown() {
052 return typeParameterDescriptor == null;
053 }
054
055 public TypeParameterDescriptor getTypeParameterDescriptor() {
056 return typeParameterDescriptor;
057 }
058
059 @NotNull
060 public Variance getPositionVariance() {
061 return positionVariance;
062 }
063
064 @Override
065 @NotNull
066 public Set<TypeValue> getUpperBounds() {
067 return upperBounds;
068 }
069
070 @Override
071 @NotNull
072 public Set<TypeValue> getLowerBounds() {
073 return lowerBounds;
074 }
075
076 @NotNull
077 public JetType getType() {
078 return value;
079 }
080
081 @NotNull
082 public JetType getOriginalType() {
083 return originalType;
084 }
085
086 public void addUpperBound(@NotNull TypeValue bound) {
087 upperBounds.add(bound);
088 }
089
090 public void addLowerBound(@NotNull TypeValue bound) {
091 lowerBounds.add(bound);
092 }
093
094 public void setValue(@NotNull JetType value) {
095 this.value = value;
096 }
097
098 public boolean hasValue() {
099 return value != null;
100 }
101
102 @Override
103 public String toString() {
104 return isKnown() ? getType().toString() : (getTypeParameterDescriptor() + (hasValue() ? " |-> " + getType() : ""));
105 }
106 }