aboutsummaryrefslogtreecommitdiff
path: root/libgrust
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-05-30 10:57:01 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2024-01-16 18:46:23 +0100
commit4d950fa5dfca0aa526a5d5e72f353b4a46cfb1e4 (patch)
treee891a737142aff4269c691ae616773cc98dfdce3 /libgrust
parente4b769cb0a196b3410b4da5e4415b634b4429399 (diff)
downloadgcc-4d950fa5dfca0aa526a5d5e72f353b4a46cfb1e4.zip
gcc-4d950fa5dfca0aa526a5d5e72f353b4a46cfb1e4.tar.gz
gcc-4d950fa5dfca0aa526a5d5e72f353b4a46cfb1e4.tar.bz2
gccrs: libproc_macro: Add cpp Span representation
Add Span representation in libproc_macro cpp part of the library. Integrate spans to existing types. gcc/rust/ChangeLog: * util/rust-token-converter.cc (convert): Update call to constructors with location information. (handle_suffix): Convert token locus to a Span and use it in the literal. libgrust/ChangeLog: * libproc_macro/Makefile.am: Add span.cc * libproc_macro/Makefile.in: Regenerate. * libproc_macro/span.cc: New file. * libproc_macro/span.h: New file. * libproc_macro/group.cc (Group::make_group): Add span argument. * libproc_macro/group.h (GROUP_H): Add include directive for spans. * libproc_macro/ident.cc (Ident__new): Add span argument. (Ident__new_raw): Likewise. (Ident::make_ident): Likewise. * libproc_macro/ident.h (Ident__new): Likewise. (Ident__new_raw): Likewise. * libproc_macro/literal.cc (Literal::clone): Clone the span. (Literal::make_literal): Add span argument. (Literal::make_u8): Likewise. (Literal::make_u16): Likewise. (Literal::make_u32): Likewise. (Literal::make_u64): Likewise. (Literal::make_i8): Likewise. (Literal::make_i16): Likewise. (Literal::make_i32): Likewise. (Literal::make_i64): Likewise. (Literal::make_string): Likewise. (Literal::make_byte_string): Likewise. (Literal::make_f32): Likewise. (Literal::make_f64): Likewise. (Literal::make_char): Likewise. (Literal::make_usize): Likewise. (Literal::make_isize): Likewise. * libproc_macro/literal.h (struct Literal): Add span to Literal structure. * libproc_macro/punct.cc (Punct::make_punct): Add span argument to punct constructor. * libproc_macro/punct.h (struct Punct): Add span to Punct structure. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'libgrust')
-rw-r--r--libgrust/libproc_macro/Makefile.am1
-rw-r--r--libgrust/libproc_macro/Makefile.in1
-rw-r--r--libgrust/libproc_macro/group.cc4
-rw-r--r--libgrust/libproc_macro/group.h5
-rw-r--r--libgrust/libproc_macro/ident.cc19
-rw-r--r--libgrust/libproc_macro/ident.h11
-rw-r--r--libgrust/libproc_macro/literal.cc36
-rw-r--r--libgrust/libproc_macro/literal.h6
-rw-r--r--libgrust/libproc_macro/punct.cc4
-rw-r--r--libgrust/libproc_macro/punct.h5
-rw-r--r--libgrust/libproc_macro/span.cc40
-rw-r--r--libgrust/libproc_macro/span.h41
12 files changed, 134 insertions, 39 deletions
diff --git a/libgrust/libproc_macro/Makefile.am b/libgrust/libproc_macro/Makefile.am
index 493508c..24945a4 100644
--- a/libgrust/libproc_macro/Makefile.am
+++ b/libgrust/libproc_macro/Makefile.am
@@ -53,6 +53,7 @@ objext = @OBJEXT@
REQUIRED_OFILES = \
./proc_macro.$(objext) \
+ ./span.$(objext) \
./literal.$(objext) \
./group.$(objext) \
./ident.$(objext) \
diff --git a/libgrust/libproc_macro/Makefile.in b/libgrust/libproc_macro/Makefile.in
index 36031ef..db5f2d4 100644
--- a/libgrust/libproc_macro/Makefile.in
+++ b/libgrust/libproc_macro/Makefile.in
@@ -312,6 +312,7 @@ TARGETLIB = ./libproc_macro.a
objext = @OBJEXT@
REQUIRED_OFILES = \
./proc_macro.$(objext) \
+ ./span.$(objext) \
./literal.$(objext) \
./group.$(objext) \
./ident.$(objext) \
diff --git a/libgrust/libproc_macro/group.cc b/libgrust/libproc_macro/group.cc
index 74c1959..38730d8 100644
--- a/libgrust/libproc_macro/group.cc
+++ b/libgrust/libproc_macro/group.cc
@@ -25,9 +25,9 @@
namespace ProcMacro {
Group
-Group::make_group (TokenStream stream, Delimiter delim)
+Group::make_group (TokenStream stream, Delimiter delim, Span span)
{
- return {delim, stream};
+ return {delim, stream, span};
}
void
diff --git a/libgrust/libproc_macro/group.h b/libgrust/libproc_macro/group.h
index 26680b0..fa76d4b 100644
--- a/libgrust/libproc_macro/group.h
+++ b/libgrust/libproc_macro/group.h
@@ -23,6 +23,7 @@
#ifndef GROUP_H
#define GROUP_H
+#include "span.h"
#include "tokenstream.h"
namespace ProcMacro {
@@ -39,9 +40,11 @@ struct Group
{
Delimiter delimiter;
TokenStream stream;
+ Span span;
public:
- static Group make_group (TokenStream stream, Delimiter delim);
+ static Group make_group (TokenStream stream, Delimiter delim,
+ Span span = Span::make_unknown ());
static void drop (Group *g);
};
diff --git a/libgrust/libproc_macro/ident.cc b/libgrust/libproc_macro/ident.cc
index c214836..2369705 100644
--- a/libgrust/libproc_macro/ident.cc
+++ b/libgrust/libproc_macro/ident.cc
@@ -28,15 +28,15 @@ namespace ProcMacro {
extern "C" {
Ident
-Ident__new (unsigned char *str, std::uint64_t len)
+Ident__new (unsigned char *str, std::uint64_t len, Span span)
{
- return Ident::make_ident (str, len);
+ return Ident::make_ident (str, len, span);
}
Ident
-Ident__new_raw (unsigned char *str, std::uint64_t len)
+Ident__new_raw (unsigned char *str, std::uint64_t len, Span span)
{
- return Ident::make_ident (str, len, true);
+ return Ident::make_ident (str, len, span, true);
}
void
@@ -57,23 +57,24 @@ Ident::clone () const
{
unsigned char *val = new unsigned char[this->len];
std::memcpy (val, this->val, this->len);
- return {this->is_raw, val, this->len};
+ return {this->is_raw, val, this->len, this->span};
}
Ident
-Ident::make_ident (std::string str, bool raw)
+Ident::make_ident (std::string str, Span span, bool raw)
{
return Ident::make_ident (reinterpret_cast<const unsigned char *> (
str.c_str ()),
- str.length (), raw);
+ str.length (), span, raw);
}
Ident
-Ident::make_ident (const unsigned char *str, std::uint64_t len, bool raw)
+Ident::make_ident (const unsigned char *str, std::uint64_t len, Span span,
+ bool raw)
{
unsigned char *val = new unsigned char[len];
std::memcpy (val, str, len);
- return {raw, val, len};
+ return {raw, val, len, span};
}
void
diff --git a/libgrust/libproc_macro/ident.h b/libgrust/libproc_macro/ident.h
index 82a154c..28d6ebe 100644
--- a/libgrust/libproc_macro/ident.h
+++ b/libgrust/libproc_macro/ident.h
@@ -26,6 +26,8 @@
#include <cstdint>
#include <string>
+#include "span.h"
+
namespace ProcMacro {
struct Ident
@@ -35,12 +37,13 @@ struct Ident
unsigned char *val;
// Length in bytes
std::uint64_t len;
+ Span span;
public:
Ident clone () const;
- static Ident make_ident (std::string str, bool raw = false);
+ static Ident make_ident (std::string str, Span span, bool raw = false);
static Ident make_ident (const unsigned char *str, std::uint64_t len,
- bool raw = false);
+ Span span, bool raw = false);
static void drop (Ident *ident);
};
@@ -48,10 +51,10 @@ public:
extern "C" {
Ident
-Ident__new (unsigned char *str, std::uint64_t len);
+Ident__new (unsigned char *str, std::uint64_t len, Span span);
Ident
-Ident__new_raw (unsigned char *str, std::uint64_t len);
+Ident__new_raw (unsigned char *str, std::uint64_t len, Span span);
void
Ident__drop (Ident *ident);
diff --git a/libgrust/libproc_macro/literal.cc b/libgrust/libproc_macro/literal.cc
index af1632b..4ad45c9 100644
--- a/libgrust/libproc_macro/literal.cc
+++ b/libgrust/libproc_macro/literal.cc
@@ -46,16 +46,16 @@ Literal::drop (Literal *lit)
Literal
Literal::clone () const
{
- return {this->kind, this->text.clone (), this->suffix.clone ()};
+ return {this->kind, this->text.clone (), this->suffix.clone (), this->span};
}
Literal
-Literal::make_literal (LitKind kind, const std::string &text,
+Literal::make_literal (LitKind kind, Span span, const std::string &text,
const std::string &suffix)
{
auto ffi_text = FFIString::make_ffistring (text);
auto ffi_suffix = FFIString::make_ffistring (suffix);
- return {kind, ffi_text, ffi_suffix};
+ return {kind, ffi_text, ffi_suffix, span};
}
Literal
@@ -63,7 +63,7 @@ Literal::make_u8 (std::uint8_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "u8" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -71,7 +71,7 @@ Literal::make_u16 (std::uint16_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "u16" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -79,7 +79,7 @@ Literal::make_u32 (std::uint32_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "u32" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -87,7 +87,7 @@ Literal::make_u64 (std::uint64_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "u64" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -95,7 +95,7 @@ Literal::make_i8 (std::int8_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "i8" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -103,7 +103,7 @@ Literal::make_i16 (std::int16_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "i16" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -111,7 +111,7 @@ Literal::make_i32 (std::int32_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "i32" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -119,7 +119,7 @@ Literal::make_i64 (std::int64_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "i64" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -127,7 +127,7 @@ Literal::make_string (const std::string &str)
{
auto text = FFIString::make_ffistring (str);
auto suffix = FFIString::make_ffistring ("");
- return {LitKind::make_str (), text, suffix};
+ return {LitKind::make_str (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -136,7 +136,7 @@ Literal::make_byte_string (const std::vector<std::uint8_t> &vec)
auto text
= FFIString::make_ffistring (std::string (vec.cbegin (), vec.cend ()));
auto suffix = FFIString::make_ffistring ("");
- return {LitKind::make_byte_str (), text, suffix};
+ return {LitKind::make_byte_str (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -144,7 +144,7 @@ Literal::make_f32 (float value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "f32" : "");
- return {LitKind::make_float (), text, suffix};
+ return {LitKind::make_float (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -152,7 +152,7 @@ Literal::make_f64 (double value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "f64" : "");
- return {LitKind::make_float (), text, suffix};
+ return {LitKind::make_float (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -160,7 +160,7 @@ Literal::make_char (std::uint32_t ch)
{
auto text = FFIString::make_ffistring (std::to_string ((char) ch));
auto suffix = FFIString::make_ffistring ("");
- return {LitKind::make_char (), text, suffix};
+ return {LitKind::make_char (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -168,7 +168,7 @@ Literal::make_usize (std::uint64_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "usize" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
Literal
@@ -176,7 +176,7 @@ Literal::make_isize (std::int64_t value, bool suffixed)
{
auto text = FFIString::make_ffistring (std::to_string (value));
auto suffix = FFIString::make_ffistring (suffixed ? "isize" : "");
- return {LitKind::make_integer (), text, suffix};
+ return {LitKind::make_integer (), text, suffix, Span::make_unknown ()};
}
LitKind
diff --git a/libgrust/libproc_macro/literal.h b/libgrust/libproc_macro/literal.h
index 86b1a17..e1b7079 100644
--- a/libgrust/libproc_macro/literal.h
+++ b/libgrust/libproc_macro/literal.h
@@ -26,6 +26,7 @@
#include <cstdint>
#include <string>
#include <vector>
+#include "span.h"
#include "ffistring.h"
namespace ProcMacro {
@@ -70,13 +71,14 @@ struct Literal
LitKind kind;
FFIString text;
FFIString suffix;
- // TODO: Add span once done in rust interface
+ Span span;
public:
Literal clone () const;
bool has_suffix () const { return suffix.len != 0; };
- static Literal make_literal (const LitKind kind, const std::string &text,
+ static Literal make_literal (const LitKind kind, Span span,
+ const std::string &text,
const std::string &suffix = "");
static Literal make_u8 (std::uint8_t value, bool suffixed = true);
static Literal make_u16 (std::uint16_t value, bool suffixed = true);
diff --git a/libgrust/libproc_macro/punct.cc b/libgrust/libproc_macro/punct.cc
index 78d25f9..32450cc 100644
--- a/libgrust/libproc_macro/punct.cc
+++ b/libgrust/libproc_macro/punct.cc
@@ -26,9 +26,9 @@
namespace ProcMacro {
Punct
-Punct::make_punct (std::uint32_t ch, Spacing spacing)
+Punct::make_punct (std::uint32_t ch, Span span, Spacing spacing)
{
- return {ch, spacing};
+ return {ch, spacing, span};
}
} // namespace ProcMacro
diff --git a/libgrust/libproc_macro/punct.h b/libgrust/libproc_macro/punct.h
index f3a1c1b..6d01460 100644
--- a/libgrust/libproc_macro/punct.h
+++ b/libgrust/libproc_macro/punct.h
@@ -24,6 +24,7 @@
#define PUNCT_H
#include <cstdint>
+#include "span.h"
namespace ProcMacro {
@@ -37,9 +38,11 @@ struct Punct
{
std::uint32_t ch;
Spacing spacing;
+ Span span;
public:
- static Punct make_punct (std::uint32_t ch, Spacing spacing = Spacing::ALONE);
+ static Punct make_punct (std::uint32_t ch, Span span,
+ Spacing spacing = Spacing::ALONE);
};
} // namespace ProcMacro
diff --git a/libgrust/libproc_macro/span.cc b/libgrust/libproc_macro/span.cc
new file mode 100644
index 0000000..62c8c57
--- /dev/null
+++ b/libgrust/libproc_macro/span.cc
@@ -0,0 +1,40 @@
+// Copyright (C) 2023 Free Software Foundation, Inc.
+//
+// This file is part of the GNU Proc Macro Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+#include "span.h"
+
+namespace ProcMacro {
+
+Span
+Span::make_span (std::uint32_t start, std::uint32_t end)
+{
+ return {start, end};
+}
+
+Span
+Span::make_unknown ()
+{
+ // TODO: Change this value to UNKNOWN_LOCATION from gcc/input.h
+ return {0, 0};
+}
+
+} // namespace ProcMacro
diff --git a/libgrust/libproc_macro/span.h b/libgrust/libproc_macro/span.h
new file mode 100644
index 0000000..70ea9e7
--- /dev/null
+++ b/libgrust/libproc_macro/span.h
@@ -0,0 +1,41 @@
+// Copyright (C) 2023 Free Software Foundation, Inc.
+//
+// This file is part of the GNU Proc Macro Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+// <http://www.gnu.org/licenses/>.
+
+#ifndef SPAN_H
+#define SPAN_H
+
+#include <cstdint>
+
+namespace ProcMacro {
+struct Span
+{
+ std::uint32_t start;
+ std::uint32_t end;
+
+public:
+ static Span make_span (std::uint32_t start, std::uint32_t end);
+
+ static Span make_unknown ();
+};
+} // namespace ProcMacro
+
+#endif /* SPAN_H */