Skip to content

Commit

Permalink
Working MapStruct source presence check
Browse files Browse the repository at this point in the history
  • Loading branch information
kokorin authored and kokorin committed Dec 9, 2020
1 parent 5a25f8b commit 8e71059
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 43 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,29 @@ public void test() {
user.setName("to_be_updated");
user.setValue(42);

UserMapper mapper = Mappers.getMapper(UserMapper.class);
UserDto dto = new UserDto();

Assert.assertFalse(dto.hasName());
Assert.assertFalse(dto.hasValue());

mapper.updateUser(dto, user);

Assert.assertEquals("to_be_updated", user.getName());
Assert.assertEquals(42, user.getValue());

dto.setName("updated_name");
dto.setValue(146);
Assert.assertTrue(dto.hasName());
Assert.assertFalse(dto.hasValue());
Assert.assertTrue(dto.hasValue());

Mappers.getMapper(UserMapper.class).updateUser(dto, user);
mapper.updateUser(dto, user);

Assert.assertEquals("updated_name", user.getName());
Assert.assertEquals(42, user.getValue());
Assert.assertEquals(146, user.getValue());
}

@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
@Mapper
public interface UserMapper {
void updateUser(UserDto dto, @MappingTarget User user);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.github.kokorin.lombok.PresenceChecker;
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.Name;
Expand Down Expand Up @@ -115,9 +116,10 @@ private void createPresenceCheckerForField(JavacNode fieldNode) {

JCTree.JCVariableDecl presenceCheckerFieldDecl = createPresenceCheckerField(fieldNode, treeMaker);
JavacNode presenceCheckerField = injectField(fieldNode.up(), presenceCheckerFieldDecl);

Type booleanType = treeMaker.Literal(false).type;
JCTree.JCMethodDecl presenceCheckerMethod = createPresenceCheckerMethod(presenceCheckerField, treeMaker);
injectMethod(fieldNode.up(), presenceCheckerMethod);
injectMethod(fieldNode.up(), presenceCheckerMethod, List.<Type>nil(), booleanType);
//injectMethod(fieldNode.up(), presenceCheckerMethod, List.<Type>nil(), getMirrorForFieldType(fieldNode));

JCTree.JCMethodDecl setterMethodDecl = (JCTree.JCMethodDecl) setterMethod.get();

Expand Down Expand Up @@ -175,10 +177,10 @@ private JCTree.JCMethodDecl createPresenceCheckerMethod(long access, JavacNode p
return decl;
}

private JCTree.JCVariableDecl createPresenceCheckerField(JavacNode fieldNode, JavacTreeMaker maker) {
private JCTree.JCVariableDecl createPresenceCheckerField(JavacNode fieldNode, JavacTreeMaker treeMaker) {
Name valueName = fieldNode.toName(toHasName(fieldNode));

return maker.VarDef(maker.Modifiers(Flags.PRIVATE), valueName, maker.TypeIdent(CTC_BOOLEAN), null);
return treeMaker.VarDef(treeMaker.Modifiers(Flags.PRIVATE), valueName, treeMaker.TypeIdent(CTC_BOOLEAN), null);
}

private List<JCTree.JCStatement> createPresenceCheckerBody(JavacTreeMaker treeMaker, JavacNode field) {
Expand Down

0 comments on commit 8e71059

Please sign in to comment.