Skip to content

Commit ce85c9c

Browse files
SentryManrbygrave
andauthored
Enable package-private Getters/Setters/Constructors (#251)
* only write to .jsonb when packages are split * allow package-private methods/constructors * Update AdapterName.java * Update PackagePrivate.java * use modules to determine if it's imported * I guess no pkg private classes * fix pkg private classes * Format only changes --------- Co-authored-by: Rob Bygrave <robin.bygrave@gmail.com>
1 parent 9a75c17 commit ce85c9c

File tree

11 files changed

+74
-28
lines changed

11 files changed

+74
-28
lines changed

jsonb-generator/src/main/java/io/avaje/jsonb/generator/AdapterName.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ final class AdapterName {
1919
} else {
2020
shortName = name;
2121
}
22-
this.adapterPackage = "".equals(originPackage) ? "jsonb" : originPackage + ".jsonb";
22+
if ("".equals(originPackage)) {
23+
this.adapterPackage = "jsonb";
24+
} else {
25+
this.adapterPackage = ProcessingContext.isImported(origin) ? originPackage + ".jsonb" : originPackage;
26+
}
2327
this.fullName = adapterPackage + "." + shortName + "JsonAdapter";
2428
}
2529

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ClassReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private Set<String> importTypes() {
171171
if (!hasSubTypes) {
172172
importTypes.add(Constants.METHODHANDLE);
173173
}
174-
if (Util.validImportType(type)) {
174+
if (Util.validImportType(type) && !ProcessingContext.isImported(beanType)) {
175175
importTypes.add(type);
176176
}
177177
for (final FieldReader allField : allFields) {

jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldProperty.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ private void writeGetValue(Append writer, String varName, String suffix) {
232232
} else if (publicField) {
233233
writer.append("%s.%s%s", varName, fieldName, suffix);
234234
} else {
235-
throw new IllegalStateException("Field " + fieldName + " is inaccessible. Add a getter or make the field public.");
235+
throw new IllegalStateException("Field " + fieldName + " is inaccessible. Add a getter or make the field public or package-private.");
236236
}
237237
}
238238

@@ -278,6 +278,9 @@ void writeFromJsonSetter(Append writer, String varName, String prefix, String nu
278278
writeFromJsonUnmapped(writer, varName);
279279
return;
280280
}
281+
if (constructorParam) {
282+
return;
283+
}
281284
if (setter != null && optional) {
282285
writer.append("%s _$%s.%s(_val$%s);", prefix, varName, setter.getName(), fieldName + num).eol();
283286
} else if (setter != null) {

jsonb-generator/src/main/java/io/avaje/jsonb/generator/FieldReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ final class FieldReader {
4848
this.raw = RawPrism.isPresent(element);
4949

5050
final var fieldName = element.getSimpleName().toString();
51-
final var publicField = !isMethod && !isParam && element.getModifiers().contains(Modifier.PUBLIC);
51+
final var publicField = !isMethod && !isParam && Util.isPublic(element);
5252
final var type = isMethod ? ((ExecutableElement) element).getReturnType() : element.asType();
5353

5454
this.property = new FieldProperty(type, raw, unmapped, genericTypeParams, publicField, fieldName);

jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ private void writeAdaptersForMixInTypes(Set<? extends Element> mixInElements) {
215215
final TypeMirror mirror = MixInPrism.getInstanceOn(mixin).value();
216216
final String importType = mirror.toString();
217217
final TypeElement element = asTypeElement(mirror);
218-
219218
mixInImports.add(importType);
220219
writeAdapterForMixInType(element, typeElement(mixin.asType().toString()));
221220
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/MethodReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ List<MethodParam> getParams() {
4646
}
4747

4848
boolean isPublic() {
49-
return element.getModifiers().contains(Modifier.PUBLIC);
49+
return Util.isPublic(element);
5050
}
5151

5252
boolean isProtected() {

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ProcessingContext.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import javax.annotation.processing.ProcessingEnvironment;
1717
import javax.lang.model.element.Element;
1818
import javax.lang.model.element.TypeElement;
19+
import javax.lang.model.type.TypeMirror;
1920
import javax.tools.FileObject;
2021
import javax.tools.StandardLocation;
2122

@@ -67,6 +68,11 @@ static Optional<JsonPrism> importedJson(TypeElement type) {
6768
return Optional.ofNullable(CTX.get().importedJsonMap.get(type.asType().toString()));
6869
}
6970

71+
static boolean isImported(Element element) {
72+
var moduleName = APContext.getProjectModuleElement().getQualifiedName();
73+
return !APContext.elements().getModuleOf(element).getQualifiedName().contentEquals(moduleName);
74+
}
75+
7076
static List<SubTypePrism> importedSubtypes(TypeElement type) {
7177
return CTX.get().importedSubtypeMap.getOrDefault(type.asType().toString(), List.of());
7278
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TypeReader.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,18 @@ final class TypeReader {
7979

8080
jsonCreator = jsonCreator.or(baseJsonCreator(baseType));
8181
constructor = jsonCreator
82-
.map(TypeReader::readJsonCreator)
82+
.map(this::readJsonCreator)
8383
.orElse(null);
8484

8585
this.hasJsonCreator = jsonCreator.isPresent();
8686
}
8787

88-
private static MethodReader readJsonCreator(ExecutableElement ex) {
88+
private MethodReader readJsonCreator(ExecutableElement ex) {
8989
var mods = ex.getModifiers();
90-
if (ex.getKind() != ElementKind.CONSTRUCTOR && !mods.contains(Modifier.STATIC) && !mods.contains(Modifier.PUBLIC)) {
91-
logError(ex, "@Json.Creator can only be placed on contructors and static factory methods");
90+
if (ex.getKind() != ElementKind.CONSTRUCTOR
91+
&& !mods.contains(Modifier.STATIC)
92+
&& Util.isPublic(ex)) {
93+
logError(ex, "@Json.Creator can only be placed on constructors and static factory methods");
9294
}
9395
return new MethodReader(ex).read();
9496
}
@@ -263,7 +265,7 @@ private void readMethod(Element element, List<FieldReader> localFields) {
263265
}
264266

265267
private boolean checkMethod2(ExecutableElement methodElement) {
266-
if (!methodElement.getModifiers().contains(Modifier.PUBLIC)) {
268+
if (!Util.isPublic(methodElement)) {
267269
return false;
268270
}
269271
if (extendsThrowable) {

jsonb-generator/src/main/java/io/avaje/jsonb/generator/Util.java

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.avaje.jsonb.generator;
22

3+
import javax.lang.model.element.Element;
4+
import javax.lang.model.element.Modifier;
35
import javax.lang.model.element.TypeElement;
6+
import javax.lang.model.element.VariableElement;
47

58
import static io.avaje.jsonb.generator.APContext.typeElement;
69
import static io.avaje.jsonb.generator.APContext.logError;
@@ -79,7 +82,6 @@ static String shortType(String fullType) {
7982
/** Trim off annotations from the raw type if present. */
8083
public static String trimAnnotations(String input) {
8184
input = COMMA_PATTERN.matcher(input).replaceAll(",");
82-
8385
return cutAnnotations(input);
8486
}
8587

@@ -95,7 +97,6 @@ private static String cutAnnotations(String input) {
9597
currentIndex = matcher.start();
9698
}
9799
final var result = input.substring(0, pos) + input.substring(currentIndex + 1);
98-
99100
return cutAnnotations(result);
100101
}
101102

@@ -168,21 +169,17 @@ static String baseTypeOfAdapter(String adapterFullName) {
168169
}
169170

170171
static String baseTypeOfAdapter(TypeElement element) {
171-
172172
return element.getInterfaces().stream()
173-
.filter(t -> t.toString().contains("io.avaje.jsonb.JsonAdapter"))
174-
.findFirst()
175-
.map(Object::toString)
176-
.map(GenericType::parse)
177-
.map(GenericType::firstParamType)
178-
.map(Util::extractTypeWithNest)
179-
.orElseGet(
180-
() -> {
181-
logError(
182-
element,
183-
"Custom Adapters must implement JsonAdapter");
184-
return "Invalid";
185-
});
173+
.filter(t -> t.toString().contains("io.avaje.jsonb.JsonAdapter"))
174+
.findFirst()
175+
.map(Object::toString)
176+
.map(GenericType::parse)
177+
.map(GenericType::firstParamType)
178+
.map(Util::extractTypeWithNest)
179+
.orElseGet(() -> {
180+
logError(element, "Custom Adapters must implement JsonAdapter");
181+
return "Invalid";
182+
});
186183
}
187184

188185
static String extractTypeWithNest(String fullType) {
@@ -208,4 +205,19 @@ static String extractTypeWithNest(String fullType) {
208205
return result.toString();
209206
}
210207
}
208+
209+
static boolean isPublic(Element element) {
210+
var mods = element.getModifiers();
211+
if (mods.contains(Modifier.PUBLIC)) {
212+
return true;
213+
}
214+
if (mods.contains(Modifier.PRIVATE) || mods.contains(Modifier.PROTECTED)) {
215+
return false;
216+
}
217+
boolean isImported = ProcessingContext.isImported(element);
218+
if (element instanceof VariableElement) {
219+
return !isImported && !mods.contains(Modifier.FINAL);
220+
}
221+
return !isImported;
222+
}
211223
}

jsonb-generator/src/test/java/io/avaje/jsonb/generator/ProcessorTest.java renamed to jsonb-generator/src/test/java/io/avaje/jsonb/generator/JsonbProcessorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.junit.jupiter.api.Disabled;
2727
import org.junit.jupiter.api.Test;
2828

29-
class ProcessorTest {
29+
class JsonbProcessorTest {
3030

3131
@AfterEach
3232
void deleteGeneratedFiles() throws IOException {

0 commit comments

Comments
 (0)