// Copyright (C) 2023-2024 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 // . #include "literal.h" #include #include #include "registration.h" namespace ProcMacro { extern "C" { bool Literal__from_string (FFIString str, Literal *lit) { bool result; auto source = str.to_string (); *lit = Literal::make_literal (source, result); return result; } } void Literal::drop (Literal *lit) { FFIString::drop (&lit->text); FFIString::drop (&lit->suffix); } Literal Literal::clone () const { return {this->kind, this->text.clone (), this->suffix.clone (), this->span}; } Literal Literal::make_literal (const std::string &text, bool &has_error) { return __gccrs_proc_macro_lit_from_str_ (text, has_error); } Literal 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, span}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal Literal::make_string (const std::string &str) { auto text = FFIString::make_ffistring (str); auto suffix = FFIString::make_ffistring (""); return {LitKind::make_str (), text, suffix, Span::make_unknown ()}; } Literal Literal::make_byte_string (const std::vector &vec) { auto text = FFIString::make_ffistring (std::string (vec.cbegin (), vec.cend ())); auto suffix = FFIString::make_ffistring (""); return {LitKind::make_byte_str (), text, suffix, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } Literal 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, Span::make_unknown ()}; } LitKind LitKind::make_byte () { LitKindPayload payload; return {BYTE, payload}; } LitKind LitKind::make_char () { LitKindPayload payload; return {CHAR, payload}; } LitKind LitKind::make_integer () { LitKindPayload payload; return {INTEGER, payload}; } LitKind LitKind::make_float () { LitKindPayload payload; return {FLOAT, payload}; } LitKind LitKind::make_str () { LitKindPayload payload; return {STR, payload}; } LitKind LitKind::make_str_raw (std::uint8_t val) { LitKindPayload payload; payload.str_raw = val; return {STR_RAW, payload}; } LitKind LitKind::make_byte_str () { LitKindPayload payload; return {BYTE_STR, payload}; } LitKind LitKind::make_byte_str_raw (std::uint8_t val) { LitKindPayload payload; payload.byte_str_raw = val; return {BYTE_STR_RAW, payload}; } } // namespace ProcMacro