12f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com/*
22f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * [The "BSD licence"]
32f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * Copyright (c) 2011 Ben Gruver
42f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * All rights reserved.
52f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *
62f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * Redistribution and use in source and binary forms, with or without
72f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * modification, are permitted provided that the following conditions
82f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * are met:
92f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * 1. Redistributions of source code must retain the above copyright
102f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *    notice, this list of conditions and the following disclaimer.
112f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * 2. Redistributions in binary form must reproduce the above copyright
122f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *    notice, this list of conditions and the following disclaimer in the
132f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *    documentation and/or other materials provided with the distribution.
142f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * 3. The name of the author may not be used to endorse or promote products
152f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *    derived from this software without specific prior written permission.
162f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com *
172f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
182f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
192f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
202f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
212f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
222f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
262f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com */
282f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
292f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.compackage org.jf.baksmali.Adaptors;
302f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
312b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruverimport org.jf.dexlib2.ReferenceType;
322b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruverimport org.jf.dexlib2.util.SyntheticAccessorResolver;
332b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruverimport org.jf.util.ExceptionWithContext;
342f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.comimport org.jf.util.IndentingWriter;
352f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
362f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.comimport java.io.IOException;
372f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
382b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruverpublic class SyntheticAccessCommentMethodItem extends MethodItem {
392b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver    private final SyntheticAccessorResolver.AccessedMember accessedMember;
402f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
412b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver    public SyntheticAccessCommentMethodItem(SyntheticAccessorResolver.AccessedMember accessedMember, int codeAddress) {
422f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        super(codeAddress);
432f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        this.accessedMember = accessedMember;
442f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
452f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
462f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    public double getSortOrder() {
472f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        //just before the pre-instruction register information, if any
482f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return 99.8;
492f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
502f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com
512f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    public boolean writeTo(IndentingWriter writer) throws IOException {
522b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver        writer.write("# ");
532b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver        switch (accessedMember.accessedMemberType) {
542b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.METHOD:
552b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("invokes: ");
562b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
572b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.GETTER:
582b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("getter for: ");
592b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
602b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.SETTER:
612b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("setter for: ");
622b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
632b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.PREFIX_INCREMENT:
642b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("++operator for: ");
652b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
662b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.POSTFIX_INCREMENT:
672b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("operator++ for: ");
682b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
692b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.PREFIX_DECREMENT:
702b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("--operator for: ");
712b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
722b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.POSTFIX_DECREMENT:
732b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("operator-- for: ");
742b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
752b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.ADD_ASSIGNMENT:
762b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("+= operator for: ");
772b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
782b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.SUB_ASSIGNMENT:
792b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("-= operator for: ");
802b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
812b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.MUL_ASSIGNMENT:
822b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("*= operator for: ");
832b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
842b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.DIV_ASSIGNMENT:
852b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("/= operator for: ");
862b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
872b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.REM_ASSIGNMENT:
882b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("%= operator for: ");
892b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
902b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.AND_ASSIGNMENT:
912b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("&= operator for: ");
922b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
932b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.OR_ASSIGNMENT:
942b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("|= operator for: ");
952b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
962b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.XOR_ASSIGNMENT:
972b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("^= operator for: ");
982b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
992b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.SHL_ASSIGNMENT:
1002b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write("<<= operator for: ");
1012b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
1022b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.SHR_ASSIGNMENT:
1032b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write(">>= operator for: ");
1042b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
1052b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            case SyntheticAccessorResolver.USHR_ASSIGNMENT:
1062b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                writer.write(">>>= operator for: ");
1072b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                break;
1082b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            default:
1092b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver                throw new ExceptionWithContext("Unknown access type: %d", accessedMember.accessedMemberType);
1102b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver        }
1112b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver
1122b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver        int referenceType;
11392a9aa2aa5292ef861211961816fac00e63080d7Ben Gruver        if (accessedMember.accessedMemberType == SyntheticAccessorResolver.METHOD) {
1142b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            referenceType = ReferenceType.METHOD;
1152f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        } else {
1162b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver            referenceType = ReferenceType.FIELD;
1172f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        }
1182b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver        ReferenceFormatter.writeReference(writer, referenceType, accessedMember.accessedMember);
1192f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com        return true;
1202f376953b4c96542f200724727e4dac74dd27425jesusfreke@jesusfreke.com    }
1212b8845bb247e3e5ee154966866b53fa9887e2609Ben Gruver}
122