1 /* 2 * Copyright 2016, Google Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 package org.jf.smalidea.dexlib; 33 34 import com.google.common.collect.ImmutableSet; 35 import com.intellij.psi.PsiClass; 36 import com.intellij.psi.PsiField; 37 import com.intellij.psi.PsiModifierList; 38 import org.jf.dexlib2.AccessFlags; 39 import org.jf.dexlib2.base.reference.BaseFieldReference; 40 import org.jf.dexlib2.iface.Annotation; 41 import org.jf.dexlib2.iface.Field; 42 import org.jf.dexlib2.iface.value.EncodedValue; 43 import org.jf.smalidea.psi.impl.SmaliField; 44 import org.jf.smalidea.util.NameUtils; 45 46 import javax.annotation.Nonnull; 47 import javax.annotation.Nullable; 48 import java.util.Set; 49 50 public class SmalideaField extends BaseFieldReference implements Field { 51 private final PsiField psiField; 52 53 public SmalideaField(PsiField psiField) { 54 this.psiField = psiField; 55 } 56 57 @Override public int getAccessFlags() { 58 if (psiField instanceof SmaliField) { 59 return ((SmaliField)psiField).getModifierList().getAccessFlags(); 60 } else { 61 int flags = 0; 62 PsiModifierList modifierList = psiField.getModifierList(); 63 if (modifierList == null) { 64 return flags; 65 } 66 if (modifierList.hasModifierProperty("public")) { 67 flags |= AccessFlags.PUBLIC.getValue(); 68 } else if (modifierList.hasModifierProperty("protected")) { 69 flags |= AccessFlags.PROTECTED.getValue(); 70 } else if (modifierList.hasModifierProperty("private")) { 71 flags |= AccessFlags.PRIVATE.getValue(); 72 } 73 74 if (modifierList.hasModifierProperty("static")) { 75 flags |= AccessFlags.STATIC.getValue(); 76 } 77 78 if (modifierList.hasModifierProperty("final")) { 79 flags |= AccessFlags.FINAL.getValue(); 80 } 81 82 if (modifierList.hasModifierProperty("volatile")) { 83 flags |= AccessFlags.VOLATILE.getValue(); 84 } 85 // TODO: how do we tell if it's an enum? 86 87 return flags; 88 } 89 } 90 91 @Nonnull @Override public String getDefiningClass() { 92 PsiClass containingClass = psiField.getContainingClass(); 93 if (containingClass == null) { 94 throw new RuntimeException("I don't know what to do here... Is this even possible?"); 95 } 96 return NameUtils.javaToSmaliType(containingClass); 97 } 98 99 @Nonnull @Override public String getName() { 100 return psiField.getNameIdentifier().getText(); 101 } 102 103 @Nonnull @Override public String getType() { 104 return NameUtils.javaToSmaliType(psiField.getType()); 105 } 106 107 @Nullable @Override public EncodedValue getInitialValue() { 108 // TODO: implement this. Not needed for method analysis 109 return null; 110 } 111 112 @Nonnull @Override public Set<? extends Annotation> getAnnotations() { 113 // TODO: implement this. Not needed for method analysis 114 return ImmutableSet.of(); 115 } 116 } 117