@@ -364,105 +364,110 @@ public void visit(MethodInvocationExpression expression) {
364364 @ Override
365365 public void visit (MethodInvocationExpression expression ) {
366366 ClassFileMethodInvocationExpression mie = (ClassFileMethodInvocationExpression )expression ;
367- BaseType parameterTypes = mie .getParameterTypes ();
368- BaseExpression parameters = mie .getParameters ();
369- Expression exp = mie .getExpression ();
370- Type expressionType = exp .getType ();
371367
372- if (staticMethod || (mie .getTypeParameters () != null ) || !mie .getInternalTypeName ().equals (internalTypeName )) {
373- TypeMaker .TypeTypes typeTypes = typeMaker .makeTypeTypes (mie .getInternalTypeName ());
374-
375- if (typeTypes != null ) {
376- BaseTypeParameter typeParameters = typeTypes .typeParameters ;
377- BaseTypeParameter methodTypeParameters = mie .getTypeParameters ();
378- BaseTypeArgument typeArguments ;
379-
380- if (exp .isSuperExpression ()) {
381- typeTypes = typeMaker .makeTypeTypes (internalTypeName );
382- typeArguments = (typeTypes .superType == null ) ? null : typeTypes .superType .getTypeArguments ();
383- } else if (exp .isMethodInvocationExpression ()) {
384- Type t = getExpressionType ((ClassFileMethodInvocationExpression ) exp );
385- if ((t != null ) && t .isObjectType ()) {
386- typeArguments = ((ObjectType )t ).getTypeArguments ();
387- } else {
388- typeArguments = null ;
389- }
390- } else if (expressionType .isGenericType ()) {
391- BaseType typeBound = contextualTypeBounds .get (expressionType .getName ());
368+ if (! mie .isBinded ()) {
369+ BaseType parameterTypes = mie .getParameterTypes ();
370+ BaseExpression parameters = mie .getParameters ();
371+ Expression exp = mie .getExpression ();
372+ Type expressionType = exp .getType ();
373+
374+ if (staticMethod || (mie .getTypeParameters () != null ) || !mie .getInternalTypeName ().equals (internalTypeName )) {
375+ TypeMaker .TypeTypes typeTypes = typeMaker .makeTypeTypes (mie .getInternalTypeName ());
376+
377+ if (typeTypes != null ) {
378+ BaseTypeParameter typeParameters = typeTypes .typeParameters ;
379+ BaseTypeParameter methodTypeParameters = mie .getTypeParameters ();
380+ BaseTypeArgument typeArguments ;
381+
382+ if (exp .isSuperExpression ()) {
383+ typeTypes = typeMaker .makeTypeTypes (internalTypeName );
384+ typeArguments = (typeTypes .superType == null ) ? null : typeTypes .superType .getTypeArguments ();
385+ } else if (exp .isMethodInvocationExpression ()) {
386+ Type t = getExpressionType ((ClassFileMethodInvocationExpression ) exp );
387+ if ((t != null ) && t .isObjectType ()) {
388+ typeArguments = ((ObjectType )t ).getTypeArguments ();
389+ } else {
390+ typeArguments = null ;
391+ }
392+ } else if (expressionType .isGenericType ()) {
393+ BaseType typeBound = contextualTypeBounds .get (expressionType .getName ());
392394
393- if (typeBound != null ) {
394- getTypeArgumentVisitor .init ();
395- typeBound .accept (getTypeArgumentVisitor );
396- typeArguments = getTypeArgumentVisitor .getTypeArguments ();
395+ if (typeBound != null ) {
396+ getTypeArgumentVisitor .init ();
397+ typeBound .accept (getTypeArgumentVisitor );
398+ typeArguments = getTypeArgumentVisitor .getTypeArguments ();
399+ } else {
400+ typeArguments = null ;
401+ }
397402 } else {
398- typeArguments = null ;
403+ typeArguments = (( ObjectType ) expressionType ). getTypeArguments () ;
399404 }
400- } else {
401- typeArguments = ((ObjectType )expressionType ).getTypeArguments ();
402- }
403405
404- Type t = mie .getType ();
406+ Type t = mie .getType ();
405407
406- if (type .isObjectType () && t .isObjectType ()) {
407- ObjectType objectType = (ObjectType ) type ;
408- ObjectType mieTypeObjectType = (ObjectType ) t ;
409- t = typeMaker .searchSuperParameterizedType (objectType , mieTypeObjectType );
410- if (t == null ) {
411- t = mie .getType ();
408+ if (type .isObjectType () && t .isObjectType ()) {
409+ ObjectType objectType = (ObjectType ) type ;
410+ ObjectType mieTypeObjectType = (ObjectType ) t ;
411+ t = typeMaker .searchSuperParameterizedType (objectType , mieTypeObjectType );
412+ if (t == null ) {
413+ t = mie .getType ();
414+ }
412415 }
413- }
414416
415- Map <String , TypeArgument > bindings = new HashMap <>();
416- boolean partialBinding = populateBindings (bindings , exp , typeParameters , typeArguments , methodTypeParameters , type , t , parameterTypes , parameters );
417+ Map <String , TypeArgument > bindings = new HashMap <>();
418+ boolean partialBinding = populateBindings (bindings , exp , typeParameters , typeArguments , methodTypeParameters , type , t , parameterTypes , parameters );
417419
418- mie .setParameterTypes (parameterTypes = bind (bindings , parameterTypes ));
419- mie .setType ((Type ) bind (bindings , mie .getType ()));
420+ mie .setParameterTypes (parameterTypes = bind (bindings , parameterTypes ));
421+ mie .setType ((Type ) bind (bindings , mie .getType ()));
420422
421- if ((methodTypeParameters != null ) && !partialBinding ) {
422- bindTypeParametersToNonWildcardTypeArgumentsVisitor .init (bindings );
423- methodTypeParameters .accept (bindTypeParametersToNonWildcardTypeArgumentsVisitor );
424- mie .setNonWildcardTypeArguments (bindTypeParametersToNonWildcardTypeArgumentsVisitor .getTypeArgument ());
425- }
423+ if ((methodTypeParameters != null ) && !partialBinding ) {
424+ bindTypeParametersToNonWildcardTypeArgumentsVisitor .init (bindings );
425+ methodTypeParameters .accept (bindTypeParametersToNonWildcardTypeArgumentsVisitor );
426+ mie .setNonWildcardTypeArguments (bindTypeParametersToNonWildcardTypeArgumentsVisitor .getTypeArgument ());
427+ }
426428
427- if (expressionType .isObjectType ()) {
428- ObjectType expressionObjectType = (ObjectType ) expressionType ;
429+ if (expressionType .isObjectType ()) {
430+ ObjectType expressionObjectType = (ObjectType ) expressionType ;
429431
430- if (bindings .isEmpty () || partialBinding ) {
431- expressionType = expressionObjectType .createType (null );
432- } else {
433- if (exp .isObjectTypeReferenceExpression () || (typeParameters == null )) {
432+ if (bindings .isEmpty () || partialBinding ) {
434433 expressionType = expressionObjectType .createType (null );
435- } else if (typeParameters .isList ()) {
436- TypeArguments tas = new TypeArguments (typeParameters .size ());
437- for (TypeParameter typeParameter : typeParameters ) {
438- tas .add (bindings .get (typeParameter .getIdentifier ()));
439- }
440- expressionType = expressionObjectType .createType (tas );
441434 } else {
442- expressionType = expressionObjectType .createType (bindings .get (typeParameters .getFirst ().getIdentifier ()));
435+ if (exp .isObjectTypeReferenceExpression () || (typeParameters == null )) {
436+ expressionType = expressionObjectType .createType (null );
437+ } else if (typeParameters .isList ()) {
438+ TypeArguments tas = new TypeArguments (typeParameters .size ());
439+ for (TypeParameter typeParameter : typeParameters ) {
440+ tas .add (bindings .get (typeParameter .getIdentifier ()));
441+ }
442+ expressionType = expressionObjectType .createType (tas );
443+ } else {
444+ expressionType = expressionObjectType .createType (bindings .get (typeParameters .getFirst ().getIdentifier ()));
445+ }
443446 }
444- }
445- } else if (expressionType .isGenericType ()) {
446- if (bindings .isEmpty () || partialBinding ) {
447- expressionType = ObjectType .TYPE_OBJECT ;
448- } else {
449- TypeArgument typeArgument = bindings .get (expressionType .getName ());
450- if (typeArgument == null ) {
447+ } else if (expressionType .isGenericType ()) {
448+ if (bindings .isEmpty () || partialBinding ) {
451449 expressionType = ObjectType .TYPE_OBJECT ;
452450 } else {
453- typeArgumentToTypeVisitor .init ();
454- typeArgument .accept (typeArgumentToTypeVisitor );
455- expressionType = typeArgumentToTypeVisitor .getType ();
451+ TypeArgument typeArgument = bindings .get (expressionType .getName ());
452+ if (typeArgument == null ) {
453+ expressionType = ObjectType .TYPE_OBJECT ;
454+ } else {
455+ typeArgumentToTypeVisitor .init ();
456+ typeArgument .accept (typeArgumentToTypeVisitor );
457+ expressionType = typeArgumentToTypeVisitor .getType ();
458+ }
456459 }
457460 }
458461 }
459462 }
460- }
461463
462- this .type = expressionType ;
463- exp .accept (this );
464+ this .type = expressionType ;
465+ exp .accept (this );
464466
465- bindParameters (parameterTypes , parameters );
467+ bindParameters (parameterTypes , parameters );
468+
469+ mie .setBinded (true );
470+ }
466471 }
467472
468473 @ Override
@@ -477,58 +482,63 @@ public void visit(LocalVariableReferenceExpression expression) {
477482 @ Override
478483 public void visit (NewExpression expression ) {
479484 ClassFileNewExpression ne = (ClassFileNewExpression )expression ;
480- BaseType parameterTypes = ne .getParameterTypes ();
481- BaseExpression parameters = ne .getParameters ();
482- ObjectType neObjectType = ne .getObjectType ();
483-
484- if (staticMethod || !neObjectType .getInternalName ().equals (internalTypeName )) {
485- TypeMaker .TypeTypes typeTypes = typeMaker .makeTypeTypes (neObjectType .getInternalName ());
486-
487- if (typeTypes != null ) {
488- BaseTypeParameter typeParameters = typeTypes .typeParameters ;
489- BaseTypeArgument typeArguments = neObjectType .getTypeArguments ();
490-
491- if ((typeParameters != null ) && (typeArguments == null )) {
492- if (typeParameters .isList ()) {
493- TypeArguments tas = new TypeArguments (typeParameters .size ());
494- for (TypeParameter typeParameter : typeParameters ) {
495- tas .add (new GenericType (typeParameter .getIdentifier ()));
485+
486+ if (! ne .isBinded ()) {
487+ BaseType parameterTypes = ne .getParameterTypes ();
488+ BaseExpression parameters = ne .getParameters ();
489+ ObjectType neObjectType = ne .getObjectType ();
490+
491+ if (staticMethod || !neObjectType .getInternalName ().equals (internalTypeName )) {
492+ TypeMaker .TypeTypes typeTypes = typeMaker .makeTypeTypes (neObjectType .getInternalName ());
493+
494+ if (typeTypes != null ) {
495+ BaseTypeParameter typeParameters = typeTypes .typeParameters ;
496+ BaseTypeArgument typeArguments = neObjectType .getTypeArguments ();
497+
498+ if ((typeParameters != null ) && (typeArguments == null )) {
499+ if (typeParameters .isList ()) {
500+ TypeArguments tas = new TypeArguments (typeParameters .size ());
501+ for (TypeParameter typeParameter : typeParameters ) {
502+ tas .add (new GenericType (typeParameter .getIdentifier ()));
503+ }
504+ neObjectType = neObjectType .createType (tas );
505+ } else {
506+ neObjectType = neObjectType .createType (new GenericType (typeParameters .getFirst ().getIdentifier ()));
496507 }
497- neObjectType = neObjectType .createType (tas );
498- } else {
499- neObjectType = neObjectType .createType (new GenericType (typeParameters .getFirst ().getIdentifier ()));
500508 }
501- }
502509
503- Type t = neObjectType ;
510+ Type t = neObjectType ;
504511
505- if (type .isObjectType ()) {
506- ObjectType objectType = (ObjectType )type ;
507- t = typeMaker .searchSuperParameterizedType (objectType , neObjectType );
508- if (t == null ) {
509- t = neObjectType ;
512+ if (type .isObjectType ()) {
513+ ObjectType objectType = (ObjectType )type ;
514+ t = typeMaker .searchSuperParameterizedType (objectType , neObjectType );
515+ if (t == null ) {
516+ t = neObjectType ;
517+ }
510518 }
511- }
512519
513- Map <String , TypeArgument > bindings = new HashMap <>();
514- boolean partialBinding = populateBindings (bindings , null , typeParameters , typeArguments , null , type , t , parameterTypes , parameters );
520+ Map <String , TypeArgument > bindings = new HashMap <>();
521+ boolean partialBinding = populateBindings (bindings , null , typeParameters , typeArguments , null , type , t , parameterTypes , parameters );
515522
516- ne .setParameterTypes (parameterTypes = bind (bindings , parameterTypes ));
523+ ne .setParameterTypes (parameterTypes = bind (bindings , parameterTypes ));
517524
518- // Replace wildcards
519- for (Map .Entry <String , TypeArgument > entry : bindings .entrySet ()) {
520- typeArgumentToTypeVisitor .init ();
521- entry .getValue ().accept (typeArgumentToTypeVisitor );
522- entry .setValue (typeArgumentToTypeVisitor .getType ());
523- }
525+ // Replace wildcards
526+ for (Map .Entry <String , TypeArgument > entry : bindings .entrySet ()) {
527+ typeArgumentToTypeVisitor .init ();
528+ entry .getValue ().accept (typeArgumentToTypeVisitor );
529+ entry .setValue (typeArgumentToTypeVisitor .getType ());
530+ }
524531
525- if (!partialBinding ) {
526- ne .setType ((ObjectType ) bind (bindings , neObjectType ));
532+ if (!partialBinding ) {
533+ ne .setType ((ObjectType ) bind (bindings , neObjectType ));
534+ }
527535 }
528536 }
529- }
530537
531- bindParameters (parameterTypes , parameters );
538+ bindParameters (parameterTypes , parameters );
539+
540+ ne .setBinded (true );
541+ }
532542 }
533543
534544 @ Override
0 commit comments