@@ -144,7 +144,7 @@ public void visit(LambdaIdentifiersExpression expression) {
144144
145145 @ Override
146146 public void visit (ReturnExpressionStatement statement ) {
147- statement .setExpression (updateExpression (returnedType , statement .getExpression ()));
147+ statement .setExpression (updateExpression (returnedType , statement .getExpression (), false ));
148148 }
149149
150150 @ Override
@@ -211,7 +211,7 @@ public void visit(ExpressionVariableInitializer declaration) {
211211 nia .getArrayInitializer ().accept (this );
212212 type = t ;
213213 } else {
214- declaration .setExpression (updateExpression (type , expression ));
214+ declaration .setExpression (updateExpression (type , expression , false ));
215215 }
216216 }
217217
@@ -220,7 +220,8 @@ public void visit(SuperConstructorInvocationExpression expression) {
220220 BaseExpression parameters = expression .getParameters ();
221221
222222 if (parameters != null ) {
223- expression .setParameters (updateExpressions (((ClassFileSuperConstructorInvocationExpression )expression ).getParameterTypes (), parameters ));
223+ boolean force = containsNullExpression (parameters ) && typeMaker .multipleMethods (expression .getObjectType ().getInternalName (), "<init>" , parameters .size ());
224+ expression .setParameters (updateExpressions (((ClassFileSuperConstructorInvocationExpression )expression ).getParameterTypes (), parameters , force ));
224225 }
225226 }
226227
@@ -229,7 +230,8 @@ public void visit(ConstructorInvocationExpression expression) {
229230 BaseExpression parameters = expression .getParameters ();
230231
231232 if (parameters != null ) {
232- expression .setParameters (updateExpressions (((ClassFileConstructorInvocationExpression )expression ).getParameterTypes (), parameters ));
233+ boolean force = containsNullExpression (parameters ) && typeMaker .multipleMethods (expression .getObjectType ().getInternalName (), "<init>" , parameters .size ());
234+ expression .setParameters (updateExpressions (((ClassFileConstructorInvocationExpression )expression ).getParameterTypes (), parameters , force ));
233235 }
234236 }
235237
@@ -238,21 +240,35 @@ public void visit(MethodInvocationExpression expression) {
238240 BaseExpression parameters = expression .getParameters ();
239241
240242 if (parameters != null ) {
241- ClassFileMethodInvocationExpression mie = (ClassFileMethodInvocationExpression )expression ;
242-
243- parameters .accept (this );
244- expression .setParameters (updateExpressions (mie .getParameterTypes (), parameters ));
243+ boolean force = containsNullExpression (parameters ) && typeMaker .multipleMethods (expression .getInternalTypeName (), expression .getName (), parameters .size ());
244+ expression .setParameters (updateExpressions (((ClassFileMethodInvocationExpression )expression ).getParameterTypes (), parameters , force ));
245245 }
246246
247247 expression .getExpression ().accept (this );
248248 }
249249
250+ protected boolean containsNullExpression (BaseExpression parameters ) {
251+ switch (parameters .size ()) {
252+ case 0 :
253+ return false ;
254+ case 1 :
255+ return parameters .getFirst ().getClass () == NullExpression .class ;
256+ default :
257+ for (Expression parameter : parameters ) {
258+ if (parameter .getClass () == NullExpression .class ) {
259+ return true ;
260+ }
261+ }
262+ return false ;
263+ }
264+ }
265+
250266 @ Override
251267 public void visit (NewExpression expression ) {
252268 BaseExpression parameters = expression .getParameters ();
253269
254270 if (parameters != null ) {
255- expression .setParameters (updateExpressions (((ClassFileNewExpression )expression ).getParameterTypes (), parameters ));
271+ expression .setParameters (updateExpressions (((ClassFileNewExpression )expression ).getParameterTypes (), parameters , false ));
256272 }
257273 }
258274
@@ -277,7 +293,7 @@ public void visit(FieldReferenceExpression expression) {
277293 Type type = typeMaker .makeFromInternalTypeName (expression .getInternalTypeName ());
278294
279295 if (type .getName () != null ) {
280- expression .setExpression (updateExpression (type , exp ));
296+ expression .setExpression (updateExpression (type , exp , false ));
281297 }
282298 }
283299 }
@@ -299,7 +315,7 @@ public void visit(BinaryOperatorExpression expression) {
299315 }
300316 }
301317
302- expression .setRightExpression (updateExpression (expression .getLeftExpression ().getType (), rightExpression ));
318+ expression .setRightExpression (updateExpression (expression .getLeftExpression ().getType (), rightExpression , false ));
303319 return ;
304320 }
305321
@@ -312,30 +328,38 @@ public void visit(TernaryOperatorExpression expression) {
312328
313329 expression .getCondition ().accept (this );
314330
315- expression .setExpressionTrue (updateExpression (expressionType , expression .getExpressionTrue ()));
316- expression .setExpressionFalse (updateExpression (expressionType , expression .getExpressionFalse ()));
331+ expression .setExpressionTrue (updateExpression (expressionType , expression .getExpressionTrue (), false ));
332+ expression .setExpressionFalse (updateExpression (expressionType , expression .getExpressionFalse (), false ));
317333 }
318334
319335 @ SuppressWarnings ("unchecked" )
320- protected BaseExpression updateExpressions (BaseType types , BaseExpression expressions ) {
336+ protected BaseExpression updateExpressions (BaseType types , BaseExpression expressions , boolean force ) {
321337 if (expressions != null ) {
322338 if (expressions .isList ()) {
323339 DefaultList <Type > t = types .getList ();
324340 DefaultList <Expression > e = expressions .getList ();
325341
326342 for (int i = e .size () - 1 ; i >= 0 ; i --) {
327- e .set (i , updateExpression (t .get (i ), e .get (i )));
343+ e .set (i , updateExpression (t .get (i ), e .get (i ), force ));
328344 }
329345 } else {
330- expressions = updateExpression (types .getFirst (), (Expression ) expressions );
346+ expressions = updateExpression (types .getFirst (), (Expression ) expressions , force );
331347 }
332348 }
333349
334350 return expressions ;
335351 }
336352
337- private Expression updateExpression (Type type , Expression expression ) {
338- if (match (expression )) {
353+ private Expression updateExpression (Type type , Expression expression , boolean force ) {
354+ Class expressionClass = expression .getClass ();
355+
356+ if (expressionClass == NullExpression .class ) {
357+ if (force ) {
358+ searchFirstLineNumberVisitor .init ();
359+ expression .accept (searchFirstLineNumberVisitor );
360+ expression = new CastExpression (searchFirstLineNumberVisitor .getLineNumber (), type , expression );
361+ }
362+ } else {
339363 Type expressionType = expression .getType ();
340364
341365 if (!expressionType .equals (type ) && !TYPE_OBJECT .equals (type )) {
@@ -364,32 +388,21 @@ private Expression updateExpression(Type type, Expression expression) {
364388 }
365389 }
366390 }
367- }
368391
369- if (expression .getClass () == CastExpression .class ) {
370- CastExpression ce = (CastExpression )expression ;
371- Type ceExpressionType = ce .getExpression ().getType ();
392+ if (expression .getClass () == CastExpression .class ) {
393+ CastExpression ce = (CastExpression )expression ;
394+ Type ceExpressionType = ce .getExpression ().getType ();
372395
373- if (type .isObject () && ceExpressionType .isObject () && typeMaker .isAssignable (typeBounds , (ObjectType )type , (ObjectType )ceExpressionType )) {
374- // Remove cast expression
375- expression = ce .getExpression ();
396+ if (type .isObject () && ceExpressionType .isObject () && typeMaker .isAssignable (typeBounds , (ObjectType )type , (ObjectType )ceExpressionType )) {
397+ // Remove cast expression
398+ expression = ce .getExpression ();
399+ }
376400 }
377- }
378-
379- expression .accept (this );
380-
381- return expression ;
382- }
383-
384- private static final boolean match (Expression expression ) {
385- Class expressionClass = expression .getClass ();
386401
387- if (expressionClass == NullExpression .class ) {
388- // Do not add a cast before a null value
389- return false ;
402+ expression .accept (this );
390403 }
391404
392- return true ;
405+ return expression ;
393406 }
394407
395408 private Expression addCastExpression (Type type , Expression expression ) {
0 commit comments