mirror of https://github.com/icsharpcode/ILSpy.git
Branch:
fix/lambda-parameter-syntax
christophwille/closedhierarchies
christophwille/membench
compound-assignment-operators
fix/1982-params-attribute-args
fix/2040-invalid-xml-characters
fix/2093-navigateto-reference-assembly
fix/2362-xalz-references
fix/2372-address-taken-by
fix/3282-indexer-optional-arguments
fix/3568-record-member-order
fix/4059-deconstruct-out-slots
fix/lambda-parameter-syntax
fix/scroll-children-on-expand
gh-pages
ldmembertoken
master
natural-type-lambdas-methods
null-coalescing-assignment
release/10.1
release/6.2
release/7.1
release/7.2
release/8.1
substring-optimizations
tests/829-async-method-builder-override
tests/829-collection-expressions
tests/829-compound-assignment-operators
tests/829-coverage-audit
tests/829-expression-tree-named-optional-args
tests/829-expression-variables-in-initializers
tests/829-extended-property-patterns
tests/829-extension-members
tests/829-extension-operators
tests/829-file-local-types
tests/829-improved-definite-assignment
tests/829-improved-overload-candidates
tests/829-inline-arrays
tests/829-interpolated-string-improvements
tests/829-lambda-param-modifiers
tests/829-list-patterns
tests/829-lock-object
tests/829-mixed-deconstruction
tests/829-null-coalescing-assignment
tests/829-null-conditional-assignment
tests/829-object-initializer-indexer
tests/829-overload-resolution-priority
tests/829-params-collections
tests/829-pattern-matching-improvements
tests/829-primary-constructors
tests/829-ref-unsafe-in-iterators-async
tests/829-sealed-record-tostring
tests/829-target-typed-conditional
tests/829-tuple-comparison
win-a11y-textsize
1.0-Beta
1.0-M1
1.0-M2
1.0-M3
1.0.0
2.0.0
2.1
2.2
2.3
2.3.1
3.0-Preview1
3.0-Preview2
3.0.2
v10.0
v10.0-preview1
v10.0-preview2
v10.0-preview3
v10.0.1
v10.1
v10.1.1
v11.0
v11.0-preview1
v11.0-rc
v2.3.2
v2.4
v3.0
v3.0-beta1
v3.0-beta2
v3.0-beta2a
v3.0-beta3
v3.0-beta4
v3.0.1
v3.1-beta1
v3.1-final
v3.1-rc
v3.2-beta
v3.2-rc
v3.2.0
v4.0
v4.0-alpha1
v4.0-beta1
v4.0-beta2
v4.0-beta3
v4.0-rc1
v4.0-rc2
v4.0.1
v5.0
v5.0-preview1
v5.0-preview2
v5.0-preview3
v5.0-preview4
v5.0-rc1
v5.0.1
v5.0.2
v6.0
v6.0-preview1
v6.0-preview2
v6.0-preview3
v6.0-preview4
v6.0-rc1
v6.1
v6.2
v6.2-preview1
v6.2-preview2
v6.2.1
v7.0
v7.0-preview1
v7.0-preview2
v7.0-preview3
v7.0-rc1
v7.0-rc2
v7.1
v7.2
v7.2-preview1
v7.2-preview2
v7.2-preview3
v7.2-preview4
v7.2-rc
v7.2.1
v8.0
v8.0-preview1
v8.0-preview2
v8.0-preview3
v8.0-preview4
v8.0-rc1
v8.1
v8.1.1
v8.2
v9.0
v9.0-preview1
v9.0-preview2
v9.0-preview3
v9.0-rc
v9.1
${ item.name }
${ noResults }
6 Commits (fix/lambda-parameter-syntax)
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
a9d7538eef |
Show real progress while a solution exports
Solution export reported once per assembly, when that assembly finished. Nothing was reported before the first one did, so the tab sat on the indeterminate spinner it starts with for most of the run and then jumped straight to the end -- exporting two assemblies showed a spinner, 1 of 2, done. A project that bailed out before decompiling never reported at all, stranding the bar short of the end for the rest of the export. Sum the per-project file counts instead: each parallel worker feeds its own counts into a shared map and the bar reports their total. WholeProjectDecompiler carries its whole file count on every report, so the total is known from a project's first written file rather than its last -- measured on two real assemblies, the bar turns determinate after 245ms instead of 15s, and moves through 978 files rather than 2 assemblies. Each project closes its share out in a finally, so bailing out or cancelling still lets the bar reach the end. The denominator grows over the first second as projects discover their file counts. The alternative -- enumerating every project's types up front -- delays the export itself to make the bar look better, which is the wrong trade. Assisted-by: Claude:claude-opus-4-8:Claude Code |
2 months ago |
|
|
150fa30aa3 |
Export what loaded, and let the user name the solution
Two gaps in the export paths, both visible from the same selection. A selection holding an assembly that failed to load was turned away by TryGetExportableAssemblies, so Ctrl+S fell through to the single-node save and quietly wrote just the focused assembly -- the rest of the selection vanished with no report. The predicate now only insists that something in the selection loaded, and the exporter skips what it cannot decompile and names it in the status report. That is also what the dialog always assumed: its "not a valid assembly" row badge was unreachable, because no selection containing one could get that far. The dialog asks for an output folder and derived the .sln name from it, while Save Code lets the user name the file. Now the dialog offers the name too, in solution mode, defaulting (via the placeholder) to the folder- derived name the exporter would pick anyway. Assisted-by: Claude:claude-opus-4-8:Claude Code |
2 months ago |
|
|
51aafa0fd9 |
Move ILSpy UI code back to the ICSharpCode.ILSpy root namespace
The Avalonia port had placed the UI app in an ILSpy.* namespace tree, while the csproj RootNamespace and every prior release (through 10.1) use ICSharpCode.ILSpy.*. Restoring the historical namespace reduces the public API diff against release/10.1 for plugin authors and removes the shadowing that forced global:: qualifiers in the test project. The Images class and AccessOverlayIcon enum move back into the root namespace (as in 10.1), since an ICSharpCode.ILSpy.Images namespace would shadow the Images class for all code inside ICSharpCode.ILSpy. Assisted-by: Claude:claude-fable-5:Claude Code |
3 months ago |
|
|
f44697cb38 |
Show live progress in long-running operation tabs
Project/solution export (and other RunInNewTabAsync work) opened a tab with a static title and a permanently indeterminate progress bar, even though the whole-project decompiler already produces per-file DecompilationProgress that was being dropped. Wire that progress through: DecompilationOptions carries an IProgress<DecompilationProgress> that DecompileAsProject sets on the WholeProjectDecompiler; a new RunInNewTabAsync overload hands the work a UI-thread-marshaled Progress<T> feeding the tab. The tab now animates the braille spinner over its title (the operation name) and shows a determinate bar plus the file currently being written and an "N of M" count. Solution export reports per-assembly rather than per-file, since its assemblies decompile in parallel and per-file reports would race. The determinate bar is pinned to 75% of the overlay width so it doesn't jitter as the status text changes. Assisted-by: Claude:claude-opus-4-8:Claude Code |
3 months ago |
|
|
aa92f27e09 |
Decompile a tiny emitted fixture in the project-export/save/compare tests
The Export Project/Solution, Save Code and Compare tests decompiled whatever the default assembly list seeds -- System.Linq, CoreLib, the Uri assembly -- so each spent ~10s purely on type count (Solution/CreateSolution/SaveCode/ DecompileAssembly ~10s, CompareView ~4.5s). Add FixtureAssembly, which emits a minimal two-type assembly via PersistedAssemblyBuilder, and point these tests at it. They still exercise the full project/solution writer, save-to-file and compare-tree pipelines, but each now runs well under a second (e.g. Solution_Mode 10.8s -> 0.3s, CreateSolution 10.8s -> 0.2s, ShowIdentical 4.5s -> 0.3s). Assisted-by: Claude:claude-opus-4-8:Claude Code |
3 months ago |
|
|
60405af407 |
Add a configurable Export Project/Solution dialog
The quick Save Code path exports a project (one assembly) or a solution (several) straight through a file picker, with no way to tune the output. Add a dedicated, discoverable "Export Project/Solution..." entry (File menu + assembly context menu, alongside Save Code) that opens a configuration dialog: pick the output folder, preview the projects that will be written (with invalid / duplicate-name / PDB-eligible badges), toggle project-format and decompiler options, optionally sign with a strong-name key, and optionally emit a portable PDB per assembly -- defaulting source-embedding off since the project's .cs are on disk. The export runs on a clone of the live settings (never the persisted instance) behind the tab's cancellable progress UI and reports into the active decompiler tab. StrongNameKeyFile now flows through DecompilationOptions into the project writer, which had no reachable setter before. The engine (ProjectExporter) and the preview computation are split out from the window so they are headless-testable. Assisted-by: Claude:claude-opus-4-8:Claude Code |
3 months ago |