Repository: carbon-language/carbon-lang
File: testing/file_test/test_file.cpp (C++)

Code before:
  // The current file name, considering splits. Empty for the default file.
  llvm::StringRef filename = "";

  // The accumulated content for the file being built. This may elide some of
  // the original content, such as conflict markers.
  std::string content;

  // The current file index.
  int file_index = 0;
};

static auto ExtractFilePathFromUri(llvm::StringRef uri)
    -> std::optional<llvm::StringRef> {
  static constexpr llvm::StringRef FilePrefix = "file:/";
  if (!uri.starts_with(FilePrefix)) {
    return std::nullopt;
  }
  return uri.drop_front(FilePrefix.size());
}

static auto AutoFillDidOpenParams(llvm::json::Object* params,
                                  llvm::ArrayRef<TestFile::Split> splits)
    -> ErrorOr<Success> {
  auto* text_document = params->getObject("textDocument");
  if (text_document == nullptr) {
    return Success{};
  }

  auto attr_it = text_document->find("text");
  if (attr_it == text_document->end() || attr_it->second != "FROM_FILE_SPLIT") {
    return Success{};
  }

  auto uri = text_document->getString("uri");
  if (!uri) {
    return ErrorBuilder() << "missing uri in params.textDocument";
  }

  auto file_path = ExtractFilePathFromUri(*uri);
  if (!file_path) {
    return ErrorBuilder() << "uri `" << *uri << "` is not a file uri";
  }
  const auto* split_it =
      llvm::find_if(splits, [&](const TestFile::Split& split) {
        return split.filename == file_path;
      });
  if (split_it == splits.end()) {
    return ErrorBuilder() << "No split found for uri: " << *uri;
  }
  attr_it->second = split_it->content;
  return Success{};

Review comment (suggestion):
A comment seems like it'd be especially helpful here:

```suggestion
// When `FROM_FILE_SPLIT` is used in `text`, populate the value from the split
// matching the `uri`. Only used for `textDocument/didOpen`.
static auto AutoFillDidOpenParams(llvm::json::Object* params,
```

Code after:

  // The current file name, considering splits. Empty for the default file.
  llvm::StringRef filename = "";

  // The accumulated content for the file being built. This may elide some of
  // the original content, such as conflict markers.
  std::string content;

  // The current file index.
  int file_index = 0;
};

// Given a `file:/<filename>` URI, returns the filename.
static auto ExtractFilePathFromUri(llvm::StringRef uri)
    -> ErrorOr<llvm::StringRef> {
  static constexpr llvm::StringRef FilePrefix = "file:/";
  if (!uri.starts_with(FilePrefix)) {
    return ErrorBuilder("uri `") << uri << "` is not a file uri";
  }
  return uri.drop_front(FilePrefix.size());
}

// When `FROM_FILE_SPLIT` is used in path `textDocument.text`, populate the
// value from the split matching the `uri`. Only used for
// `textDocument/didOpen`.
static auto AutoFillDidOpenParams(llvm::json::Object* params,
                                  llvm::ArrayRef<TestFile::Split> splits)
    -> ErrorOr<Success> {
  auto* text_document = params->getObject("textDocument");
  if (text_document == nullptr) {
    return Success();
  }

  auto attr_it = text_document->find("text");
  if (attr_it == text_document->end() || attr_it->second != "FROM_FILE_SPLIT") {
    return Success();
  }

  auto uri = text_document->getString("uri");
  if (!uri) {
    return Error("missing uri in params.textDocument");
  }

  CARBON_ASSIGN_OR_RETURN(auto file_path, ExtractFilePathFromUri(*uri));
  const auto* split_it =
      llvm::find_if(splits, [&](const TestFile::Split& split) {
        return split.filename == file_path;
      });
  if (split_it == splits.end()) {
    return ErrorBuilder() << "No split found for uri: " << *uri;
  }