# HG changeset patch # User Michael Starzinger # Date 1302512715 -7200 # Node ID 0355dd717a24ad1af4c699473cda8c0565b1b84a # Parent 8bb44682be11be41b2d0c3dfae10b0135b526117 Fixed enumerations as annotation parameters. * dex/DexAnnotationVisitor.java (visitEnum): Added new interface method. * dex/EncodedValue.java (parse): Decode encoded enumeration values. * rewriter/DexRewriter.java (AnnotationRewriter): Adapted to above change. * rewriter/AnnotationParamTest.java: New test case for annotation parameters. diff -r 8bb44682be11 -r 0355dd717a24 src/main/java/org/icedrobot/daneel/dex/DexAnnotationVisitor.java --- a/src/main/java/org/icedrobot/daneel/dex/DexAnnotationVisitor.java Sun Apr 10 23:54:27 2011 +0200 +++ b/src/main/java/org/icedrobot/daneel/dex/DexAnnotationVisitor.java Mon Apr 11 11:05:15 2011 +0200 @@ -95,6 +95,16 @@ String methodDesc); /** + * Visits an enumeration-reference annotation parameter. The enumeration + * value is passed as a combination of the enumeration class and name. + * + * @param name The annotation parameter name. + * @param enumOwner The enumeration's class as a type descriptor. + * @param enumName The enumeration's constant name. + */ + void visitEnum(String name, String enumOwner, String enumName); + + /** * Visits a sub-annotation annotation parameter. In case this visitor is * interested in further details about the annotation parameter it should * return a new visitor object, otherwise it should return {@code null}. diff -r 8bb44682be11 -r 0355dd717a24 src/main/java/org/icedrobot/daneel/dex/EncodedValue.java --- a/src/main/java/org/icedrobot/daneel/dex/EncodedValue.java Sun Apr 10 23:54:27 2011 +0200 +++ b/src/main/java/org/icedrobot/daneel/dex/EncodedValue.java Mon Apr 11 11:05:15 2011 +0200 @@ -131,6 +131,14 @@ .getMethodDesc()); } }; + case VALUE_ENUM: + assertValueArg(arg, 3); + final FieldId e = dex.getFieldId((int) readU64(buffer, arg)); + return new AnnotationVisitable() { + public void accept(DexAnnotationVisitor visitor, String name) { + visitor.visitEnum(name, e.getClassName(), e.getName()); + } + }; case VALUE_ARRAY: assertValueArg(arg, 0); return parseArray(buffer, dex); diff -r 8bb44682be11 -r 0355dd717a24 src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java --- a/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Sun Apr 10 23:54:27 2011 +0200 +++ b/src/main/java/org/icedrobot/daneel/rewriter/DexRewriter.java Mon Apr 11 11:05:15 2011 +0200 @@ -1195,6 +1195,11 @@ } @Override + public void visitEnum(String name, String enumOwner, String enumName) { + av.visitEnum(name, enumOwner, enumName); + } + + @Override public void visitField(String name, String fieldOwner, String fieldName, String fieldDesc) { throw new UnsupportedOperationException("Unexpected parameter"); diff -r 8bb44682be11 -r 0355dd717a24 src/test/java/org/icedrobot/daneel/rewriter/AnnotationParamTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/org/icedrobot/daneel/rewriter/AnnotationParamTest.java Mon Apr 11 11:05:15 2011 +0200 @@ -0,0 +1,77 @@ +/* + * Daneel - Dalvik to Java bytecode compiler + * Copyright (C) 2011 IcedRobot team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * This file is subject to the "Classpath" exception: + * + * Linking this library statically or dynamically with other modules is + * making a combined work based on this library. Thus, the terms and + * conditions of the GNU General Public License cover the whole + * combination. + * + * As a special exception, the copyright holders of this library give you + * permission to link this library with independent modules to produce an + * executable, regardless of the license terms of these independent + * modules, and to copy and distribute the resulting executable under terms + * of your choice, provided that you also meet, for each linked independent + * module, the terms and conditions of the license of that module. An + * independent module is a module which is not derived from or based on + * this library. If you modify this library, you may extend this exception + * to your version of the library, but you are not obligated to do so. If + * you do not wish to do so, delete this exception statement from your + * version. + */ + +package org.icedrobot.daneel.rewriter; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.reflect.Field; + +import org.icedrobot.daneel.DexifyingRunner; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(DexifyingRunner.class) +public class AnnotationParamTest { + + @Test + public void testEnumParam() throws Exception { + Field f = DEXCode.class.getField("fieldEnum"); + TestEnumAnnotation a = f.getAnnotation(TestEnumAnnotation.class); + assertNotNull(a); + assertSame(TestEnumeration.CONST_B, a.value()); + } + + private static enum TestEnumeration { + CONST_A, CONST_B; + }; + + @Retention(RetentionPolicy.RUNTIME) + private static @interface TestEnumAnnotation { + TestEnumeration value(); + }; + + // Keep this class named "DEXCode" to push it through Daneel. + public static class DEXCode { + + @TestEnumAnnotation(TestEnumeration.CONST_B) + public int fieldEnum; + }; +}