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