Home | History | Annotate | Download | only in rewriter
      1 /*
      2  * Copyright 2014, Google Inc.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  *     * Redistributions of source code must retain the above copyright
     10  * notice, this list of conditions and the following disclaimer.
     11  *     * Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *     * Neither the name of Google Inc. nor the names of its
     16  * contributors may be used to endorse or promote products derived from
     17  * this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 package org.jf.dexlib2.rewriter;
     33 
     34 import org.jf.dexlib2.base.reference.BaseTypeReference;
     35 import org.jf.dexlib2.iface.reference.TypeReference;
     36 
     37 import javax.annotation.Nonnull;
     38 import javax.annotation.Nullable;
     39 import java.util.*;
     40 
     41 public class RewriterUtils {
     42     @Nullable
     43     public static <T> T rewriteNullable(@Nonnull Rewriter<T> rewriter, @Nullable T value) {
     44         return value==null?null:rewriter.rewrite(value);
     45     }
     46 
     47     public static <T> Set<T> rewriteSet(@Nonnull final Rewriter<T> rewriter,
     48                                         @Nonnull final Set<? extends T> set) {
     49         return new AbstractSet<T>() {
     50             @Nonnull @Override public Iterator<T> iterator() {
     51                 final Iterator<? extends T> iterator = set.iterator();
     52                 return new Iterator<T>() {
     53                     @Override public boolean hasNext() {
     54                         return iterator.hasNext();
     55                     }
     56 
     57                     @Override public T next() {
     58                         return rewriteNullable(rewriter, iterator.next());
     59                     }
     60 
     61                     @Override public void remove() {
     62                         iterator.remove();
     63                     }
     64                 };
     65             }
     66 
     67             @Override public int size() {
     68                 return set.size();
     69             }
     70         };
     71     }
     72 
     73     public static <T> List<T> rewriteList(@Nonnull final Rewriter<T> rewriter,
     74                                         @Nonnull final List<? extends T> list) {
     75         return new AbstractList<T>() {
     76             @Override public T get(int i) {
     77                 return rewriteNullable(rewriter, list.get(i));
     78             }
     79 
     80             @Override public int size() {
     81                 return list.size();
     82             }
     83         };
     84     }
     85 
     86     public static <T> Iterable<T> rewriteIterable(@Nonnull final Rewriter<T> rewriter,
     87                                                   @Nonnull final Iterable<? extends T> iterable) {
     88         return new Iterable<T>() {
     89             @Override public Iterator<T> iterator() {
     90                 final Iterator<? extends T> iterator = iterable.iterator();
     91                 return new Iterator<T>() {
     92                     @Override public boolean hasNext() {
     93                         return iterator.hasNext();
     94                     }
     95 
     96                     @Override public T next() {
     97                         return rewriteNullable(rewriter, iterator.next());
     98                     }
     99 
    100                     @Override public void remove() {
    101                         iterator.remove();
    102                     }
    103                 };
    104             }
    105         };
    106     }
    107 
    108     public static TypeReference rewriteTypeReference(@Nonnull final Rewriter<String> typeRewriter,
    109                                                      @Nonnull final TypeReference typeReference) {
    110         return new BaseTypeReference() {
    111             @Nonnull @Override public String getType() {
    112                 return typeRewriter.rewrite(typeReference.getType());
    113             }
    114         };
    115     }
    116 }
    117 
    118 
    119