Skip to content

Commit 31dafec

Browse files
author
emmanue1
committed
Fix generic cast expression
1 parent 6288852 commit 31dafec

File tree

3 files changed

+144
-116
lines changed

3 files changed

+144
-116
lines changed

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/model/javasyntax/expression/ClassFileMethodInvocationExpression.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class ClassFileMethodInvocationExpression extends MethodInvocationExpress
1919
protected AbstractTypeParametersToTypeArgumentsBinder binder;
2020
protected BaseTypeParameter typeParameters;
2121
protected BaseType parameterTypes;
22+
protected boolean binded = false;
2223

2324
public ClassFileMethodInvocationExpression(
2425
AbstractTypeParametersToTypeArgumentsBinder binder,
@@ -45,4 +46,12 @@ public BaseType getParameterTypes() {
4546
public void setParameterTypes(BaseType parameterTypes) {
4647
this.parameterTypes = parameterTypes;
4748
}
49+
50+
public boolean isBinded() {
51+
return binded;
52+
}
53+
54+
public void setBinded(boolean binded) {
55+
this.binded = binded;
56+
}
4857
}

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/model/javasyntax/expression/ClassFileNewExpression.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
public class ClassFileNewExpression extends NewExpression {
1717
protected BaseType parameterTypes;
18+
protected boolean binded = false;
1819

1920
public ClassFileNewExpression(int lineNumber, ObjectType type) {
2021
super(lineNumber, type, null);
@@ -32,6 +33,14 @@ public void setParameterTypes(BaseType parameterTypes) {
3233
this.parameterTypes = parameterTypes;
3334
}
3435

36+
public boolean isBinded() {
37+
return binded;
38+
}
39+
40+
public void setBinded(boolean binded) {
41+
this.binded = binded;
42+
}
43+
3544
public void set(String descriptor, BaseType parameterTypes, BaseExpression parameters) {
3645
this.descriptor = descriptor;
3746
this.parameterTypes = parameterTypes;

src/main/java/org/jd/core/v1/service/converter/classfiletojavasyntax/util/Java5TypeParametersToTypeArgumentsBinder.java

Lines changed: 126 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)