PoolClassDef.java revision fbdc6cb9cbb0401d1212b0a8e7de661a1b2f7325
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2013, Google Inc.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All rights reserved.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Redistribution and use in source and binary forms, with or without
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * modification, are permitted provided that the following conditions are
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * met:
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *     * Redistributions of source code must retain the above copyright
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * notice, this list of conditions and the following disclaimer.
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *     * Redistributions in binary form must reproduce the above
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copyright notice, this list of conditions and the following disclaimer
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the documentation and/or other materials provided with the
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribution.
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *     * Neither the name of Google Inc. nor the names of its
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * contributors may be used to endorse or promote products derived from
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * this software without specific prior written permission.
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpackage org.jf.dexlib2.writer.pool;
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport com.google.common.collect.*;
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.base.reference.BaseTypeReference;
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.Annotation;
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.ClassDef;
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport org.jf.dexlib2.iface.Field;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport javax.annotation.Nonnull;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport javax.annotation.Nullable;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgimport java.util.*;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass PoolClassDef extends BaseTypeReference implements ClassDef {
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final ClassDef classDef;
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final TypeListPool.Key<SortedSet<String>> interfaces;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final ImmutableSortedSet<Field> staticFields;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final ImmutableSortedSet<Field> instanceFields;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final ImmutableSortedSet<PoolMethod> directMethods;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull final ImmutableSortedSet<PoolMethod> virtualMethods;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int classDefOffset = DexPool.NO_OFFSET;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int encodedArrayOffset = DexPool.NO_OFFSET;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int annotationDirectoryOffset = DexPool.NO_OFFSET;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PoolClassDef(@Nonnull ClassDef classDef) {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        this.classDef = classDef;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        interfaces = new TypeListPool.Key<SortedSet<String>>(ImmutableSortedSet.copyOf(classDef.getInterfaces()));
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        staticFields = ImmutableSortedSet.copyOf(classDef.getStaticFields());
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        instanceFields = ImmutableSortedSet.copyOf(classDef.getInstanceFields());
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        directMethods = ImmutableSortedSet.copyOf(
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                Iterables.transform(classDef.getDirectMethods(), PoolMethod.TRANSFORM));
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        virtualMethods = ImmutableSortedSet.copyOf(
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                Iterables.transform(classDef.getVirtualMethods(), PoolMethod.TRANSFORM));
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public String getType() {
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return classDef.getType();
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Override public int getAccessFlags() {
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return classDef.getAccessFlags();
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nullable @Override public String getSuperclass() {
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return classDef.getSuperclass();
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public SortedSet<String> getInterfaces() {
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return interfaces.types;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nullable @Override public String getSourceFile() {
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return classDef.getSourceFile();
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return classDef.getAnnotations();
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public SortedSet<Field> getStaticFields() {
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return staticFields;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public SortedSet<Field> getInstanceFields() {
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return instanceFields;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public Collection<Field> getFields() {
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return new AbstractCollection<Field>() {
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            @Nonnull @Override public Iterator<Field> iterator() {
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return Iterators.mergeSorted(
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        ImmutableList.of(staticFields.iterator(), instanceFields.iterator()),
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        Ordering.natural());
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            @Override public int size() {
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return staticFields.size() + instanceFields.size();
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        };
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public SortedSet<PoolMethod> getDirectMethods() {
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return directMethods;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public SortedSet<PoolMethod> getVirtualMethods() {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return virtualMethods;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    @Nonnull @Override public Collection<PoolMethod> getMethods() {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        return new AbstractCollection<PoolMethod>() {
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            @Nonnull @Override public Iterator<PoolMethod> iterator() {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return Iterators.mergeSorted(
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        ImmutableList.of(directMethods.iterator(), virtualMethods.iterator()),
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        Ordering.natural());
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            @Override public int size() {
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                return directMethods.size() + virtualMethods.size();
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        };
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    }
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org