Files
clice/include/Test/Annotation.h
2025-11-30 15:21:27 +08:00

53 lines
1.3 KiB
C++

#pragma once
#include "AST/SourceCode.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
namespace clice::testing {
struct AnnotatedSource {
std::string content;
/// All named offsets
llvm::StringMap<std::uint32_t> offsets;
llvm::StringMap<LocalSourceRange> ranges;
std::vector<std::uint32_t> nameless_offsets;
/// Point Annotation:
/// - $(key): Marks a single point.
///
/// Range Annotation:
/// - @key[...content...]: Marks a range.
///
/// A range annotation for 'key' creates both a `ranges["key"]` and an `offsets["key"]`
/// (pointing to the start).
static AnnotatedSource from(llvm::StringRef content);
};
struct AnnotatedSources {
/// All sources file in the compilation.
llvm::StringMap<AnnotatedSource> all_files;
void add_source(llvm::StringRef file, llvm::StringRef content) {
all_files.try_emplace(file, AnnotatedSource::from(content));
}
/// Add sources to the params, use `#[filename]` to mark
/// a new file start. For example
///
/// ```cpp
/// #[test.h]
/// int foo();
///
/// #[main.cpp]
/// #include "test.h"
/// int x = foo();
/// ```
void add_sources(llvm::StringRef content);
};
} // namespace clice::testing