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;
50e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
51f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverpublic class ImmutableClassDef extends BaseTypeReference implements ClassDef {
5222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull protected final String type;
5322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    protected final int accessFlags;
5422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String superclass;
5522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull protected final ImmutableSet<String> interfaces;
5622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nullable protected final String sourceFile;
5722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations;
580a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> staticFields;
590a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableField> instanceFields;
600a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> directMethods;
610a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull protected final ImmutableSortedSet<? extends ImmutableMethod> virtualMethods;
62e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
63db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    public ImmutableClassDef(@Nonnull String type,
64e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             int accessFlags,
65e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String superclass,
6622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                             @Nullable Collection<String> interfaces,
67e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String sourceFile,
68c6e54994a7be1bdbdd751ede7c96e07e7fb1c84fBen Gruver                             @Nullable Collection<? extends Annotation> annotations,
69ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Iterable<? extends Field> fields,
70ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Iterable<? extends Method> methods) {
716926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        if (fields == null) {
726926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver            fields = ImmutableList.of();
736926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        }
746926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        if (methods == null) {
756926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver            methods = ImmutableList.of();
766926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver        }
776926ece0cd35d0b34ca66db6f64fdb45e2fac544Ben Gruver
78ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.type = type;
79ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.accessFlags = accessFlags;
80ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.superclass = superclass;
81ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.interfaces = interfaces==null ? ImmutableSet.<String>of() : ImmutableSet.copyOf(interfaces);
82ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.sourceFile = sourceFile;
83ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
84ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.staticFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
85ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.instanceFields = ImmutableField.immutableSetOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
86ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.directMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
87ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver        this.virtualMethods = ImmutableMethod.immutableSetOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
88ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver    }
89ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver
90ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver    public ImmutableClassDef(@Nonnull String type,
91ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             int accessFlags,
92ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable String superclass,
93ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Collection<String> interfaces,
94ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable String sourceFile,
95ddf18a996e841e82d57a44de5ea95332e0ee8936Ben Gruver                             @Nullable Collection<? extends Annotation> annotations,
960a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Field> staticFields,
970a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Field> instanceFields,
980a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Method> directMethods,
990a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable Iterable<? extends Method> virtualMethods) {
100db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver        this.type = type;
101e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.accessFlags = accessFlags;
102e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.superclass = superclass;
10322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.interfaces = interfaces==null ? ImmutableSet.<String>of() : ImmutableSet.copyOf(interfaces);
104e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.sourceFile = sourceFile;
10522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.annotations = ImmutableAnnotation.immutableSetOf(annotations);
1060a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.staticFields = ImmutableField.immutableSetOf(staticFields);
1070a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.instanceFields = ImmutableField.immutableSetOf(instanceFields);
1080a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.directMethods = ImmutableMethod.immutableSetOf(directMethods);
1090a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.virtualMethods = ImmutableMethod.immutableSetOf(virtualMethods);
110e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
111e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
112db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    public ImmutableClassDef(@Nonnull String type,
113e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             int accessFlags,
114e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String superclass,
11522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                             @Nullable ImmutableSet<String> interfaces,
116e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                             @Nullable String sourceFile,
11722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver                             @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations,
1180a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableField> staticFields,
1190a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableField> instanceFields,
1200a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> directMethods,
1210a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                             @Nullable ImmutableSortedSet<? extends ImmutableMethod> virtualMethods) {
122db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver        this.type = type;
123e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.accessFlags = accessFlags;
124e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.superclass = superclass;
12522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.interfaces = ImmutableUtils.nullToEmptySet(interfaces);
126e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        this.sourceFile = sourceFile;
12722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        this.annotations = ImmutableUtils.nullToEmptySet(annotations);
1280a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.staticFields = ImmutableUtils.nullToEmptySortedSet(staticFields);
1290a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.instanceFields = ImmutableUtils.nullToEmptySortedSet(instanceFields);
1300a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.directMethods = ImmutableUtils.nullToEmptySortedSet(directMethods);
1310a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        this.virtualMethods = ImmutableUtils.nullToEmptySortedSet(virtualMethods);
132e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
133e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
134e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    public static ImmutableClassDef of(ClassDef classDef) {
135e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        if (classDef instanceof ImmutableClassDef) {
136e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver            return (ImmutableClassDef)classDef;
137e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        }
138e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver        return new ImmutableClassDef(
139db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver                classDef.getType(),
140e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getAccessFlags(),
141e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getSuperclass(),
142e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getInterfaces(),
143e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getSourceFile(),
144e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver                classDef.getAnnotations(),
1450a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getStaticFields(),
1460a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getInstanceFields(),
1470a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getDirectMethods(),
1480a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                classDef.getVirtualMethods());
149e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    }
150e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver
151db389aa3a1d898d3a452f3f0b2220b334b23cb4cBen Gruver    @Nonnull @Override public String getType() { return type; }
152e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Override public int getAccessFlags() { return accessFlags; }
153e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Nullable @Override public String getSuperclass() { return superclass; }
15422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull @Override public ImmutableSet<String> getInterfaces() { return interfaces; }
155e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver    @Nullable @Override public String getSourceFile() { return sourceFile; }
15622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; }
1570a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getStaticFields() { return staticFields; }
1580a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableField> getInstanceFields() { return instanceFields; }
1590a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getDirectMethods() { return directMethods; }
1600a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull @Override public ImmutableSet<? extends ImmutableMethod> getVirtualMethods() { return virtualMethods; }
1610a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1620a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull
1630a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Override
1640a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    public Collection<? extends ImmutableField> getFields() {
1650a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        return new AbstractCollection<ImmutableField>() {
1660a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Nonnull
1670a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override
1680a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            public Iterator<ImmutableField> iterator() {
1690a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return Iterators.concat(staticFields.iterator(), instanceFields.iterator());
1700a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1710a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1720a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override public int size() {
1730a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return staticFields.size() + instanceFields.size();
1740a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1750a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        };
1760a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    }
1770a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1780a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Nonnull
1790a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    @Override
1800a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    public Collection<? extends ImmutableMethod> getMethods() {
1810a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        return new AbstractCollection<ImmutableMethod>() {
1820a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Nonnull
1830a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override
1840a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            public Iterator<ImmutableMethod> iterator() {
1850a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return Iterators.concat(directMethods.iterator(), virtualMethods.iterator());
1860a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1870a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver
1880a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            @Override public int size() {
1890a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver                return directMethods.size() + virtualMethods.size();
1900a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver            }
1910a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver        };
1920a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver    }
1938405133a40e68eeaeff38b64af23426662852618Ben Gruver
1948405133a40e68eeaeff38b64af23426662852618Ben Gruver    @Nonnull
19522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    public static ImmutableSet<ImmutableClassDef> immutableSetOf(@Nullable Iterable<? extends ClassDef> iterable) {
19622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver        return CONVERTER.toSet(iterable);
1978405133a40e68eeaeff38b64af23426662852618Ben Gruver    }
1988405133a40e68eeaeff38b64af23426662852618Ben Gruver
19922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver    private static final ImmutableConverter<ImmutableClassDef, ClassDef> CONVERTER =
20022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver            new ImmutableConverter<ImmutableClassDef, ClassDef>() {
2018405133a40e68eeaeff38b64af23426662852618Ben Gruver                @Override
202ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                protected boolean isImmutable(@Nonnull ClassDef item) {
2038405133a40e68eeaeff38b64af23426662852618Ben Gruver                    return item instanceof ImmutableClassDef;
2048405133a40e68eeaeff38b64af23426662852618Ben Gruver                }
2058405133a40e68eeaeff38b64af23426662852618Ben Gruver
206ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                @Nonnull
2078405133a40e68eeaeff38b64af23426662852618Ben Gruver                @Override
208ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver                protected ImmutableClassDef makeImmutable(@Nonnull ClassDef item) {
2098405133a40e68eeaeff38b64af23426662852618Ben Gruver                    return ImmutableClassDef.of(item);
2108405133a40e68eeaeff38b64af23426662852618Ben Gruver                }
2118405133a40e68eeaeff38b64af23426662852618Ben Gruver            };
212e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver}
213