changeset 107:75d12be4d1ea

Adapted parser interface to allow skipping. * dex/DexReader.java (accept): Added skip flags parameter. * dex/DexFile.java: Adapted to above change. * rewriter/DexRewriter.java: Likewise.
author Michael Starzinger <michi@complang.tuwien.ac.at>
date Thu, 31 Mar 2011 00:04:19 +0200
parents ff944d4bdfb7
children 19915795c08c
files src/main/java/org/icedrobot/daneel/dex/DexFile.java src/main/java/org/icedrobot/daneel/dex/DexReader.java src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java src/main/java/org/icedrobot/daneel/rewriter/Main.java
diffstat 4 files changed, 39 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/icedrobot/daneel/dex/DexFile.java	Wed Mar 30 23:40:28 2011 +0200
+++ b/src/main/java/org/icedrobot/daneel/dex/DexFile.java	Thu Mar 31 00:04:19 2011 +0200
@@ -263,17 +263,13 @@
         return buffer;
     }
 
+    @Override
     public String toString() {
         return header.toString();
     }
 
-    /**
-     * Allows the given visitor to visit this DEX file.
-     * 
-     * @param visitor The given DEX file visitor object.
-     */
     @Override
-    public void accept(DexFileVisitor visitor) {
+    public void accept(DexFileVisitor visitor, int skip) {
         for (ClassDef classDef : classDefs.values()) {
             DexClassVisitor dcv = visitor.visitClass(classDef.getClassName());
             if (dcv != null)
@@ -282,16 +278,8 @@
         visitor.visitEnd();
     }
 
-    /**
-     * Allows the given visitor to visit a class inside this DEX file.
-     * 
-     * @param className The name of the class to visit as a type descriptor.
-     * @param visitor The given DEX class visitor object.
-     * @throws ClassNotFoundException In case the given class is not defined
-     *         inside this DEX file.
-     */
     @Override
-    public void accept(String className, DexClassVisitor visitor)
+    public void accept(String className, DexClassVisitor visitor, int skip)
             throws ClassNotFoundException {
         ClassDef classDef = classDefs.get(className);
         if (classDef == null)
--- a/src/main/java/org/icedrobot/daneel/dex/DexReader.java	Wed Mar 30 23:40:28 2011 +0200
+++ b/src/main/java/org/icedrobot/daneel/dex/DexReader.java	Thu Mar 31 00:04:19 2011 +0200
@@ -38,11 +38,41 @@
 package org.icedrobot.daneel.dex;
 
 /**
- * Common interface of DEX file reader.
+ * A common interface of a DEX file reader which is able to accept visitors. One
+ * implementation of such a reader is {@link DexFile}, which parses given DEX
+ * files.
  */
 public interface DexReader {
-    public void accept(DexFileVisitor dv);
+
+    /** Skip no information. Default behavior. */
+    public static final int SKIP_NONE = 0;
+
+    /** Skip {@code code_item} information. */
+    public static final int SKIP_CODE = 0x1;
+
+    /** Skip {@code debug_info_item} information. */
+    public static final int SKIP_DEBUGINFO = 0x2;
+
+    /** Skip {@code annotations_directory_item} information. */
+    public static final int SKIP_ANNOTATIONS = 0x4;
 
-    public void accept(String className, DexClassVisitor cv)
+    /**
+     * Allows the given visitor to visit this DEX file.
+     * 
+     * @param visitor The given DEX file visitor object.
+     * @param skip Flags indicating which information to skip while visiting.
+     */
+    public void accept(DexFileVisitor visitor, int skip);
+
+    /**
+     * Allows the given visitor to visit a class inside this DEX file.
+     * 
+     * @param className The name of the class to visit as a type descriptor.
+     * @param visitor The given DEX class visitor object.
+     * @param skip Flags indicating which information to skip while visiting.
+     * @throws ClassNotFoundException In case the given class is not defined
+     *         inside this DEX file.
+     */
+    public void accept(String className, DexClassVisitor visitor, int skip)
             throws ClassNotFoundException;
-}
\ No newline at end of file
+}
--- a/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java	Wed Mar 30 23:40:28 2011 +0200
+++ b/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java	Thu Mar 31 00:04:19 2011 +0200
@@ -88,7 +88,7 @@
     public static byte[] rewrite(String name, DexReader reader)
             throws ClassNotFoundException {
         ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-        reader.accept("L" + name.replace('.', '/') + ";", new DexRewriter(writer));
+        reader.accept("L" + name.replace('.', '/') + ";", new DexRewriter(writer), 0);
         return writer.toByteArray();
     }
 
--- a/src/main/java/org/icedrobot/daneel/rewriter/Main.java	Wed Mar 30 23:40:28 2011 +0200
+++ b/src/main/java/org/icedrobot/daneel/rewriter/Main.java	Thu Mar 31 00:04:19 2011 +0200
@@ -65,7 +65,7 @@
             protected Class<?> findClass(String name)
                     throws ClassNotFoundException {
                 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
-                dexReader.accept('L'+name.replace('.', '/')+';', new DexRewriter(writer));
+                dexReader.accept('L'+name.replace('.', '/')+';', new DexRewriter(writer), 0);
                 byte[] array = writer.toByteArray();
 
                 CheckClassAdapter.verify(new ClassReader(array), true,