FieldAnnotationStruct.java revision 579d7739c53a2707ad711a2d2cae46d7d782f061
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (C) 2008 The Android Open Source Project 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * you may not use this file except in compliance with the License. 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * You may obtain a copy of the License at 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See the License for the specific language governing permissions and 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * limitations under the License. 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package com.android.dx.dex.file; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.android.dx.rop.annotation.Annotations; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.android.dx.rop.cst.CstFieldRef; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.android.dx.util.AnnotatedOutput; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.android.dx.util.Hex; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.android.dx.util.ToHuman; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/** 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Association of a field and its annotations. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public final class FieldAnnotationStruct 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) implements ToHuman, Comparable<FieldAnnotationStruct> { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** {@code non-null;} the field in question */ 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final CstFieldRef field; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** {@code non-null;} the associated annotations */ 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private AnnotationSetItem annotations; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Constructs an instance. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param field {@code non-null;} the field in question 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param annotations {@code non-null;} the associated annotations 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public FieldAnnotationStruct(CstFieldRef field, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AnnotationSetItem annotations) { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (field == null) { 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) throw new NullPointerException("field == null"); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (annotations == null) { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) throw new NullPointerException("annotations == null"); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.field = field; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this.annotations = annotations; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** {@inheritDoc} */ 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int hashCode() { 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return field.hashCode(); 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** {@inheritDoc} */ 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public boolean equals(Object other) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (! (other instanceof FieldAnnotationStruct)) { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return field.equals(((FieldAnnotationStruct) other).field); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** {@inheritDoc} */ 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int compareTo(FieldAnnotationStruct other) { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return field.compareTo(other.field); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** {@inheritDoc} */ 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void addContents(DexFile file) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FieldIdsSection fieldIds = file.getFieldIds(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MixedItemSection wordData = file.getWordData(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fieldIds.intern(field); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) annotations = wordData.intern(annotations); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** {@inheritDoc} */ 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void writeTo(DexFile file, AnnotatedOutput out) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int fieldIdx = file.getFieldIds().indexOf(field); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int annotationsOff = annotations.getAbsoluteOffset(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (out.annotates()) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out.annotate(0, " " + field.toHuman()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out.annotate(4, " field_idx: " + Hex.u4(fieldIdx)); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out.annotate(4, " annotations_off: " + 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Hex.u4(annotationsOff)); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out.writeInt(fieldIdx); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out.writeInt(annotationsOff); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** {@inheritDoc} */ 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public String toHuman() { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return field.toHuman() + ": " + annotations; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Gets the field this item is for. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {@code non-null;} the field 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public CstFieldRef getField() { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return field; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Gets the associated annotations. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return {@code non-null;} the annotations 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public Annotations getAnnotations() { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return annotations.getAnnotations(); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)