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