Add getAttributeLocation to AttributeMap and related classes.

PiperOrigin-RevId: 175230893
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
index db7d6f0..c866cbd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
@@ -17,23 +17,24 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.syntax.Type;
 
 /**
- * An {@link AttributeMap} that supports attribute type queries on both a rule
- * and its aspects and attribute value queries on the rule.
+ * An {@link AttributeMap} that supports attribute type queries on both a rule and its aspects and
+ * attribute value queries on the rule.
  *
- * <p>An attribute type query is anything accessible from {@link Attribute} (i.e.
- * anything about how the attribute is integrated into the {@link RuleClass}). An
- * attribute value query is anything related to the actual value an attribute takes.
+ * <p>An attribute type query is anything accessible from {@link Attribute} (i.e. anything about how
+ * the attribute is integrated into the {@link RuleClass}). An attribute value query is anything
+ * related to the actual value an attribute takes.
  *
- * <p>For example, given {@code deps = [":adep"]}, checking that {@code deps} exists
- * or that it's type is {@link BuildType.LABEL_LIST} are type queries. Checking that
- * its value is explicitly set in the BUILD File or that its value
- * {@code [":adep"]} are value queries..
+ * <p>For example, given {@code deps = [":adep"]}, checking that {@code deps} exists or that it's
+ * type is {@link com.google.devtools.build.lib.packages.BuildType#LABEL_LIST} are type queries.
+ * Checking that its value is explicitly set in the BUILD File or that its value {@code [":adep"]}
+ * are value queries..
  *
  * <p>Value queries on aspect attributes trigger {@link UnsupportedOperationException}.
  */
@@ -167,4 +168,13 @@
           && aspectAttributes.get(attrName).getType() == type;
     }
   }
+
+  @Override
+  public Location getAttributeLocation(String attrName) {
+    if (ruleAttributes.has(attrName)) {
+      return ruleAttributes.getAttributeLocation(attrName);
+    } else {
+      return Location.BUILTIN;
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
index ec03962..c2725a3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
@@ -16,6 +16,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BuildType.SelectorList;
 import com.google.devtools.build.lib.syntax.Type;
 import javax.annotation.Nullable;
@@ -277,4 +278,9 @@
   public <T> boolean has(String attrName, Type<T> type) {
     return getAttributeType(attrName) == type;
   }
+
+  @Override
+  public Location getAttributeLocation(String attrName) {
+    return attributes.getAttributeLocation(attrName);
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
index cc3b5ee..a43fd86 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.CollectionUtils;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute.ComputationLimiter;
 import com.google.devtools.build.lib.packages.BuildType.Selector;
 import com.google.devtools.build.lib.packages.BuildType.SelectorList;
@@ -545,6 +546,11 @@
       public <T> boolean has(String attrName, Type<T> type) {
         return owner.has(attrName, type);
       }
+
+      @Override
+      public Location getAttributeLocation(String attrName) {
+        return owner.getAttributeLocation(attrName);
+      }
     };
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
index a573bf0..d00c6db 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
@@ -15,6 +15,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.Type;
 import javax.annotation.Nullable;
 
@@ -95,9 +96,10 @@
    */
   boolean isAttributeValueExplicitlySpecified(String attributeName);
 
-  /**
-   * An interface which accepts {@link Attribute}s, used by {@link #visitLabels}.
-   */
+  /** Returns the {@link Location} at which the attribute was defined. */
+  Location getAttributeLocation(String attrName);
+
+  /** An interface which accepts {@link Attribute}s, used by {@link #visitLabels}. */
   interface AcceptsLabelAttribute {
     /**
      * Accept a (Label, Attribute) pair describing a dependency edge.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
index 5e56c99..37163fb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
@@ -16,6 +16,7 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.Type;
 import javax.annotation.Nullable;
 
@@ -106,4 +107,9 @@
   public <T> boolean has(String attrName, Type<T> type) {
     return delegate.has(attrName, type);
   }
+
+  @Override
+  public Location getAttributeLocation(String attrName) {
+    return delegate.getAttributeLocation(attrName);
+  }
 }