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)