1e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom/* 2e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Copyright (C) 2008 The Android Open Source Project 3e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 4e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * you may not use this file except in compliance with the License. 6e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * You may obtain a copy of the License at 7e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 8e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * 10e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 11e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * See the License for the specific language governing permissions and 14e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom * limitations under the License. 15e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom */ 16e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 17e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrompackage libcore.reflect; 18e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 19e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstromimport java.lang.reflect.Type; 20e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstromimport java.util.ArrayList; 21e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstromimport java.util.List; 22d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogersimport libcore.util.EmptyArray; 23e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 24e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrompublic final class ListOfTypes { 25e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom public static final ListOfTypes EMPTY = new ListOfTypes(0); 26e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 27e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom private final ArrayList<Type> types; 28e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom private Type[] resolvedTypes; 29e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 30e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom ListOfTypes(int capacity) { 31e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom types = new ArrayList<Type>(capacity); 32e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 33e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 34e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom ListOfTypes(Type[] types) { 35e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom this.types = new ArrayList<Type>(types.length); 36e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom for (Type type : types) { 37e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom this.types.add(type); 38e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 39e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 40e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 41e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom void add(Type type) { 42e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom if (type == null) { 43e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom throw new NullPointerException("type == null"); 44e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 45e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom types.add(type); 46e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 47e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 48e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom int length() { 49e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return types.size(); 50e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 51e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 52e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom public Type[] getResolvedTypes() { 53e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom Type[] result = resolvedTypes; 54d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers if (result == null) { 55d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers result = resolveTypes(types); 56d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers resolvedTypes = result; 57d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers } 58d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers return result; 59e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 60e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 61e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom private Type[] resolveTypes(List<Type> unresolved) { 62d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers int size = unresolved.size(); 63d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers if (size == 0) { 64d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers return EmptyArray.TYPE; 65d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers } 66d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers Type[] result = new Type[size]; 67d4ec55c4e1acc3c3df937facbd367aff6618536cIan Rogers for (int i = 0; i < size; i++) { 68e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom Type type = unresolved.get(i); 69e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom try { 70e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom result[i] = ((ParameterizedTypeImpl) type).getResolvedType(); 71e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } catch (ClassCastException e) { 72e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom result[i] = type; 73e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 74e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 75e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return result; 76e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 77e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom 78e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom @Override public String toString() { 79e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom StringBuilder result = new StringBuilder(); 80e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom for (int i = 0; i < types.size(); i++) { 81e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom if (i > 0) { 82e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom result.append(", "); 83e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 84e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom result.append(types.get(i)); 85e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 86e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom return result.toString(); 87e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom } 88e96f94f57430bf3060581c816cc3a148adbe91a4Brian Carlstrom} 89