aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2017-11-06 19:49:16 +0100
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-11-06 20:20:32 +0100
commit67c84b1036ad02ba2384fa75fb28e779a488f3d4 (patch)
treec70665241fab2a4947f0941659b8e6421eabb44c
parent11517396816697ad1c48a71e47f37d9206225741 (diff)
Break dependency on vfs from the interface of syntax and cmdline.
These libs are exposed externally, implying that the vfs is also exposed externally. We break out PathFragment from vfs to still use this in their interface. This class is a much smaller dependency than the entire vfs. PiperOrigin-RevId: 174729373
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD3
-rw-r--r--src/main/java/com/google/devtools/build/lib/cmdline/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkInterfaceUtils.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkPrintable.java42
-rw-r--r--src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/ParserInputSource.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Printer.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/BUILD36
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/Path.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java37
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java4
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitorTest.java6
19 files changed, 192 insertions, 111 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 4810d3b84e..f75cf265e2 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -273,7 +273,6 @@ java_library(
"skylarkinterface/*.java",
]),
deps = [
- "//src/main/java/com/google/devtools/build/lib:util",
"//third_party:jsr305",
],
)
@@ -291,7 +290,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/profiler",
- "//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//third_party:asm",
"//third_party:asm-commons",
"//third_party:asm-util",
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
index 027317878b..306eba1bec 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -21,7 +21,7 @@ java_library(
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/concurrent",
- "//src/main/java/com/google/devtools/build/lib/vfs",
+ "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//third_party:guava",
"//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index 976b56d914..0520c0268f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.Runtime;
import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -125,7 +126,10 @@ public class ASTFileLookupFunction implements SkyFunction {
/*importMap=*/ null)
.setupDynamic(Runtime.PKG_NAME, Runtime.NONE)
.setupDynamic(Runtime.REPOSITORY_NAME, Runtime.NONE);
- ast = BuildFileAST.parseSkylarkFile(path, astFileSize, env.getListener());
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(path, astFileSize);
+ ast =
+ BuildFileAST.parseSkylarkFile(
+ bytes, path.getDigest(), path.asFragment(), env.getListener());
ast = ast.validate(validationEnv, env.getListener());
}
} catch (IOException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
index 41602146ad..4c56ade09d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.LoadStatement;
import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.syntax.Statement;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.lib.vfs.RootedPath;
@@ -65,8 +66,13 @@ public class WorkspaceASTFunction implements SkyFunction {
Transience.PERSISTENT);
}
if (workspaceFileValue.exists()) {
- ast = BuildFileAST.parseBuildFile(
- ParserInputSource.create(repoWorkspace), ast.getStatements(), env.getListener());
+ byte[] bytes =
+ FileSystemUtils.readWithKnownFileSize(repoWorkspace, repoWorkspace.getFileSize());
+ ast =
+ BuildFileAST.parseBuildFile(
+ ParserInputSource.create(bytes, repoWorkspace.asFragment()),
+ ast.getStatements(),
+ env.getListener());
if (ast.containsErrors()) {
throw new WorkspaceASTFunctionException(
new BuildFileContainsErrorsException(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkInterfaceUtils.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkInterfaceUtils.java
index bee73efaf8..e3751a8494 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkInterfaceUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkInterfaceUtils.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.skylarkinterface;
-import com.google.devtools.build.lib.util.Pair;
import java.lang.reflect.Method;
import javax.annotation.Nullable;
@@ -23,21 +22,30 @@ import javax.annotation.Nullable;
*/
public class SkylarkInterfaceUtils {
+ private static final class ClassAndSkylarkModule {
+ final Class<?> klass;
+ final SkylarkModule skylarkModule;
+
+ ClassAndSkylarkModule(Class<?> klass, SkylarkModule skylarkModule) {
+ this.klass = klass;
+ this.skylarkModule = skylarkModule;
+ }
+ }
+
@Nullable
- private static Pair<Class<?>, SkylarkModule> searchForSkylarkModule(Class<?> classObj) {
+ private static ClassAndSkylarkModule searchForSkylarkModule(Class<?> classObj) {
if (classObj.isAnnotationPresent(SkylarkModule.class)) {
- return new Pair<Class<?>, SkylarkModule>(
- classObj, classObj.getAnnotation(SkylarkModule.class));
+ return new ClassAndSkylarkModule(classObj, classObj.getAnnotation(SkylarkModule.class));
}
Class<?> superclass = classObj.getSuperclass();
if (superclass != null) {
- Pair<Class<?>, SkylarkModule> result = searchForSkylarkModule(superclass);
+ ClassAndSkylarkModule result = searchForSkylarkModule(superclass);
if (result != null) {
return result;
}
}
for (Class<?> interfaceObj : classObj.getInterfaces()) {
- Pair<Class<?>, SkylarkModule> result = searchForSkylarkModule(interfaceObj);
+ ClassAndSkylarkModule result = searchForSkylarkModule(interfaceObj);
if (result != null) {
return result;
}
@@ -52,8 +60,8 @@ public class SkylarkInterfaceUtils {
*/
@Nullable
public static SkylarkModule getSkylarkModule(Class<?> classObj) {
- Pair<Class<?>, SkylarkModule> result = searchForSkylarkModule(classObj);
- return result == null ? null : result.second;
+ ClassAndSkylarkModule result = searchForSkylarkModule(classObj);
+ return result == null ? null : result.skylarkModule;
}
/**
@@ -63,8 +71,8 @@ public class SkylarkInterfaceUtils {
*/
@Nullable
public static Class<?> getParentWithSkylarkModule(Class<?> classObj) {
- Pair<Class<?>, SkylarkModule> result = searchForSkylarkModule(classObj);
- return result == null ? null : result.first;
+ ClassAndSkylarkModule result = searchForSkylarkModule(classObj);
+ return result == null ? null : result.klass;
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkPrintable.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkPrintable.java
new file mode 100644
index 0000000000..39760c4108
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkPrintable.java
@@ -0,0 +1,42 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkinterface;
+
+/**
+ * Interface for types that aren't {@link SkylarkValue}s, but that we still want to support printing
+ * of.
+ */
+public interface SkylarkPrintable {
+
+ /**
+ * Print an official representation of object x.
+ *
+ * <p>For regular data structures, the value should be parsable back into an equal data structure.
+ *
+ * @param printer a printer to be used for formatting nested values.
+ */
+ void repr(SkylarkPrinter printer);
+
+ /**
+ * Print an informal, human-readable representation of the value.
+ *
+ * <p>By default dispatches to the {@code repr} method.
+ *
+ * @param printer a printer to be used for formatting nested values.
+ */
+ default void str(SkylarkPrinter printer) {
+ repr(printer);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
index 6d430ff4ab..b61da9b418 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
@@ -19,7 +19,7 @@ package com.google.devtools.build.lib.skylarkinterface;
*
* <p>This is used for extending the Skylark interpreter with domain-specific values.
*/
-public interface SkylarkValue {
+public interface SkylarkValue extends SkylarkPrintable {
/**
* Returns if the value is immutable and thus suitable for being used as a dictionary key.
@@ -30,24 +30,4 @@ public interface SkylarkValue {
default boolean isImmutable() {
return false;
}
-
- /**
- * Print an official representation of object x.
- *
- * <p>For regular data structures, the value should be parsable back into an equal data structure.
- *
- * @param printer a printer to be used for formatting nested values.
- */
- void repr(SkylarkPrinter printer);
-
- /**
- * Print an informal, human-readable representation of the value.
- *
- * <p>By default dispatches to the {@code repr} method.
- *
- * @param printer a printer to be used for formatting nested values.
- */
- default void str(SkylarkPrinter printer) {
- repr(printer);
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
index fcd3da0085..439e4c5f50 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
@@ -23,7 +23,6 @@ import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.syntax.Parser.ParseResult;
import com.google.devtools.build.lib.syntax.SkylarkImports.SkylarkImportSyntaxException;
import com.google.devtools.build.lib.util.Pair;
-import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
import java.util.List;
@@ -278,24 +277,14 @@ public class BuildFileAST extends ASTNode {
.validateBuildFile(eventHandler);
}
- /**
- * Parse the specified Skylark file, returning its AST. All errors during scanning or parsing will
- * be reported to the reporter.
- *
- * @throws IOException if the file cannot not be read.
- */
- public static BuildFileAST parseSkylarkFile(Path file, EventHandler eventHandler)
- throws IOException {
- return parseSkylarkFile(file, file.getFileSize(), eventHandler);
- }
-
- public static BuildFileAST parseSkylarkFile(Path file, long fileSize, EventHandler eventHandler)
+ public static BuildFileAST parseSkylarkFile(
+ byte[] bytes, byte[] digest, PathFragment path, EventHandler eventHandler)
throws IOException {
- ParserInputSource input = ParserInputSource.create(file, fileSize);
+ ParserInputSource input = ParserInputSource.create(bytes, path);
Parser.ParseResult result = Parser.parseFile(input, eventHandler);
return create(
ImmutableList.of(), result,
- HashCode.fromBytes(file.getDigest()).toString(), eventHandler);
+ HashCode.fromBytes(digest).toString(), eventHandler);
}
public static BuildFileAST parseSkylarkFile(ParserInputSource input, EventHandler eventHandler) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ParserInputSource.java b/src/main/java/com/google/devtools/build/lib/syntax/ParserInputSource.java
index 5f2ce3fa66..05663e2960 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ParserInputSource.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ParserInputSource.java
@@ -13,10 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.syntax;
-import com.google.devtools.build.lib.vfs.FileSystemUtils;
-import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
-
import java.io.IOException;
/**
@@ -38,20 +35,9 @@ public abstract class ParserInputSource {
*/
public abstract PathFragment getPath();
- /**
- * Create an input source instance by (eagerly) reading from the file at
- * path. The file is assumed to be ISO-8859-1 encoded and smaller than
- * 2 Gigs - these assumptions are reasonable for BUILD files, which is
- * all we care about here.
- */
- public static ParserInputSource create(Path path) throws IOException {
- return create(path, path.getFileSize());
- }
-
- public static ParserInputSource create(Path path, long fileSize) throws IOException {
- byte[] bytes = FileSystemUtils.readWithKnownFileSize(path, fileSize);
- char[] content = FileSystemUtils.convertFromLatin1(bytes);
- return create(content, path.asFragment());
+ public static ParserInputSource create(byte[] bytes, PathFragment path) throws IOException {
+ char[] content = convertFromLatin1(bytes);
+ return create(content, path);
}
/**
@@ -82,4 +68,12 @@ public abstract class ParserInputSource {
}
};
}
+
+ private static char[] convertFromLatin1(byte[] content) {
+ char[] latin1 = new char[content.length];
+ for (int i = 0; i < latin1.length; i++) { // yeah, latin1 is this easy! :-)
+ latin1[i] = (char) (0xff & content[i]);
+ }
+ return latin1;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Printer.java b/src/main/java/com/google/devtools/build/lib/syntax/Printer.java
index fe4191f477..69b16fefc9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Printer.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Printer.java
@@ -16,11 +16,10 @@ package com.google.devtools.build.lib.syntax;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
-import com.google.devtools.build.lib.vfs.Path;
-import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
import java.util.Arrays;
import java.util.Formattable;
@@ -316,8 +315,8 @@ public class Printer {
// values such as Locations or ASTs.
this.append("null");
- } else if (o instanceof SkylarkValue) {
- ((SkylarkValue) o).repr(this);
+ } else if (o instanceof SkylarkPrintable) {
+ ((SkylarkPrintable) o).repr(this);
} else if (o instanceof String) {
writeString((String) o);
@@ -344,13 +343,6 @@ public class Printer {
this.repr(entry.getKey());
this.append(": ");
this.repr(entry.getValue());
-
- } else if (o instanceof PathFragment) {
- this.append(((PathFragment) o).getPathString());
-
- } else if (o instanceof Path) {
- append(o.toString());
-
} else if (o instanceof Class<?>) {
this.append(EvalUtils.getDataTypeNameFromClass((Class<?>) o));
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/BUILD b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
index 37bb571214..1e6c5a9dc6 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/vfs/BUILD
@@ -6,17 +6,45 @@ filegroup(
visibility = ["//src/main/java/com/google/devtools/build/lib:__pkg__"],
)
+PATH_FRAGMENT_SOURCES = [
+ "Canonicalizer.java",
+ "PathFragment.java",
+ "PathFragmentSerializationProxy.java",
+ "UnixPathFragment.java",
+ "WindowsPathFragment.java",
+]
+
+java_library(
+ name = "pathfragment",
+ srcs = PATH_FRAGMENT_SOURCES,
+ deps = [
+ "//src/main/java/com/google/devtools/build/lib:base-util",
+ "//src/main/java/com/google/devtools/build/lib:os_util",
+ "//src/main/java/com/google/devtools/build/lib:preconditions",
+ "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
+ "//src/main/java/com/google/devtools/build/lib/concurrent",
+ "//third_party:guava",
+ ],
+)
+
# Virtual file system; do not use externally!
java_library(
name = "vfs",
- srcs = glob([
- "*.java",
- ]),
+ srcs = glob(
+ [
+ "*.java",
+ ],
+ exclude = PATH_FRAGMENT_SOURCES,
+ ),
visibility = ["//visibility:public"],
+ exports = [
+ ":pathfragment",
+ ],
deps = [
+ ":pathfragment",
"//src/main/java/com/google/devtools/build/lib:base-util",
- "//src/main/java/com/google/devtools/build/lib:os_util",
"//src/main/java/com/google/devtools/build/lib:preconditions",
+ "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib/clock",
"//src/main/java/com/google/devtools/build/lib/concurrent",
"//src/main/java/com/google/devtools/build/lib/profiler",
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/Path.java b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
index 52b8af3f50..ab5ad5c1ce 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/Path.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/Path.java
@@ -15,6 +15,8 @@ package com.google.devtools.build.lib.vfs;
import com.google.common.base.Predicate;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.StringCanonicalizer;
import com.google.devtools.build.lib.vfs.FileSystem.HashFunction;
@@ -37,21 +39,20 @@ import java.util.IdentityHashMap;
import java.util.Objects;
/**
- * <p>Instances of this class represent pathnames, forming a tree
- * structure to implement sharing of common prefixes (parent directory names).
- * A node in these trees is something like foo, bar, .., ., or /. If the
- * instance is not a root path, it will have a parent path. A path can also
- * have children, which are indexed by name in a map.
+ * Instances of this class represent pathnames, forming a tree structure to implement sharing of
+ * common prefixes (parent directory names). A node in these trees is something like foo, bar, ..,
+ * ., or /. If the instance is not a root path, it will have a parent path. A path can also have
+ * children, which are indexed by name in a map.
*
- * <p>There is some limited support for Windows-style paths. Most importantly, drive identifiers
- * in front of a path (c:/abc) are supported. However, Windows-style backslash separators
+ * <p>There is some limited support for Windows-style paths. Most importantly, drive identifiers in
+ * front of a path (c:/abc) are supported. However, Windows-style backslash separators
* (C:\\foo\\bar) and drive-relative paths ("C:foo") are explicitly not supported, same with
* advanced features like \\\\network\\paths and \\\\?\\unc\\paths.
*
* <p>{@link FileSystem} implementations maintain pointers into this graph.
*/
@ThreadSafe
-public class Path implements Comparable<Path>, Serializable {
+public class Path implements Comparable<Path>, Serializable, SkylarkPrintable {
/** Filesystem-specific factory for {@link Path} objects. */
public static interface PathFactory {
@@ -427,6 +428,11 @@ public class Path implements Comparable<Path>, Serializable {
return builder.toString();
}
+ @Override
+ public void repr(SkylarkPrinter printer) {
+ printer.append(getPathString());
+ }
+
/**
* Returns the path as a string.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index c47a5f7122..a6d6b2b908 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -20,6 +20,8 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrintable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.StringCanonicalizer;
@@ -45,7 +47,8 @@ import java.util.Set;
*/
@Immutable
@ThreadSafe
-public abstract class PathFragment implements Comparable<PathFragment>, Serializable {
+public abstract class PathFragment
+ implements Comparable<PathFragment>, Serializable, SkylarkPrintable {
private static final Helper HELPER =
OS.getCurrent() == OS.WINDOWS ? WindowsPathFragment.HELPER : UnixPathFragment.HELPER;
@@ -451,18 +454,17 @@ public abstract class PathFragment implements Comparable<PathFragment>, Serializ
}
/**
- * Returns the path formed by appending the single non-special segment
- * "baseName" to this path.
+ * Returns the path formed by appending the single non-special segment "baseName" to this path.
*
- * <p>You should almost always use {@link #getRelative} instead, which has
- * the same performance characteristics if the given name is a valid base
- * name, and which also works for '.', '..', and strings containing '/'.
+ * <p>You should almost always use {@link #getRelative} instead, which has the same performance
+ * characteristics if the given name is a valid base name, and which also works for '.', '..', and
+ * strings containing '/'.
*
- * @throws IllegalArgumentException if {@code baseName} is not a valid base
- * name according to {@link FileSystemUtils#checkBaseName}
+ * @throws IllegalArgumentException if {@code baseName} is not a valid base name according to
+ * {@link #checkBaseName}
*/
public PathFragment getChild(String baseName) {
- FileSystemUtils.checkBaseName(baseName);
+ checkBaseName(baseName);
baseName = StringCanonicalizer.intern(baseName);
String[] newSegments = Arrays.copyOf(segments, segments.length + 1);
newSegments[newSegments.length - 1] = baseName;
@@ -734,4 +736,21 @@ public abstract class PathFragment implements Comparable<PathFragment>, Serializ
public String toString() {
return getPathString();
}
+
+ @Override
+ public void repr(SkylarkPrinter printer) {
+ printer.append(getPathString());
+ }
+
+ private static void checkBaseName(String baseName) {
+ if (baseName.length() == 0) {
+ throw new IllegalArgumentException("Child must not be empty string ('')");
+ }
+ if (baseName.equals(".") || baseName.equals("..")) {
+ throw new IllegalArgumentException("baseName must not be '" + baseName + "'");
+ }
+ if (baseName.indexOf('/') != -1) {
+ throw new IllegalArgumentException("baseName must not contain a slash: '" + baseName + "'");
+ }
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
index e92d3af074..2a4dbeaa4e 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTest.java
@@ -27,6 +27,7 @@ import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import java.util.List;
@@ -150,8 +151,11 @@ public class WorkspaceFactoryTest {
root);
Exception exception = null;
try {
+ byte[] bytes =
+ FileSystemUtils.readWithKnownFileSize(
+ workspaceFilePath, workspaceFilePath.getFileSize());
factory.parse(
- ParserInputSource.create(workspaceFilePath),
+ ParserInputSource.create(bytes, workspaceFilePath.asFragment()),
SkylarkSemantics.DEFAULT_SEMANTICS,
eventHandler);
} catch (BuildFileContainsErrorsException e) {
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index e487f3fdb4..742f616496 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -38,6 +38,7 @@ import com.google.devtools.build.lib.syntax.SkylarkSemantics;
import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
import com.google.devtools.build.lib.testutil.TestUtils;
import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
@@ -109,7 +110,8 @@ public class PackageFactoryApparatus {
* Parses the {@code buildFile} into a {@link BuildFileAST}.
*/
public BuildFileAST ast(Path buildFile) throws IOException {
- ParserInputSource inputSource = ParserInputSource.create(buildFile);
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(buildFile, buildFile.getFileSize());
+ ParserInputSource inputSource = ParserInputSource.create(bytes, buildFile.asFragment());
return BuildFileAST.parseBuildFile(inputSource, eventHandler);
}
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index bb588ecfe4..07079d9d09 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -670,9 +670,10 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
* usually write those files using UTF-8 encoding. Currently, the string-valued 'substitutions'
* parameter of the template_action function contains a hack that assumes its input is a UTF-8
* encoded string which has been ingested as Latin 1. The hack converts the string to its
- * "correct" UTF-8 value. Once {@link com.google.devtools.build.lib.syntax.ParserInputSource#create(com.google.devtools.build.lib.vfs.Path)}
- * parses files using UTF-8 and the hack for the substituations parameter is removed, this test
- * will fail.
+ * "correct" UTF-8 value. Once {@link
+ * com.google.devtools.build.lib.syntax.ParserInputSource#create(byte[],
+ * com.google.devtools.build.lib.vfs.PathFragment)} parses files using UTF-8 and the hack for the
+ * substituations parameter is removed, this test will fail.
*/
@Test
public void testCreateTemplateActionWithWrongEncoding() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
index aef5f82c27..f1aa92f02a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BuildFileASTTest.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
import com.google.devtools.build.lib.testutil.MoreAsserts;
import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import org.junit.Test;
@@ -45,7 +46,8 @@ public class BuildFileASTTest extends EvaluationTestCase {
*/
private BuildFileAST parseBuildFile(String... lines) throws IOException {
Path file = scratch.file("/a/build/file/BUILD", lines);
- ParserInputSource inputSource = ParserInputSource.create(file, file.getFileSize());
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(file, file.getFileSize());
+ ParserInputSource inputSource = ParserInputSource.create(bytes, file.asFragment());
return BuildFileAST.parseBuildFile(inputSource, getEventHandler());
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
index ce459d2eb8..fc8fb6b1a7 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserInputSourceTest.java
@@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.util.StringUtilities.joinLines;
import static org.junit.Assert.fail;
import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.io.IOException;
@@ -36,7 +37,8 @@ public class ParserInputSourceTest {
public void testCreateFromFile() throws IOException {
String content = joinLines("Line 1", "Line 2", "Line 3", "");
Path file = scratch.file("/tmp/my/file.txt", content.getBytes(StandardCharsets.UTF_8));
- ParserInputSource input = ParserInputSource.create(file);
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(file, file.getFileSize());
+ ParserInputSource input = ParserInputSource.create(bytes, file.asFragment());
assertThat(new String(input.getContent())).isEqualTo(content);
assertThat(input.getPath().toString()).isEqualTo("/tmp/my/file.txt");
}
@@ -65,7 +67,8 @@ public class ParserInputSourceTest {
public void testIOExceptionIfInputFileDoesNotExistForSingleArgConstructor() {
try {
Path path = scratch.resolve("/does/not/exist");
- ParserInputSource.create(path);
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(path, path.getFileSize());
+ ParserInputSource.create(bytes, path.asFragment());
fail();
} catch (IOException e) {
String expected = "/does/not/exist (No such file or directory)";
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitorTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitorTest.java
index 39f46d03b2..bdeb5ae680 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitorTest.java
@@ -16,6 +16,7 @@ package com.google.devtools.build.lib.syntax;
import static com.google.common.truth.Truth.assertThat;
import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import java.io.IOException;
import java.util.ArrayList;
@@ -24,7 +25,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-
/** Tests for @{code SyntaxTreeVisitor} */
@RunWith(JUnit4.class)
public class SyntaxTreeVisitorTest {
@@ -34,7 +34,9 @@ public class SyntaxTreeVisitorTest {
/** Parses the contents of the specified string and returns the AST. */
private BuildFileAST parse(String... lines) throws IOException {
Path file = scratch.file("/a/build/file/BUILD", lines);
- return BuildFileAST.parseSkylarkFile(file, null /* reporter */);
+ byte[] bytes = FileSystemUtils.readWithKnownFileSize(file, file.getFileSize());
+ return BuildFileAST.parseSkylarkFile(
+ bytes, file.getDigest(), file.asFragment(), /* reporter */ null);
}
@Test