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