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