diff options
-rw-r--r-- | pyGHDL/libghdl/_decorator.py | 2 | ||||
-rw-r--r-- | pyGHDL/libghdl/file_comments.py | 94 | ||||
-rw-r--r-- | pyGHDL/libghdl/flags.py | 3 | ||||
-rw-r--r-- | src/file_comments.adb | 18 | ||||
-rw-r--r-- | src/file_comments.ads | 6 | ||||
-rw-r--r-- | src/vhdl/vhdl-comments.adb | 11 | ||||
-rw-r--r-- | src/vhdl/vhdl-comments.ads | 9 |
7 files changed, 140 insertions, 3 deletions
diff --git a/pyGHDL/libghdl/_decorator.py b/pyGHDL/libghdl/_decorator.py index 49694e8a3..b124461e5 100644 --- a/pyGHDL/libghdl/_decorator.py +++ b/pyGHDL/libghdl/_decorator.py @@ -99,7 +99,7 @@ def BindToLibGHDL(subprogramName): return c_bool elif typ is bytes: return c_char_p - elif typ in (c_char, c_char_p): + elif typ in (c_char, c_char_p, c_uint32): return typ elif isinstance(typ, TypeVar): # Humm, recurse ? diff --git a/pyGHDL/libghdl/file_comments.py b/pyGHDL/libghdl/file_comments.py new file mode 100644 index 000000000..1a942d008 --- /dev/null +++ b/pyGHDL/libghdl/file_comments.py @@ -0,0 +1,94 @@ +# ============================================================================= +# ____ _ _ ____ _ _ _ _ _ _ _ +# _ __ _ _ / ___| | | | _ \| | | (_) |__ __ _| |__ __| | | +# | '_ \| | | | | _| |_| | | | | | | | | '_ \ / _` | '_ \ / _` | | +# | |_) | |_| | |_| | _ | |_| | |___ _| | | |_) | (_| | | | | (_| | | +# | .__/ \__, |\____|_| |_|____/|_____(_)_|_|_.__/ \__, |_| |_|\__,_|_| +# |_| |___/ |___/ +# ============================================================================= +# Authors: +# Tristan Gingold +# Patrick Lehmann +# +# Package package: Python binding and low-level API for shared library 'libghdl'. +# +# License: +# ============================================================================ +# Copyright (C) 2019-2021 Tristan Gingold +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program 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. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <gnu.org/licenses>. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ============================================================================ +# + +from ctypes import c_uint32 +from typing import TypeVar + +from pyTooling.Decorators import export + +from pyGHDL.libghdl._types import SourceFileEntry, SourcePtr +from pyGHDL.libghdl._decorator import BindToLibGHDL +import pyGHDL.libghdl.files_map as files_map + +__all__ = [ + "Comment_Index", + "No_Comment_Index", + ] + +Comment_Index = TypeVar("Comment_Index", bound=c_uint32) + +No_Comment_Index = 0 + +@export +@BindToLibGHDL("file_comments__find_first_comment") +def Find_First_Comment(File: SourceFileEntry, N: c_uint32) -> Comment_Index: + """ + Get the first comment associated to a node. + :param N: Node + :param File: Source file for node + :return: The first comment index, or No_Comment_Index if none. + """ + return 0 + +@export +@BindToLibGHDL("file_comments__get_comment_start") +def Get_Comment_Start(File: SourceFileEntry, Idx: Comment_Index) -> SourcePtr: + """ + Get the start of comment + """ + +@export +@BindToLibGHDL("file_comments__get_comment_last") +def Get_Comment_Last(File: SourceFileEntry, Idx: Comment_Index) -> SourcePtr: + """ + Get the end of comment + """ + +def Get_Comment(File: SourceFileEntry, Idx: Comment_Index) -> str: + """ + Get a comment + """ + buf = files_map.Get_File_Buffer(File) + s = Get_Comment_Start(File, Idx); + l = Get_Comment_Last(File, Idx); + return buf[s:l].decode("iso-8859-1") + +@export +@BindToLibGHDL("file_comments__get_next_comment") +def Get_Next_Comment(File: SourceFileEntry, Idx: Comment_Index) -> Comment_Index: + """ + Get the next comment + """ + diff --git a/pyGHDL/libghdl/flags.py b/pyGHDL/libghdl/flags.py index f62d5de2c..fadd3bb52 100644 --- a/pyGHDL/libghdl/flags.py +++ b/pyGHDL/libghdl/flags.py @@ -41,6 +41,7 @@ __all__ = [ "Verbose", "Flag_Elaborate_With_Outdated", "Flag_Force_Analysis", + "Flag_Gather_Comments", ] assert sizeof(c_bool) == 1 @@ -52,3 +53,5 @@ Verbose = c_bool.in_dll(libghdl, "flags__verbose") Flag_Elaborate_With_Outdated = c_bool.in_dll(libghdl, "flags__flag_elaborate_with_outdated") Flag_Force_Analysis = c_bool.in_dll(libghdl, "flags__flag_force_analysis") + +Flag_Gather_Comments = c_bool.in_dll(libghdl, "flags__flag_gather_comments") diff --git a/src/file_comments.adb b/src/file_comments.adb index 183b17144..505a4ee79 100644 --- a/src/file_comments.adb +++ b/src/file_comments.adb @@ -166,6 +166,24 @@ package body File_Comments is Last := Fc.Comments.Table (Idx).Last; end Get_Comment; + function Get_Comment_Start (File : Source_File_Entry; + Idx : Comment_Index) return Source_Ptr + is + Start, Last : Source_Ptr; + begin + Get_Comment (File, Idx, Start, Last); + return Start; + end Get_Comment_Start; + + function Get_Comment_Last (File : Source_File_Entry; + Idx : Comment_Index) return Source_Ptr + is + Start, Last : Source_Ptr; + begin + Get_Comment (File, Idx, Start, Last); + return Last; + end Get_Comment_Last; + function Get_Next_Comment (File : Source_File_Entry; Idx : Comment_Index) return Comment_Index is diff --git a/src/file_comments.ads b/src/file_comments.ads index 8ed07566d..633d15d24 100644 --- a/src/file_comments.ads +++ b/src/file_comments.ads @@ -66,6 +66,12 @@ package File_Comments is Idx : Comment_Index; Start, Last : out Source_Ptr); + -- Simpler functions for python binding. + function Get_Comment_Start (File : Source_File_Entry; + Idx : Comment_Index) return Source_Ptr; + function Get_Comment_Last (File : Source_File_Entry; + Idx : Comment_Index) return Source_Ptr; + -- Return the next comment after IDX. -- Return No_Comment_Index if no related comment exists. function Get_Next_Comment (File : Source_File_Entry; diff --git a/src/vhdl/vhdl-comments.adb b/src/vhdl/vhdl-comments.adb index bc7a3e2e8..c7b98509e 100644 --- a/src/vhdl/vhdl-comments.adb +++ b/src/vhdl/vhdl-comments.adb @@ -20,8 +20,7 @@ -- Since the names are not prefixed, this package is expected to be with'ed -- but not to be use'd. -with Types; use Types; -with File_Comments; use File_Comments; +with Files_Map; with Vhdl.Scanner; use Vhdl.Scanner; @@ -30,4 +29,12 @@ package body Vhdl.Comments is begin Gather_Comments (Get_Current_Source_File, Uns32 (N)); end Gather_Comments; + + function Find_First_Comment (File : Source_File_Entry; N : Node) + return Comment_Index + is + pragma Assert (Files_Map.Location_To_File (Get_Location (N)) = File); + begin + return Find_First_Comment (File, Uns32 (N)); + end Find_First_Comment; end Vhdl.Comments; diff --git a/src/vhdl/vhdl-comments.ads b/src/vhdl/vhdl-comments.ads index b9b63b667..1d9694a49 100644 --- a/src/vhdl/vhdl-comments.ads +++ b/src/vhdl/vhdl-comments.ads @@ -20,9 +20,18 @@ -- Since the names are not prefixed, this package is expected to be with'ed -- but not to be use'd. +with Types; use Types; +with File_Comments; use File_Comments; + with Vhdl.Nodes; use Vhdl.Nodes; package Vhdl.Comments is -- Attach previously scanned comments to node N. procedure Gather_Comments (N : Iir); + + -- Return the first comment attached to node N. FILE must be the file + -- of N. + -- Use File_Comments to iterate on comments. + function Find_First_Comment (File : Source_File_Entry; N : Node) + return Comment_Index; end Vhdl.Comments; |