mapstruct / mapstruct/mapstruct-idea

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

Ouverte
#245 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Java
Étoiles
168
Forks
41
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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

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

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

default Set orderPaymentRefsToOrderPaymentRefPayments(Set 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 orderPaymentRefPayments,
List 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();
}
```

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans org.mapstruct.intellij.expression.JavaExpressionInjector et examinez comment la cible résolue est convertie en type pour les expressions Java. Reproduisez la requête de complétion avec le record OrderDto et vérifiez que des suggestions de complétion apparaissent pour orderPaymentRefPayments ; c’est terminé lorsque le type cible du composant du record est résolu sans régression dans la gestion existante des champs, méthodes ou paramètres.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
java
Domaine
devtools
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.