summaryrefslogtreecommitdiff
path: root/compiler/Meta.ml
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/Meta.ml')
-rw-r--r--compiler/Meta.ml44
1 files changed, 44 insertions, 0 deletions
diff --git a/compiler/Meta.ml b/compiler/Meta.ml
new file mode 100644
index 00000000..f0e4ca04
--- /dev/null
+++ b/compiler/Meta.ml
@@ -0,0 +1,44 @@
+(** Meta data like code spans *)
+
+(** A line location *)
+type loc = {
+ line : int; (** The (1-based) line number. *)
+ col : int; (** The (0-based) column offset. *)
+}
+[@@deriving show]
+
+type file_name =
+ | Virtual of string (** A remapped path (namely paths into stdlib) *)
+ | Local of string
+ (** A local path (a file coming from the current crate for instance) *)
+[@@deriving show]
+
+(** Span data *)
+type span = { file : file_name; beg_loc : loc; end_loc : loc } [@@deriving show]
+
+type meta = {
+ span : span;
+ (** The source code span.
+
+ If this meta information is for a statement/terminator coming from a macro
+ expansion/inlining/etc., this span is (in case of macros) for the macro
+ before expansion (i.e., the location the code where the user wrote the call
+ to the macro).
+
+ Ex:
+ {[
+ // Below, we consider the spans for the statements inside `test`
+
+ // the statement we consider, which gets inlined in `test`
+ VV
+ macro_rules! macro { ... st ... } // `generated_from_span` refers to this location
+
+ fn test() {
+ macro!(); // <-- `span` refers to this location
+ }
+ ]}
+ *)
+ generated_from_span : span option;
+ (** Where the code actually comes from, in case of macro expansion/inlining/etc. *)
+}
+[@@deriving show]