All Downloads are FREE. Search and download functionalities are using the official Maven repository.

name.remal.gradle_plugins.lombok.config.LombokConfigFileParser Maven / Gradle / Ivy

package name.remal.gradle_plugins.lombok.config;

import static lombok.AccessLevel.PRIVATE;
import static name.remal.gradle_plugins.lombok.config.LombokConfigNormalizer.normalizeLombokConfigKey;
import static name.remal.gradle_plugins.lombok.config.LombokConfigPropertyOperator.CLEAR;
import static name.remal.gradle_plugins.lombok.config.LombokConfigPropertyOperator.MINUS;
import static name.remal.gradle_plugins.lombok.config.LombokConfigPropertyOperator.PLUS;
import static name.remal.gradle_plugins.lombok.config.LombokConfigPropertyOperator.SET;
import static name.remal.gradle_plugins.toolkit.PathUtils.getPathLastModifiedIfExists;
import static name.remal.gradle_plugins.toolkit.StringUtils.substringBefore;

import com.google.common.annotations.VisibleForTesting;
import java.util.regex.Pattern;
import lombok.NoArgsConstructor;
import lombok.val;
import name.remal.gradle_plugins.toolkit.cache.ToolkitCache;
import name.remal.gradle_plugins.toolkit.cache.ToolkitCacheBuilder;

/**
 * See
 * https://github.com/projectlombok/lombok/blob/master/src/core/lombok/core/configuration/ConfigurationParser.java
 */
@NoArgsConstructor(access = PRIVATE)
@SuppressWarnings({"java:S6395", "java:S3776", "RegExpUnnecessaryNonCapturingGroup"})
abstract class LombokConfigFileParser {

    private static final Pattern NEW_LINE = Pattern.compile("(?:\\r\\n)|(?:\\n\\r)|(?:\\n)|(?:\\r)");

    private static final Pattern PROPERTY = Pattern.compile("(?:clear\\s+([^=]+))|(?:(\\S*?)\\s*([-+]?=)\\s*(.*?))");
    private static final Pattern IMPORT = Pattern.compile("import\\s+(.+?)");


    private static final ToolkitCache PARSE_CACHE =
        new ToolkitCacheBuilder()
            .withLastModifiedTimeGetter(key -> getPathLastModifiedIfExists(key.getFileSystemPath()))
            .withLoader(LombokConfigFileParser::parseLombokConfigFileImpl)
            .build();

    public static LombokConfigFile parseLombokConfigFile(LombokConfigPath lombokConfigPath) {
        return PARSE_CACHE.get(lombokConfigPath);
    }


    @VisibleForTesting
    @SuppressWarnings("StringSplitter")
    static LombokConfigFile parseLombokConfigFileImpl(LombokConfigPath file) {
        val lombokConfigFileBuilder = LombokConfigFile.builder().file(file);

        val content = file.readContent();
        val lines = NEW_LINE.split(content);
        for (int lineNumber = 1; lineNumber <= lines.length; ++lineNumber) {
            String originalLine = lines[lineNumber - 1];
            val line = substringBefore(originalLine, "#").trim();
            if (line.isEmpty()) {
                continue;
            }

            val importMatcher = IMPORT.matcher(line);
            if (importMatcher.matches()) {
                val importInstruction = ImportInstruction.builder()
                    .file(file)
                    .lineNumber(lineNumber)
                    .value(importMatcher.group(1))
                    .build();
                lombokConfigFileBuilder.importInstruction(importInstruction);
                continue;
            }

            val propertyMatcher = PROPERTY.matcher(line);
            if (propertyMatcher.matches()) {
                if (propertyMatcher.group(1) == null) {
                    val key = normalizeLombokConfigKey(propertyMatcher.group(2));
                    val operatorString = propertyMatcher.group(3);
                    val value = propertyMatcher.group(4);

                    final LombokConfigPropertyOperator operator;
                    switch (operatorString) {
                        case "=":
                            operator = SET;
                            break;
                        case "+=":
                            operator = PLUS;
                            break;
                        case "-=":
                            operator = MINUS;
                            break;
                        default:
                            lombokConfigFileBuilder.parseError(LombokConfigFileParseError.builder()
                                .file(file)
                                .lineNumber(lineNumber)
                                .message("Invalid line (unsupported operator): " + line)
                                .build()
                            );
                            continue;
                    }

                    lombokConfigFileBuilder.property(LombokConfigFileProperty.builder()
                        .key(key)
                        .operator(operator)
                        .value(value)
                        .file(file)
                        .lineNumber(lineNumber)
                        .build()
                    );

                } else {
                    val key = normalizeLombokConfigKey(propertyMatcher.group(1));
                    lombokConfigFileBuilder.property(LombokConfigFileProperty.builder()
                        .key(key)
                        .operator(CLEAR)
                        .value("")
                        .file(file)
                        .lineNumber(lineNumber)
                        .build()
                    );
                }

                continue;
            }

            lombokConfigFileBuilder.parseError(LombokConfigFileParseError.builder()
                .file(file)
                .lineNumber(lineNumber)
                .message("Invalid line: " + line)
                .build()
            );
        }

        return lombokConfigFileBuilder.build();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy