diff options
Diffstat (limited to 'src')
5 files changed, 43 insertions, 91 deletions
diff --git a/src/core/lombok/core/configuration/BubblingConfigurationResolver.java b/src/core/lombok/core/configuration/BubblingConfigurationResolver.java index 0849eee2..a5a5f1d6 100644 --- a/src/core/lombok/core/configuration/BubblingConfigurationResolver.java +++ b/src/core/lombok/core/configuration/BubblingConfigurationResolver.java @@ -41,6 +41,7 @@ public class BubblingConfigurationResolver implements ConfigurationResolver { public <T> T resolve(ConfigurationKey<T> key) { boolean isList = key.getType().isList(); List<List<ListModification>> listModificationsList = null; + outer: for (ConfigurationSource source : sources) { Result result = source.resolve(key); if (result == null) continue; @@ -49,7 +50,7 @@ public class BubblingConfigurationResolver implements ConfigurationResolver { listModificationsList.add((List<ListModification>)result.getValue()); } if (result.isAuthoritative()) { - if (isList) break; + if (isList) break outer; return (T) result.getValue(); } } diff --git a/src/core/lombok/core/configuration/ConfigurationApp.java b/src/core/lombok/core/configuration/ConfigurationApp.java index bbdea4ad..e3b18408 100644 --- a/src/core/lombok/core/configuration/ConfigurationApp.java +++ b/src/core/lombok/core/configuration/ConfigurationApp.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2018 The Project Lombok Authors. + * Copyright (C) 2014-2020 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,8 +21,6 @@ */ package lombok.core.configuration; -import static lombok.core.configuration.FileSystemSourceCache.fileToString; - import java.io.File; import java.io.PrintStream; import java.net.URI; @@ -53,7 +51,6 @@ import com.zwitserloot.cmdreader.Shorthand; import lombok.ConfigurationKeys; import lombok.core.LombokApp; import lombok.core.configuration.ConfigurationParser.Collector; -import lombok.core.configuration.ConfigurationParser.Context; @ProviderFor(LombokApp.class) public class ConfigurationApp extends LombokApp { @@ -254,12 +251,13 @@ public class ConfigurationApp extends LombokApp { Set<ConfigurationKey<?>> used = new HashSet<ConfigurationKey<?>>(); boolean stopBubbling = false; - String previousFileName = null; + String previousDescription = null; for (File currentDirectory = new File(directory); currentDirectory != null && !stopBubbling; currentDirectory = currentDirectory.getParentFile()) { File configFile = new File(currentDirectory, "lombok.config"); if (!configFile.exists() || !configFile.isFile()) continue; - Map<ConfigurationKey<?>, List<String>> traces = trace(fileToString(configFile), Context.fromFile(configFile), keys); + ConfigurationFile context = ConfigurationFile.fromFile(configFile); + Map<ConfigurationKey<?>, List<String>> traces = trace(context.contents(), context, keys); stopBubbling = stopBubbling(traces.get(ConfigurationKeys.STOP_BUBBLING)); for (ConfigurationKey<?> key : keys) { @@ -270,17 +268,17 @@ public class ConfigurationApp extends LombokApp { } else { used.add(key); } - if (previousFileName != null) { + if (previousDescription != null) { modifications.add(""); - modifications.add(previousFileName + ":"); + modifications.add(previousDescription + ":"); } result.get(key).addAll(0, modifications); } - previousFileName = configFile.getAbsolutePath(); + previousDescription = context.description(); } for (ConfigurationKey<?> key : keys) { if (used.contains(key)) { - result.get(key).add(0, previousFileName + (stopBubbling ? " (stopped bubbling):" : ":")); + result.get(key).add(0, previousDescription + (stopBubbling ? " (stopped bubbling):" : ":")); } else { result.put(key, Collections.<String>emptyList()); } @@ -288,23 +286,23 @@ public class ConfigurationApp extends LombokApp { return result; } - private Map<ConfigurationKey<?>, List<String>> trace(String content, Context context, final Collection<ConfigurationKey<?>> keys) { + private Map<ConfigurationKey<?>, List<String>> trace(String content, ConfigurationFile context, final Collection<ConfigurationKey<?>> keys) { final Map<ConfigurationKey<?>, List<String>> result = new HashMap<ConfigurationKey<?>, List<String>>(); Collector collector = new Collector() { - @Override public void clear(ConfigurationKey<?> key, Context context, int lineNumber) { + @Override public void clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber) { trace(key, "clear " + key.getKeyName(), lineNumber); } - @Override public void set(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { trace(key, key.getKeyName() + " = " + value, lineNumber); } - @Override public void add(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { trace(key, key.getKeyName() + " += " + value, lineNumber); } - @Override public void remove(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { trace(key, key.getKeyName() + " -= " + value, lineNumber); } diff --git a/src/core/lombok/core/configuration/ConfigurationParser.java b/src/core/lombok/core/configuration/ConfigurationParser.java index 0def6ce1..a19e48d8 100644 --- a/src/core/lombok/core/configuration/ConfigurationParser.java +++ b/src/core/lombok/core/configuration/ConfigurationParser.java @@ -21,7 +21,6 @@ */ package lombok.core.configuration; -import java.io.File; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -29,7 +28,7 @@ import java.util.regex.Pattern; public class ConfigurationParser { private static final Pattern LINE = Pattern.compile("(?:clear\\s+([^=]+))|(?:(\\S*?)\\s*([-+]?=)\\s*(.*?))"); private static final Pattern NEWLINE_FINDER = Pattern.compile("^[\t ]*(.*?)[\t\r ]*$", Pattern.MULTILINE); - private static final Pattern IMPORT = Pattern.compile("import\\s+(.*?)"); + private static final Pattern IMPORT = Pattern.compile("import\\s+(.+?)"); private ConfigurationProblemReporter reporter; @@ -38,7 +37,7 @@ public class ConfigurationParser { this.reporter = reporter; } - public void parse(CharSequence content, Context context, Collector collector) { + public void parse(CharSequence content, ConfigurationFile context, Collector collector) { Map<String, ConfigurationKey<?>> registeredKeys = ConfigurationKey.registeredKeys(); int lineNumber = 0; Matcher lineMatcher = NEWLINE_FINDER.matcher(content); @@ -54,7 +53,10 @@ public class ConfigurationParser { reporter.report(context.description(), "Imports are only allowed in the top of the file", lineNumber, line); continue; } -// collector.addImport(importMatcher.group(1), contentDescription, lineNumber); + String imported = importMatcher.group(1); + if (!context.importResolves(imported)) { + reporter.report(context.description(), "Imported file does not exist", lineNumber, line); + } continue; } @@ -115,25 +117,9 @@ public class ConfigurationParser { } public interface Collector { - void clear(ConfigurationKey<?> key, Context context, int lineNumber); - void set(ConfigurationKey<?> key, Object value, Context context, int lineNumber); - void add(ConfigurationKey<?> key, Object value, Context context, int lineNumber); - void remove(ConfigurationKey<?> key, Object value, Context context, int lineNumber); - } - - public static final class Context { - private final File file; - - public static Context fromFile(File file) { - return new Context(file); - } - - private Context(File file) { - this.file = file; - } - - public String description() { - return file.getAbsolutePath(); - } + void clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber); + void set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber); + void add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber); + void remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber); } } diff --git a/src/core/lombok/core/configuration/FileSystemSourceCache.java b/src/core/lombok/core/configuration/FileSystemSourceCache.java index d0b51fa3..0dfc54ab 100644 --- a/src/core/lombok/core/configuration/FileSystemSourceCache.java +++ b/src/core/lombok/core/configuration/FileSystemSourceCache.java @@ -21,9 +21,7 @@ */ package lombok.core.configuration; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; import java.net.URI; import java.util.Collections; import java.util.Iterator; @@ -33,7 +31,6 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import lombok.ConfigurationKeys; -import lombok.core.configuration.ConfigurationParser.Context; import lombok.core.configuration.ConfigurationSource.Result; import lombok.core.debug.ProblemReporter; @@ -42,9 +39,9 @@ public class FileSystemSourceCache { private static final long FULL_CACHE_CLEAR_INTERVAL = TimeUnit.MINUTES.toMillis(30); private static final long RECHECK_FILESYSTEM = TimeUnit.SECONDS.toMillis(2); private static final long NEVER_CHECKED = -1; - private static final long MISSING = -88; // Magic value; any lombok.config with this exact epochmillis last modified will never be read, so, let's ensure nobody accidentally has one with that exact last modified stamp. + static final long MISSING = -88; // Magic value; any lombok.config with this exact epochmillis last modified will never be read, so, let's ensure nobody accidentally has one with that exact last modified stamp. - private final ConcurrentMap<File, Content> fileCache = new ConcurrentHashMap<File, Content>(); // caches files to the content object that tracks content. + private final ConcurrentMap<ConfigurationFile, Content> fileCache = new ConcurrentHashMap<ConfigurationFile, Content>(); // caches files to the content object that tracks content. private final ConcurrentMap<URI, File> uriCache = new ConcurrentHashMap<URI, File>(); // caches URIs of java source files to the dir that contains it. private volatile long lastCacheClear = System.currentTimeMillis(); @@ -150,71 +147,42 @@ public class FileSystemSourceCache { } ConfigurationSource getSourceForDirectory(File directory, ConfigurationProblemReporter reporter) { - File configFile = new File(directory, LOMBOK_CONFIG_FILENAME); - return getSourceForConfigFile(configFile, reporter); + return getSourceForConfigFile(ConfigurationFile.fromFile(new File(directory, LOMBOK_CONFIG_FILENAME)), reporter); } - private ConfigurationSource getSourceForConfigFile(File configFile, ConfigurationProblemReporter reporter) { + private ConfigurationSource getSourceForConfigFile(ConfigurationFile context, ConfigurationProblemReporter reporter) { long now = System.currentTimeMillis(); - Content content = ensureContent(configFile); + Content content = ensureContent(context); synchronized (content) { if (content.lastChecked != NEVER_CHECKED && now - content.lastChecked < RECHECK_FILESYSTEM) { return content.source; } content.lastChecked = now; long previouslyModified = content.lastModified; - content.lastModified = getLastModifiedOrMissing(configFile); - if (content.lastModified != previouslyModified) content.source = content.lastModified == MISSING ? null : parse(configFile, reporter); + content.lastModified = context.getLastModifiedOrMissing(); + if (content.lastModified != previouslyModified) content.source = content.lastModified == MISSING ? null : parse(context, reporter); return content.source; } } - private Content ensureContent(File configFile) { - Content content = fileCache.get(configFile); + private Content ensureContent(ConfigurationFile context) { + Content content = fileCache.get(context); if (content != null) { return content; } - fileCache.putIfAbsent(configFile, Content.empty()); - return fileCache.get(configFile); + fileCache.putIfAbsent(context, Content.empty()); + return fileCache.get(context); } - private ConfigurationSource parse(File configFile, ConfigurationProblemReporter reporter) { - Context context = Context.fromFile(configFile); + private ConfigurationSource parse(ConfigurationFile context, ConfigurationProblemReporter reporter) { try { - return StringConfigurationSource.forString(fileToString(configFile), reporter, context); + return StringConfigurationSource.forString(context.contents(), reporter, context); } catch (Exception e) { reporter.report(context.description(), "Exception while reading file: " + e.getMessage(), 0, null); return null; } } - private static final ThreadLocal<byte[]> buffers = new ThreadLocal<byte[]>() { - protected byte[] initialValue() { - return new byte[65536]; - } - }; - - static String fileToString(File configFile) throws Exception { - byte[] b = buffers.get(); - FileInputStream fis = new FileInputStream(configFile); - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - while (true) { - int r = fis.read(b); - if (r == -1) break; - out.write(b, 0, r); - } - return new String(out.toByteArray(), "UTF-8"); - } finally { - fis.close(); - } - } - - private static final long getLastModifiedOrMissing(File file) { - if (!file.exists() || !file.isFile()) return MISSING; - return file.lastModified(); - } - private static class Content { ConfigurationSource source; long lastModified; diff --git a/src/core/lombok/core/configuration/StringConfigurationSource.java b/src/core/lombok/core/configuration/StringConfigurationSource.java index 46ae4717..c1bd498e 100644 --- a/src/core/lombok/core/configuration/StringConfigurationSource.java +++ b/src/core/lombok/core/configuration/StringConfigurationSource.java @@ -29,28 +29,27 @@ import java.util.Map; import java.util.Map.Entry; import lombok.core.configuration.ConfigurationParser.Collector; -import lombok.core.configuration.ConfigurationParser.Context; public class StringConfigurationSource implements ConfigurationSource { private final Map<ConfigurationKey<?>, Result> values; - public static ConfigurationSource forString(CharSequence content, ConfigurationProblemReporter reporter, Context context) { + public static ConfigurationSource forString(CharSequence content, ConfigurationProblemReporter reporter, ConfigurationFile context) { final Map<ConfigurationKey<?>, Result> values = new HashMap<ConfigurationKey<?>, Result>(); Collector collector = new Collector() { - @Override public void clear(ConfigurationKey<?> key, Context context, int lineNumber) { + @Override public void clear(ConfigurationKey<?> key, ConfigurationFile context, int lineNumber) { values.put(key, new Result(null, true)); } - @Override public void set(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void set(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { values.put(key, new Result(value, true)); } - @Override public void add(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void add(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { modifyList(key, value, true); } - @Override public void remove(ConfigurationKey<?> key, Object value, Context context, int lineNumber) { + @Override public void remove(ConfigurationKey<?> key, Object value, ConfigurationFile context, int lineNumber) { modifyList(key, value, false); } |