77
88package org .jd .core .v1 .service .converter .classfiletojavasyntax .visitor ;
99
10- import org .jd .core .v1 .api .printer .Printer ;
1110import org .jd .core .v1 .model .javasyntax .AbstractJavaSyntaxVisitor ;
1211import org .jd .core .v1 .model .javasyntax .declaration .*;
1312import org .jd .core .v1 .model .javasyntax .expression .*;
1716import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileBodyDeclaration ;
1817import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileConstructorDeclaration ;
1918import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileFieldDeclaration ;
19+ import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .declaration .ClassFileMethodDeclaration ;
2020import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .expression .ClassFileConstructorInvocationExpression ;
2121import org .jd .core .v1 .service .converter .classfiletojavasyntax .model .javasyntax .expression .ClassFileSuperConstructorInvocationExpression ;
2222import org .jd .core .v1 .util .DefaultList ;
2323
2424import java .util .*;
2525
26+ import static org .jd .core .v1 .api .printer .Printer .UNKNOWN_LINE_NUMBER ;
27+
2628public class InitInstanceFieldVisitor extends AbstractJavaSyntaxVisitor {
2729 protected SearchFirstLineNumberVisitor searchFirstLineNumberVisitor = new SearchFirstLineNumberVisitor ();
2830 protected HashMap <String , FieldDeclarator > fieldDeclarators = new HashMap <>();
2931 protected DefaultList <Data > datas = new DefaultList <>();
3032 protected DefaultList <BinaryOperatorExpression > putFields = new DefaultList <>();
33+ protected int lineNumber = UNKNOWN_LINE_NUMBER ;
3134 protected boolean containsLocalVariableReference ;
3235
3336 @ Override
@@ -89,7 +92,27 @@ public void visit(ConstructorDeclaration declaration) {
8992 datas .add (new Data (cfcd , statements , iterator .nextIndex ()));
9093
9194 if (datas .size () == 1 ) {
92- int firstLineNumber = superConstructorCall .getDescriptor ().equals ("()V" ) ? Printer .UNKNOWN_LINE_NUMBER : superConstructorCall .getLineNumber ();
95+ int firstLineNumber = superConstructorCall .getLineNumber ();
96+
97+ if (superConstructorCall .getDescriptor ().equals ("()V" ) && (firstLineNumber != UNKNOWN_LINE_NUMBER )) {
98+ if ((lineNumber == UNKNOWN_LINE_NUMBER ) || (lineNumber >= firstLineNumber )) {
99+ ListIterator <Statement > li = statements .listIterator (iterator .nextIndex ());
100+
101+ while (li .hasNext ()) {
102+ searchFirstLineNumberVisitor .init ();
103+ li .next ().accept (searchFirstLineNumberVisitor );
104+ int ln = searchFirstLineNumberVisitor .getLineNumber ();
105+ if ((ln != UNKNOWN_LINE_NUMBER ) && (ln < firstLineNumber )) {
106+ break ;
107+ }
108+ }
109+
110+ if (!li .hasNext ()) {
111+ firstLineNumber = UNKNOWN_LINE_NUMBER ;
112+ }
113+ }
114+ }
115+
93116 initPutFields (internalTypeName , firstLineNumber , iterator );
94117 } else {
95118 filterPutFields (internalTypeName , iterator );
@@ -99,7 +122,9 @@ public void visit(ConstructorDeclaration declaration) {
99122 }
100123
101124 @ Override
102- public void visit (MethodDeclaration declaration ) {}
125+ public void visit (MethodDeclaration declaration ) {
126+ lineNumber = ((ClassFileMethodDeclaration )declaration ).getFirstLineNumber ();
127+ }
103128
104129 @ Override
105130 public void visit (NewExpression expression ) {
@@ -190,7 +215,7 @@ protected void initPutFields(String internalTypeName, int firstLineNumber, ListI
190215 int lastLineNumber ;
191216
192217 if (expression == null ) {
193- lastLineNumber = (firstLineNumber == Printer . UNKNOWN_LINE_NUMBER ) ? Printer . UNKNOWN_LINE_NUMBER : firstLineNumber +1 ;
218+ lastLineNumber = (firstLineNumber == UNKNOWN_LINE_NUMBER ) ? UNKNOWN_LINE_NUMBER : firstLineNumber +1 ;
194219 } else {
195220 lastLineNumber = expression .getLineNumber ();
196221 }
0 commit comments