1b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta/* 2b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * Copyright (C) 2015 The Android Open Source Project 3b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * 4b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 5b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * you may not use this file except in compliance with the License. 6b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * You may obtain a copy of the License at 7b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * 8b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * http://www.apache.org/licenses/LICENSE-2.0 9b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * 10b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software 11b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS, 12b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * See the License for the specific language governing permissions and 14b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * limitations under the License. 15b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta */ 16b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 17b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptapackage com.android.tools.layoutlib.create; 18b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 19b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport org.objectweb.asm.ClassVisitor; 20b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport org.objectweb.asm.FieldVisitor; 21b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 22b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport java.util.Set; 23b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 24b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport static org.objectweb.asm.Opcodes.ACC_PRIVATE; 25b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport static org.objectweb.asm.Opcodes.ACC_PROTECTED; 26b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport static org.objectweb.asm.Opcodes.ACC_PUBLIC; 27b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptaimport static org.objectweb.asm.Opcodes.ASM4; 28b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 29b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta/** 30b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta * Promotes given fields to public visibility. 31b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta */ 32b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Guptapublic class PromoteFieldClassAdapter extends ClassVisitor { 33b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 34b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta private final Set<String> mFieldNames; 35b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta private static final int ACC_NOT_PUBLIC = ~(ACC_PRIVATE | ACC_PROTECTED); 36b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 37b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta public PromoteFieldClassAdapter(ClassVisitor cv, Set<String> fieldNames) { 38b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta super(ASM4, cv); 39b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta mFieldNames = fieldNames; 40b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta } 41b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta 42b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta @Override 43b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta public FieldVisitor visitField(int access, String name, String desc, String signature, 44b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta Object value) { 45b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta if (mFieldNames.contains(name)) { 46b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta if ((access & ACC_PUBLIC) == 0) { 47b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta access = (access & ACC_NOT_PUBLIC) | ACC_PUBLIC; 48b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta } 49b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta } 50b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta return super.visitField(access, name, desc, signature, value); 51b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta } 52b556decf75b2b084e1aed54ac7fa23a141eedb7fDeepanshu Gupta} 53