001: /*
002: * Copyright 2007 Google Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License. You may obtain a copy of
006: * 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, WITHOUT
012: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013: * License for the specific language governing permissions and limitations under
014: * the License.
015: */
016: package com.google.gwt.core.ext.typeinfo;
017:
018: /**
019: * Represents a wildcard type argument to a parameterized type.
020: */
021: public class JWildcardType extends JDelegatingClassType implements
022: HasBounds {
023: private final JBound bounds;
024:
025: public JWildcardType(JBound bounds) {
026: super .setBaseType(bounds.getFirstBound());
027: this .bounds = bounds;
028: }
029:
030: @Override
031: public JField findField(String name) {
032: return getBaseType().findField(name);
033: }
034:
035: @Override
036: public JMethod findMethod(String name, JType[] paramTypes) {
037: return getBaseType().findMethod(name, paramTypes);
038: }
039:
040: public JBound getBounds() {
041: return bounds;
042: }
043:
044: @Override
045: public JField getField(String name) {
046: return getBaseType().getField(name);
047: }
048:
049: @Override
050: public JField[] getFields() {
051: return getBaseType().getFields();
052: }
053:
054: public JClassType getFirstBound() {
055: return getBounds().getFirstBound();
056: }
057:
058: @Override
059: public JMethod getMethod(String name, JType[] paramTypes)
060: throws NotFoundException {
061: return getBaseType().getMethod(name, paramTypes);
062: }
063:
064: @Override
065: public JMethod[] getMethods() {
066: return getBaseType().getMethods();
067: }
068:
069: @Override
070: public String getQualifiedSourceName() {
071: return "?" + bounds.getQualifiedSourceName();
072: }
073:
074: @Override
075: public String getSimpleSourceName() {
076: return "?" + bounds.getSimpleSourceName();
077: }
078:
079: @Override
080: public JClassType[] getSubtypes() {
081: return bounds.getSubtypes();
082: }
083:
084: @Override
085: public boolean isAssignableFrom(JClassType otherType) {
086: if (otherType == this ) {
087: return true;
088: }
089:
090: return getBounds().isAssignableFrom(otherType);
091: }
092:
093: @Override
094: public boolean isAssignableTo(JClassType otherType) {
095: if (otherType == this ) {
096: return true;
097: }
098:
099: return getBounds().isAssignableTo(otherType);
100: }
101:
102: @Override
103: public JGenericType isGenericType() {
104: return null;
105: }
106:
107: @Override
108: public JParameterizedType isParameterized() {
109: return null;
110: }
111:
112: @Override
113: public JRawType isRawType() {
114: return null;
115: }
116:
117: @Override
118: public JWildcardType isWildcard() {
119: return this ;
120: }
121:
122: @Override
123: JClassType getSubstitutedType(JParameterizedType parameterizedType) {
124: JClassType[] currentBounds = bounds.getBounds();
125: JClassType[] newBounds = new JClassType[currentBounds.length];
126: for (int i = 0; i < currentBounds.length; ++i) {
127: newBounds[i] = currentBounds[i]
128: .getSubstitutedType(parameterizedType);
129: }
130:
131: JBound newBound = bounds.isLowerBound() != null ? new JLowerBound(
132: newBounds)
133: : new JUpperBound(newBounds);
134: return getOracle().getWildcardType(newBound);
135: }
136:
137: /**
138: * Returns <code>true</code> if this instance has the same bounds that are
139: * requested.
140: *
141: * @param otherBounds
142: * @return <code>true</code> if this instance has the same bounds that are
143: * requested
144: */
145: boolean hasBounds(JBound otherBounds) {
146: if ((bounds.isUpperBound() != null && otherBounds
147: .isLowerBound() != null)
148: || (bounds.isLowerBound() != null && otherBounds
149: .isUpperBound() != null)) {
150: return false;
151: }
152:
153: JClassType[] boundTypes = bounds.getBounds();
154: JClassType[] otherBoundTypes = otherBounds.getBounds();
155:
156: if (boundTypes.length != otherBoundTypes.length) {
157: return false;
158: }
159:
160: for (int i = 0; i < boundTypes.length; ++i) {
161: if (boundTypes[i] != otherBoundTypes[i]) {
162: return false;
163: }
164: }
165: return true;
166: }
167: }
|