1515import org .jd .core .v1 .model .javasyntax .statement .BaseStatement ;
1616import org .jd .core .v1 .model .javasyntax .statement .ExpressionStatement ;
1717import org .jd .core .v1 .model .javasyntax .statement .Statement ;
18+ import org .jd .core .v1 .model .javasyntax .statement .Statements ;
1819import org .jd .core .v1 .model .javasyntax .type .PrimitiveType ;
1920import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileBodyDeclaration ;
21+ import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileConstructorOrMethodDeclaration ;
2022import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileFieldDeclaration ;
2123import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileStaticInitializerDeclaration ;
2224import org .jd .core .v1 .util .DefaultList ;
2325
2426import java .util .Iterator ;
27+ import java .util .List ;
2528
2629public class InitStaticFieldVisitor extends AbstractJavaSyntaxVisitor {
2730 protected SearchFirstLineNumberVisitor searchFirstLineNumberVisitor = new SearchFirstLineNumberVisitor ();
31+ protected SearchLocalVariableReferenceVisitor searchLocalVariableReferenceVisitor = new SearchLocalVariableReferenceVisitor ();
2832 protected String internalTypeName ;
2933 protected DefaultList <FieldDeclarator > fields = new DefaultList <>();
30- protected ClassFileStaticInitializerDeclaration staticDeclaration ;
34+ protected List <ClassFileConstructorOrMethodDeclaration > methods ;
35+ protected Boolean deleteStaticDeclaration ;
3136
3237 public void setInternalTypeName (String internalTypeName ) {
3338 this .internalTypeName = internalTypeName ;
3439 }
3540
3641 @ Override
3742 public void visit (AnnotationDeclaration declaration ) {
43+ this .internalTypeName = declaration .getInternalTypeName ();
3844 safeAccept (declaration .getBodyDeclaration ());
3945 }
4046
@@ -59,19 +65,36 @@ public void visit(InterfaceDeclaration declaration) {
5965 @ Override
6066 public void visit (BodyDeclaration declaration ) {
6167 ClassFileBodyDeclaration bodyDeclaration = (ClassFileBodyDeclaration )declaration ;
68+
6269 // Store field declarations
6370 fields .clear ();
64- staticDeclaration = null ;
6571 safeAcceptListDeclaration (bodyDeclaration .getFieldDeclarations ());
6672
6773 if (!fields .isEmpty ()) {
68- // Visit methods
69- safeAcceptListDeclaration (bodyDeclaration .getMethodDeclarations ());
70- }
74+ methods = bodyDeclaration .getMethodDeclarations ();
75+
76+ if (methods != null ) {
77+ deleteStaticDeclaration = null ;
7178
72- if ((staticDeclaration != null ) && (staticDeclaration .getStatements () == null )) {
73- bodyDeclaration .getMethodDeclarations ().remove (staticDeclaration );
79+ for (int i =0 , len =methods .size (); i <len ; i ++) {
80+ methods .get (i ).accept (this );
81+
82+ if (deleteStaticDeclaration != null ) {
83+ if (deleteStaticDeclaration .booleanValue ()) {
84+ methods .remove (i );
85+ }
86+ break ;
87+ }
88+ }
89+ }
7490 }
91+
92+ safeAcceptListDeclaration (bodyDeclaration .getInnerTypeDeclarations ());
93+ }
94+
95+ @ Override
96+ public void visit (FieldDeclarator declaration ) {
97+ fields .add (declaration );
7598 }
7699
77100 @ Override
@@ -80,101 +103,173 @@ public void visit(ConstructorDeclaration declaration) {}
80103 @ Override
81104 public void visit (MethodDeclaration declaration ) {}
82105
106+ @ Override
107+ public void visit (InstanceInitializerDeclaration declaration ) {}
108+
83109 @ Override
84110 @ SuppressWarnings ("unchecked" )
85111 public void visit (StaticInitializerDeclaration declaration ) {
86- staticDeclaration = (ClassFileStaticInitializerDeclaration ) declaration ;
112+ ClassFileStaticInitializerDeclaration sid = (ClassFileStaticInitializerDeclaration ) declaration ;
87113
88- BaseStatement statements = staticDeclaration .getStatements ();
114+ BaseStatement statements = sid .getStatements ();
89115
90- if (( statements != null ) && ( statements . size () > 0 ) ) {
116+ if (statements != null ) {
91117 if (statements .isList ()) {
92- Statement statement = statements .getFirst ();
118+ // Multiple statements
119+ if ((statements .size () > 0 ) && isAssertionsDisabled (statements .getFirst ())) {
120+ // Remove assert initialization statement
121+ statements .getList ().removeFirst ();
122+ }
123+
124+ if (statements .size () > 0 ) {
125+ DefaultList <Statement > list = statements .getList ();
126+ Iterator <FieldDeclarator > fieldDeclaratorIterator = fields .iterator ();
127+ // int lastLineNumber = 0;
128+
129+ for (int i =0 , len =list .size (); i <len ; i ++) {
130+ Statement statement = list .get (i );
93131
94- if ((statement .getClass () == ExpressionStatement .class )) {
95- ExpressionStatement cdes = (ExpressionStatement ) statement ;
132+ if (setStaticFieldInitializer (statement , fieldDeclaratorIterator )) {
133+ if (i > 0 ) {
134+ // Split 'static' block
135+ BaseStatement newStatements ;
96136
97- if (cdes .getExpression ().getClass () == BinaryOperatorExpression .class ) {
98- BinaryOperatorExpression cfboe = (BinaryOperatorExpression ) cdes .getExpression ();
137+ if (i == 1 ) {
138+ newStatements = list .removeFirst ();
139+ } else {
140+ List <Statement > subList = list .subList (0 , i );
141+ newStatements = new Statements (subList );
142+ subList .clear ();
143+ }
99144
100- if (cfboe .getLeftExpression ().getClass () == FieldReferenceExpression .class ) {
101- FieldReferenceExpression fre = (FieldReferenceExpression ) cfboe .getLeftExpression ();
145+ // Removes statements from original list
146+ len -= newStatements .size ();
147+ i = 0 ;
102148
103- if ((fre .getType () == PrimitiveType .TYPE_BOOLEAN ) && fre .getInternalTypeName ().equals (internalTypeName ) && fre .getName ().equals ("$assertionsDisabled" )) {
104- // Remove assert initialization statement
105- statements .getList ().removeFirst ();
149+ addStaticInitializerDeclaration (sid , getFirstLineNumber (newStatements ), newStatements );
106150 }
151+
152+ // Remove field initialization statement
153+ list .remove (i --);
154+ len --;
155+ // TODO Fix problem with local variable declarations before split static block
156+ // lastLineNumber = 0;
157+ // } else {
158+ // int newLineNumber = getFirstLineNumber(statement);
159+ //
160+ // if ((lastLineNumber > 0) && (newLineNumber > 0) && (lastLineNumber + 3 < newLineNumber)) {
161+ // // Split 'static' block
162+ // BaseStatement newStatements;
163+ //
164+ // if (i == 1) {
165+ // newStatements = list.removeFirst();
166+ // } else {
167+ // List<Statement> subList = list.subList(0, i);
168+ // newStatements = new Statements(subList);
169+ // subList.clear();
170+ // }
171+ //
172+ // // Removes statements from original list
173+ // len -= newStatements.size();
174+ // i = 0;
175+ //
176+ // addStaticInitializerDeclaration(sid, newLineNumber, newStatements);
177+ // }
178+ //
179+ // lastLineNumber = newLineNumber;
107180 }
108181 }
109182 }
183+ } else {
184+ // Single statement
185+ if (isAssertionsDisabled (statements .getFirst ())) {
186+ // Remove assert initialization statement
187+ statements = null ;
188+ }
189+ if ((statements != null ) && setStaticFieldInitializer (statements .getFirst (), fields .iterator ())) {
190+ // Remove field initialization statement
191+ statements = null ;
192+ }
193+ }
194+
195+ if ((statements == null ) || (statements .size () == 0 )) {
196+ deleteStaticDeclaration = Boolean .TRUE ;
197+ } else {
198+ int firstLineNumber = getFirstLineNumber (statements );
199+ sid .setFirstLineNumber ((firstLineNumber ==-1 ) ? 0 : firstLineNumber );
200+ deleteStaticDeclaration = Boolean .FALSE ;
110201 }
202+ }
203+ }
111204
112- Iterator <Statement > statementIterator = statements .iterator ();
113- Iterator <FieldDeclarator > fieldDeclaratorIterator = fields .iterator ();
205+ protected boolean isAssertionsDisabled (Statement statement ) {
206+ if ((statement .getClass () == ExpressionStatement .class )) {
207+ ExpressionStatement cdes = (ExpressionStatement ) statement ;
114208
115- while ( statementIterator . hasNext () ) {
116- Statement statement = statementIterator . next ();
209+ if ( cdes . getExpression (). getClass () == BinaryOperatorExpression . class ) {
210+ BinaryOperatorExpression cfboe = ( BinaryOperatorExpression ) cdes . getExpression ();
117211
118- if (statement .getClass () != ExpressionStatement .class ) {
119- break ;
212+ if (cfboe .getLeftExpression ().getClass () == FieldReferenceExpression .class ) {
213+ FieldReferenceExpression fre = (FieldReferenceExpression ) cfboe .getLeftExpression ();
214+
215+ if ((fre .getType () == PrimitiveType .TYPE_BOOLEAN ) && fre .getInternalTypeName ().equals (internalTypeName ) && fre .getName ().equals ("$assertionsDisabled" )) {
216+ return true ;
217+ }
120218 }
219+ }
220+ }
121221
122- ExpressionStatement cdes = (ExpressionStatement ) statement ;
222+ return false ;
223+ }
123224
124- if ( cdes . getExpression (). getClass () != BinaryOperatorExpression . class ) {
125- break ;
126- }
225+ protected boolean setStaticFieldInitializer ( Statement statement , Iterator < FieldDeclarator > fieldDeclaratorIterator ) {
226+ if ( statement . getClass () == ExpressionStatement . class ) {
227+ ExpressionStatement cdes = ( ExpressionStatement ) statement ;
127228
229+ if (cdes .getExpression ().getClass () == BinaryOperatorExpression .class ) {
128230 BinaryOperatorExpression cfboe = (BinaryOperatorExpression ) cdes .getExpression ();
129231
130- if (cfboe .getLeftExpression ().getClass () != FieldReferenceExpression .class ) {
131- break ;
132- }
232+ if (cfboe .getLeftExpression ().getClass () == FieldReferenceExpression .class ) {
233+ FieldReferenceExpression fre = (FieldReferenceExpression ) cfboe .getLeftExpression ();
133234
134- FieldReferenceExpression fre = (FieldReferenceExpression ) cfboe .getLeftExpression ();
235+ if (fre .getInternalTypeName ().equals (internalTypeName )) {
236+ while (fieldDeclaratorIterator .hasNext ()) {
237+ FieldDeclarator fdr = fieldDeclaratorIterator .next ();
238+ FieldDeclaration fdn = fdr .getFieldDeclaration ();
135239
136- if (!fre .getInternalTypeName ().equals (internalTypeName )) {
137- break ;
138- }
240+ if (((fdn .getFlags () & Declaration .FLAG_STATIC ) != 0 ) && fdr .getName ().equals (fre .getName ()) && fdn .getType ().getDescriptor ().equals (fre .getDescriptor ())) {
241+ Expression expression = cfboe .getRightExpression ();
139242
140- FieldDeclarator fieldDeclarator = null ;
243+ searchLocalVariableReferenceVisitor .init (-1 );
244+ expression .accept (searchLocalVariableReferenceVisitor );
141245
142- while ( fieldDeclaratorIterator . hasNext ()) {
143- FieldDeclarator fdr = fieldDeclaratorIterator . next () ;
144- FieldDeclaration fdn = fdr . getFieldDeclaration ();
246+ if ( searchLocalVariableReferenceVisitor . containsReference ()) {
247+ return false ;
248+ }
145249
146- if (((fdn .getFlags () & Declaration .FLAG_STATIC ) != 0 ) && fdr .getName ().equals (fre .getName ()) && fdn .getType ().getDescriptor ().equals (fre .getDescriptor ())) {
147- fieldDeclarator = fdr ;
148- break ;
149- }
150- }
151-
152- if (fieldDeclarator == null ) {
153- break ;
154- } else {
155- Expression expression = cfboe .getRightExpression ();
250+ fdr .setVariableInitializer (new ExpressionVariableInitializer (expression ));
251+ ((ClassFileFieldDeclaration )fdr .getFieldDeclaration ()).setFirstLineNumber (expression .getLineNumber ());
156252
157- fieldDeclarator .setVariableInitializer (new ExpressionVariableInitializer (expression ));
158- ((ClassFileFieldDeclaration )fieldDeclarator .getFieldDeclaration ()).setFirstLineNumber (expression .getLineNumber ());
159- statementIterator .remove ();
253+ return true ;
254+ }
255+ }
256+ }
160257 }
161258 }
259+ }
162260
163- if (statements .size () == 0 ) {
164- staticDeclaration .setStatements (null );
165- staticDeclaration .setFirstLineNumber (0 );
166- } else {
167- searchFirstLineNumberVisitor .init ();
168- staticDeclaration .getStatements ().accept (searchFirstLineNumberVisitor );
169- int firstLineNumber = searchFirstLineNumberVisitor .getLineNumber ();
261+ return false ;
262+ }
170263
171- staticDeclaration .setFirstLineNumber ((firstLineNumber ==-1 ) ? 0 : firstLineNumber );
172- }
173- }
264+ protected int getFirstLineNumber (BaseStatement baseStatement ) {
265+ searchFirstLineNumberVisitor .init ();
266+ baseStatement .accept (searchFirstLineNumberVisitor );
267+ return searchFirstLineNumberVisitor .getLineNumber ();
174268 }
175269
176- @ Override
177- public void visit (FieldDeclarator declaration ) {
178- fields .add (declaration );
270+ protected void addStaticInitializerDeclaration (ClassFileStaticInitializerDeclaration sid , int lineNumber , BaseStatement statements ) {
271+ methods .add (new ClassFileStaticInitializerDeclaration (
272+ sid .getBodyDeclaration (), sid .getClassFile (), sid .getMethod (), sid .getBindings (),
273+ sid .getTypeBounds (), lineNumber , statements ));
179274 }
180275}
0 commit comments