mapstruct / mapstruct/mapstruct-idea

Completion for java "expression" does't work with DTO as records

Offen
#245 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Java
Sterne
168
Forks
41
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

Example mapper:

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING)
public interface OrderMapper {
    OrderGetAllDto toOrderDto(Order order);

    default <T, R> R mapFromAggregateReference(AggregateReference<T, R> aggregateReference) {
        if (aggregateReference == null) {
            return null;
        }
        return aggregateReference.getId();
    }

    @Mapping(target = "orderPaymentRefPayments", expression = "java(orderPaymentRefsToOrderPaymentRefPayments())")
    OrderDto toOrderGetOneDto(Order order);

    default Set<Long> orderPaymentRefsToOrderPaymentRefPayments(Set<OrderPaymentRef> orderPaymentRefs) {
        return orderPaymentRefs.stream()
            .map(OrderPaymentRef::getPayment)
            .map(AggregateReference::getId)
            .collect(Collectors.toSet());
    }
}

DTO as JAVA record:

public record OrderDto(Long id, String number, Integer owner, Set<Long> orderPaymentRefPayments,
                       List<OrderItemDto> orderItems, BigDecimal totalCost, LocalDateTime createdDate,
                       LocalDateTime lastModifiedDate) {
    /**
     * DTO for {@link OrderItem}
     */
    public record OrderItemDto(Long id, Long service, Integer quantity, String serviceName, BigDecimal price,
                               BigDecimal cost) {
    }
}

When writing an JAVA expression for

@Mapping(target = "orderPaymentRefPayments", expression = "java()")

completion hints are not displayed.
Because OrderDto is a record and it's not possible to resolve target type in sources org.mapstruct.intellij.expression.JavaExpressionInjector, see

PsiElement resolved = references[0].resolve();
                            if ( resolved instanceof PsiMethod resolvedPsiMethod ) {
                                PsiParameter[] psiParameters =
                                        resolvedPsiMethod.getParameterList().getParameters();
                                if ( psiParameters.length > 0) {
                                    targetType = psiParameters[0].getType();
                                }
                            }
                            else if ( resolved instanceof PsiParameter resolvedPsiParameter ) {
                                targetType = resolvedPsiParameter.getType();
                            }
                            else if ( resolved instanceof PsiField resolvedPsiField ) {
                                targetType = resolvedPsiField.getType();
                            }

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne in org.mapstruct.intellij.expression.JavaExpressionInjector und untersuche, wie das aufgelöste Ziel für Java-Ausdrücke in einen Typ umgewandelt wird. Reproduziere die Vervollständigungsanfrage mit dem OrderDto record und prüfe, dass Vervollständigungshinweise für orderPaymentRefPayments erscheinen; abgeschlossen ist die Aufgabe, wenn der Zieltyp der record component aufgelöst wird, ohne die bestehende Behandlung von Feldern, Methoden oder Parametern zu beeinträchtigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.