Update from Google.

--
MOE_MIGRATED_REVID=85702957
diff --git a/src/main/java/com/google/devtools/build/lib/packages/InputFile.java b/src/main/java/com/google/devtools/build/lib/packages/InputFile.java
new file mode 100644
index 0000000..130e2b7
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/packages/InputFile.java
@@ -0,0 +1,124 @@
+// Copyright 2014 Google Inc. 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.packages;
+
+import com.google.common.base.Preconditions;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathFragment;
+
+/**
+ * A file that is an input to the build system.
+ *
+ * <p>In the build system, a file is considered an <i>input</i> file iff it is
+ * not generated by the build system (e.g. it's maintained under version
+ * control, or created by the test harness).  It has nothing to do with the
+ * type of the file; a generated file containing <code>Java</code> source code
+ * is an OutputFile, not an InputFile.
+ */
+@Immutable @ThreadSafe
+public final class InputFile extends FileTarget {
+  private final Location location;
+  private final RuleVisibility visibility;
+  private final License license;
+
+  /**
+   * Constructs an input file with the given label, which must be a label for
+   * the given package, and package-default visibility.
+   */
+  InputFile(Package pkg, Label label, Location location) {
+    this(pkg, label, location, null, License.NO_LICENSE);
+  }
+
+  /**
+   * Constructs an input file with the given label, which must be a label for the given package
+   * that was parsed from the specified location, and has the specified visibility.
+   */
+  InputFile(Package pkg, Label label, Location location, RuleVisibility visibility,
+      License license) {
+    super(pkg, label);
+    Preconditions.checkNotNull(location);
+    this.location = location;
+    this.visibility = visibility;
+    this.license = license;
+  }
+
+  public boolean isVisibilitySpecified() {
+    return visibility != null;
+  }
+
+  @Override
+  public RuleVisibility getVisibility() {
+    if (visibility != null) {
+      return visibility;
+    } else {
+      return pkg.getDefaultVisibility();
+    }
+  }
+
+  public boolean isLicenseSpecified() {
+    return license != null && license != License.NO_LICENSE;
+  }
+
+  @Override
+  public License getLicense() {
+    if (license != null) {
+      return license;
+    } else {
+      return pkg.getDefaultLicense();
+    }
+  }
+
+  /**
+   * Returns the path to the location of the input file (which is necessarily
+   * within the source tree, not beneath <code>bin</code> or
+   * <code>genfiles</code>.
+   *
+   * <p>Prefer {@link #getExecPath} if possible.
+   */
+  public Path getPath() {
+    return pkg.getPackageDirectory().getRelative(label.getName());
+  }
+
+  /**
+   * Returns the exec path of the file, i.e. the path relative to the package source root.
+   */
+  public PathFragment getExecPath() {
+    return label.toPathFragment();
+  }
+
+  @Override
+  public int hashCode() {
+    return label.hashCode();
+  }
+
+  @Override
+  public String getTargetKind() {
+    return "source file";
+  }
+
+  @Override
+  public Rule getAssociatedRule() {
+    return null;
+  }
+
+  @Override
+  public Location getLocation() {
+    return location;
+  }
+}