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