diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2019-12-19 03:19:24 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-19 03:19:24 +0100 |
commit | 859c1149727a98648ab9ad2763f26f351448851f (patch) | |
tree | 32ee4b7f1ca798642aebad359e6a40fbdd539f87 /src/core | |
parent | 1b0055893822a7edc135e5c7bdcbbd63584dec2a (diff) | |
parent | 31086f05ac06f19da2b5b3aba364e8bdad40a85a (diff) | |
download | lombok-859c1149727a98648ab9ad2763f26f351448851f.tar.gz lombok-859c1149727a98648ab9ad2763f26f351448851f.tar.bz2 lombok-859c1149727a98648ab9ad2763f26f351448851f.zip |
Merge pull request #2273 from Lekanich/issue2262
Fixed @SuperBuilder with generic with inner static class produces CE
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/lombok/javac/handlers/HandleSuperBuilder.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index 0f809571..83dc23d1 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -26,6 +26,7 @@ import static lombok.javac.Javac.*; import static lombok.javac.handlers.JavacHandlerUtil.*; import java.util.ArrayList; +import java.util.Collections; import javax.lang.model.element.Modifier; @@ -1007,8 +1008,35 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> { typeParamsForBuilderParameter.add(maker.Ident(((JCTypeParameter)typeParam).getName())); } else if (typeParam instanceof JCIdent) { typeParamsForBuilderParameter.add(maker.Ident(((JCIdent)typeParam).getName())); + } else if (typeParam instanceof JCFieldAccess) { + typeParamsForBuilderParameter.add(copySelect(maker, (JCFieldAccess) typeParam)); } } return typeParamsForBuilderParameter; } + + private JCExpression copySelect(JavacTreeMaker maker, JCFieldAccess typeParam) { + java.util.List<Name> chainNames = new ArrayList<Name>(); + JCExpression expression = typeParam; + while (expression != null) { + if (expression instanceof JCFieldAccess) { + chainNames.add(((JCFieldAccess) expression).getIdentifier()); + expression = ((JCFieldAccess) expression).getExpression(); + } else if (expression instanceof JCIdent) { + chainNames.add(((JCIdent) expression).getName()); + expression = null; + } + } + + Collections.reverse(chainNames); + JCExpression typeParameter = null; + for (Name name : chainNames) { + if (typeParameter == null) { + typeParameter = maker.Ident(name); + } else { + typeParameter = maker.Select(typeParameter, name); + } + } + return typeParameter; + } } |