aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java254
1 files changed, 0 insertions, 254 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java
deleted file mode 100644
index ac3be0f524..0000000000
--- a/src/main/java/com/google/devtools/build/lib/vfs/WindowsPathFragment.java
+++ /dev/null
@@ -1,254 +0,0 @@
-// 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.vfs;
-
-import java.io.InvalidObjectException;
-import java.io.ObjectInputStream;
-
-/**
- * Abstract base class for {@link PathFragment} instances that will be allocated when Blaze is run
- * on a Windows platform.
- */
-abstract class WindowsPathFragment extends PathFragment {
- static final Helper HELPER = new Helper();
-
- // The drive letter of an absolute path, eg. 'C' for 'C:/foo'.
- // We deliberately ignore "C:foo" style paths and treat them like a literal "C:foo" path segment.
- protected final char driveLetter;
-
- protected WindowsPathFragment(char driveLetter, String[] segments) {
- super(segments);
- this.driveLetter = driveLetter;
- }
-
- @Override
- public String windowsVolume() {
- return (driveLetter != '\0') ? driveLetter + ":" : "";
- }
-
- @Override
- public char getDriveLetter() {
- return driveLetter;
- }
-
- @Override
- protected int computeHashCode() {
- int h = 0;
- for (String segment : segments) {
- int segmentHash = segment.toLowerCase().hashCode();
- h = h * 31 + segmentHash;
- }
- return h;
- }
-
- private static class Helper extends PathFragment.Helper {
- private static final char SEPARATOR_CHAR = '/';
- // TODO(laszlocsomor): Lots of internal PathFragment operations, e.g. getPathString, use the
- // primary separator char and do not use this.
- private static final char EXTRA_SEPARATOR_CHAR = '\\';
-
- private static boolean isDriveLetter(char c) {
- return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
- }
-
- @Override
- PathFragment create(String path) {
- char driveLetter =
- path.length() >= 3
- && path.charAt(1) == ':'
- && isSeparator(path.charAt(2))
- && isDriveLetter(path.charAt(0))
- ? Character.toUpperCase(path.charAt(0))
- : '\0';
- if (driveLetter != '\0') {
- path = path.substring(2);
- }
- boolean isAbsolute = path.length() > 0 && isSeparator(path.charAt(0));
- return isAbsolute
- ? new AbsoluteWindowsPathFragment(driveLetter, segment(path, 1))
- : new RelativeWindowsPathFragment(driveLetter, segment(path, 0));
- }
-
- @Override
- PathFragment createAlreadyInterned(char driveLetter, boolean isAbsolute, String[] segments) {
- return isAbsolute
- ? new AbsoluteWindowsPathFragment(driveLetter, segments)
- : new RelativeWindowsPathFragment(driveLetter, segments);
- }
-
- @Override
- char getPrimarySeparatorChar() {
- return SEPARATOR_CHAR;
- }
-
- @Override
- boolean isSeparator(char c) {
- return c == SEPARATOR_CHAR || c == EXTRA_SEPARATOR_CHAR;
- }
-
- @Override
- boolean containsSeparatorChar(String path) {
- // TODO(laszlocsomor): This is inefficient.
- return path.indexOf(SEPARATOR_CHAR) != -1 || path.indexOf(EXTRA_SEPARATOR_CHAR) != -1;
- }
-
- @Override
- boolean segmentsEqual(int length, String[] segments1, int offset1, String[] segments2) {
- if ((segments1.length - offset1) < length || segments2.length < length) {
- return false;
- }
- for (int i = 0; i < length; ++i) {
- String seg1 = segments1[i + offset1];
- String seg2 = segments2[i];
- if ((seg1 == null) != (seg2 == null)) {
- return false;
- }
- if (seg1 == null) {
- continue;
- }
- // TODO(laszlocsomor): The calls to String#toLowerCase are inefficient and potentially
- // repeated too. Also, why not use String#equalsIgnoreCase.
- seg1 = seg1.toLowerCase();
- seg2 = seg2.toLowerCase();
- if (!seg1.equals(seg2)) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- protected int compare(PathFragment pathFragment1, PathFragment pathFragment2) {
- if (pathFragment1.isAbsolute() != pathFragment2.isAbsolute()) {
- return pathFragment1.isAbsolute() ? -1 : 1;
- }
- int cmp = Character.compare(pathFragment1.getDriveLetter(), pathFragment2.getDriveLetter());
- if (cmp != 0) {
- return cmp;
- }
- String[] segments1 = pathFragment1.segments();
- String[] segments2 = pathFragment2.segments();
- int len1 = segments1.length;
- int len2 = segments2.length;
- int n = Math.min(len1, len2);
- for (int i = 0; i < n; i++) {
- String seg1 = segments1[i].toLowerCase();
- String seg2 = segments2[i].toLowerCase();
- cmp = seg1.compareTo(seg2);
- if (cmp != 0) {
- return cmp;
- }
- }
- return len1 - len2;
- }
- }
-
- private static final class AbsoluteWindowsPathFragment extends WindowsPathFragment {
- private AbsoluteWindowsPathFragment(char driveLetter, String[] segments) {
- super(driveLetter, segments);
- }
-
- @Override
- public boolean isAbsolute() {
- return true;
- }
-
- @Override
- protected int computeHashCode() {
- int h = Boolean.TRUE.hashCode();
- h = h * 31 + super.computeHashCode();
- h = h * 31 + Character.valueOf(getDriveLetter()).hashCode();
- return h;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof AbsoluteWindowsPathFragment)) {
- return false;
- }
- if (this == other) {
- return true;
- }
- AbsoluteWindowsPathFragment otherAbsoluteWindowsPathFragment =
- (AbsoluteWindowsPathFragment) other;
- return this.driveLetter == otherAbsoluteWindowsPathFragment.driveLetter
- && HELPER.segmentsEqual(this.segments, otherAbsoluteWindowsPathFragment.segments);
- }
-
- // Java serialization looks for the presence of this method in the concrete class. It is not
- // inherited from the parent class.
- @Override
- protected Object writeReplace() {
- return super.writeReplace();
- }
-
- // Java serialization looks for the presence of this method in the concrete class. It is not
- // inherited from the parent class.
- @Override
- protected void readObject(ObjectInputStream stream) throws InvalidObjectException {
- super.readObject(stream);
- }
- }
-
- private static final class RelativeWindowsPathFragment extends WindowsPathFragment {
- private RelativeWindowsPathFragment(char driveLetter, String[] segments) {
- super(driveLetter, segments);
- }
-
- @Override
- public boolean isAbsolute() {
- return false;
- }
-
- @Override
- protected int computeHashCode() {
- int h = Boolean.FALSE.hashCode();
- h = h * 31 + super.computeHashCode();
- if (!isEmpty()) {
- h = h * 31 + Character.valueOf(getDriveLetter()).hashCode();
- }
- return h;
- }
-
- @Override
- public boolean equals(Object other) {
- if (!(other instanceof RelativeWindowsPathFragment)) {
- return false;
- }
- if (this == other) {
- return true;
- }
- RelativeWindowsPathFragment otherRelativeWindowsPathFragment =
- (RelativeWindowsPathFragment) other;
- return isEmpty() && otherRelativeWindowsPathFragment.isEmpty()
- ? true
- : this.driveLetter == otherRelativeWindowsPathFragment.driveLetter
- && HELPER.segmentsEqual(this.segments, otherRelativeWindowsPathFragment.segments);
- }
-
- // Java serialization looks for the presence of this method in the concrete class. It is not
- // inherited from the parent class.
- @Override
- protected Object writeReplace() {
- return super.writeReplace();
- }
-
- // Java serialization looks for the presence of this method in the concrete class. It is not
- // inherited from the parent class.
- @Override
- protected void readObject(ObjectInputStream stream) throws InvalidObjectException {
- super.readObject(stream);
- }
- }
-}