14357de47e313869f6566b7468712c29e403c8c24Ben Gruver/* 24357de47e313869f6566b7468712c29e403c8c24Ben Gruver * Copyright 2014, Google Inc. 34357de47e313869f6566b7468712c29e403c8c24Ben Gruver * All rights reserved. 44357de47e313869f6566b7468712c29e403c8c24Ben Gruver * 54357de47e313869f6566b7468712c29e403c8c24Ben Gruver * Redistribution and use in source and binary forms, with or without 64357de47e313869f6566b7468712c29e403c8c24Ben Gruver * modification, are permitted provided that the following conditions are 74357de47e313869f6566b7468712c29e403c8c24Ben Gruver * met: 84357de47e313869f6566b7468712c29e403c8c24Ben Gruver * 94357de47e313869f6566b7468712c29e403c8c24Ben Gruver * * Redistributions of source code must retain the above copyright 104357de47e313869f6566b7468712c29e403c8c24Ben Gruver * notice, this list of conditions and the following disclaimer. 114357de47e313869f6566b7468712c29e403c8c24Ben Gruver * * Redistributions in binary form must reproduce the above 124357de47e313869f6566b7468712c29e403c8c24Ben Gruver * copyright notice, this list of conditions and the following disclaimer 134357de47e313869f6566b7468712c29e403c8c24Ben Gruver * in the documentation and/or other materials provided with the 144357de47e313869f6566b7468712c29e403c8c24Ben Gruver * distribution. 154357de47e313869f6566b7468712c29e403c8c24Ben Gruver * * Neither the name of Google Inc. nor the names of its 164357de47e313869f6566b7468712c29e403c8c24Ben Gruver * contributors may be used to endorse or promote products derived from 174357de47e313869f6566b7468712c29e403c8c24Ben Gruver * this software without specific prior written permission. 184357de47e313869f6566b7468712c29e403c8c24Ben Gruver * 194357de47e313869f6566b7468712c29e403c8c24Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 204357de47e313869f6566b7468712c29e403c8c24Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 214357de47e313869f6566b7468712c29e403c8c24Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 224357de47e313869f6566b7468712c29e403c8c24Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 234357de47e313869f6566b7468712c29e403c8c24Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 244357de47e313869f6566b7468712c29e403c8c24Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 254357de47e313869f6566b7468712c29e403c8c24Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 264357de47e313869f6566b7468712c29e403c8c24Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 274357de47e313869f6566b7468712c29e403c8c24Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 284357de47e313869f6566b7468712c29e403c8c24Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 294357de47e313869f6566b7468712c29e403c8c24Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 304357de47e313869f6566b7468712c29e403c8c24Ben Gruver */ 314357de47e313869f6566b7468712c29e403c8c24Ben Gruver 324357de47e313869f6566b7468712c29e403c8c24Ben Gruverpackage org.jf.dexlib2.rewriter; 334357de47e313869f6566b7468712c29e403c8c24Ben Gruver 344357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport org.jf.dexlib2.base.reference.BaseFieldReference; 354357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport org.jf.dexlib2.iface.Annotation; 364357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport org.jf.dexlib2.iface.Field; 374357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport org.jf.dexlib2.iface.value.EncodedValue; 384357de47e313869f6566b7468712c29e403c8c24Ben Gruver 394357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport javax.annotation.Nonnull; 404357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport javax.annotation.Nullable; 414357de47e313869f6566b7468712c29e403c8c24Ben Gruverimport java.util.Set; 424357de47e313869f6566b7468712c29e403c8c24Ben Gruver 434357de47e313869f6566b7468712c29e403c8c24Ben Gruverpublic class FieldRewriter implements Rewriter<Field> { 444357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Nonnull protected final Rewriters rewriters; 454357de47e313869f6566b7468712c29e403c8c24Ben Gruver 464357de47e313869f6566b7468712c29e403c8c24Ben Gruver public FieldRewriter(@Nonnull Rewriters rewriters) { 474357de47e313869f6566b7468712c29e403c8c24Ben Gruver this.rewriters = rewriters; 484357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 494357de47e313869f6566b7468712c29e403c8c24Ben Gruver 504357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Nonnull @Override public Field rewrite(@Nonnull Field field) { 514357de47e313869f6566b7468712c29e403c8c24Ben Gruver return new RewrittenField(field); 524357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 534357de47e313869f6566b7468712c29e403c8c24Ben Gruver 544357de47e313869f6566b7468712c29e403c8c24Ben Gruver protected class RewrittenField extends BaseFieldReference implements Field { 554357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Nonnull protected Field field; 564357de47e313869f6566b7468712c29e403c8c24Ben Gruver 574357de47e313869f6566b7468712c29e403c8c24Ben Gruver public RewrittenField(@Nonnull Field field) { 584357de47e313869f6566b7468712c29e403c8c24Ben Gruver this.field = field; 594357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 604357de47e313869f6566b7468712c29e403c8c24Ben Gruver 614357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Override @Nonnull public String getDefiningClass() { 624357de47e313869f6566b7468712c29e403c8c24Ben Gruver return rewriters.getFieldReferenceRewriter().rewrite(field).getDefiningClass(); 634357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 644357de47e313869f6566b7468712c29e403c8c24Ben Gruver 654357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Override @Nonnull public String getName() { 664357de47e313869f6566b7468712c29e403c8c24Ben Gruver return rewriters.getFieldReferenceRewriter().rewrite(field).getName(); 674357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 684357de47e313869f6566b7468712c29e403c8c24Ben Gruver 694357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Override @Nonnull public String getType() { 704357de47e313869f6566b7468712c29e403c8c24Ben Gruver return rewriters.getFieldReferenceRewriter().rewrite(field).getType(); 714357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 724357de47e313869f6566b7468712c29e403c8c24Ben Gruver 734357de47e313869f6566b7468712c29e403c8c24Ben Gruver public int getAccessFlags() { 744357de47e313869f6566b7468712c29e403c8c24Ben Gruver return field.getAccessFlags(); 754357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 764357de47e313869f6566b7468712c29e403c8c24Ben Gruver 774357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Nullable public EncodedValue getInitialValue() { 784357de47e313869f6566b7468712c29e403c8c24Ben Gruver return RewriterUtils.rewriteNullable(rewriters.getEncodedValueRewriter(), field.getInitialValue()); 794357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 804357de47e313869f6566b7468712c29e403c8c24Ben Gruver 814357de47e313869f6566b7468712c29e403c8c24Ben Gruver @Nonnull public Set<? extends Annotation> getAnnotations() { 824357de47e313869f6566b7468712c29e403c8c24Ben Gruver return RewriterUtils.rewriteSet(rewriters.getAnnotationRewriter(), field.getAnnotations()); 834357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 844357de47e313869f6566b7468712c29e403c8c24Ben Gruver } 854357de47e313869f6566b7468712c29e403c8c24Ben Gruver} 86