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

Code before:
  // 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) -> llvm::StringRef {
  static constexpr llvm::StringRef FilePrefix = "file:/";
  if (uri.starts_with(FilePrefix)) {
    return uri.drop_front(FilePrefix.size());
  }
  return uri;
}

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 != "AUTOFILL") {
    return Success{};
  }

  auto uri = text_document->getString("uri");
  CARBON_CHECK(uri.has_value());

  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;
  }
  attr_it->second = split_it->content;
  return Success{};
}

// Reformats `[[@LSP:` and similar keyword as an LSP call with headers.
static auto ReplaceLspKeywordAt(std::string* content, size_t keyword_pos,
                                int& lsp_call_id,
                                llvm::ArrayRef<TestFile::Split> splits)
    -> ErrorOr<size_t> {
  llvm::StringRef content_at_keyword =
      llvm::StringRef(*content).substr(keyword_pos);

Review comment (suggestion):
minor but i suggest a different wording here
```suggestion
  if (attr_it == text_document->end() || attr_it->second != "FROM_FILE_SPLIT") {
```

Code after:

  // 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;
  }
  attr_it->second = split_it->content;
  return Success();
}