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 3422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport com.google.common.collect.ImmutableSet; 350a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruverimport com.google.common.collect.ImmutableSortedSet; 360a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruverimport com.google.common.collect.Ordering; 37f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport org.jf.dexlib2.base.reference.BaseFieldReference; 38e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.Annotation; 39e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.Field; 40e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.iface.value.EncodedValue; 41f4662586da3c902c3a0ed21a174b814e248c7fb8Ben Gruverimport org.jf.dexlib2.immutable.value.ImmutableEncodedValue; 42b76e75c8bcc11d1e3f348166e2e9f83085154fc8Ben Gruverimport org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory; 4322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport org.jf.util.ImmutableConverter; 442d7e1111358e2b8cc951a46dc8b0217a7fa0deadBen Gruverimport org.jf.util.ImmutableUtils; 45e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 46e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nonnull; 47e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport javax.annotation.Nullable; 48c6e54994a7be1bdbdd751ede7c96e07e7fb1c84fBen Gruverimport java.util.Collection; 49e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 50f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverpublic class ImmutableField extends BaseFieldReference implements Field { 5122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull protected final String definingClass; 5222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull protected final String name; 5322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull protected final String type; 5422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver protected final int accessFlags; 5522c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nullable protected final ImmutableEncodedValue initialValue; 5622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull protected final ImmutableSet<? extends ImmutableAnnotation> annotations; 57e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 5822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public ImmutableField(@Nonnull String definingClass, 59a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver @Nonnull String name, 60e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nonnull String type, 61e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver int accessFlags, 62e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nullable EncodedValue initialValue, 63c6e54994a7be1bdbdd751ede7c96e07e7fb1c84fBen Gruver @Nullable Collection<? extends Annotation> annotations) { 6422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.definingClass = definingClass; 65e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.name = name; 66e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.type = type; 67e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.accessFlags = accessFlags; 68ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver this.initialValue = ImmutableEncodedValueFactory.ofNullable(initialValue); 6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.annotations = ImmutableAnnotation.immutableSetOf(annotations); 70e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 71e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 7222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public ImmutableField(@Nonnull String definingClass, 73a8e05220c14778d93c97911044ff5124aadbd77cBen Gruver @Nonnull String name, 74e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nonnull String type, 75e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver int accessFlags, 76e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nullable ImmutableEncodedValue initialValue, 7722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nullable ImmutableSet<? extends ImmutableAnnotation> annotations) { 7822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.definingClass = definingClass; 79e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.name = name; 80e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.type = type; 81e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.accessFlags = accessFlags; 82e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver this.initialValue = initialValue; 8322c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver this.annotations = ImmutableUtils.nullToEmptySet(annotations); 84e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 85e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 86e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static ImmutableField of(Field field) { 87e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if (field instanceof ImmutableField) { 88e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return (ImmutableField)field; 89e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 90e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return new ImmutableField( 9122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver field.getDefiningClass(), 92e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver field.getName(), 93e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver field.getType(), 94e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver field.getAccessFlags(), 95e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver field.getInitialValue(), 96e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver field.getAnnotations()); 97e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 98e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 9922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull @Override public String getDefiningClass() { return definingClass; } 100e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nonnull @Override public String getName() { return name; } 101e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nonnull @Override public String getType() { return type; } 102e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Override public int getAccessFlags() { return accessFlags; } 103e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Override public EncodedValue getInitialValue() { return initialValue;} 10422c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver @Nonnull @Override public ImmutableSet<? extends ImmutableAnnotation> getAnnotations() { return annotations; } 105e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 106e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Nonnull 1070a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver public static ImmutableSortedSet<ImmutableField> immutableSetOf(@Nullable Iterable<? extends Field> list) { 1080a18ea7f8b62e51945a79ac37802133a24c9a742Ben Gruver return CONVERTER.toSortedSet(Ordering.natural(), list); 109e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 110e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 11122c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver private static final ImmutableConverter<ImmutableField, Field> CONVERTER = 11222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver new ImmutableConverter<ImmutableField, Field>() { 113e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Override 114ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver protected boolean isImmutable(@Nonnull Field item) { 115e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return item instanceof ImmutableField; 116e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 117e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 118ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver @Nonnull 119e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver @Override 120ddf20219422e40a1e60268d8049093602d7bacf8Ben Gruver protected ImmutableField makeImmutable(@Nonnull Field item) { 121e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return ImmutableField.of(item); 122e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 123e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver }; 124e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver} 125