summaryrefslogtreecommitdiffstats
path: root/src/org/jetbrains/java/decompiler/struct/attr/StructGeneralAttribute.java
blob: bd0596adcdc5f7df2bb38a0e2cc687f920aa294f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jetbrains.java.decompiler.struct.attr;

import org.jetbrains.java.decompiler.struct.consts.ConstantPool;

import java.io.DataOutputStream;
import java.io.IOException;

/*
    attribute_info {
    	u2 attribute_name_index;
    	u4 attribute_length;
    	u1 info[attribute_length];
    }
*/

public class StructGeneralAttribute {

  public static final String ATTRIBUTE_CODE = "Code";
  public static final String ATTRIBUTE_INNER_CLASSES = "InnerClasses";
  public static final String ATTRIBUTE_SIGNATURE = "Signature";
  public static final String ATTRIBUTE_ANNOTATION_DEFAULT = "AnnotationDefault";
  public static final String ATTRIBUTE_EXCEPTIONS = "Exceptions";
  public static final String ATTRIBUTE_ENCLOSING_METHOD = "EnclosingMethod";
  public static final String ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS = "RuntimeVisibleAnnotations";
  public static final String ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS = "RuntimeInvisibleAnnotations";
  public static final String ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = "RuntimeVisibleParameterAnnotations";
  public static final String ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = "RuntimeInvisibleParameterAnnotations";
  public static final String ATTRIBUTE_RUNTIME_VISIBLE_TYPE_ANNOTATIONS = "RuntimeVisibleTypeAnnotations";
  public static final String ATTRIBUTE_RUNTIME_INVISIBLE_TYPE_ANNOTATIONS = "RuntimeInvisibleTypeAnnotations";
  public static final String ATTRIBUTE_LOCAL_VARIABLE_TABLE = "LocalVariableTable";
  public static final String ATTRIBUTE_CONSTANT_VALUE = "ConstantValue";
  public static final String ATTRIBUTE_BOOTSTRAP_METHODS = "BootstrapMethods";
  public static final String ATTRIBUTE_SYNTHETIC = "Synthetic";
  public static final String ATTRIBUTE_DEPRECATED = "Deprecated";


  // *****************************************************************************
  // private fields
  // *****************************************************************************

  protected int attribute_name_index;

  protected byte[] info;

  protected String name;

  // *****************************************************************************
  // public methods
  // *****************************************************************************

  public void writeToStream(DataOutputStream out) throws IOException {
    out.writeShort(attribute_name_index);
    out.writeInt(info.length);
    if (info.length > 0) {
      out.write(info);
    }
  }

  public void initContent(ConstantPool pool) {
    name = pool.getPrimitiveConstant(attribute_name_index).getString();
  }

  public static StructGeneralAttribute getMatchingAttributeInstance(int nameindex, String attrname) {

    StructGeneralAttribute attr;

    if (ATTRIBUTE_INNER_CLASSES.equals(attrname)) {
      attr = new StructInnerClassesAttribute();
    }
    else if (ATTRIBUTE_CONSTANT_VALUE.equals(attrname)) {
      attr = new StructConstantValueAttribute();
    }
    else if (ATTRIBUTE_SIGNATURE.equals(attrname)) {
      attr = new StructGenericSignatureAttribute();
    }
    else if (ATTRIBUTE_ANNOTATION_DEFAULT.equals(attrname)) {
      attr = new StructAnnDefaultAttribute();
    }
    else if (ATTRIBUTE_EXCEPTIONS.equals(attrname)) {
      attr = new StructExceptionsAttribute();
    }
    else if (ATTRIBUTE_ENCLOSING_METHOD.equals(attrname)) {
      attr = new StructEnclosingMethodAttribute();
    }
    else if (ATTRIBUTE_RUNTIME_VISIBLE_ANNOTATIONS.equals(attrname) ||
             ATTRIBUTE_RUNTIME_INVISIBLE_ANNOTATIONS.equals(attrname)) {
      attr = new StructAnnotationAttribute();
    }
    else if (ATTRIBUTE_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS.equals(attrname) ||
             ATTRIBUTE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS.equals(attrname)) {
      attr = new StructAnnotationParameterAttribute();
    }
    else if (ATTRIBUTE_RUNTIME_VISIBLE_TYPE_ANNOTATIONS.equals(attrname) ||
             ATTRIBUTE_RUNTIME_INVISIBLE_TYPE_ANNOTATIONS.equals(attrname)) {
      attr = new StructAnnotationTypeAttribute();
    }
    else if (ATTRIBUTE_LOCAL_VARIABLE_TABLE.equals(attrname)) {
      attr = new StructLocalVariableTableAttribute();
    }
    else if (ATTRIBUTE_BOOTSTRAP_METHODS.equals(attrname)) {
      attr = new StructBootstrapMethodsAttribute();
    }
    else if (ATTRIBUTE_SYNTHETIC.equals(attrname) || ATTRIBUTE_DEPRECATED.equals(attrname)) {
      attr = new StructGeneralAttribute();
    }
    else {
      // unsupported attribute
      return null;
    }

    attr.setAttribute_name_index(nameindex);
    return attr;
  }

  // *****************************************************************************
  // getter and setter methods
  // *****************************************************************************

  public byte[] getInfo() {
    return info;
  }

  public void setInfo(byte[] info) {
    this.info = info;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getAttribute_name_index() {
    return attribute_name_index;
  }

  public void setAttribute_name_index(int attribute_name_index) {
    this.attribute_name_index = attribute_name_index;
  }
}