aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/lombok/core/configuration/BubblingConfigurationResolver.java3
-rw-r--r--src/core/lombok/core/configuration/ConfigurationApp.java28
-rw-r--r--src/core/lombok/core/configuration/ConfigurationParser.java34
-rw-r--r--src/core/lombok/core/configuration/FileSystemSourceCache.java58
-rw-r--r--src/core/lombok/core/configuration/StringConfigurationSource.java11
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);
}