1e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver/*
2e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Copyright 2012, Google Inc.
3e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * All rights reserved.
4e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
5e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Redistribution and use in source and binary forms, with or without
6e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * modification, are permitted provided that the following conditions are
7e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * met:
8e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
9e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Redistributions of source code must retain the above copyright
10e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * notice, this list of conditions and the following disclaimer.
11e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Redistributions in binary form must reproduce the above
12e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * in the documentation and/or other materials provided with the
14e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * distribution.
15e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * contributors may be used to endorse or promote products derived from
17e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * this software without specific prior written permission.
18e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver *
19e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver */
31e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
32e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverpackage org.jf.dexlib2.immutable;
33e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
346926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruverimport com.google.common.collect.*;
35f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport org.jf.dexlib2.base.reference.BaseTypeReference;
36e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.Annotation;
37e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.ClassDef;
38e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.Field;
39e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.Method;
40ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruverimport org.jf.dexlib2.util.FieldUtil;
41ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruverimport org.jf.dexlib2.util.MethodUtil;
4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport org.jf.util.ImmutableConverter;
432d7e1111358e2b8cc951a46dc8b0217a7fa0deadBen Gruverimport org.jf.util.ImmutableUtils;
44e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
45e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nonnull;
46e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nullable;
470a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruverimport java.util.AbstractCollection;
4812b970ed4dfad768002335503e49c348ea0ed69bBen Gruverimport java.util.Collection;
490a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruverimport java.util.Iterator;
50c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Lightimport java.util.List;
51e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
52f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverpublic class ImmutableClassDef extends BaseTypeReference implements ClassDef {
5322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull protected final String type;
5422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    protected final int accessFlags;
5522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String superclass;
56c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light    @Nonnull protected final ImmutableList<String> interfaces;
5722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String sourceFile;
5822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
590a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> staticFields;
600a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> instanceFields;
610a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> directMethods;
620a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> virtualMethods;
63e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
64db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    public ImmutableClassDef(@Nonnull String type,
65e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             int accessFlags,
66e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String superclass,
6722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                             @Nullable Collection<String> interfaces,
68e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String sourceFile,
69c6e54994a7be1bdbdd751ede7c96e07e7fb1c84fBen Gruver                             @Nullable Collection<? extends Annotation> annotations,
70ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Iterable<? extends Field> fields,
71ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Iterable<? extends Method> methods) {
726926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        if (fields == null) {
736926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver            fields = ImmutableList.of();
746926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        }
756926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        if (methods == null) {
766926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver            methods = ImmutableList.of();
776926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        }
786926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver
79ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.type = type;
80ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.accessFlags = accessFlags;
81ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.superclass = superclass;
82c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light        this.interfaces = interfaces==null ? ImmutableList.<String>of() : ImmutableList.copyOf(interfaces);
83ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.sourceFile = sourceFile;
84ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
85ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.staticFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
86ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.instanceFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
87ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.directMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
88ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.virtualMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
89ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver    }
90ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver
91ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver    public ImmutableClassDef(@Nonnull String type,
92ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             int accessFlags,
93ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable String superclass,
94ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Collection<String> interfaces,
95ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable String sourceFile,
96ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Collection<? extends Annotation> annotations,
970a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Field> staticFields,
980a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Field> instanceFields,
990a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Method> directMethods,
1000a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Method> virtualMethods) {
101db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver        this.type = type;
102e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.accessFlags = accessFlags;
103e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.superclass = superclass;
104c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light        this.interfaces = interfaces==null ? ImmutableList.<String>of() : ImmutableList.copyOf(interfaces);
105e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.sourceFile = sourceFile;
10622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
1070a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.staticFields = ImmutableField.immutableSetOf(staticFields);
1080a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.instanceFields = ImmutableField.immutableSetOf(instanceFields);
1090a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.directMethods = ImmutableMethod.immutableSetOf(directMethods);
1100a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.virtualMethods = ImmutableMethod.immutableSetOf(virtualMethods);
111e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
112e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
113db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    public ImmutableClassDef(@Nonnull String type,
114e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             int accessFlags,
115e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String superclass,
116c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light                             @Nullable ImmutableList<String> interfaces,
117e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String sourceFile,
11822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                             @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
1190a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableField> staticFields,
1200a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableField> instanceFields,
1210a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> directMethods,
1220a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> virtualMethods) {
123db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver        this.type = type;
124e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.accessFlags = accessFlags;
125e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.superclass = superclass;
126c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light        this.interfaces = ImmutableUtils.nullToEmptyList(interfaces);
127e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.sourceFile = sourceFile;
12822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
1290a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.staticFields = ImmutableUtils.nullToEmptySortedSet(staticFields);
1300a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.instanceFields = ImmutableUtils.nullToEmptySortedSet(instanceFields);
1310a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.directMethods = ImmutableUtils.nullToEmptySortedSet(directMethods);
1320a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.virtualMethods = ImmutableUtils.nullToEmptySortedSet(virtualMethods);
133e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
134e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
135e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    public static ImmutableClassDef of(ClassDef classDef) {
136e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        if (classDef instanceof ImmutableClassDef) {
137e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver            return (ImmutableClassDef)classDef;
138e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        }
139e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        return new ImmutableClassDef(
140db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver                classDef.getType(),
141e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getAccessFlags(),
142e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getSuperclass(),
143e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getInterfaces(),
144e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getSourceFile(),
145e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getAnnotations(),
1460a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getStaticFields(),
1470a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getInstanceFields(),
1480a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getDirectMethods(),
1490a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getVirtualMethods());
150e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
151e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
152db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    @Nonnull @Override public String getType() { return type; }
153e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Override public int getAccessFlags() { return accessFlags; }
154e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Nullable @Override public String getSuperclass() { return superclass; }
155c456c55c40d0731edb9913fae73f16b9d94ac45bAlex Light    @Nonnull @Override public ImmutableList<String> getInterfaces() { return interfaces; }
156e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Nullable @Override public String getSourceFile() { return sourceFile; }
15722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; }
1580a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getStaticFields() { return staticFields; }
1590a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getInstanceFields() { return instanceFields; }
1600a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getDirectMethods() { return directMethods; }
1610a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getVirtualMethods() { return virtualMethods; }
1620a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1630a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull
1640a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Override
1650a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    public Collection<? extends ImmutableField> getFields() {
1660a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        return new AbstractCollection<ImmutableField>() {
1670a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Nonnull
1680a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override
1690a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            public Iterator<ImmutableField> iterator() {
1700a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return Iterators.concat(staticFields.iterator(), instanceFields.iterator());
1710a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1720a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1730a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override public int size() {
1740a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return staticFields.size() + instanceFields.size();
1750a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1760a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        };
1770a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    }
1780a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1790a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull
1800a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Override
1810a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    public Collection<? extends ImmutableMethod> getMethods() {
1820a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        return new AbstractCollection<ImmutableMethod>() {
1830a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Nonnull
1840a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override
1850a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            public Iterator<ImmutableMethod> iterator() {
1860a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return Iterators.concat(directMethods.iterator(), virtualMethods.iterator());
1870a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1880a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1890a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override public int size() {
1900a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return directMethods.size() + virtualMethods.size();
1910a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1920a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        };
1930a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    }
1948405133a40e68eeaeff38b64af23426662852618Ben Gruver
1958405133a40e68eeaeff38b64af23426662852618Ben Gruver    @Nonnull
19622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static ImmutableSet<ImmutableClassDef> immutableSetOf(@Nullable Iterable<? extends ClassDef> iterable) {
19722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return CONVERTER.toSet(iterable);
1988405133a40e68eeaeff38b64af23426662852618Ben Gruver    }
1998405133a40e68eeaeff38b64af23426662852618Ben Gruver
20022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    private static final ImmutableConverter<ImmutableClassDef, ClassDef> CONVERTER =
20122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            new ImmutableConverter<ImmutableClassDef, ClassDef>() {
2028405133a40e68eeaeff38b64af23426662852618Ben Gruver                @Override
203ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                protected boolean isImmutable(@Nonnull ClassDef item) {
2048405133a40e68eeaeff38b64af23426662852618Ben Gruver                    return item instanceof ImmutableClassDef;
2058405133a40e68eeaeff38b64af23426662852618Ben Gruver                }
2068405133a40e68eeaeff38b64af23426662852618Ben Gruver
207ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                @Nonnull
2088405133a40e68eeaeff38b64af23426662852618Ben Gruver                @Override
209ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                protected ImmutableClassDef makeImmutable(@Nonnull ClassDef item) {
2108405133a40e68eeaeff38b64af23426662852618Ben Gruver                    return ImmutableClassDef.of(item);
2118405133a40e68eeaeff38b64af23426662852618Ben Gruver                }
2128405133a40e68eeaeff38b64af23426662852618Ben Gruver            };
213e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver}
214