Repository navigation
Bump libClangSharp.runtime.linux-x64 from 21.1.8.2 to 23.1.5 - #29
Closed
dependabot[bot] wants to merge 226 commits into
Closed
dependabot[bot] wants to merge 226 commits into
dependabot[bot] wants to merge 226 commits into
Conversation
…; force-ignore QVariant/QMetaObject/QHash
…d: HasHeightForWidth=>True); exec() event-loop crash TODO
…ods generate; fix dtor hook (graceful native-created objects)
…patch native glue + NativeToManaged)
…ort + phantom-symbol filter); value types (QSize) runnable
…st TypeMap; fix default-expr printing (float/enum/QFlags/char/QList/QString), dedupe default-value overloads
…mo (Split => string[], new QApplication(args))
…icked; demo button click pops QMessageBox
…ue (QtSharp_signals.cpp) + PyQt-style .XxxSignal.Connect(); calculator demo
…List (string[]) marshalling
…itance this-adjust; AnalogClock demo - GenerateNativeToManaged = true; force-ignore QFileDevice (broken base chain) - Runtime/VTables.cs: fix CloneTable secondary-vtable source (*(IntPtr*)(instance+offset)) - CSharpSources.cs: vtable hook this-adjust (GetVTableThisOffset) + GetInstanceParam interface-impl vs virtual-override - gen: add QPainter/QTimer/QTime roots + qtimer.h (QTimer.TimeoutSignal) - testbind: AnalogClock (QWidget subclass, paintEvent + QPainter draw), Calculator rewritten as QWidget subclass; [STAThread] main
…dits/ShapedClock/Calendar/SystemTray - New examples (C#, PyQt-style signals, QWidget subclassing): Sliders, Spin Boxes, Window Flags, Line Edits, Shaped Clock, Calendar Widget, System Tray Icon - Bindings: add QSystemTrayIcon/QShortcut/QIntValidator/QDoubleValidator/QRegularExpressionValidator/ QCommonStyle/QProxyStyle/QStylePainter/QStyleFactory roots; qsystemtrayicon.h/qstyle.h/etc headers; QAction + QSystemTrayIcon signal scan (TriggeredSignal, MessageClickedSignal); un-ignore QHeaderView; ForceIgnore QLayoutItemInternal::tr (broken default-arg overload) - Drop 'unsafe partial' from user example classes (not required for subclassing)
SymbolsCodeGenerator.WriteMethodWrapper emits extern C wrapper calling self->method(args) for NeedsSymbol non-operator methods, handling MS-ABI sret and stripping default args; GenerateDef prefers Qt re-export then wrapper alias (220 inline methods now exported). WindowFlags restores QPoint.Pos X/Y usage.
…alue-type inline wrappers
…s, abstract ctors ABI: GatherInternalParams gains realAbiOrder so vtable hooks use the real MS ABI order (this before sret); sret hooks now return the return-slot pointer in RAX and copy non-trivial value types via the copy ctor instead of a bitwise memcpy. Types: TagType.Equals/GetHashCode compare declarations by clang USR so duplicate declarations produced across translation units are recognised as the same type (fixes QCommonStyle not overriding QStyle pure virtuals -> CS0534). QFlags: allow QAbstractItemModel::flags through a whitelist and emit an int return buffer for QFlags sret returns. Symbols: generate concrete subclass wrappers for abstract-class constructors. gen: extra item-view headers/types, QSettings root, Qt enum roots. native: hand-written shims for QString/QKeySequence/QAction/QSettings/dataChanged/QPixmap.
Shortcut Editor: hierarchical read-write QAbstractItemModel (context/category/action) plus a QStyledItemDelegate whose editor is a QKeySequenceEdit, an ActionManager and the official MainWindow layout. Document Viewer: official app shell (File/Edit/Help menus, toolbar, status bar, QSplitter with west QTabWidget and a widgetResizable QScrollArea), QSettings-backed recent files, and inline text/JSON/image viewers (system JSON parser + custom tree model). Calculator, Scribble, CalendarWidget, ShapedClock, SpinBoxes, SystemTray and WidgetsGallery rewritten against the official sources. AllDemos tiles every demo in one process. QtCompat re-exposes pruned helpers and wraps the hand-written native shims.
native/CrashTracer.cpp installs a vectored exception handler, walks the stack with StackWalk64 and dumps registers plus disassembly bytes to crash_stack.txt; build_crashtracer.bat builds it; tools/disasm.py disassembles by RVA with capstone.
…highlighting, image IO New roots/headers: QAbstractAnimation/QPropertyAnimation/QEasingCurve, QSortFilterProxyModel, QStringListModel, QStandardItem, QSyntaxHighlighter, QImageReader/Writer, QPainterPath, QCompleter, QFileSystemModel, QDataWidgetMapper, QItemDelegate, QWizard/QWizardPage, QErrorMessage, QFocusFrame, QScroller, QUndoStack/QUndoCommand/QUndoView. Signal generator: parse unnamed parameters, ignore QPrivateSignal markers (exposed neither in the managed signature nor the connect lambda), and only use the disambiguating member-pointer cast for overloaded signals (QPrivateSignal cannot be named). Demos: QSpinBox/QDoubleSpinBox valueChanged now carries the value, so the sliders/spinboxes connections take the argument. Document Viewer uses the QSettings Scope overload (the (string,string) ctor is not generated reliably).
Adds QInputEvent/QContextMenuEvent/QHoverEvent/QDragEnterEvent/QDragMoveEvent/QDragLeaveEvent/QDropEvent/QHelpEvent/QActionEvent and QMimeData (qmimedata.h) so widgets can override those handlers.
Menus (examples/widgets/mainwindows/menus): menu bar with File/Edit/Format/Help, checkable format actions, status tips, a right-click context menu built from QContextMenuEvent and a status label that reports the invoked action. Basic Layouts (examples/widgets/layouts/basiclayouts): menu bar inside the layout, horizontal/grid/form group boxes, a big editor, a QDialogButtonBox wired to accept/reject and a scroll area with a custom vertical scrollbar style. AllDemos now tiles 15 windows.
…gnal) native/QtSharp_meta.cpp installs a single QtPrivate::QSlotObjectBase forwarder via QObjectPrivate::connect(sender, signal_index, slotObj, type) and resolves the signal at runtime from the sender's QMetaObject, so no per-signal compile-time glue is needed. Verified by 'testapp metasig': int/QString/bool delivery, a parameter that is unnamed in the header, two overloads of QCompleter::activated resolving to distinct indices, rejection of a bogus signature, and QTimer::timeout. Diagnostic finding: moc strips the QPrivateSignal marker from the runtime signature (QTimer::timeout is recorded as 'timeout()', and QObject::destroyed appears as both 'destroyed(QObject*)' and 'destroyed()'), so the type we could not even name in generated glue never appears at runtime.
…nmanagedCallersOnly) native/QtSharp_vdispatch.cpp emits real C++ subclasses of QWidget and QAbstractItemModel whose overrides forward to one managed entry point through a function pointer obtained from an [UnmanagedCallersOnly] static method. Because the C++ compiler emits the override, the ABI (including sret / return-by-value) is the compiler's job; managed code only sees plain pointers. Verified by 'testapp vdispatch': sizeHint() (QSize by value) and paintEvent reach C# and the values come back correctly, rowCount() reaches C#, dispatch still works after GC.Collect() (no delegate keep-alive), and Qt's own QAbstractItemModel::match() calls the managed data() and gets the managed QVariant - the exact path that previously required the sret/RAX workaround.
Qt-owned objects are held by the managed side as a bare IntPtr (no SafeHandle, no finalizer) so the GC never frees them; QObject::destroyed invalidates the managed wrapper and later access throws ObjectDisposedException instead of dereferencing freed memory (the PySide RuntimeError analogue). Objects .NET owns are released exactly once through a SafeHandle. Verified by 'testapp own': a Qt parent destroys its children and their wrappers are invalidated; GC.Collect() leaves Qt-owned objects alive and usable from native; disposing is exactly-once and idempotent; an abandoned managed-owned object is finalised exactly once.
model/qtsharp.api.json is now the checked-in source of truth: a clang-extracted, sorted, minimal API model (QObject: methods, virtuals, signals). The extractor ignores the legacy pipeline's IsGenerated pruning and decides by its own type whitelist, handles value returns (hidden indirect-return params) and references. gen/ApiCodeGen.cs turns the model into C# bindings, a C++ wrapper (virtual overrides forwarded to one managed entry point) and P/Invoke declarations - a pure function: two runs produce byte-identical output. native/QtSharpApiRuntime.cpp is the hand-written runtime that ships with the bindings (generic moc signal forwarder + QString bridge); build_api.bat produces QtSharp.Api.dll; tools/regen-api.ps1 runs extract -> diff gate -> codegen -> determinism gate -> build -> smoke test. Verified: 'testapp api' passes (generated accessors, a generated signal property delivered through the moc dispatcher, and a native call into the generated virtual reaching the managed override). 15 legacy demos and the three PoCs still pass.
extract2 (gen/ApiModel2.cs) reads the same model out of one libclang translation unit. The CppSharp AST projection, its pass chain and the chunked double-parse self-check are gone, so the 44-class model comes back byte-identical in ~2.5s instead of ~165s, and three runs hash the same - the reproducibility machinery existed to work around a layer that no longer exists. Both front ends share everything downstream of 'the AST has been read', which is what let the replacement be diffed against the checked-in model before the Roots table grew. With that in place the Roots table went from 44 to 221 classes (QtWidgets 121, QtGui 69, QtCore 31): 5439 methods, 478 virtuals, 385 constructors, 210 signals, 269 enums. The model gained 'subclassable' (a private destructor means C++ will not let us derive, so no native wrapper) and 'pure' on virtuals (QAbstractButton::paintEvent = 0 has no body to chain to), and virtuals outside the override whitelist are now published as callable methods instead of being dropped. The code generator needed the rest: null-safe boxed parameters, dropping optional boxed parameters whose default cannot be expressed (they used to reach the glue as a null handle and crash - the api-lineedits regression), no CallBase/__base for pure slots, an ownership path only where constructors exist, QStringList signal decoding, and skipping function templates without defaulted template parameters. tools/clangprobe is the probe the migration was validated with (fact extraction, --all, --index for choosing Roots rows). Verified: tools/regen-api.ps1 is green - model diff gate, codegen determinism, native build, C# build, and four self-tests (api 6, api-analogclock 10, api-lineedits 9, api-widgets 44 assertions, the last one new). The 15 legacy demos and the three PoCs are untouched.
The type vocabulary was the bottleneck: with 225 classes in the model, everything still blocked on the handful of types Qt spells differently. const char* is the other string convention and now surfaces as a managed string - passed straight through to the LPUTF8Str marshalling, and copied into a QString on the way back so the existing QString bridge carries it. The 64-bit and unsigned typedefs resolve through their canonical types (qsizetype/qint64 -> long long, uint/QRgb -> unsigned int, quint64 -> unsigned long long), and char32_t becomes an unsigned code unit. QStringView and QAnyStringView are strings. QStringList is the one container: a managed string[] becomes a native QStringList for the duration of the call (created and freed around the P/Invoke by the generated try/finally), and a returned list is copied out element by element. Model side it is recognised as QList<QString>, the only container spelling the model carries. ApiTypes.Managed had to test for strings before pointers: 'char*' also ends in '*' and was mapping to IntPtr while the code generator rendered a string, which produced two C# overloads with the same signature. The generated constructor local named 'context' collided with QShortcut's parameter of that name and is now __context. QMetaObject, QCalendar, QMimeData and QBitArray join the Roots table; QMetaObject makes metaObject().className() and indexOfSignal() usable. Verified: regen-api.ps1 green (model gate, codegen determinism, native and C# builds) and api-widgets grew to 51 assertions covering a string[] argument and return, a const char* argument with a qsizetype return, the meta-object, QCalendar and QMimeData. The other three self-tests and the 15 legacy demos are unaffected.
QFuture stays out of the API: the async surface is Task, CancellationToken and IProgress<T>. RunAsync gains Action<CancellationToken>/Func<CancellationToken, T> overloads (an OperationCanceledException after the token fires cancels the task instead of faulting it) and Action<IProgress<int>>/Func<IProgress<int>, T> overloads whose reports reach the caller's Progress<T> on the caller's thread - the part QFutureWatcher::progressValueChanged used to carry. Co-Authored-By: Claude Code <noreply@anthropic.com>
…Shot QThread::create is bound through the same managed token as the other functor helpers; the caller owns the returned thread, as Qt documents. QTimer gains the std::chrono forms (TimeSpan with optional Qt.TimerType and context), with a negative interval rejected instead of firing immediately. Co-Authored-By: Claude Code <noreply@anthropic.com>
strings and tree both complete against the 0.25.0 packages (2.1 s and 1.3 s, offscreen); the QApplication-initialization timeout from 0.19.0 no longer reproduces. api-gaps now reports Sender, FindChild and FindChildren as present, and #57's GUI scenario is verified. Co-Authored-By: Claude Code <noreply@anthropic.com>
The long/uchar*/nested-class/bare-enumerator items are now marked permanent with the reason, so the tracking issue has a stable link per item instead of a list of undecided gaps. Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
The GL entry-point table (137 methods) joins the QtGui roots, which also brings QOpenGLContext.functions() into the model. test-opengl-functions initializes the table from a widget's initializeGL and checks that glClearColor/glClear/glEnable leave no GL error; the offscreen platform has no GL, so it reports a skip there. Co-Authored-By: Claude Code <noreply@anthropic.com>
dependabot
Bot
force-pushed
the
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2
branch
from
November 2, 2026 05:57
e1281bc to
545948d
Compare
QOpenGLShader joins the QtOpenGL roots: its ShaderType enum is the missing parameter type that kept QOpenGLShaderProgram.AddShaderFromSourceCode out of the model. examples/QtOpenGLWidgets holds Qt's opengl/hellogl2 - the logo mesh, the VAO/VBO setup, the paint path and the slider rotations - with the normal-matrix uniform folded into the vertex shader (QMatrix3x3 is not published) and the Binder spelled Bind/Release. Offscreen it asserts the mesh and rotation wrapping and skips the GL path; on a display it builds the program and paints with no GL error. Co-Authored-By: Claude Code <noreply@anthropic.com>
QEvent joins the bindable roots now that custom events are the point: a C# subclass carries the payload, QEvent.RegisterEventType supplies the id, and QCoreApplication.PostEvent's two-argument overload hands the instance to Qt and invalidates the wrapper, so Dispose cannot double-free the object Qt deletes after delivery. The generated three-argument overload stays for code that needs a priority. test-custom-events covers construction, the transfer and the receiver-side type dispatch. Co-Authored-By: Claude Code <noreply@anthropic.com>
The process died inside qwindows.dll about a quarter of the time while the runtime tore the application down with a shown window still alive. The test now hides both windows, flushes the posted events and disposes them before returning; on the windows QPA platform that is 0 crashes in 40 runs against 5 in 20 before. All 115 assertions run in the gate again. Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
QSqlTableModel now reports Qt::ItemIsEditable for a valid index and emits
dataChanged(index, index, {EditRole, DisplayRole}) when SetData stages an
edit, the QAbstractItemModel::setData contract a view needs to open an editor
and repaint. The test connects to the native dataChanged signal and checks
that a staged edit emits once while rejected edits emit nothing.
The changelog bullet moves to Unreleased: it was swept into the hellogl2
commit while the code was still uncommitted, so 0.26.0 shipped without it.
Co-Authored-By: Claude Code <noreply@anthropic.com>
QSqlQueryModel.SetQuery/Select and QSqlTableModel.SubmitAll now return false and leave the driver's exception in LastError(), Qt's lastError() contract. Before, a failing SubmitAll from a button's Clicked handler unwound a SqliteException into Qt's signal dispatch. A failed SetQuery resets the model, as Qt's setQuery does. A failed SubmitAll rolls its transaction back and keeps every staged edit, inserted row and deletion so the caller can fix the offending row and submit again, matching Qt's submitAll semantics. Also stage insert/remove rows with the * and ! vertical headers, serve EditRole from Data so a view's editor opens on the cell's value, repaint on RevertAll, and read Record/Value through the staged value. test-sqlmodel covers the failure paths and the staged row operations. Co-Authored-By: Claude Code <noreply@anthropic.com>
Marking a base row deleted emits headerDataChanged(Qt::Vertical, row, row), as Qt's removeRows does in the manual-submit strategy; RevertAll emits it when it restores the row. Before, the vertical header kept painting the old number or "!" until something else forced a repaint. test-sqlmodel checks both signals and the restored header value. Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
Pull the upstream v0.20.0-v0.27.0 line: SQL model editing and provider errors, QOpenGLFunctions and the hellogl2 port, async/await on the Qt thread, functor and template bindings, the BCL interop bridges, WebView2, and the documentation rewrite. Resolution: - FindChild/FindChildren follow upstream (generic, QRegularExpression and QMetaObject overloads, native walk); the parallel local implementation in runtime/QtCore/QObjectLookup.cs and its additions to ObjectLookupApi are dropped. That work remains in history at 11d715c. - Conflicting docs and package versions take the upstream v0.27.0 files. - The local interop review fixes (invalid QRegularExpression rejection, QTimeZone rule checks) are kept, with their changelog entries listed under Unreleased. Co-Authored-By: Claude Code <noreply@anthropic.com>
QSet<T> surfaces as HashSet<T>; QPair/std::pair as ValueTuple; a container may be a list element or map value (QHash<int, QHash<T, QVariant>> is a nested Dictionary). A set element or map key may be a pair but not a container, because an array/HashSet/Dictionary has no structural equality. The element codec is recursive and the qtsharp.models are regenerated from extraction. Co-Authored-By: Claude Code <noreply@anthropic.com>
QList<T> and QStringList returns are List<T> snapshots; a container parameter is the read-only interface (IReadOnlyList<T>, IReadOnlySet<T>, IReadOnlyDictionary<K,V>), so List<T>, T[], HashSet<T> and Dictionary<K,V> all pass without overloads. std::optional<T> surfaces as T? or a nullable reference, with heap-backed native helpers for value and reference payloads. The generated helper bodies go through CodeWriter so indentation is structural instead of hand-counted. Co-Authored-By: Claude Code <noreply@anthropic.com>
The new generator is an instance-based pipeline: a model pass builds the class/enum vocabulary and module closure, a regex-registered type/parameter handler set owns the mapping decisions, and separate emitters produce the C# declarations, metatype table and native glue. No per-run static state remains below the driver. It reproduces the old generator's output for all 18 modules, then takes over codegen in tools/regen-api.ps1 and the CI/release workflows. The old qtgen executable stays for model extraction, split-core and the module descriptor. The switched pipeline exposed one real defect the old oracle shared: a namespaced enum used as a container element was spelled QSortPolicy::SortType inside the native helper, without Qt3DRender::, so Qt3DRender did not compile. The container C++ spelling now qualifies enum elements. The QtPrintSupport example also moves from List<T>.Length to Count after the container binding. Co-Authored-By: Claude Code <noreply@anthropic.com>
Bump the binding package versions and the sample/readme references, and mark the container vocabulary changes as the 0.28.0 section. Co-Authored-By: Claude Code <noreply@anthropic.com>
The method is declared only under Q_OS_WIN in qprinter.h, but the checked-in model is extracted from the Windows headers. Emitting its forwarder made the Linux native binding fail to compile. Treat it like the QProcess Windows-only members and leave it out of the published surface on every platform. Co-Authored-By: Claude Code <noreply@anthropic.com>
gen-next was the working name of the rewrite. The old ApiCodeGen, its emitters and its generated-file helpers are removed; gen/ is now the single qtgen project, owning codegen plus extract2, split-core and the module descriptor. The generation scripts, CI and release workflows build one executable and call qtgen for both model extraction and code generation. QtSharp.slnx keeps only the one generator project, and the docs point at the merged layout. Co-Authored-By: Claude Code <noreply@anthropic.com>
--- updated-dependencies: - dependency-name: libClangSharp.runtime.linux-x64 dependency-version: 22.1.8.2 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2
branch
from
November 7, 2026 17:21
545948d to
ef8bfba
Compare
ProxyCheng
force-pushed
the
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2
branch
from
November 12, 2026 15:56
ef8bfba to
af72813
Compare
Contributor
Author
|
OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting If you change your mind, just re-open this PR and I'll resolve any conflicts on it. |
dependabot
Bot
deleted the
dependabot/nuget/gen/libClangSharp.runtime.linux-x64-22.1.8.2
branch
November 12, 2026 15:56
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updated libClangSharp.runtime.linux-x64 from 21.1.8.2 to 23.1.5.
Release notes
Sourced from libClangSharp.runtime.linux-x64's releases.
22.1.8
What's Changed
New Contributors
Full Changelog: dotnet/ClangSharp@v21.1.8.4...v22.1.8
21.1.8.4
What's Changed
... (truncated)
21.1.8.3
What's Changed
New Contributors
Full Changelog: dotnet/ClangSharp@v21.1.8.2...v21.1.8.3
Commits viewable in compare view.