aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-11-20 20:01:14 +0100
committerTristan Gingold <tgingold@free.fr>2022-11-20 20:01:14 +0100
commitf722f900f4211bbddc0f432ce652e68313807ee0 (patch)
treeb91ab3b2768acb6b5323fa1b9aebfecc163662fc
parenta4f4840bfee3adf2eff26ffb9e5c68182d034dd4 (diff)
downloadghdl-f722f900f4211bbddc0f432ce652e68313807ee0.tar.gz
ghdl-f722f900f4211bbddc0f432ce652e68313807ee0.tar.bz2
ghdl-f722f900f4211bbddc0f432ce652e68313807ee0.zip
pyGHDL: add file_comments.py
-rw-r--r--pyGHDL/libghdl/_decorator.py2
-rw-r--r--pyGHDL/libghdl/file_comments.py94
-rw-r--r--pyGHDL/libghdl/flags.py3
-rw-r--r--src/file_comments.adb18
-rw-r--r--src/file_comments.ads6
-rw-r--r--src/vhdl/vhdl-comments.adb11
-rw-r--r--src/vhdl/vhdl-comments.ads9
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;