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