1/*
2 * ProGuard -- shrinking, optimization, obfuscation, and preverification
3 *             of Java bytecode.
4 *
5 * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21package proguard.classfile.attribute.visitor;
22
23import proguard.classfile.*;
24import proguard.classfile.attribute.*;
25import proguard.classfile.attribute.annotation.*;
26import proguard.classfile.attribute.preverification.*;
27import proguard.util.StringMatcher;
28
29/**
30 * This AttributeVisitor delegates its visits another AttributeVisitor, but
31 * only when the visited attribute is not empty. For instance, a local variable
32 * table without variables is empty.
33 *
34 * @author Eric Lafortune
35 */
36public class NonEmptyAttributeFilter
37implements   AttributeVisitor
38{
39    private final AttributeVisitor attributeVisitor;
40
41
42    /**
43     * Creates a new NonEmptyAttributeFilter.
44     * @param attributeVisitor the <code>AttributeVisitor</code> to which
45     *                         visits will be delegated.
46     */
47    public NonEmptyAttributeFilter(AttributeVisitor attributeVisitor)
48    {
49        this.attributeVisitor = attributeVisitor;
50    }
51
52
53    // Implementations for AttributeVisitor.
54
55    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
56    {
57        unknownAttribute.accept(clazz, attributeVisitor);
58    }
59
60
61    public void visitBootstrapMethodsAttribute(Clazz clazz, BootstrapMethodsAttribute bootstrapMethodsAttribute)
62    {
63        if (bootstrapMethodsAttribute.u2bootstrapMethodsCount > 0)
64        {
65            bootstrapMethodsAttribute.accept(clazz, attributeVisitor);
66        }
67    }
68
69
70    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
71    {
72        sourceFileAttribute.accept(clazz, attributeVisitor);
73    }
74
75
76    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
77    {
78        sourceDirAttribute.accept(clazz, attributeVisitor);
79    }
80
81
82    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
83    {
84        if (innerClassesAttribute.u2classesCount > 0)
85        {
86            innerClassesAttribute.accept(clazz, attributeVisitor);
87        }
88    }
89
90
91    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
92    {
93        enclosingMethodAttribute.accept(clazz, attributeVisitor);
94    }
95
96
97    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
98    {
99        deprecatedAttribute.accept(clazz, attributeVisitor);
100    }
101
102
103    public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
104    {
105        deprecatedAttribute.accept(clazz, field, attributeVisitor);
106    }
107
108
109    public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
110    {
111        deprecatedAttribute.accept(clazz, method, attributeVisitor);
112    }
113
114
115    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
116    {
117        syntheticAttribute.accept(clazz, attributeVisitor);
118    }
119
120
121    public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
122    {
123        syntheticAttribute.accept(clazz, field, attributeVisitor);
124    }
125
126
127    public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
128    {
129        syntheticAttribute.accept(clazz, method, attributeVisitor);
130    }
131
132
133    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
134    {
135        signatureAttribute.accept(clazz, attributeVisitor);
136    }
137
138
139    public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute)
140    {
141        signatureAttribute.accept(clazz, field, attributeVisitor);
142    }
143
144
145    public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute)
146    {
147        signatureAttribute.accept(clazz, method, attributeVisitor);
148    }
149
150
151    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
152    {
153        constantValueAttribute.accept(clazz, field, attributeVisitor);
154    }
155
156
157    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
158    {
159        if (exceptionsAttribute.u2exceptionIndexTableLength > 0)
160        {
161            exceptionsAttribute.accept(clazz, method, attributeVisitor);
162        }
163    }
164
165
166    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
167    {
168        codeAttribute.accept(clazz, method, attributeVisitor);
169    }
170
171
172    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
173    {
174        if (stackMapAttribute.u2stackMapFramesCount > 0)
175        {
176            stackMapAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
177        }
178    }
179
180
181    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
182    {
183        if (stackMapTableAttribute.u2stackMapFramesCount > 0)
184        {
185            stackMapTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
186        }
187    }
188
189
190    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
191    {
192        if (lineNumberTableAttribute.u2lineNumberTableLength > 0)
193        {
194            lineNumberTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
195        }
196    }
197
198
199    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
200    {
201        if (localVariableTableAttribute.u2localVariableTableLength > 0)
202        {
203            localVariableTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
204        }
205    }
206
207
208    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
209    {
210        if (localVariableTypeTableAttribute.u2localVariableTypeTableLength > 0)
211        {
212            localVariableTypeTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
213        }
214    }
215
216
217    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
218    {
219        if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0)
220        {
221            runtimeVisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
222        }
223    }
224
225
226    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
227    {
228        if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0)
229        {
230            runtimeVisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
231        }
232    }
233
234
235    public void visitRuntimeVisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleAnnotationsAttribute runtimeVisibleAnnotationsAttribute)
236    {
237        if (runtimeVisibleAnnotationsAttribute.u2annotationsCount > 0)
238        {
239            runtimeVisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
240        }
241    }
242
243
244    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
245    {
246        if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0)
247        {
248            runtimeInvisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
249        }
250    }
251
252
253    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
254    {
255        if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0)
256        {
257            runtimeInvisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
258        }
259    }
260
261
262    public void visitRuntimeInvisibleAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleAnnotationsAttribute runtimeInvisibleAnnotationsAttribute)
263    {
264        if (runtimeInvisibleAnnotationsAttribute.u2annotationsCount > 0)
265        {
266            runtimeInvisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
267        }
268    }
269
270
271    public void visitRuntimeVisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute runtimeVisibleParameterAnnotationsAttribute)
272    {
273        if (runtimeVisibleParameterAnnotationsAttribute.u2parametersCount > 0)
274        {
275            runtimeVisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
276        }
277    }
278
279
280    public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute)
281    {
282        if (runtimeInvisibleParameterAnnotationsAttribute.u2parametersCount > 0)
283        {
284            runtimeInvisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
285        }
286    }
287
288
289    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
290    {
291        annotationDefaultAttribute.accept(clazz, method, attributeVisitor);
292    }
293}
294