private String createMessage(Map<Pair<Unit, Set<String>>, Set<Unit>> createProvidesConfigMap) {
    StringBuilder stringBuilder = new StringBuilder();
    boolean appendedConfiguration = false;
    for (Entry<Pair<Unit, Set<String>>, Set<Unit>> provideEntry :
        createProvidesConfigMap.entrySet()) {
      Pair<Unit, Set<String>> key = provideEntry.getKey();
      Unit definition = key.getFirst();
      FeatureTag definitionTag = (FeatureTag) definition.getTag("FeatureTag");
      Set<String> configuration = key.getSecond();

      Set<Unit> reachedUses = provideEntry.getValue();
      for (Unit reachedUnit : reachedUses) {
        FeatureTag reachedUnitTag = (FeatureTag) reachedUnit.getTag("FeatureTag");
        Set<String> difference = new HashSet<String>(reachedUnitTag);
        difference.removeAll(definitionTag);

        if (difference.size() == 0) {
          continue;
        }

        if (!appendedConfiguration) {
          stringBuilder.append("\n\n");
          stringBuilder.append(configuration);
          stringBuilder.append('\n');
          appendedConfiguration = true;
        }
        stringBuilder.append("Provides " + definition + " to\n");

        for (String feature : difference) {
          stringBuilder.append("line " + ASTNodeUnitBridge.getLineFromUnit(reachedUnit));
          stringBuilder.append(" [feature " + feature + "]\n");
        }
      }
      appendedConfiguration = false;
    }
    return stringBuilder.toString();
  }