From a25ccd2a71779dd93ba302ea4f586292606cbcd5 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 31 Aug 2023 15:44:19 -0400 Subject: [PATCH] validate module --- .../recordbuilder/internal/ModuleReader.java | 130 ++++-------------- .../recordbuilder/internal/RecordModel.java | 3 +- .../internal/RecordProcessor.java | 10 +- 3 files changed, 36 insertions(+), 107 deletions(-) diff --git a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/ModuleReader.java b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/ModuleReader.java index db8132e..49a724f 100644 --- a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/ModuleReader.java +++ b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/ModuleReader.java @@ -1,113 +1,33 @@ package io.avaje.recordbuilder.internal; -import static java.util.stream.Collectors.toSet; +import static io.avaje.recordbuilder.internal.APContext.logWarn; import java.io.BufferedReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -public final class ModuleReader { - - private static final Pattern regex = Pattern.compile("provides\\s+(.*?)\\s+with"); - - /** Keeps Track of found services by SPI and implementation set */ - private final Map> foundServices = new HashMap<>(); - - private final Map> missingServicesMap = new HashMap<>(); - - private boolean staticWarning; - private boolean inProvides = false; - - private static boolean coreWarning; - - public ModuleReader(Map> services) { - services.forEach(this::add); - } - - private void add(String k, Set v) { - missingServicesMap.put( - ProcessorUtils.shortType(k).replace("$", "."), - v.stream().map(ProcessorUtils::shortType).collect(toSet())); - } - - public void read(BufferedReader reader) throws IOException { - String line; - while ((line = reader.readLine()) != null) { - // retrieve service from provides statement - readLine(line); - } - } - - void readLine(String line) { - String service = null; - if (line.contains("provides")) { - inProvides = true; - final var matcher = regex.matcher(line); - if (matcher.find()) { - service = ProcessorUtils.shortType(matcher.group(1)).replace("$", "."); - } - } - - // if not part of a provides statement skip - if (!inProvides || line.isBlank()) { - if (!staticWarning && line.contains("io.avaje.recordbuilder") && !line.contains("static")) { - staticWarning = true; - } - if (line.contains("io.avaje.recordbuilder.core")) { - coreWarning = true; - } - return; - } +import javax.lang.model.element.ModuleElement; - processLine(line, service); - - // provides statement has ended - if (line.contains(";")) { - inProvides = false; - } - } - - /** as service implementations are discovered, remove from missing strings map */ - private void processLine(String line, String service) { - final Set missingServiceImpls = missingServicesMap.get(service); - final Set foundServiceImpls = - foundServices.computeIfAbsent(service, k -> new HashSet<>()); - if (!foundServiceImpls.containsAll(missingServiceImpls)) { - parseServices(line, missingServiceImpls, foundServiceImpls); - } - missingServiceImpls.removeAll(foundServiceImpls); - } - - /** - * as service implementations are discovered, add to found strings set for a given service - * - * @param input the line to check - * @param missingServiceImpls the services we're looking for - * @param foundServiceImpls where we'll store the results if we have a match - */ - private static void parseServices( - String input, Set missingServiceImpls, Set foundServiceImpls) { - - for (final var impl : missingServiceImpls) { - if (input.contains(impl)) { - foundServiceImpls.add(impl); - } - } - } - - public boolean staticWarning() { - return staticWarning; - } - - public boolean coreWarning() { - return coreWarning; - } - - public Map> missing() { - return missingServicesMap; +public final class ModuleReader { + private ModuleReader() {} + + private static ModuleElement module; + + public static void read(BufferedReader reader) { + reader + .lines() + .forEach( + line -> { + if (line.isBlank()) { + return; + } + + if (line.contains("io.avaje.recordbuilder") && !line.contains("static")) { + logWarn( + "`requires io.avaje.recordbuilder` should be `requires static io.avaje.recordbuilder`", + module); + } + if (line.contains("io.avaje.recordbuilder.core")) { + logWarn("io.avaje.recordbuilder.core should not be used", module); + } + }); } } diff --git a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordModel.java b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordModel.java index d0cf4da..e87c85b 100644 --- a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordModel.java +++ b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordModel.java @@ -60,7 +60,8 @@ String fields(Map defaultsMap) { final String dt = defaultsMap.get(type.mainType()); if (dt != null) { importTypes.add(dt); - defaultVal = " = new " + dt + "<>()"; + + defaultVal = " = new " + ProcessorUtils.shortType(dt) + "<>()"; } } diff --git a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordProcessor.java b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordProcessor.java index 40317aa..90729e7 100644 --- a/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordProcessor.java +++ b/avaje-record-builder-core/src/main/java/io/avaje/recordbuilder/internal/RecordProcessor.java @@ -1,7 +1,7 @@ package io.avaje.recordbuilder.internal; import static io.avaje.recordbuilder.internal.APContext.createSourceFile; -import static io.avaje.recordbuilder.internal.APContext.elements; +import static io.avaje.recordbuilder.internal.APContext.*; import static io.avaje.recordbuilder.internal.APContext.logError; import static io.avaje.recordbuilder.internal.APContext.typeElement; import static java.util.stream.Collectors.joining; @@ -82,6 +82,14 @@ public boolean process(Set tes, RoundEnvironment roundEnv .map(APContext::asTypeElement) .forEach(this::readElement); + if (roundEnv.processingOver()) { + try (var reader = getModuleInfoReader()) { + + ModuleReader.read(reader); + } catch (IOException e) { + // Can't read module, it's whatever + } + } return false; }