1 /*******************************************************************************
2  * Copyright (c) 2000, 2016 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types;
15 
16 public final class SuperWildcardType extends WildcardType {
17 
SuperWildcardType(TypeEnvironment environment)18 	protected SuperWildcardType(TypeEnvironment environment) {
19 		super(environment);
20 	}
21 
22 	@Override
getErasure()23 	public TType getErasure() {
24 		return getEnvironment().getJavaLangObject();
25 	}
26 
27 	@Override
getKind()28 	public int getKind() {
29 		return SUPER_WILDCARD_TYPE;
30 	}
31 
32 	@Override
doCanAssignTo(TType lhs)33 	protected boolean doCanAssignTo(TType lhs) {
34 		switch(lhs.getKind()) {
35 			case STANDARD_TYPE:
36 				return ((StandardType)lhs).isJavaLangObject();
37 			case UNBOUND_WILDCARD_TYPE:
38 				return true;
39 			case EXTENDS_WILDCARD_TYPE:
40 				return ((ExtendsWildcardType)lhs).getBound().isJavaLangObject();
41 			case SUPER_WILDCARD_TYPE:
42 				return ((SuperWildcardType)lhs).getBound().canAssignTo(this.getBound());
43 			case TYPE_VARIABLE:
44 				return ((TypeVariable)lhs).isUnbounded();
45 			case CAPTURE_TYPE:
46 				return ((CaptureType)lhs).checkLowerBound(this);
47 
48 			default:
49 				return false;
50 		}
51 	}
52 
53 	@Override
checkTypeArgument(TType rhs)54 	protected boolean checkTypeArgument(TType rhs) {
55 		switch(rhs.getKind()) {
56 			case ARRAY_TYPE:
57 			case STANDARD_TYPE:
58 			case PARAMETERIZED_TYPE:
59 			case RAW_TYPE:
60 				return getBound().canAssignTo(rhs);
61 
62 			case UNBOUND_WILDCARD_TYPE:
63 				return false;
64 			case EXTENDS_WILDCARD_TYPE:
65 				return false;
66 			case SUPER_WILDCARD_TYPE:
67 				return getBound().canAssignTo(((SuperWildcardType)rhs).getBound());
68 
69 			case TYPE_VARIABLE:
70 				return getBound().canAssignTo(rhs);
71 
72 			case CAPTURE_TYPE:
73 				return checkTypeArgument(((CaptureType)rhs).getWildcard());
74 
75 			default:
76 				return false;
77 		}
78 	}
79 
80 	@Override
checkAssignmentBound(TType rhs)81 	protected boolean checkAssignmentBound(TType rhs) {
82 		// ? super Number is a set of all super types of number including
83 		// Number. So I can only assign objects which are a subtype of
84 		// Number.
85 		return rhs.canAssignTo(getBound());
86 	}
87 
88 	@Override
getName()89 	public String getName() {
90 		return internalGetName("super"); //$NON-NLS-1$
91 	}
92 
93 	@Override
getPlainPrettySignature()94 	protected String getPlainPrettySignature() {
95 		return internalGetPrettySignature("super"); //$NON-NLS-1$
96 	}
97 }
98