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 ExtendsWildcardType extends WildcardType {
17 
ExtendsWildcardType(TypeEnvironment environment)18 	protected ExtendsWildcardType(TypeEnvironment environment) {
19 		super(environment);
20 	}
21 
22 	@Override
getKind()23 	public int getKind() {
24 		return EXTENDS_WILDCARD_TYPE;
25 	}
26 
27 	@Override
getErasure()28 	public TType getErasure() {
29 		return fBound.getErasure();
30 	}
31 
32 	@Override
getSubTypes()33 	public TType[] getSubTypes() {
34 		return new TType[] { fBound };
35 	}
36 
37 	@Override
doCanAssignTo(TType lhs)38 	protected boolean doCanAssignTo(TType lhs) {
39 		switch (lhs.getKind()) {
40 			case ARRAY_TYPE:
41 			case STANDARD_TYPE:
42 			case PARAMETERIZED_TYPE:
43 			case RAW_TYPE:
44 				return getBound().canAssignTo(lhs);
45 
46 			case UNBOUND_WILDCARD_TYPE:
47 				return true;
48 			case SUPER_WILDCARD_TYPE:
49 			case EXTENDS_WILDCARD_TYPE:
50 				return ((WildcardType)lhs).checkAssignmentBound(getBound());
51 
52 			case TYPE_VARIABLE:
53 				return ((TypeVariable)lhs).checkAssignmentBound(getBound());
54 			case CAPTURE_TYPE:
55 				return ((CaptureType)lhs).checkLowerBound(this);
56 
57 			default:
58 				return false;
59 		}
60 	}
61 
62 	@Override
checkTypeArgument(TType rhs)63 	protected boolean checkTypeArgument(TType rhs) {
64 		switch(rhs.getKind()) {
65 			case ARRAY_TYPE:
66 			case STANDARD_TYPE:
67 			case PARAMETERIZED_TYPE:
68 				return rhs.canAssignTo(getBound());
69 			case RAW_TYPE:
70 				// unchecked conversion not allowed here; fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583
71 				return ! getBound().isParameterizedType() && rhs.canAssignTo(getBound());
72 
73 			case UNBOUND_WILDCARD_TYPE:
74 				return getBound().isJavaLangObject();
75 			case EXTENDS_WILDCARD_TYPE:
76 				return ((ExtendsWildcardType)rhs).getBound().canAssignTo(getBound());
77 			case SUPER_WILDCARD_TYPE:
78 				return getBound().isJavaLangObject();
79 
80 			case TYPE_VARIABLE:
81 				return rhs.canAssignTo(getBound());
82 
83 			case CAPTURE_TYPE:
84 				return checkTypeArgument(((CaptureType)rhs).getWildcard());
85 
86 			default:
87 				return false;
88 		}
89 	}
90 
91 	@Override
checkAssignmentBound(TType rhs)92 	protected boolean checkAssignmentBound(TType rhs) {
93 		// ? extends Number is a set of all subtyes of number and number.
94 		// so the only thing that can be assigned is null since null is
95 		// a sub type of everything
96 		return rhs.isNullType();
97 	}
98 
99 	@Override
getName()100 	public String getName() {
101 		return internalGetName("extends"); //$NON-NLS-1$
102 	}
103 
104 	@Override
getPlainPrettySignature()105 	protected String getPlainPrettySignature() {
106 		return internalGetPrettySignature("extends"); //$NON-NLS-1$
107 	}
108 }
109