@Override
  public void visitElement(@NonNull XmlContext context, @NonNull Element element) {
    // Record include graph such that we can look for inter-layout duplicates after the
    // project has been fully checked

    String layout = element.getAttribute(ATTR_LAYOUT); // NOTE: Not in android: namespace
    if (layout.startsWith(LAYOUT_RESOURCE_PREFIX)) { // Ignore @android:layout/ layouts
      layout = layout.substring(LAYOUT_RESOURCE_PREFIX.length());

      if (context.getPhase() == 1) {
        if (!context.getProject().getReportIssues()) {
          // If this is a library project not being analyzed, ignore it
          return;
        }

        List<String> to = mIncludes.get(context.file);
        if (to == null) {
          to = new ArrayList<String>();
          mIncludes.put(context.file, to);
        }
        to.add(layout);
      } else {
        assert context.getPhase() == 2;

        Collection<Multimap<String, Occurrence>> maps = mLocations.get(context.file);
        if (maps != null && !maps.isEmpty()) {
          for (Multimap<String, Occurrence> map : maps) {
            if (!maps.isEmpty()) {
              Collection<Occurrence> occurrences = map.get(layout);
              if (occurrences != null && !occurrences.isEmpty()) {
                for (Occurrence occurrence : occurrences) {
                  Location location = context.getLocation(element);
                  location.setClientData(element);
                  location.setMessage(occurrence.message);
                  location.setSecondary(occurrence.location);
                  occurrence.location = location;
                }
              }
            }
          }
        }
      }
    }
  }