|
87 | 87 | import static org.objectweb.asm.Opcodes.ACC_FINAL; |
88 | 88 | import static org.objectweb.asm.Opcodes.ACC_INTERFACE; |
89 | 89 | import static org.objectweb.asm.Opcodes.ACC_PRIVATE; |
| 90 | +import static org.objectweb.asm.Opcodes.ACC_PROTECTED; |
90 | 91 | import static org.objectweb.asm.Opcodes.ACC_PUBLIC; |
91 | 92 | import static org.objectweb.asm.Opcodes.ACC_STATIC; |
92 | 93 | import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC; |
@@ -569,43 +570,55 @@ private void processField(final FieldNode field, final MethodNode initializer, f |
569 | 570 | } |
570 | 571 |
|
571 | 572 | private MethodNode processMethod(final ClassNode traitClass, final ClassNode traitHelperClass, final MethodNode methodNode, final ClassNode fieldHelper, final Collection<String> knownFields) { |
572 | | - Parameter[] initialParams = methodNode.getParameters(); |
573 | | - Parameter[] newParams = new Parameter[initialParams.length + 1]; |
574 | | - newParams[0] = createSelfParameter(traitClass, methodNode.isStatic()); |
575 | | - System.arraycopy(initialParams, 0, newParams, 1, initialParams.length); |
576 | | - final int mod = methodNode.isPrivate() ? ACC_PRIVATE : ACC_PUBLIC | (methodNode.isFinal() ? ACC_FINAL : 0); |
| 573 | + boolean isAbstractMethod = methodNode.isAbstract(); |
| 574 | + boolean isPrivateMethod = methodNode.isPrivate(); |
| 575 | + boolean isStaticMethod = methodNode.isStatic(); |
| 576 | + |
| 577 | + int modifiers = ACC_PUBLIC; |
| 578 | + if (isAbstractMethod) { |
| 579 | + modifiers |= ACC_ABSTRACT; |
| 580 | + } else { |
| 581 | + // public or private |
| 582 | + if (isPrivateMethod) { |
| 583 | + modifiers ^= ACC_PUBLIC | (!isStaticMethod ? ACC_PRIVATE : ACC_PROTECTED); // GROOVY-11776 |
| 584 | + } |
| 585 | + // static or final (maybe) |
| 586 | + if (!isStaticMethod && methodNode.isFinal()) { |
| 587 | + modifiers |= ACC_FINAL; |
| 588 | + } |
| 589 | + modifiers |= ACC_STATIC; |
| 590 | + } |
| 591 | + |
| 592 | + Parameter[] methodParams = methodNode.getParameters(); |
| 593 | + Parameter[] helperParams = new Parameter[methodParams.length + 1]; |
| 594 | + helperParams[0] = createSelfParameter(traitClass, isStaticMethod); |
| 595 | + System.arraycopy(methodParams, 0, helperParams, 1, methodParams.length); |
| 596 | + |
577 | 597 | MethodNode mNode = new MethodNode( |
578 | 598 | methodNode.getName(), |
579 | | - mod | ACC_STATIC, |
| 599 | + modifiers, |
580 | 600 | methodNode.getReturnType(), |
581 | | - newParams, |
| 601 | + helperParams, |
582 | 602 | methodNode.getExceptions(), |
583 | | - processBody(varX(newParams[0]), methodNode.getCode(), traitClass, traitHelperClass, fieldHelper, knownFields) |
| 603 | + processBody(varX(helperParams[0]), methodNode.getCode(), traitClass, traitHelperClass, fieldHelper, knownFields) |
584 | 604 | ); |
585 | | - mNode.setSourcePosition(methodNode); |
586 | | - mNode.addAnnotations(filterAnnotations(methodNode.getAnnotations())); |
587 | | - mNode.setGenericsTypes(methodNode.getGenericsTypes()); |
588 | | - if (methodNode.isAbstract()) { |
589 | | - mNode.setModifiers(ACC_PUBLIC | ACC_ABSTRACT); |
590 | | - } else { |
591 | | - methodNode.addAnnotation(new AnnotationNode(Traits.IMPLEMENTED_CLASSNODE)); |
| 605 | + for (AnnotationNode annotation : methodNode.getAnnotations()) { |
| 606 | + if (!annotation.getClassNode().equals(OVERRIDE_TYPE)) { |
| 607 | + mNode.addAnnotation(annotation); |
| 608 | + } |
592 | 609 | } |
593 | | - methodNode.setCode(null); |
| 610 | + mNode.setGenericsTypes(methodNode.getGenericsTypes()); |
| 611 | + mNode.setSourcePosition(methodNode); |
594 | 612 |
|
595 | | - if (!methodNode.isPrivate() && !methodNode.isStatic()) { |
| 613 | + if (!isAbstractMethod) { |
| 614 | + methodNode.addAnnotation(Traits.IMPLEMENTED_CLASSNODE); |
| 615 | + } |
| 616 | + if (!isPrivateMethod && !isStaticMethod) { |
596 | 617 | methodNode.setModifiers(ACC_PUBLIC | ACC_ABSTRACT); |
597 | 618 | } |
598 | | - return mNode; |
599 | | - } |
| 619 | + methodNode.setCode(null); |
600 | 620 |
|
601 | | - private static List<AnnotationNode> filterAnnotations(final List<AnnotationNode> annotations) { |
602 | | - List<AnnotationNode> result = new ArrayList<>(annotations.size()); |
603 | | - for (AnnotationNode annotation : annotations) { |
604 | | - if (!annotation.getClassNode().equals(OVERRIDE_TYPE)) { |
605 | | - result.add(annotation); |
606 | | - } |
607 | | - } |
608 | | - return result; |
| 621 | + return mNode; |
609 | 622 | } |
610 | 623 |
|
611 | 624 | private static Parameter createSelfParameter(final ClassNode traitClass, boolean isStatic) { |
|
0 commit comments