Skip to content

Commit 3ada312

Browse files
authored
Migrate IPR non-mutating headers to C++20 modules (includes and supersedes #322) (#323)
* Migrate IPR interface to C++20 module cxx.ipr Replace <ipr/interface> and its transitive header dependencies with a named C++20 module expressed as three partitions: cxx.ipr:vocabulary - structural templates, enums, locations cxx.ipr:syntax - tokens, attributes, declarators, constraints cxx.ipr - semantic node hierarchy, Visitor, Lexicon New files: src/cxx-ipr-vocabulary.ixx - :vocabulary partition src/cxx-ipr-syntax.ixx - :syntax partition src/cxx-ipr.ixx - primary module interface src/cxx-ipr.cxx - module implementation unit include/ipr/std-preamble - TEMPORARY standard header preamble include/ipr/utility-impl - impl-only utility types (rb_tree, etc.) Removed headers: interface, synopsis, ancillary, location, attribute, cxx-form, utility, and src/interface.cxx. Tested on MSVC 19.50, GCC 15.2, Clang 21.1 (libstdc++ and libc++). * Restore comments removed during module migration Preserve the original form and content of comments that were inadvertently dropped or reformatted when migrating headers to C++20 module partitions: - cxx-ipr-syntax.ixx: restore '// -- ' prefix on the design rationale comment block (matching the original <ipr/cxx-form>) - cxx-ipr-vocabulary.ixx: restore box-style section dividers, add missing directive forward declarations section, add 'distinguished node' section, restore multi-line inline comments on Phantom, Demotion, and Label - cxx-ipr.cxx: add Visitor sub-hierarchy forwarding rationale and section headers (Types, Expressions, Directives, Statements, Declarations) from the original traversal.cxx - utility-impl: restore rb_tree algorithm comments (rotation operations, chain/container insert documentation, string pool description) * Migrate <ipr/traversal> and <ipr/io> to C++20 modules Introduce two new named modules: - cxx.ipr.traversal: structural comparison, visitor utilities - cxx.ipr.io: the XPR pretty-printer Move physically_same and as<> from the traversal module to cxx.ipr's :vocabulary partition, where they belong: both are vocabulary-level predicates depending only on Node&. New files: - src/cxx-ipr-traversal.ixx (module interface) - src/cxx-ipr-traversal.cxx (module implementation unit) - src/cxx-ipr-io.ixx (module interface) - src/cxx-ipr-io.cxx (module implementation unit) Deleted files: - include/ipr/traversal (replaced by cxx.ipr.traversal) - include/ipr/io (replaced by cxx.ipr.io) - src/traversal.cxx (renamed to cxx-ipr-traversal.cxx) - src/io.cxx (renamed to cxx-ipr-io.cxx) Key changes: - Export physically_same and as<> from cxx.ipr:vocabulary. This eliminates the as<> duplicate that was in cxx-ipr.cxx, and removes the need for <ipr/impl> to import cxx.ipr.traversal. - Define util::std_insertable solely in cxx.ipr.io (removed from <ipr/utility-impl> where it was the only consumer). - Both module interfaces import only cxx.ipr; implementation- only dependencies (cxx.ipr.traversal in cxx-ipr-io.cxx, <typeinfo> in cxx-ipr-traversal.cxx) are in the .cxx files. - Update CMakeLists.txt: new module file sets, renamed sources, removed deleted headers from PRIVATE list. - Update consumer TUs: only files that use traversal-specific symbols (Constant_visitor, util::view, etc.) import cxx.ipr.traversal; others get physically_same from cxx.ipr. Tested on: - MSVC 19.50 (VS 18 Preview): pass - GCC 15.2: pass - Clang 21.1 (libstdc++): pass - Clang 21.1 (libc++): pass
1 parent a45d0b8 commit 3ada312

27 files changed

+1843
-2592
lines changed

CMakeLists.txt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,22 @@ else()
2626
endif()
2727

2828
add_library(${PROJECT_NAME}
29-
src/interface.cxx
3029
src/impl.cxx
31-
src/io.cxx
32-
src/traversal.cxx
30+
src/cxx-ipr-io.cxx
31+
src/cxx-ipr-traversal.cxx
3332
src/input.cxx
3433
src/utility.cxx
34+
src/cxx-ipr.cxx
35+
)
36+
37+
target_sources(${PROJECT_NAME}
38+
PUBLIC
39+
FILE_SET CXX_MODULES FILES
40+
src/cxx-ipr-vocabulary.ixx
41+
src/cxx-ipr-syntax.ixx
42+
src/cxx-ipr.ixx
43+
src/cxx-ipr-traversal.ixx
44+
src/cxx-ipr-io.ixx
3545
)
3646

3747
target_include_directories(${PROJECT_NAME}
@@ -41,18 +51,10 @@ target_include_directories(${PROJECT_NAME}
4151

4252
target_sources(${PROJECT_NAME}
4353
PRIVATE
44-
${PROJECT_SOURCE_DIR}/include/ipr/ancillary
45-
${PROJECT_SOURCE_DIR}/include/ipr/attribute
46-
${PROJECT_SOURCE_DIR}/include/ipr/cxx-form
4754
${PROJECT_SOURCE_DIR}/include/ipr/impl
48-
${PROJECT_SOURCE_DIR}/include/ipr/interface
49-
${PROJECT_SOURCE_DIR}/include/ipr/io
5055
${PROJECT_SOURCE_DIR}/include/ipr/lexer
51-
${PROJECT_SOURCE_DIR}/include/ipr/location
5256
${PROJECT_SOURCE_DIR}/include/ipr/node-category
53-
${PROJECT_SOURCE_DIR}/include/ipr/synopsis
54-
${PROJECT_SOURCE_DIR}/include/ipr/traversal
55-
${PROJECT_SOURCE_DIR}/include/ipr/utility
57+
${PROJECT_SOURCE_DIR}/include/ipr/utility-impl
5658
${PROJECT_SOURCE_DIR}/include/ipr/input
5759
${PROJECT_SOURCE_DIR}/3rdparty/doctest/doctest.h
5860
)
@@ -99,6 +101,7 @@ install(
99101
TARGETS ipr
100102
LIBRARY DESTINATION lib
101103
ARCHIVE DESTINATION lib
104+
FILE_SET CXX_MODULES DESTINATION lib/cmake/ipr
102105
)
103106
install(
104107
DIRECTORY include/ipr

include/ipr/ancillary

Lines changed: 0 additions & 258 deletions
This file was deleted.

0 commit comments

Comments
 (0)