11bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver/* 21bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Copyright 2013, Google Inc. 31bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * All rights reserved. 41bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * 51bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * Redistribution and use in source and binary forms, with or without 61bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * modification, are permitted provided that the following conditions are 71bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * met: 81bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * 91bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * * Redistributions of source code must retain the above copyright 101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * notice, this list of conditions and the following disclaimer. 111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * * Redistributions in binary form must reproduce the above 121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * copyright notice, this list of conditions and the following disclaimer 131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * in the documentation and/or other materials provided with the 141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * distribution. 151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * * Neither the name of Google Inc. nor the names of its 161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * contributors may be used to endorse or promote products derived from 171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * this software without specific prior written permission. 181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * 191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 221bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver */ 311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverpackage org.jf.dexlib2.writer.pool; 331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport com.google.common.collect.*; 351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.base.reference.BaseTypeReference; 361bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.Annotation; 371bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.ClassDef; 381bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport org.jf.dexlib2.iface.Field; 391bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 401bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport javax.annotation.Nonnull; 411bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport javax.annotation.Nullable; 421bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverimport java.util.*; 431bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 441bf6f2324541df184689fdb2c0d8188af5221784Ben Gruverclass PoolClassDef extends BaseTypeReference implements ClassDef { 451bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final ClassDef classDef; 461bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final TypeListPool.Key<SortedSet<String>> interfaces; 471bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final ImmutableSortedSet<Field> staticFields; 481bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final ImmutableSortedSet<Field> instanceFields; 491bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final ImmutableSortedSet<PoolMethod> directMethods; 501bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull final ImmutableSortedSet<PoolMethod> virtualMethods; 511bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 52f1f00f9f6ecf9eb088ad9777ab1419705a852562Ben Gruver int classDefIndex = DexPool.NO_INDEX; 53242dd62a714d5d114b35437b5f39a5b2e107dcfeBen Gruver int encodedArrayOffset = DexPool.NO_OFFSET; 541bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver int annotationDirectoryOffset = DexPool.NO_OFFSET; 551bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 561bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver PoolClassDef(@Nonnull ClassDef classDef) { 571bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver this.classDef = classDef; 581bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 591bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver interfaces = new TypeListPool.Key<SortedSet<String>>(ImmutableSortedSet.copyOf(classDef.getInterfaces())); 601bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver staticFields = ImmutableSortedSet.copyOf(classDef.getStaticFields()); 611bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver instanceFields = ImmutableSortedSet.copyOf(classDef.getInstanceFields()); 621bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver directMethods = ImmutableSortedSet.copyOf( 631bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver Iterables.transform(classDef.getDirectMethods(), PoolMethod.TRANSFORM)); 641bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver virtualMethods = ImmutableSortedSet.copyOf( 651bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver Iterables.transform(classDef.getVirtualMethods(), PoolMethod.TRANSFORM)); 661bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 671bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 681bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public String getType() { 691bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return classDef.getType(); 701bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 711bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 721bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Override public int getAccessFlags() { 731bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return classDef.getAccessFlags(); 741bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 751bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 761bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nullable @Override public String getSuperclass() { 771bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return classDef.getSuperclass(); 781bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 791bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 801bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public SortedSet<String> getInterfaces() { 811bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return interfaces.types; 821bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 831bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 841bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nullable @Override public String getSourceFile() { 851bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return classDef.getSourceFile(); 861bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 871bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 881bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public Set<? extends Annotation> getAnnotations() { 891bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return classDef.getAnnotations(); 901bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 911bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 921bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public SortedSet<Field> getStaticFields() { 931bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return staticFields; 941bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 951bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 961bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public SortedSet<Field> getInstanceFields() { 971bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return instanceFields; 981bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 991bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 1001bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public Collection<Field> getFields() { 1011bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return new AbstractCollection<Field>() { 1021bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public Iterator<Field> iterator() { 1031bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return Iterators.mergeSorted( 1041bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver ImmutableList.of(staticFields.iterator(), instanceFields.iterator()), 1051bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver Ordering.natural()); 1061bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1071bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 1081bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Override public int size() { 1091bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return staticFields.size() + instanceFields.size(); 1101bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1111bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver }; 1121bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1131bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 1141bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public SortedSet<PoolMethod> getDirectMethods() { 1151bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return directMethods; 1161bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1171bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 1181bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public SortedSet<PoolMethod> getVirtualMethods() { 1191bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return virtualMethods; 1201bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1211bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 122fbdc6cb9cbb0401d1212b0a8e7de661a1b2f7325Ben Gruver @Nonnull @Override public Collection<PoolMethod> getMethods() { 1231bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return new AbstractCollection<PoolMethod>() { 1241bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Nonnull @Override public Iterator<PoolMethod> iterator() { 1251bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return Iterators.mergeSorted( 1261bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver ImmutableList.of(directMethods.iterator(), virtualMethods.iterator()), 1271bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver Ordering.natural()); 1281bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1291bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver 1301bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver @Override public int size() { 1311bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver return directMethods.size() + virtualMethods.size(); 1321bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1331bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver }; 1341bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver } 1351bf6f2324541df184689fdb2c0d8188af5221784Ben Gruver} 136