From e4b769cb0a196b3410b4da5e4415b634b4429399 Mon Sep 17 00:00:00 2001
From: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Date: Fri, 26 May 2023 18:03:28 +0200
Subject: [PATCH] gccrs: libproc_macro: Add Span definition

Add Span type definition in the rust interface.

libgrust/ChangeLog:

	* libproc_macro/rust/bridge/group.rs: Add span member
	to the Group structure.
	* libproc_macro/rust/bridge/ident.rs: Likewise with the
	Ident structure.
	* libproc_macro/rust/bridge/literal.rs: Likewise with
	the Literal structure.
	* libproc_macro/rust/bridge/punct.rs: Likewise with the
	Punct structure.
	* libproc_macro/rust/bridge/span.rs: Add span
	internals.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
---
 libgrust/libproc_macro/rust/bridge/group.rs   |  9 +++++++--
 libgrust/libproc_macro/rust/bridge/ident.rs   | 17 ++++++++--------
 libgrust/libproc_macro/rust/bridge/literal.rs | 20 ++++++++++++++-----
 libgrust/libproc_macro/rust/bridge/punct.rs   |  4 +++-
 libgrust/libproc_macro/rust/bridge/span.rs    | 20 +++++++++++++------
 5 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/libgrust/libproc_macro/rust/bridge/group.rs b/libgrust/libproc_macro/rust/bridge/group.rs
index 83d2e068429a..254a3db746d2 100644
--- a/libgrust/libproc_macro/rust/bridge/group.rs
+++ b/libgrust/libproc_macro/rust/bridge/group.rs
@@ -8,11 +8,16 @@ use Delimiter;
 pub struct Group {
     delimiter: Delimiter,
     stream: TokenStream,
+    span: Span,
 }
 
 impl Group {
     pub fn new(delimiter: Delimiter, stream: TokenStream) -> Self {
-        Group { delimiter, stream }
+        Group {
+            delimiter,
+            stream,
+            span: Span::default(),
+        }
     }
 
     pub fn delimiter(&self) -> Delimiter {
@@ -20,7 +25,7 @@ impl Group {
     }
 
     pub fn span(&self) -> Span {
-        Span {}
+        self.span
     }
 
     pub fn set_span(&mut self, span: Span) {
diff --git a/libgrust/libproc_macro/rust/bridge/ident.rs b/libgrust/libproc_macro/rust/bridge/ident.rs
index 04169a46fad9..4218921724ac 100644
--- a/libgrust/libproc_macro/rust/bridge/ident.rs
+++ b/libgrust/libproc_macro/rust/bridge/ident.rs
@@ -4,8 +4,8 @@ use std::ffi::c_uchar;
 use std::fmt;
 
 extern "C" {
-    fn Ident__new(string: *const c_uchar, len: u64) -> Ident;
-    fn Ident__new_raw(string: *const c_uchar, len: u64) -> Ident;
+    fn Ident__new(string: *const c_uchar, len: u64, span: Span) -> Ident;
+    fn Ident__new_raw(string: *const c_uchar, len: u64, span: Span) -> Ident;
     fn Ident__drop(ident: *mut Ident);
     fn Ident__clone(ident: *const Ident) -> Ident;
 }
@@ -16,23 +16,24 @@ pub struct Ident {
     pub(crate) is_raw: bool,
     pub(crate) val: *const c_uchar,
     len: u64,
+    span: Span,
 }
 
 impl Ident {
-    pub fn new(string: &str, _span: Span) -> Self {
-        unsafe { Ident__new(string.as_ptr(), string.len().try_into().unwrap()) }
+    pub fn new(string: &str, span: Span) -> Self {
+        unsafe { Ident__new(string.as_ptr(), string.len().try_into().unwrap(), span) }
     }
 
-    pub fn new_raw(string: &str, _span: Span) -> Self {
-        unsafe { Ident__new_raw(string.as_ptr(), string.len().try_into().unwrap()) }
+    pub fn new_raw(string: &str, span: Span) -> Self {
+        unsafe { Ident__new_raw(string.as_ptr(), string.len().try_into().unwrap(), span) }
     }
 
     pub fn span(&self) -> Span {
-        Span {}
+        self.span
     }
 
     pub fn set_span(&mut self, span: Span) {
-        let _ = span;
+        self.span = span;
     }
 }
 
diff --git a/libgrust/libproc_macro/rust/bridge/literal.rs b/libgrust/libproc_macro/rust/bridge/literal.rs
index f54bfe20d8d2..b03e363db333 100644
--- a/libgrust/libproc_macro/rust/bridge/literal.rs
+++ b/libgrust/libproc_macro/rust/bridge/literal.rs
@@ -29,7 +29,7 @@ pub struct Literal {
     kind: LitKind,
     text: FFIString,
     suffix: FFIString,
-    // FIXME: Add span, cannot add whilst Span remain an empty type
+    span: Span,
 }
 
 macro_rules! suffixed_int_literals {
@@ -38,7 +38,8 @@ macro_rules! suffixed_int_literals {
             Literal {
                 kind : LitKind::Integer,
                 text: FFIString::from(&n.to_string()),
-                suffix: FFIString::from(stringify!($kind))
+                suffix: FFIString::from(stringify!($kind)),
+                span: Span::default(),
             }
         }
     )*)
@@ -50,7 +51,8 @@ macro_rules! unsuffixed_int_literals {
             Literal {
                 kind : LitKind::Integer,
                 text: FFIString::from(&n.to_string()),
-                suffix: FFIString::from("")
+                suffix: FFIString::from(""),
+                span: Span::default(),
             }
         }
     )*)
@@ -97,6 +99,7 @@ impl Literal {
             kind: LitKind::Float,
             text: FFIString::from(&repr),
             suffix: FFIString::from(""),
+            span: Span::default(),
         }
     }
 
@@ -105,6 +108,7 @@ impl Literal {
             kind: LitKind::Float,
             text: FFIString::from(&n.to_string()),
             suffix: FFIString::from("f32"),
+            span: Span::default(),
         }
     }
 
@@ -118,6 +122,7 @@ impl Literal {
             kind: LitKind::Float,
             text: FFIString::from(&repr),
             suffix: FFIString::from(""),
+            span: Span::default(),
         }
     }
 
@@ -126,6 +131,7 @@ impl Literal {
             kind: LitKind::Float,
             text: FFIString::from(&n.to_string()),
             suffix: FFIString::from("f64"),
+            span: Span::default(),
         }
     }
 
@@ -134,6 +140,7 @@ impl Literal {
             kind: LitKind::Str,
             text: FFIString::from(string),
             suffix: FFIString::from(""),
+            span: Span::default(),
         }
     }
 
@@ -142,6 +149,7 @@ impl Literal {
             kind: LitKind::Char,
             text: FFIString::from(&c.to_string()),
             suffix: FFIString::from(""),
+            span: Span::default(),
         }
     }
 
@@ -150,15 +158,16 @@ impl Literal {
             kind: LitKind::ByteStr,
             text: FFIString::from(&bytes.escape_ascii().to_string()),
             suffix: FFIString::from(""),
+            span: Span::default(),
         }
     }
 
     pub fn span(&self) -> Span {
-        Span {}
+        self.span
     }
 
     pub fn set_span(&mut self, span: Span) {
-        let _ = span;
+        self.span = span;
     }
 }
 
@@ -221,6 +230,7 @@ impl FromStr for Literal {
             kind: LitKind::Err,
             text: FFIString::from(""),
             suffix: FFIString::from(""),
+            span: Span::default(),
         };
         // TODO: We might want to pass a LexError by reference to retrieve
         // error information
diff --git a/libgrust/libproc_macro/rust/bridge/punct.rs b/libgrust/libproc_macro/rust/bridge/punct.rs
index f5f76b1f1cf6..e835472f233a 100644
--- a/libgrust/libproc_macro/rust/bridge/punct.rs
+++ b/libgrust/libproc_macro/rust/bridge/punct.rs
@@ -8,6 +8,7 @@ use Spacing;
 pub struct Punct {
     pub(crate) ch: u32,
     pub(crate) spacing: Spacing,
+    span: Span,
 }
 
 impl Punct {
@@ -15,11 +16,12 @@ impl Punct {
         Punct {
             ch: ch.into(),
             spacing,
+            span: Span::default(),
         }
     }
 
     pub fn span(&self) -> Span {
-        Span {}
+        self.span
     }
 
     pub fn set_span(&mut self, span: Span) {
diff --git a/libgrust/libproc_macro/rust/bridge/span.rs b/libgrust/libproc_macro/rust/bridge/span.rs
index 5bbdd5a34ea2..06537c93d69b 100644
--- a/libgrust/libproc_macro/rust/bridge/span.rs
+++ b/libgrust/libproc_macro/rust/bridge/span.rs
@@ -5,28 +5,36 @@
 //! All methods accessing source location in rust are unstable, hence this
 //! implementation with an empty structure.
 
-#[derive(Copy, Clone, Debug)]
+/// # Note: Gcc does not have a span interner, a span will not contain an index
+#[derive(Copy, Clone, Debug, Default)]
 #[repr(C)]
-pub struct Span {}
+pub struct Span {
+    location: u32,
+}
 
 impl Span {
     pub fn call_site() -> Self {
-        Span {}
+        // FIXME: implement this function properly
+        Span::default()
     }
 
     pub fn mixed_site() -> Self {
-        Span {}
+        // FIXME: implement this function properly
+        Span::default()
     }
 
     pub fn resolved_at(&self, _other: Span) -> Self {
-        Span {}
+        // FIXME: implement this function properly
+        Span::default()
     }
 
     pub fn located_at(&self, _other: Span) -> Self {
-        Span {}
+        // FIXME: implement this function properly
+        Span::default()
     }
 
     pub fn source_text(&self) -> Option<String> {
+        // FIXME: implement this function properly
         None
     }
 }
-- 
GitLab