Compare commits

...

200 Commits

Author SHA1 Message Date
Mathis Beer aa49b9035c Tag the constructor arguments in new-anonymous-class calls as named arguments. 2025-10-09 08:25:39 +02:00
Mathis Beer 49612a48a6 Track 'new' expressions in the named argument offset list as well. 2025-09-25 23:29:13 +02:00
Mathis Beer a12e83e8a4 Avoid interpreting named args as labels when indenting newline in keep_line_breaks mode. 2025-09-25 23:29:13 +02:00
Nicholas Wilson d8e43e23ec remove explicit `nothrow` from `globMatchEditorConfig`
The in contract may throw.
2024-08-21 09:58:22 +02:00
Andrei Horodniceanu 0ea0572e86 makefile: Remove stdx-allocator from imports and sources
Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
2024-05-11 20:07:03 +02:00
Andrei Horodniceanu 5ea76cd293 makefile: fix bin/dfmt-test target
Don't call the D compiler with bin/githash.txt as a source file.

Signed-off-by: Andrei Horodniceanu <a.horodniceanu@proton.me>
2024-05-11 20:07:03 +02:00
Jeremy Baxter fa463b472c improve makefile
o  add 'install' target
 o  shorten the name of INCLUDE_PATHS to IMPORTS
 o  use filename prerequisities and targets rather than phony keywords
 o  add a dependency on .git/refs/tags for the githash target
 o  add githash.txt and dfmt-test to the clean target
 o  add more targets to .PHONY
2024-02-15 10:41:02 +01:00
Daniel Zuncke 2ea6c43a66 Use libdparse to check for named arg
Remove custom named arg parser
2023-10-26 20:10:50 +00:00
Daniel Zuncke 9f377100f0 Remove unnecessary tok!"comment" filter 2023-10-26 20:10:50 +00:00
Daniel Zuncke 20b8badf8c Fix issue #586 2023-10-26 20:10:50 +00:00
Daniel Zuncke 35e55bc9b2
Fix #578 ternary expressions in AA literals not properly formatted (#591) 2023-10-22 17:52:14 +09:00
Daniel Zuncke 08fe5d6855 Confirm token equality, safer loop
Using different variable to iterate to guarantee unchanged behaviour
if anything doesn't work as intended.
2023-10-18 10:22:48 +02:00
Daniel Zuncke c0452dbd11 Update test to include both known cases
I have formatted them both to look like the the individual bad output
and not like the actual output from formatting the issue0432.d file with
the current implementation. The current implementation makes it look
like a new / different problem.
2023-10-18 10:22:48 +02:00
Daniel Zuncke 876bbe33c1 Fix issue #432
Overview:
Array astInformation.structInitEndLocations is used to find index to use
in astInformation.indentInfoSortedByEndLocation.
Both are sorted, first is used to find the array index, second is
accessed at that index to get brace indentation information.

Problem:
structInitEndLocations is generated from struct initializers
exclusively while the brace information array also contains entries
for function literal initializers. Thus when function literal init(s)
are used, we get accumulating off by one errors in the second array:

match value in structInitEndLocations and take that index:
[3, 50]
    ^--> index 1

take brace indent information from that index:
[3, 15, 50]
    |   ^--> the one we want
    ^------> the one we get (function literal init)

Solution:
This guarantees that searching forward works.
While better search strategies than linear are possible, this should be
enough for any sane and most of the insane code files.
2023-10-18 10:22:48 +02:00
WebFreak001 1e765fb781 add knr test variant for no_space_after_keyword
The generator is so outdated and basic that it didn't generate this.
2023-07-26 16:13:48 +02:00
Robert Schadek c43803575d No space after keywords
Readme update

test files
2023-07-26 16:13:48 +02:00
WebFreak001 470e65f7cc bump minimum libdparse version, fix #583 2023-07-19 14:43:24 +02:00
Eugen Wissner 6f41b20d5b Remove travis 2023-05-01 23:01:54 +02:00
Razvan Nitu 49b9fe4051
Merge pull request #579 from belka-ew/bug/revert-array-indent-on-line
Keep "(" indentation with a "]" in the same line
2023-04-07 23:19:48 +08:00
Eugen Wissner fec7394175 Add reflow_property_chains option
Recalculate the splitting of property chains into multiple lines.
2023-03-29 11:29:59 +02:00
Eugen Wissner 727472c365
Keep "(" indentation with a "]" in the same line 2023-03-20 18:23:33 +01:00
WebFreak001 840aeee45e add missing test 2023-03-01 22:07:37 +01:00
WebFreak001 a91f044958 add some missing hasCurrent checks 2023-03-01 22:07:37 +01:00
Eugen Wissner dba8c87ebc Revert operator indentation in an argument list 2023-02-06 10:17:09 +01:00
Eugen Wissner a4fbc6f881 Revert chain indentation in an argument list 2023-01-15 20:51:03 +01:00
Eugen Wissner 57f57d95de Fix else indentation after array literal 2023-01-14 02:18:28 +01:00
WebFreak001 4a6078779a Fix #568, don't output empty files without error
Now when an error in formatting happens, it never outputs anything and
doesn't override the file when working inplace.

Additionally dfmt is no longer able to fail in the middle of a file, as
now we first write everything to a buffer and only if everything was
successful, that buffer is printed to stdout or written to the inplace
file.

This should also guard against segfaults with inplace file formatting
erasing parts of the file, as well as the user thinking it was
successful, even though dfmt didn't finish properly.
2022-10-15 02:33:04 +02:00
Iain Buclaw e251e4343a Remove appveyor.yml
This pipeline isn't in use anymore.
2022-10-06 21:10:01 +02:00
Iain Buclaw 02070df593 Update downloads.dlang.org links to use https 2022-10-06 21:10:01 +02:00
Andrey Proskurin 6744df20f3 Add knr brace style to README 2022-09-14 13:25:04 +02:00
Eugen Wissner 8d42254d47 Fix indentation of callchains with comments
Weird formatting and indentation of multiline callchains with comments
in the middle.
2022-08-06 08:55:43 +02:00
Bastiaan Veelo 2a4af7a2b2
Retain line ending by default. (#553) 2022-07-28 17:21:10 +02:00
Eugen Wissner 026a58e273 Very long chained calls in array literals are indented weirdly 2022-07-28 17:14:01 +02:00
Bastiaan Veelo 4947beec6b CI
Add GitHub action.
2022-07-14 23:19:37 +02:00
belka-ew d862d8aef1
Fix array literal indentation in foreach (#554) 2022-06-14 12:35:54 +00:00
skyline131313 036da91542
Update dub.json to remove dependency on `rdmd` (#547) 2022-06-13 16:23:56 +02:00
Max Haughton ed5fc2ffd2
Merge pull request #551 from veelo/d_test_script
Port `test.sh` to platform independent D.
2022-05-30 00:15:49 +01:00
Bastiaan Veelo b8da7c5cd4 Refactor courtesy WebFreak001.
Co-authored-by: Jan Jurzitza <gh@webfreak.org>
2022-05-27 19:47:47 +02:00
Bastiaan Veelo f6d9d04e43 Port `test.sh` to platform independent D.
This executes also way faster by not spawning GNU diff.
2022-05-26 16:10:07 +02:00
Bastiaan Veelo f81ddeadbd
obey `end_of_line` setting in all tokens (#550)
Multi-line tokens would be written with `LF`, regardless the `end_of_line` setting.

Fixes #228 and also produces end_of_line specified line-endings in strings.
2022-05-25 13:21:07 +02:00
Bastiaan Veelo 3e1e643972
Merge branch 'dlang-community:master' into master 2022-05-23 16:23:20 +02:00
Eugen Wissner 77e2ba4e3d Fix array indentation as argument 2022-05-23 14:09:26 +02:00
RazvanN7 6a24f0dc7c Upgrade libdparse to latest version 2022-01-26 14:05:44 +01:00
Martin Kinkelin b776d5a9b9 Fix tests 2021-10-31 20:37:32 +09:00
Razvan Nitu 2beb819851
Merge pull request #535 from dlang-community/single-indent
Add single_indent option
2021-10-22 16:22:40 +03:00
Jan Jurzitza f1e57135bb
Merge pull request #534 from dlang-community/knr_brace_style 2021-10-09 09:09:50 +02:00
Max Haughton e5e11604f0
Merge pull request #542 from belka-ew/comment-before-contract
Fix comment before contract
2021-09-07 16:46:42 +01:00
Eugen Wissner e8bd41c70d
Fix comment before contract
Fixes #451.
2021-09-07 14:29:45 +02:00
Sönke Ludwig b3b8ff1a43 Avoid possible null pointer access. 2021-08-16 18:09:57 +02:00
Amin Yahyaabadi 0e5615e13e
Fix the CLI help output about the `--config` option (#541) 2021-08-04 00:40:22 +03:00
belka-ew f6490b31c9
Format multiline arrays first (#538) 2021-06-16 17:23:27 +03:00
Eugen Wissner 995c21ab87 Format do like body after function attributes 2021-06-14 21:06:32 +00:00
Eugen Wissner 821b9be9e9 Fix double array indentation inside parens 2021-06-12 05:39:30 +00:00
Eugen Wissner ea36fbf58b
Add single_indent option 2021-05-18 06:36:57 +02:00
Sönke Ludwig 0f61586438 Add tests for "knr" brace style. 2021-04-16 13:57:59 +02:00
Sönke Ludwig e35bde0815 Add Kernighan & Ritchie style brace formatting.
The original K&R style behaves like BraceStyle.otbs, except for function definitions that use Allman style.
2021-04-16 13:57:21 +02:00
WebFreak001 e79ba9f0c8 upgrade libdparse to <0.18.0 2021-04-06 20:14:47 +02:00
Preetpal Sohal 3479e73707
Fix installation instructions on README.md (#531)
* Fix installation instructions on README.md

Fixes Issue #530.
2021-03-11 16:40:44 +02:00
Eugen Wissner 1f21a97713 Don't indent associative array keys as labels 2021-03-09 11:38:33 +01:00
Eugen Wissner c4b6a7e7e3 Don't write a space after the return attribute
Fixes #521.
2021-02-27 16:06:06 +01:00
Eugen Wissner e6199aaa9b Don't output an extra newline after a comment
with keep_line_breaks=true.

Fixes #509 and #490.
2020-10-10 07:25:27 +02:00
Brian Schott e880e00e73
Merge pull request #516 from dlang-community/issue-515
Fix #515
2020-10-07 14:14:03 -07:00
Hackerpilot 41e8c05558 Fix #515 2020-10-07 02:19:55 -07:00
Brian Schott 7659b1ae1a
Fix Issue 508 (#511)
Fix Issue 508
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-10-01 08:35:20 +02:00
Eugen Wissner eab4cac12f Regenerate line break hints after newline
Fixes #486.
2020-09-04 00:14:25 +02:00
Eugen Wissner 94351246f6 Keep line break after function attributes
Fixes #504.
2020-09-02 09:09:19 +02:00
Eugen Wissner d100c40dab Print colon in AA before identifiers 2020-08-27 09:43:25 +02:00
Eugen Wissner 58b2c6ebc6 Break line on multiline strings
Fixes #476.
2020-08-10 15:25:59 +02:00
Mathis Beer b5dbb0e031 Fix issue 483: indent continuing case statements on the same level 2020-07-22 10:27:52 +02:00
Mathis Beer e4f2f20720 Fix issue 497: insert space before function/delegate in function type that returns template instantiated with parenless value argument 2020-07-20 08:04:51 +02:00
The Dlang Bot d92a6799ac
Merge pull request #493 from WebFreak001/upgrade-libdparse
Upgrade libdparse to <0.16.0
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-06-28 08:33:28 +02:00
WebFreak001 e5eda5c14a Upgrade libdparse to <0.16.0 2020-06-24 22:26:03 +02:00
The Dlang Bot f80bffcf84
Merge pull request #491 from WebFreak001/add-minmax-libdparse
use test_with_package.d for libdparse for tests
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-06-09 23:18:25 +02:00
Jan Jurzitza ad00b113a9 use test_with_package for libdparse test
test both minimum and maximum allowed libdparse versions with dub
2020-06-08 14:21:33 +02:00
The Dlang Bot 83f8a4c65d
Merge pull request #488 from WebFreak001/fix-482
switch statement alignment is implemented fix #482
merged-on-behalf-of: Petar Kirov <PetarKirov@users.noreply.github.com>
2020-05-06 06:42:34 +02:00
Jan Jurzitza f59f25bb09 switch statement alignment is implemented fix #482 2020-05-05 14:06:55 +02:00
The Dlang Bot 09caf255e5
Merge pull request #475 from WebFreak001/fix-474
Fix #474
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-04-03 09:51:49 +02:00
Jan Jurzitza 34810aa928 Fix stuck-while TODO (this is a do-while loop) 2020-04-03 09:19:24 +02:00
Jan Jurzitza cb1dfe091f Check for token before access, fix #474 2020-04-02 13:39:29 +02:00
Jan Jurzitza 7b955c18d1 Add hasCurrent to check if a token is available 2020-04-02 13:38:02 +02:00
Jan Jurzitza 1964f807cf
Merge pull request #473 from belka-ew/break-on-this
keep_line_breaks: multi-line tokens and argument list break
2020-03-24 14:42:25 +01:00
Eugen Wissner ef83514541 keep_line_breaks: Compare with the token end line 2020-03-24 14:39:31 +01:00
Eugen Wissner 394da5d02a Fix break after comma, before this 2020-03-22 17:54:59 +01:00
The Dlang Bot 66faac49f1
Merge pull request #470 from dlang-community/issue-469
Fix Issue #469
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-03-09 10:03:20 +01:00
Hackerpilot e9034f4fec Fix return value when reading from stdin 2020-03-08 13:23:42 -07:00
Brian Schott b17304accd
Update tests/test.sh
Co-Authored-By: Jan Jurzitza <gh@webfreak.org>
2020-03-08 13:17:48 -07:00
The Dlang Bot c41c0349a2
Merge pull request #471 from belka-ew/feature/keep-line-breaks
Support disabling automatic line breaks
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2020-03-07 21:47:03 +01:00
Eugen Wissner 5f0d2843e6 Support disabling automatic line breaks
Support disabling automatic line breaks With --keep_line_breaks.
2020-03-07 21:14:10 +01:00
Hackerpilot 63a29ab757 Update dependency 2020-03-06 13:28:45 -08:00
Hackerpilot 2dc19b6577 Update submodule 2020-03-06 13:11:20 -08:00
Hackerpilot fbd8559ceb Test case for issue 469 2020-03-06 13:10:21 -08:00
Hackerpilot 977318214d Add check for tests that are supposed to error out, and clean up code based on shellcheck suggestions 2020-03-06 13:10:04 -08:00
Hackerpilot 4db5ba44b2 Error out on lexer failure 2020-03-06 13:09:14 -08:00
The Dlang Bot 399041c84f
Merge pull request #467 from Geod24/fix-deps
Replace 'body' with 'do'
merged-on-behalf-of: Sebastian Wilzbach <sebi.wilzbach@gmail.com>
2020-02-04 03:36:42 +01:00
Geod24 d38c3d96bf Replace 'body' with 'do'
The former is set to be deprecated in the next (2.091.0) DMD release.
2020-02-04 11:28:21 +09:00
Geod24 da51958770 Remove trailing whitespace 2020-02-04 11:27:58 +09:00
Eugen Wissner 27929e4cc5 Wrap the argument list of a template function
Fixes #454.
2020-01-12 22:49:16 +01:00
Eugen Wissner 0795a477f1 Put space between a comment and an identifier
Fixes #452.
2020-01-05 23:11:18 +01:00
Eugen Wissner 8f779b33bf Put a space in contract expressions
Fixes #448.
2020-01-05 20:28:56 +01:00
Sebastian Wilzbach 024c6e6a63
Merge pull request #460 from WebFreak001/fix-trivials
Fix trivial issues
2019-12-03 02:13:34 +01:00
WebFreak001 8c2076d4f2 better gen_expected script 2019-11-25 17:10:20 +01:00
WebFreak001 70bae7487e add dub build to readme fix #234 2019-11-25 17:09:51 +01:00
WebFreak001 79ae2c09d0 trivially fix #195
probably fixed in previous libdparse
2019-11-25 17:09:51 +01:00
WebFreak001 28b32d9d77 trivially fix #134
was fixed in the past
2019-11-25 17:09:51 +01:00
WebFreak001 d33b878965 fix #430 already working
resolved with previous libdparse update
2019-11-25 17:09:51 +01:00
The Dlang Bot a4d4d94a50
Merge pull request #459 from WebFreak001/libdparse-0-13-z
upgrade libdparse to 0.13.z
merged-on-behalf-of: Sebastian Wilzbach <sebi.wilzbach@gmail.com>
2019-11-25 16:41:20 +01:00
WebFreak001 30ab6e103d upgrade libdparse to 0.13.z 2019-11-25 16:22:13 +01:00
The Dlang Bot 3f141b272d
Merge pull request #446 from Sobaya007/fix-issue256
Fix: Issue 256 "named member struct initialisers"
merged-on-behalf-of: Jan Jurzitza <gh@webfreak.org>
2019-08-06 23:22:24 +02:00
sobaya 06881d8654 Fix: assertion message in indent manipulation of struct initializer 2019-08-04 13:05:39 +09:00
sobaya ac8e34815f Fix: Use more readable expression 2019-08-04 13:04:39 +09:00
sobaya b3946b7525 Add: Test for nested struct formatting 2019-08-03 08:55:32 +09:00
sobaya 05db8ae8fa Fix: indentation for wrapping in struct initializer 2019-08-01 17:43:45 +09:00
sobaya 81c607a115 Fix: extrace space after first field 2019-08-01 16:58:41 +09:00
sobaya 1024f16715 Add: struct fields to the test of issue 256 2019-07-30 23:04:02 +09:00
sobaya ac61efe767 Fix: Issue 256 "named member struct initialisers" 2019-07-30 13:02:48 +09:00
The Dlang Bot 4fea171d2f
Merge pull request #442 from kotet/issue-361
Fix #361
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-05-14 10:41:32 +02:00
Kotet 3af8edc57f Fix #361 - Unexpected empty new line if function header ends with a comment 2019-05-14 09:00:56 +09:00
The Dlang Bot 6d2a56e15e
Merge pull request #441 from kotet/issue-426
Fix #426
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-05-13 11:06:56 +02:00
Kotet f8f34ff097 Fix #426 2019-05-13 17:49:12 +09:00
The Dlang Bot 999c044020
Merge pull request #440 from kotet/issue-0433
Fix #433
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-05-13 08:57:58 +02:00
Kotet 2cc1f59235 Fix #433 2019-05-13 12:13:32 +09:00
The Dlang Bot 436d157b4f
Merge pull request #439 from dayllenger/readme
make readme look nicer
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-04-14 05:15:26 +02:00
Viktor 0878430125 sort options and make links to "below" 2019-04-13 15:49:31 +03:00
Viktor ac5f8b18aa
make readme look nicer 2019-04-13 15:04:22 +03:00
Sebastian Wilzbach 793a575b1c Build win{32,64} binaries with LDC 2019-04-01 11:05:24 +02:00
Basile-z 313b886799 upgrade dependencies (#438)
upgrade dependencies
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-04-01 09:00:24 +02:00
The Dlang Bot 54a84bd927
Merge pull request #437 from dlang-community/issue-436
Fix #436
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2019-02-22 03:20:39 +01:00
Hackerpilot b4e97d3381 Fix #436 2019-02-20 11:25:31 -08:00
Laurent Tréguier b34acc9f26 Update libdparse to v0.11.2 (#429)
Update libdparse to v0.11.2
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-02-12 18:53:19 +01:00
Laurent Tréguier dae7d85c80 Fix #427 - Crash on invariant (#428)
Fix #427 - Crash on invariant
merged-on-behalf-of: Basile-z <Basile-z@users.noreply.github.com>
2019-02-11 13:55:33 +01:00
The Dlang Bot 6b9eddde5d
Merge pull request #424 from WebFreak001/fix-dubhash-spaces
Fix dubhash with spaces in folder name
merged-on-behalf-of: Jan Jurzitza <gh@webfreak.org>
2019-01-15 01:31:51 +01:00
WebFreak001 a79a43a9dc Fix dubhash with spaces in folder name 2019-01-14 20:33:17 +01:00
The Dlang Bot b00d3490bf
Merge pull request #423 from WebFreak001/aa3
fix array item access regression
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2019-01-12 22:01:28 +01:00
WebFreak001 bdac7361a5 Add test for issue0112 without array item 2019-01-12 12:37:06 +01:00
WebFreak001 7f41c8ae7f fix array item access regression 2019-01-12 12:25:46 +01:00
The Dlang Bot 989c0da60c
Merge pull request #422 from WebFreak001/aa2
Fix arrays in AAs, 2D arrays, long arrays
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2019-01-11 23:33:42 +01:00
WebFreak001 6dea7b689e fix otbs expected test result for 2d arrays 2019-01-11 22:23:04 +01:00
WebFreak001 98cd73ec80 Fix 2D (assoc) arrays & add tests
Fix #312
2019-01-11 22:06:57 +01:00
WebFreak001 eebd341343 Allow multilineAt to stop at commas 2019-01-11 22:05:41 +01:00
WebFreak001 733898e013 more informative dump function 2019-01-11 22:04:52 +01:00
Brian Schott 188c0dca03
Merge pull request #421 from WebFreak001/aa
Associative array formatting & space_before_aa_colon option
2019-01-11 12:55:15 -08:00
WebFreak001 60b2cff18a Adjust issue0017 for now (minor improvement) 2019-01-11 20:22:30 +01:00
WebFreak001 1da1ca6545 Fix isMultilineAt for array + refactor right bracket
Refactor formatRightBracket into own function
2019-01-11 20:19:50 +01:00
WebFreak001 48b2b84c33 Add documentation/comments & undo minor name change 2019-01-11 01:11:03 +01:00
WebFreak001 fcad21ba61 Improve AA formatting
fix #143, fix Pure-D/code-d#188
2019-01-11 00:50:50 +01:00
WebFreak001 85c7d57167 make multiline checking code modular
Arrays and delegates now use the check whether a line is longer
than the max line length using easy to reuse code
2019-01-11 00:48:59 +01:00
WebFreak001 053b775cd1 Add details to indentation stack
This makes more advanced state handling easily possible.
Also moved isWrapIndent/isTempIndent into this, which allows
for exceptions for certain tokens and more control.
2019-01-11 00:47:50 +01:00
WebFreak001 6e4136a353 Make colon almost never break a line 2019-01-11 00:45:47 +01:00
WebFreak001 3b094b16d9 Add ArrayLiterals into arrayStartLocations list
This is done to properly format arrays in function arguments
2019-01-11 00:44:11 +01:00
BBasile 460096728b Cleanup, remove socimantic stuff, close #406 (#418)
Cleanup, remove sociomantic stuff, close #406
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2019-01-02 16:20:15 +01:00
Jan Jurzitza c3537a5d51 Upgrade to libdparse 0.10.12 (#419)
Upgrade to libdparse 0.10.12
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-12-31 02:00:47 +01:00
Sebastian Wilzbach fc4cb9eecc
Merge pull request #417 from WebFreak001/fix-releases
Build tagged releases in CIs
2018-12-27 16:54:44 +01:00
WebFreak001 909164708a Build tagged releases in CIs 2018-12-27 16:37:32 +01:00
Jan Jurzitza ced64acae0 fix dub dependency build (fix #413) (#414) 2018-12-09 12:56:38 +01:00
The Dlang Bot bb679b1b6e
Merge pull request #411 from LaurentTreguier/issue-407
Fix #407 - `dub run dfmt` keeps building dfmt anew each time
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-11-14 18:51:28 +01:00
Laurent Tréguier 5508e9ced1
Fix #407 - `dub run dfmt` keeps building dfmt anew each time 2018-11-14 17:58:13 +01:00
Laurent Tréguier f4417dc1b5 Update libdparse to v0.10.x (#410)
Update libdparse to v0.10.x
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-11-10 14:02:31 +01:00
The Dlang Bot fd1f2f5161
Merge pull request #409 from LaurentTreguier/empty-braces-double-spaces
Spaces inside empty braces
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2018-11-09 10:51:13 +01:00
Laurent Tréguier 67664c2835
Don't put spaces inside empty braces 2018-11-06 16:40:25 +01:00
BBasile dc8e7a087c Prevent running CI twice when PR originated from origin (#408)
Prevent running CI twice when PR originated from origin
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-11-02 06:05:52 +01:00
Bastiaan Veelo 5274e5531e
Merge pull request #1 from dlang-community/master
Allow comments in selective imports. (#403)
2018-10-29 12:04:52 +01:00
Bastiaan Veelo 92d5e1ac8c Allow comments in selective imports. (#403)
Allow comments in selective imports.
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2018-10-19 01:45:52 +02:00
Laurent Tréguier 6ad2fbb6fc Fix #287 - Extra space after import in delegate 2018-10-15 10:14:23 +02:00
The Dlang Bot 3917c32925
Merge pull request #402 from some-bot/merge-libdparse-v0.9.10
Update dlibparse to v0.9.10
merged-on-behalf-of: Dlang Community Bot <some-bot@users.noreply.github.com>
2018-10-13 16:02:16 +02:00
some-bot a1cb44eb80 Updated libdparse to v0.9.10. 2018-10-13 12:59:49 +00:00
Laurent Tréguier 049f86ebfd Fix #349 - Wrong indentation of access modifier after break of long line 2018-10-11 05:43:37 +02:00
Laurent Tréguier 2578dbf2a7 Fix #267 - Indentation with debug inconsistent 2018-10-11 05:43:18 +02:00
Laurent Tréguier 908f32e433 Properly recognize debug as block header 2018-10-11 05:43:18 +02:00
The Dlang Bot 18eea577f8
Merge pull request #398 from LaurentTreguier/issue-345
Fix #345 -  Case of trailing white space
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-10-10 13:43:57 +02:00
Laurent Tréguier b928eb6d84
Fix #345 - Case of trailing white space 2018-10-10 13:37:06 +02:00
The Dlang Bot 810e4b464f
Merge pull request #396 from LaurentTreguier/debug-with-param
Debug with param
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-10-09 15:50:10 +02:00
Laurent Tréguier 6ff47e106a
Fix else indentation after debug conditions 2018-10-09 13:19:07 +02:00
Laurent Tréguier 72dd6e83b3
Stop directly accessing top indent token
Accessing the top indent token without using the topIs* () methods is
unsafe and can lead to range violations.
2018-10-09 12:04:44 +02:00
Laurent Tréguier c84db53c7c Fix #372 - Improper indentation after single-line catch (#395)
Fix #372 - Improper indentation after single-line catch
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-10-08 13:32:15 +02:00
Laurent Tréguier f3463cdd34 Fix #326 - Spaces missing after attributes in function literals (#394)
Fix #326 - Spaces missing after attributes in function literals
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-10-07 20:47:28 +02:00
Laurent Tréguier 16c3811261 Fix #286 - Weird indentation in else branch after wrapping expression (#393)
Fix #286 - Weird indentation in else branch after wrapping expression
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-10-07 19:56:08 +02:00
Laurent Tréguier 886903f8ea Fix #246 - Questionable indentation for multiple `with` statements 2018-10-07 12:36:17 +02:00
some-bot 494f70b429 Updated libdparse to v0.9.9. 2018-10-03 15:14:17 +02:00
Basile Burg dca9e15483 fix #244 - Wrong indentation for bool enums 2018-10-03 12:07:54 +02:00
Laurent Tréguier 5e6dd58502 Properly format enum member attributes and parameter attributes 2018-09-29 22:52:49 +02:00
some-bot 0fc4149907 Updated libdparse to v0.9.8. 2018-09-29 14:24:12 +02:00
BBasile 7fb46c9aa5 Use automatic versioning (#379)
Use automatic versioning
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-09-19 15:16:41 +02:00
Laurent Tréguier 647bb6daa9 Support for DIP1009 (new contracts syntax), #375 (#376)
Support for DIP1009 (new contracts syntax), #375
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-09-10 14:15:14 +02:00
BBasile 1fd19a1375 deactivate testing with DMD nightly (#383)
deactivate testing with DMD nightly
merged-on-behalf-of: Laurent Tréguier <LaurentTreguier@users.noreply.github.com>
2018-09-08 13:40:50 +02:00
Brian Schott ae76778801 Add index validity checks to the left paren/bracket code. Fixes #367. (#368)
Add index validity checks to the left paren/bracket code. Fixes #367.
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-09-06 01:01:27 +02:00
BBasile 56097fd106 Deprecate enforce ex (#377)
Deprecate enforce ex
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-09-06 01:01:08 +02:00
Stefan Koch 4256f988bf Merge tag v0.8.2 into v0.x.x 2018-06-19 16:48:23 +02:00
Stefan Koch cff6eb908e Merge tag v0.7.2 into v0.8.x 2018-06-19 16:48:23 +02:00
BBasile c58e54fe71 Handle do as contract header and handle body as identifier (#360)
Handle `do` as contract header and handle `body` as identifier
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>

* libdparse 687c0ca(687c0ca)...086cf06(086cf06) (28 commits)
  > Merge pull request #242 from BBasile/issue-241
  > Merge pull request #239 from kubo39/add-isIntegerLiteral
  > Merge pull request #237 from BBasile/parse-virt-helpers
  > Merge pull request #236 from JinShil/patch-2
  > Merge pull request #235 from BBasile/upd-stdx-alloc
  (...)
2018-06-19 16:46:39 +02:00
BBasile 46788e53ba Handle do as contract header and handle body as identifier (#360)
Handle `do` as contract header and handle `body` as identifier
merged-on-behalf-of: Brian Schott <Hackerpilot@users.noreply.github.com>
2018-06-14 23:29:47 +02:00
Leandro Lucarella c66fea0fe5 v0.7.1
-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJbGrPQAAoJEOPQILQNRairRBoP+wQp3KG8pBYRjYWCUYBCcNrO
 5YgjtI7aEZfjo7mp56a7aYlXHmJpd8zPwR7xC9dwkA7/WzH6Pd6Lz5rz1cZq0KS7
 b+xwv834FRcGP17t7wKh1YqC8cvaL5UxgIIWvsk8L8W8wvt5ZwWXWkWGvUHfCgsp
 yZAjODJHBqUpkVSyCoOPgK8H02iY2wLAhQz1wZDRVyst9oFmNw0bgKprzyYaJrSd
 TkZL+1NZB9emCXBhW54Rh31hBnil5X7BJYvm9gNoEy9NO30uO+M1Z+HtRqY2z/kY
 VeCbk6oIvqQbqX/gbaNDWXhnnYcNJS6T7f6kob0Iu6m0FiCeW7e0PoYit4XmlLvQ
 XuXHx3BMLDYBamMbthEBLZ7iE37df31j+wo26dEj69Ax9lye4xzKEdu7Ke7uPL1C
 DaxInqxdp5DSdzu1CJcKPKpSJbJNslKP3nDPGOEGG119ujBQihV7CfmEbzgi/Py4
 BmK2sBKheRAiPrtbvjDq/HxTMbcjDvZMhqlYur4qNOQsWdei2UfWiRgOY8CFGKdt
 qVDkl/klYAihdYLy9Kh3I3TtbDN/VyRTE+I7O80RgxKB/UYzkTZABuIycsxLhaCp
 45FtPaetBuUUNYl26TTX/tIeEov7MQnvoPidzfg2ldTcswmZV4uz1RGZ7/odxVuV
 VN3VD8zCd6he0EYxdSqH
 =p5+M
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJbGrPRAAoJEOPQILQNRairLs8P/37fPm1PQIatry/RovNGzu9Q
 CwZEJJDocVz6wc5d9XJoFr5pXnkj0jHzbMd7Bw1JI3/nAnY6H79gKJnK/KJluKkx
 vI79iKmTQyjb4r2mJt9k9XPevDkQlAxFTEpkvP/uAGhqkArQlUbLV1Hp9wPf6oH3
 Qn9mrGi68/h/ENiYpcIAJAbnJj+QUDcHqZeb7c7omX5VKWK3gdl+chBqEqnOCoAm
 1cfKpKDNp3jQHr4dY72MAjYbGBwQRRqRfmwadwjydwKVd22lY4Tc2EnEKRjurlyY
 y/QczFS/0XzPG+Y4Ft11fCkiVJMi/8GJkJZFmCOHi8R49U78Pb5bNpeEbLLRBMCO
 ECMXw/G7YjmlJ1A97AobBAlmGtISNcTT/ia0cgZGEKgZhPmMxNgIIK6ooNYsuOly
 s7M9CYqZ/erH4C94XnJbvWimWbmYai0PwqVb00wOvW4d5vN0YE1Rhq/s4k0UOtnz
 wXpb0acRDVS0sL4m5dyljOBlQ8ChPeJo7+B10yjXj7SBFZ/8XgNtLF+rqQW7Fsyf
 JBgHmj/6nDij4OWa8C8pfv57oXWkMVokopvoChXOWQdiElMF7IyV2wrgAtIsQIKf
 9Sk3pX/E7a2J6cVwrNm/WwlLVWdXNX4PxcK77B7FAXFDxCKBc+fUq3L0jzrKFHAW
 rUWBbzWvK4RHkJO83l67
 =wbJ6
 -----END PGP SIGNATURE-----

Merge tag v0.7.1 into v0.8.x
v0.7.1

# gpg: Signature made Fri 08 Jun 2018 18:50:24 CEST
# gpg:                using RSA key E3D020B40D45A8AB
# gpg: Good signature from "Leandro Lucarella <leandro.lucarella@sociomantic.com>"

* tag 'v0.7.1':
  Update Windows Travis Deploy Regex (#354)
  Deploy binaries to GitHub releases (Linux/MacOS) (#348)
2018-06-08 18:50:25 +02:00
Leandro Lucarella 4fd89f1f41 v0.8.1
-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJbGrPRAAoJEOPQILQNRairbNQQAKDzxypJ5XjWhgBl9mALP4ia
 jPAZhaUXrPNNXmTVc6X09BwMPEqldC51AbMM2x7b81g6IjxEi4mk38yOy+ZAVaaX
 GMEHHXrSX6PspCxBgjICOkYEy2ADZkZ1PfpZrv93fNVLQb1rRdGnOV8sxLqCMdiJ
 IpYasQoFSiJFgjhaZPvY9/mTcV701OXrRQrLjpEhjJM3hWsXjs9x2VukcImebaOE
 OidjUqGDlqVNTBnNRNihJ6n47sZBredUeTyRG5eCdaoXUGQe4kToo96kX2LefObr
 JSXAkAdVuNFq4Ffk9F/wXL6NyR197c1Y5x5MDMFv+bF7COQt7K0PsAIX7whw5y9S
 LHfuopY/2hyHad5qW6T1itIFVESIRXNGk6DkLeZ2MnozbyByjEVam3gOkRCKYdIw
 R205SVyB9CVLOZ/jw/gEROc9dBqDkh0lsIAYhQuWHV3tqr3vxqj2L/X1w8IsJu64
 2ldMvz4ZkgcaE0h2SWm1ZAeyag5nTXJG/rJ2F7lY/lBd3NNDHNtygyKtLtO+cMdd
 i33zwif22tDAm1IF6A8JFIWZvCwONleffX5B3FKnozKWPln60GFdcEP6BUeoPTp+
 DGHpKcHFZpfbWvlqhdpDf4dkCHjehlUuTCSqnG+LWp13GgDxuX+v/iQOmIpMQlSJ
 dJnlL9Or+QrNhqzyqyFE
 =5WQY
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJbGrPRAAoJEOPQILQNRairJW0P/2+P9IGiHdJtrOrU7OBiT4Ml
 xYawWos4FILLHgoj/W3zPUqSkMCq1w4WcvOKG4A3eHaC6+xnyDQwN6uCysfd2tIO
 Pk8Afam5g+EpFf9ZnjnxChpBKIb3UHplkdKcL0tWCvzBjRbXycR3pxW/UVx8WQ+V
 UY3S9lcgbZW7PBBRZbCPRhviFZnNL48apN+pVGmV7gWc0BNpA8muFTL/I7bA+gpP
 MEZ6xYC+xV+1qKoJ9oyxAC/LUwt0nsw2uWc/y+C55hhKUdOchQDboc8V7ythBdCT
 c83hpvrnElvbxKpaKsWJs6+rL8Cvp3ongKh/4sdGKLK44HKmU/usNk70dbDI7oTa
 dHxjq1Cyl6cPJ4Xmmhpxke2UEvS6vPKdcRXJDVtopKVssWZqGlnfDrPmdGICnFqc
 g0yxKMxu7LN6dHczCaVPmLc77TbBhJyAF4taMnFY539P/ME0cnOXPQNdBSK4uO+C
 44zydEPVLPrf/y1hYQS1u+So/klUNxFR/9JCNBcSat9QqneUL6vS+kx97MSXGq8p
 oNvndoI3uzoju6UmEgKLm3+1iTBLAieZPDRCOgFXvfksgr3HjZEdJU+QyqtKARuV
 hjWMM/QIFO3vutOSn5Asqc/wgQBpyUrHoMmm0dGptGOW3S8XauFkW5D7z78+Slbm
 xD+cPH9UHku04aaY0/Eb
 =6HPM
 -----END PGP SIGNATURE-----

Merge tag v0.8.1 into v0.x.x
v0.8.1

# gpg: Signature made Fri 08 Jun 2018 18:50:25 CEST
# gpg:                using RSA key E3D020B40D45A8AB
# gpg: Good signature from "Leandro Lucarella <leandro.lucarella@sociomantic.com>"

* tag 'v0.8.1':
  Update Windows Travis Deploy Regex (#354)
  Deploy binaries to GitHub releases (Linux/MacOS) (#348)
2018-06-08 18:50:25 +02:00
Stefan Koch 8f76cce8db Clear release notes after release 2018-05-29 16:17:05 +02:00
Stefan Koch b416d72221 Add ufcs formatting relnotes 2018-05-29 16:05:25 +02:00
BBasile 2284d98ef7 Update stdx alloc for future removal of std.c (#357) 2018-05-26 20:04:38 +02:00
Hackerpilot 1753127e74 Update dub file to bring in newer libdparse 2018-05-09 16:06:12 +02:00
Hackerpilot c4b9178e81 Better formatting for UFCS chains 2018-05-09 16:06:12 +02:00
Brian Schott 6eb7b95173 Fix #351 (#352)
Fix #351
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-05-07 07:04:19 +02:00
notna123 08f73d216b Update main.d (#347)
GIT repo change from "Hackerpilot" to "dlang-community"
merged-on-behalf-of: BBasile <BBasile@users.noreply.github.com>
2018-03-27 08:59:46 +02:00
Stefan Koch 8c95061c1a Clear release notes after release 2018-03-14 16:40:37 +01:00
526 changed files with 7598 additions and 736 deletions

16
.gitattributes vendored Normal file
View File

@ -0,0 +1,16 @@
tests/issue0228.d text eol=lf
tests/allman/issue0228.d.ref text eol=crlf
tests/knr/issue0228.d.ref text eol=crlf
tests/otbs/issue0228.d.ref text eol=crlf
tests/issue0552_lf.d text eol=lf
tests/allman/issue0552_lf.d.ref text eol=lf
tests/knr/issue0552_lf.d.ref text eol=lf
tests/otbs/issue0552_lf.d.ref text eol=lf
tests/issue0552_cr.d text eol=cr
tests/allman/issue0552_cr.d.ref text eol=cr
tests/knr/issue0552_cr.d.ref text eol=cr
tests/otbs/issue0552_cr.d.ref text eol=cr
tests/issue0552_crlf.d text eol=crlf
tests/allman/issue0552_crlf.d.ref text eol=crlf
tests/knr/issue0552_crlf.d.ref text eol=crlf
tests/otbs/issue0552_crlf.d.ref text eol=crlf

34
.github/workflows/d.yml vendored Normal file
View File

@ -0,0 +1,34 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: D
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: dlang-community/setup-dlang@4c99aa991ce7d19dd3064de0a4f2f6b2f152e2d7
- name: 'Build & Test'
run: |
# Build the project, with its main file included, without unittests
dub build --compiler=$DC
# Build and run tests, as defined by `unittest` configuration
# In this mode, `mainSourceFile` is excluded and `version (unittest)` are included
# See https://dub.pm/package-format-json.html#configurations
dub test --compiler=$DC
# Run tests
cd tests && rdmd test

9
.gitmodules vendored
View File

@ -1,12 +1,9 @@
[submodule "libdparse"]
path = libdparse
url = https://github.com/dlang-community/libdparse.git
[submodule "makd"]
path = makd
url = https://github.com/sociomantic-tsunami/makd
[submodule "beaver"]
path = beaver
url = https://github.com/sociomantic-tsunami/beaver.git
[submodule "stdx-allocator"]
path = stdx-allocator
url = https://github.com/dlang-community/stdx-allocator
[submodule "d-test-utils"]
path = d-test-utils
url = https://github.com/dlang-community/d-test-utils.git

View File

@ -1,15 +0,0 @@
#!/bin/bash
set -e
if [[ $BUILD == dub ]]; then
dub build --build=release
elif [[ $DC == ldc2 ]]; then
git submodule update --init --recursive
make ldc -j2
else
git submodule update --init --recursive
make debug -j2
fi
cd tests && ./test.sh

View File

@ -1,97 +0,0 @@
sudo: false
language: d
d:
- dmd-nightly
- dmd-beta
- dmd
- ldc-beta
- ldc
os:
- linux
# - osx # disabled until travis has more mac resources
env:
- BUILD=
- BUILD=dub
script: ./.travis.sh
jobs:
include:
- stage: Build & Upload Package
if: tag IS present
# Which package to deploy
env:
- DMD=2.076.*
- DIST=xenial
- PATH="$(git config -f .gitmodules submodule.beaver.path)/bin:$PATH"
language: generic
sudo: required
services:
- docker
git:
submodules: false
before_install: git submodule update --init
install: beaver dlang install
script:
- beaver dlang make pkg
deploy:
provider: script
script: beaver bintray upload -d dlang-community/apt/dfmt build/last/pkg/*.deb
skip_cleanup: true
on:
tags: true # must be a git tag
repo: dlang-community/dfmt # must be a tag on dlang-community
- stage: GitHub Release
#if: tag IS present
d: ldc-1.8.0
os: linux
script: echo "Deploying to GitHub releases ..." && ./release.sh
deploy:
provider: releases
api_key: $GH_REPO_TOKEN
file_glob: true
file: bin/dfmt-*.tar.gz
skip_cleanup: true
on:
repo: dlang-community/dfmt
tags: true
- stage: GitHub Release
#if: tag IS present
d: ldc-1.8.0
os: osx
script: echo "Deploying to GitHub releases ..." && ./release.sh
deploy:
provider: releases
api_key: $GH_REPO_TOKEN
file_glob: true
file: bin/dfmt-*.tar.gz
skip_cleanup: true
on:
repo: dlang-community/dfmt
tags: true
- stage: GitHub Release
#if: tag IS present
d: dmd
os: linux
language: generic
sudo: yes
script: echo "Deploying to GitHub releases ..." && ./release-windows.sh
addons:
apt:
packages:
- p7zip-full
- wine
deploy:
provider: releases
api_key: $GH_REPO_TOKEN
file_glob: true
file: bin/dfmt-*.zip
skip_cleanup: true
on:
repo: dlang-community/dfmt
tags: true
stages:
- name: test
if: type = pull_request or (type = push and branch = master)

130
README.md
View File

@ -1,54 +1,66 @@
# dfmt [![Build Status](https://travis-ci.org/dlang-community/dfmt.svg?branch=master)](https://travis-ci.org/dlang-community/dfmt)
# dfmt [![Build Status](https://github.com/dlang-community/dfmt/actions/workflows/d.yml/badge.svg)](https://github.com/dlang-community/dfmt/actions?query=workflow%3A%22D%22)
**dfmt** is a formatter for D source code
## Status
**dfmt** is beta quality. Make backups of your files or use source control
when using the **--inplace** option.
## Building
### Using Make
## Installation
### Installing with DUB
```sh
> dub run dfmt -- -h
```
### Building from source using Make
* Clone the repository
* Run ```git submodule update --init --recursive``` in the dfmt directory
* To compile with DMD, run ```make``` in the dfmt directory. To compile with
LDC, run ```make ldc``` instead. The generated binary will be placed in ```dfmt/bin/```.
### Installing with DUB
```sh
> dub fetch --version='~master' dfmt && dub run dfmt -- -h
```
### Building from source using dub
* Clone the repository
* run `dub build --build=release`, optionally with `--compiler=ldc2`
## Using
By default, dfmt reads its input from **stdin** and writes to **stdout**.
If a file name is specified on the command line, input will be read from the
file instead, and output will be written to **stdout**.
**dfmt** uses EditorConfig files for configuration. If you run **dfmt** on a
source file it will look for .editorconfig files that apply to that source file.
If no file is specified on the command line, **dfmt** will look for .editorconfig
**dfmt** uses [EditorConfig](http://editorconfig.org/) files for configuration. If you run **dfmt** on a
source file it will look for *.editorconfig* files that apply to that source file.
If no file is specified on the command line, **dfmt** will look for *.editorconfig*
files that would apply to a D file in the current working directory. Command
line options can be used instead of .editorconfig files, or to override options
found in .editorconfig files.
line options can be used instead of *.editorconfig* files, or to override options
found there.
### Options
* **--help | -h**: Display command line options
* **--inplace | -i**: A file name is required and the file will be edited in-place.
* **--align_switch_statements**: See **dfmt_align_switch_statements** below
* **--brace_style**: See **brace_style** below
* **--end_of_line**: See **end_of_line** below
* **--indent_size**: See **indent_size** below
* **--indent_style | -t**: See **indent_style** below
* **--max_line_length**: See **max_line_length** below
* **--soft_max_line_length**: See **dfmt_soft_max_line_length** below
* **--outdent_attributes**: See **dfmt_outdent_attributes** below
* **--single_template_constraint_indent**: See **dfmt_template_constraint_style** below
* **--space_after_cast**: See **dfmt_space_after_cast** below
* **--space_before_function_parameters**: See **dfmt_space_before_function_parameters** below
* **--split_operator_at_line_end**: See **dfmt_split_operator_at_line_end** below
* **--tab_width**: See **tab_width** below
* **--selective_import_space**: See **dfmt_selective_import_space** below
* **--compact_labeled_statements**: See **dfmt_compact_labeled_statements** below
* **--template_constraint_style**: See **dfmt_template_constraint_style** below
* `--help | -h`: Display command line options.
* `--inplace | -i`: A file name is required and the file will be edited in-place.
* `--align_switch_statements`: *see dfmt_align_switch_statements [below](#dfmt-specific-properties)*
* `--brace_style`: *see dfmt_brace_style [below](#dfmt-specific-properties)*
* `--compact_labeled_statements`: *see dfmt_compact_labeled_statements [below](#dfmt-specific-properties)*
* `--end_of_line`: *see end_of_line [below](#standard-editorconfig-properties)*
* `--indent_size`: *see indent_size [below](#standard-editorconfig-properties)*
* `--indent_style | -t`: *see indent_style [below](#standard-editorconfig-properties)*
* `--max_line_length`: *see max_line_length [below](#standard-editorconfig-properties)*
* `--outdent_attributes`: *see dfmt_outdent_attributes [below](#dfmt-specific-properties)*
* `--selective_import_space`: *see dfmt_selective_import_space [below](#dfmt-specific-properties)*
* `--single_template_constraint_indent`: *see dfmt_single_template_constraint_indent [below](#dfmt-specific-properties)*
* `--soft_max_line_length`: *see dfmt_soft_max_line_length [below](#dfmt-specific-properties)*
* `--space_after_cast`: *see dfmt_space_after_cast [below](#dfmt-specific-properties)*
* `--space_before_aa_colon`: *see dfmt_space_before_aa_colon [below](#dfmt-specific-properties)*
* `--space_before_named_arg_colon`: *see dfmt_space_before_named_arg_colon [below](#dfmt-specific-properties)*
* `--space_before_function_parameters`: *see dfmt_space_before_function_parameters [below](#dfmt-specific-properties)*
* `--split_operator_at_line_end`: *see dfmt_split_operator_at_line_end [below](#dfmt-specific-properties)*
* `--tab_width`: *see tab_width [below](#standard-editorconfig-properties)*
* `--template_constraint_style`: *see dfmt_template_constraint_style [below](#dfmt-specific-properties)*
* `--keep_line_breaks`: *see dfmt_keep_line_breaks [below](#dfmt-specific-properties)*
* `--single_indent`: *see dfmt_single_indent [below](#dfmt-specific-properties)*
* `--reflow_property_chains`: *see dfmt_property_chains [below](#dfmt-specific-properties)*
* `--space_after_keywords`: *see dfmt_space_after_keywords [below](#dfmt-specific-properties)*
### Example
```
@ -67,7 +79,7 @@ void main(string[] args)
// dfmt has no way of knowing that "getopt" is special, so it wraps the
// argument list normally
getopt(args, "optionOne", &optionOne, "optionTwo", &optionTwo, "optionThree", &optionThree);
getopt(args, "optionOne", &optionOne, "optionTwo", &optionTwo, "optionThree", &optionThree);
// dfmt off
getopt(args,
@ -82,31 +94,37 @@ void main(string[] args)
**dfmt** uses [EditorConfig](http://editorconfig.org/) configuration files.
**dfmt**-specific properties are prefixed with *dfmt_*.
### Standard EditorConfig properties
Property Name | Allowed Values | Default Value | Description
--------------|----------------|---------------|------------
end_of_line | `cr`, `crlf` and `lf` | `lf` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#end_of_line)
insert_final_newline | | `true` | Not supported. `dfmt` always inserts a final newline.
charset | | `UTF-8` | Not supported. `dfmt` only works correctly on UTF-8.
indent_style | `tab`, `space` | `space` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#indent_style)
indent_size | positive integers | `4` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#indent_size)
tab_width | positive integers | `4` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#tab_width)
trim_trailing_whitespace | | `true` | Not supported. `dfmt` does not emit trailing whitespace.
max_line_length | positive integers | `120` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#max_line_length)
Property Name | Allowed Values | Description
--------------|----------------|------------
end_of_line | `cr`, `crlf` and `lf` | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#end_of_line) When not set, `dfmt` adopts the first line ending in the input.
insert_final_newline | **`true`** | Not supported. `dfmt` always inserts a final newline.
charset | **`UTF-8`** | Not supported. `dfmt` only works correctly on UTF-8.
indent_style | `tab`, **`space`** | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#indent_style)
indent_size | positive integers (**`4`**) | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#indent_size)
tab_width | positive integers (**`4`**) | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#tab_width)
trim_trailing_whitespace | **`true`** | Not supported. `dfmt` does not emit trailing whitespace.
max_line_length | positive integers (**`120`**) | [See EditorConfig documentation.](https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties#max_line_length)
### dfmt-specific properties
Property Name | Allowed Values | Default Value | Description
--------------|----------------|---------------|------------
dfmt_brace_style | `allman`, `otbs`, or `stroustrup` | `allman` | [See Wikipedia](https://en.wikipedia.org/wiki/Brace_style)
dfmt_soft_max_line_length | positive integers | `80` | The formatting process will usually keep lines below this length, but they may be up to max_line_length columns long.
dfmt_align_switch_statements (Not yet implemented) | `true`, `false` | `true` | Align labels, cases, and defaults with their enclosing switch.
dfmt_outdent_attributes (Not yet implemented) | `true`, `false` | `true` | Decrease the indentation level of attributes.
dfmt_split_operator_at_line_end | `true`, `false` | `false` | Place operators on the end of the previous line when splitting lines.
dfmt_space_after_cast | `true`, `false` | `true` | Insert space after the closing paren of a `cast` expression.
dfmt_space_after_keywords (Not yet implemented) | `true`, `false` | `true` | Insert space after `if`, `while`, `foreach`, etc, and before the `(`.
dfmt_space_before_function_parameters | `true`, `false` | `false` | Insert space before the opening paren of a function parameter list.
dfmt_selective_import_space | `true`, `false` | `true` | Insert space after the module name and before the `:` for selective imports.
dfmt_compact_labeled_statements | `true`, `false` | `true` | Place labels on the same line as the labeled `switch`, `for`, `foreach`, or `while` statement.
dfmt_template_constraint_style | `conditional_newline_indent` `conditional_newline` `always_newline` `always_newline_indent` | `conditional_newline_indent` | Control the formatting of template constraints.
dfmt_single_template_constraint_indent | `true`, `false` | `false` | Set if the constraints are indented by a single tab instead of two. Has only an effect for if indentation style if set to `always_newline_indent` or `conditional_newline_indent`.
Property Name | Allowed Values | Description
--------------|----------------|------------
dfmt_brace_style | **`allman`**, `otbs`, `stroustrup` or `knr` | [See Wikipedia](https://en.wikipedia.org/wiki/Brace_style)
dfmt_soft_max_line_length | positive integers (**`80`**) | The formatting process will usually keep lines below this length, but they may be up to *max_line_length* columns long.
dfmt_align_switch_statements | **`true`**, `false` | Align labels, cases, and defaults with their enclosing switch.
dfmt_outdent_attributes (Not yet implemented) | **`true`**, `false`| Decrease the indentation level of attributes.
dfmt_split_operator_at_line_end | `true`, **`false`** | Place operators on the end of the previous line when splitting lines.
dfmt_space_after_cast | **`true`**, `false` | Insert space after the closing paren of a `cast` expression.
dfmt_space_after_keywords (Not yet implemented) | **`true`**, `false` | Insert space after `if`, `while`, `foreach`, etc, and before the `(`.
dfmt_space_before_function_parameters | `true`, **`false`** | Insert space before the opening paren of a function parameter list.
dfmt_selective_import_space | **`true`**, `false` | Insert space after the module name and before the `:` for selective imports.
dfmt_compact_labeled_statements | **`true`**, `false` | Place labels on the same line as the labeled `switch`, `for`, `foreach`, or `while` statement.
dfmt_template_constraint_style | **`conditional_newline_indent`** `conditional_newline` `always_newline` `always_newline_indent` | Control the formatting of template constraints.
dfmt_single_template_constraint_indent | `true`, **`false`** | Set if the constraints are indented by a single tab instead of two. Has only an effect if the style set to `always_newline_indent` or `conditional_newline_indent`.
dfmt_space_before_aa_colon | `true`, **`false`** | Adds a space after an associative array key before the `:` like in older dfmt versions.
dfmt_space_before_named_arg_colon | `true`, **`false`** | Adds a space after a named function argument or named struct constructor argument before the `:`.
dfmt_keep_line_breaks | `true`, **`false`** | Keep existing line breaks if these don't violate other formatting rules.
dfmt_single_indent | `true`, **`false`** | Set if the code in parens is indented by a single tab instead of two.
dfmt_reflow_property_chains | **`true`**, `false` | Recalculate the splitting of property chains into multiple lines.
dfmt_space_after_keywords | **`true`**, `false` | Insert space after keywords (if,while,foreach,for, etc.).
## Terminology
* Braces - `{` and `}`

View File

@ -1,111 +0,0 @@
platform: x64
environment:
matrix:
- DC: dmd
DVersion: stable
arch: x64
- DC: dmd
DVersion: stable
arch: x86
# - DC: ldc
# DVersion: beta
# arch: x86
# - DC: ldc
# DVersion: beta
# arch: x64
# - DC: ldc
# DVersion: stable
# arch: x86
# - DC: ldc
# DVersion: stable
# arch: x64
skip_tags: false
branches:
only:
- master
install:
- ps: function ResolveLatestDMD
{
$version = $env:DVersion;
if($version -eq "stable") {
$latest = (Invoke-WebRequest "http://downloads.dlang.org/releases/LATEST").toString();
$url = "http://downloads.dlang.org/releases/2.x/$($latest)/dmd.$($latest).windows.7z";
}elseif($version -eq "beta") {
$latest = (Invoke-WebRequest "http://downloads.dlang.org/pre-releases/LATEST").toString();
$latestVersion = $latest.split("-")[0].split("~")[0];
$url = "http://downloads.dlang.org/pre-releases/2.x/$($latestVersion)/dmd.$($latest).windows.7z";
}elseif($version -eq "nightly") {
$url = "http://nightlies.dlang.org/dmd-master-2017-05-20/dmd.master.windows.7z"
}else {
$url = "http://downloads.dlang.org/releases/2.x/$($version)/dmd.$($version).windows.7z";
}
$env:PATH += ";C:\dmd2\windows\bin;";
return $url;
}
- ps: function ResolveLatestLDC
{
$version = $env:DVersion;
if($version -eq "stable") {
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST").toString().replace("`n","").replace("`r","");
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-win64-msvc.zip";
}elseif($version -eq "beta") {
$latest = (Invoke-WebRequest "https://ldc-developers.github.io/LATEST_BETA").toString().replace("`n","").replace("`r","");
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($latest)/ldc2-$($latest)-win64-msvc.zip";
} else {
$latest = $version;
$url = "https://github.com/ldc-developers/ldc/releases/download/v$($version)/ldc2-$($version)-win64-msvc.zip";
}
$env:PATH += ";C:\ldc2-$($latest)-win64-msvc\bin";
$env:DC = "ldc2";
return $url;
}
- ps: function SetUpDCompiler
{
$env:toolchain = "msvc";
if($env:DC -eq "dmd"){
echo "downloading ...";
$url = ResolveLatestDMD;
echo $url;
Invoke-WebRequest $url -OutFile "c:\dmd.7z";
echo "finished.";
pushd c:\\;
7z x dmd.7z > $null;
popd;
}
elseif($env:DC -eq "ldc"){
echo "downloading ...";
$url = ResolveLatestLDC;
echo $url;
Invoke-WebRequest $url -OutFile "c:\ldc.zip";
echo "finished.";
pushd c:\\;
7z x ldc.zip > $null;
popd;
}
}
- ps: SetUpDCompiler
build_script:
- ps: if($env:arch -eq "x86"){
$env:compilersetupargs = "x86";
$env:Darch = "x86";
$env:DConf = "m32";
}elseif($env:arch -eq "x64"){
$env:compilersetupargs = "amd64";
$env:Darch = "x86_64";
$env:DConf = "m64";
}
- ps: $env:compilersetup = "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall";
- '"%compilersetup%" %compilersetupargs%'
test_script:
- echo %PLATFORM%
- echo %Darch%
- echo %DC%
- echo %PATH%
- '%DC% --version'
- dub test --arch=%Darch% --compiler=%DC%
- git submodule update --init --recursive
- build.bat

View File

@ -24,7 +24,7 @@ _dfmt()
eolOpts="lf cr crlf"
boolOpts="true false"
braceOpts="allman otbs stroustrup"
braceOpts="allman otbs stroustrup knr"
indentOpts="tab space"
constraintOpts="conditional_newline_indent conditional_newline always_newline always_newline_indent"

1
beaver

@ -1 +0,0 @@
Subproject commit 82f8c8f6bbd9f0fbd9753a134377bec134a5956c

View File

@ -1,6 +0,0 @@
# Copyright sociomantic labs GmbH 2017.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
FROM sociomantictsunami/dlang:v4

View File

@ -11,6 +11,20 @@ set STDXALLOCATOR=
set STDXALLOCATORBLOCKS=
set OBIN=bin\dfmt
:: git might not be installed, so we provide 0.0.0 as a fallback or use
:: the existing githash file if existent
if not exist "bin" mkdir bin
git describe --tags > bin\githash_.txt
for /f %%i in ("bin\githash_.txt") do set githashsize=%%~zi
if %githashsize% == 0 (
if not exist "bin\githash.txt" (
echo v0.0.0 > bin\githash.txt
)
) else (
move /y bin\githash_.txt bin\githash.txt
)
for %%x in (src\dfmt\*.d) do set CORE=!CORE! %%x
for %%x in (libdparse\src\std\experimental\*.d) do set STD=!STD! %%x
for %%x in (libdparse\src\dparse\*.d) do set STDD=!STDD! %%x
@ -18,6 +32,6 @@ for %%x in (stdx-allocator\source\stdx\allocator\*.d) do set STDXALLOCATOR=!STDX
for %%x in (stdx-allocator\source\stdx\allocator\building_blocks\*.d) do set STDXALLOCATORBLOCKS=!STDXALLOCATORBLOCKS! %%x
@echo on
%DC% %CORE% %STD% %STDD% %STDE% %STDXALLOCATOR% %STDXALLOCATORBLOCKS% -I"stdx-allocator\source" -I"libdparse\src" %DFLAGS% -of%OBIN%.exe
%DC% %CORE% %STD% %STDD% %STDE% %STDXALLOCATOR% %STDXALLOCATORBLOCKS% -I"stdx-allocator\source" -I"libdparse\src" -Jbin %DFLAGS% -of%OBIN%.exe
if exist %OBIN%.obj del %OBIN%.obj

1
d-test-utils Submodule

@ -0,0 +1 @@
Subproject commit 206a2e6abd97b4462f3a320e4f2d23986fad3cff

View File

@ -4,8 +4,17 @@
"targetType": "autodetect",
"license": "BSL-1.0",
"dependencies": {
"libdparse": "~>0.8.0-alpha.5"
"libdparse": ">=0.19.2 <1.0.0"
},
"targetPath" : "bin/",
"targetName" : "dfmt",
"stringImportPaths" : [
"bin"
],
"versions" : [
"built_with_dub"
],
"preBuildCommands" : [
"$DC -run \"$PACKAGE_DIR/dubhash.d\""
]
}

23
dubhash.d Normal file
View File

@ -0,0 +1,23 @@
import std.algorithm;
import std.ascii;
import std.conv;
import std.exception;
import std.file;
import std.path;
import std.process;
import std.range;
import std.string;
void main()
{
auto dir = environment.get("DUB_PACKAGE_DIR");
auto hashFile = dir.buildPath("bin", "dubhash.txt");
auto gitVer = executeShell("git -C " ~ dir ~ " describe --tags");
auto ver = (gitVer.status == 0 ? gitVer.output.strip
: "v" ~ dir.dirName.baseName.findSplitAfter(
environment.get("DUB_ROOT_PACKAGE") ~ "-")[1]).ifThrown("0.0.0")
.chain(newline).to!string.strip;
dir.buildPath("bin").mkdirRecurse;
if (!hashFile.exists || ver != hashFile.readText.strip)
hashFile.write(ver);
}

@ -1 +1 @@
Subproject commit 687c0ca751747ebe498c183da1a3ee3119d57932
Subproject commit fe6d1e38fb4fc04323170389cfec67ed7fd4e24a

1
makd

@ -1 +0,0 @@
Subproject commit d735c1df67399693f699f8315418173a55de5313

View File

@ -1,49 +1,63 @@
PREFIX = /usr/local
SRC := $(shell find src -name "*.d") \
$(shell find libdparse/src -name "*.d") \
$(shell find stdx-allocator/source -name "*.d")
INCLUDE_PATHS := -Ilibdparse/src -Istdx-allocator/source -Isrc
DMD_COMMON_FLAGS := -dip25 -w $(INCLUDE_PATHS) -Jviews
DMD_DEBUG_FLAGS := -debug -g $(DMD_COMMON_FLAGS)
DMD_FLAGS := -O -inline $(DMD_COMMON_FLAGS)
DMD_TEST_FLAGS := -unittest -g $(DMD_COMMON_FLAGS)
LDC_FLAGS := -g -w -oq $(INCLUDE_PATHS)
GDC_FLAGS := -g -w -oq $(INCLUDE_PATHS)
$(shell find libdparse/src -name "*.d")
IMPORTS := -Ilibdparse/src -Isrc -Jbin
DC ?= dmd
LDC ?= ldc2
GDC ?= gdc
.PHONY: dmd ldc gdc test
DMD_COMMON_FLAGS := -w $(IMPORTS)
DMD_DEBUG_FLAGS := -debug -g $(DMD_COMMON_FLAGS)
DMD_FLAGS := -O -inline $(DMD_COMMON_FLAGS)
DMD_TEST_FLAGS := -unittest -g $(DMD_COMMON_FLAGS)
LDC_FLAGS := -g -w -oq $(IMPORTS)
GDC_FLAGS := -g -w -oq $(IMPORTS)
override DMD_FLAGS += $(DFLAGS)
override LDC_FLAGS += $(DFLAGS)
override GDC_FLAGS += $(DFLAGS)
.PHONY: all clean install debug dmd ldc gdc pkg release test
all: bin/dfmt
bin/githash.txt:
mkdir -p bin
git describe --tags > bin/githash.txt
dmd: bin/dfmt
views/VERSION : .git/refs/tags .git/HEAD
mkdir -p $(dir $@)
git describe --tags > $@
ldc: $(SRC)
$(LDC) $(LDC_FLAGS) $^ -ofbin/dfmt
ldc: bin/githash.txt
$(LDC) $(SRC) $(LDC_FLAGS) -ofbin/dfmt
-rm -f *.o
gdc: $(SRC)
$(GDC) $(GDC_FLAGS) $^ -obin/dfmt
gdc: bin/githash.txt
$(GDC) $(SRC) $(GDC_FLAGS) -obin/dfmt
test: debug
cd tests && ./test.sh
cd tests && ./test.d
bin/dfmt-test: $(SRC)
$(DC) $(DMD_TEST_FLAGS) $^ -of$@
bin/dfmt-test: bin/githash.txt $(SRC)
$(DC) $(DMD_TEST_FLAGS) $(filter %.d,$^) -of$@
bin/dfmt: views/VERSION $(SRC)
bin/dfmt: bin/githash.txt $(SRC)
$(DC) $(DMD_FLAGS) $(filter %.d,$^) -of$@
debug: views/VERSION $(SRC)
debug: bin/githash.txt $(SRC)
$(DC) $(DMD_DEBUG_FLAGS) $(filter %.d,$^) -ofbin/dfmt
pkg: dmd
$(MAKE) -f makd/Makd.mak pkg
clean:
$(RM) bin/dfmt
$(RM) bin/dfmt bin/dfmt-test bin/githash.txt
install:
chmod +x bin/dfmt
mkdir -p $(DESTDIR)$(PREFIX)/bin
cp -f bin/dfmt $(DESTDIR)$(PREFIX)/bin/dfmt
release:
./release.sh
$(MAKE) bin/githash.txt

View File

@ -1,31 +0,0 @@
# dfmt packaging configuration
# ============================
dfmt_bindir='bin'
#-------------------------------------------------------------------------------
# Define the keyword arguments to pass to fpm (via the OPTS dict)
#-------------------------------------------------------------------------------
OPTS.update(
name = "dfmt",
url = 'https://github.com/dlang-community/dfmt',
maintainer = 'Stefan Koch <stefan.koch@sociomantic.com>',
vendor = 'Sociomantic Labs GmbH',
provides = "dfmt",
description = '''\
D source code formatter
''',
depends = FUN.autodeps('dfmt', path=dfmt_bindir),
)
#-------------------------------------------------------------------------------
# Define the positional arguments to pass to fpm (via the ARGS list)
#-------------------------------------------------------------------------------
ARGS.extend(FUN.mapfiles(dfmt_bindir, '/usr/bin', 'dfmt'))
ARGS.extend([
'bash-completion/completions/dfmt=/usr/share/bash-completion/completions/dfmt'
])
# vim: set ft=python tw=80 :

View File

@ -1,25 +1,21 @@
#!/usr/bin/env bash
# Build the Windows binaries under Linux (requires wine)
# Build the Windows binaries under Linux
set -eux -o pipefail
VERSION=$(git describe --abbrev=0 --tags)
OS=windows
ARCH_SUFFIX="x86"
BIN_NAME=dfmt
# Allow the script to be run from anywhere
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $DIR
# Step 1: download the DMD binaries
if [ ! -d dmd2 ] ; then
wget http://downloads.dlang.org/releases/2.x/2.079.0/dmd.2.079.0.windows.7z
7z x dmd.2.079.0.windows.7z > /dev/null
fi
source setup-ldc-windows.sh
# Step 2: Run DMD via wineconsole
archiveName="dfmt-$VERSION-$OS-$ARCH_SUFFIX.zip"
# Run LDC with cross-compilation
archiveName="$BIN_NAME-$VERSION-$OS-$ARCH_SUFFIX.zip"
echo "Building $archiveName"
mkdir -p bin
DC="$DIR/dmd2/windows/bin/dmd.exe" wine cmd /C build.bat
DC=ldmd2 make ldc
cd bin
zip "$archiveName" dfmt.exe
mv "${BIN_NAME}" "${BIN_NAME}.exe"
zip "$archiveName" "${BIN_NAME}.exe"

View File

@ -19,5 +19,5 @@ esac
archiveName="dfmt-$VERSION-$OS-$ARCH_SUFFIX.tar.gz"
echo "Building $archiveName"
${MAKE:-make} ldc LDC_FLAGS="${LDC_FLAGS[*]}"
${MAKE:-make} ldc LDC_FLAGS="${LDC_FLAGS[*]} -Jbin"
tar cvfz "bin/$archiveName" -C bin dfmt

View File

@ -1,5 +0,0 @@
### Small fixes
- Properly indent for struct-literals (#237)
- Ignore empty files

70
setup-ldc-windows.sh Normal file
View File

@ -0,0 +1,70 @@
#!/usr/bin/env bash
# sets up LDC for cross-compilation. Source this script, s.t. the new LDC is in PATH
LDC_VERSION="1.13.0"
ARCH=${ARCH:-32}
VERSION=$(git describe --abbrev=0 --tags)
OS=windows
# Step 0: install ldc
if [ ! -f install.sh ] ; then
wget https://dlang.org/install.sh
fi
. $(bash ./install.sh -a "ldc-${LDC_VERSION}")
# for the install.sh script only
LDC_PATH="$(dirname $(dirname $(which ldc2)))"
# Step 1a: download the LDC x64 windows binaries
if [ "${ARCH}" == 64 ] && [ ! -d "ldc2-${LDC_VERSION}-windows-x64" ] ; then
wget "https://github.com/ldc-developers/ldc/releases/download/v1.13.0/ldc2-${LDC_VERSION}-windows-x64.7z"
7z x "ldc2-${LDC_VERSION}-windows-x64.7z" > /dev/null
# Step 2a: Add LDC windows binaries to LDC Linux
if [ ! -d "${LDC_PATH}/lib-win64" ] ; then
cp -r ldc2-1.13.0-windows-x64/lib "${LDC_PATH}/lib-win64"
cat >> "$LDC_PATH"/etc/ldc2.conf <<EOF
"x86_64-.*-windows-msvc":
{
switches = [
"-defaultlib=phobos2-ldc,druntime-ldc",
"-link-defaultlib-shared=false",
];
lib-dirs = [
"%%ldcbinarypath%%/../lib-win64",
];
};
EOF
fi
fi
# Step 1b: download the LDC x86 windows binaries
if [ "${ARCH}" == 32 ] && [ ! -d "ldc2-${LDC_VERSION}-windows-x86" ] ; then
wget "https://github.com/ldc-developers/ldc/releases/download/v1.13.0/ldc2-${LDC_VERSION}-windows-x86.7z"
7z x "ldc2-${LDC_VERSION}-windows-x86.7z" > /dev/null
# Step 2b: Add LDC windows binaries to LDC Linux
if [ ! -d "${LDC_PATH}/lib-win32" ] ; then
cp -r ldc2-1.13.0-windows-x86/lib "${LDC_PATH}/lib-win32"
cat >> "$LDC_PATH"/etc/ldc2.conf <<EOF
"i686-.*-windows-msvc":
{
switches = [
"-defaultlib=phobos2-ldc,druntime-ldc",
"-link-defaultlib-shared=false",
];
lib-dirs = [
"%%ldcbinarypath%%/../lib-win32",
];
};
EOF
fi
fi
# set suffices and compilation flags
if [ "$ARCH" == "64" ] ; then
ARCH_SUFFIX="x86_64"
export DFLAGS="-mtriple=x86_64-windows-msvc"
else
ARCH_SUFFIX="x86"
export DFLAGS="-mtriple=i686-windows-msvc"
fi

View File

@ -23,18 +23,26 @@ struct BraceIndentInfo
uint beginIndentLevel;
}
struct StructInitializerInfo
{
size_t startLocation;
size_t endLocation;
}
/// AST information that is needed by the formatter.
struct ASTInformation
{
/// Sorts the arrays so that binary search will work on them
void cleanup()
{
import std.algorithm : sort;
import std.algorithm : sort, uniq;
import std.array : array;
sort(doubleNewlineLocations);
sort(spaceAfterLocations);
sort(unaryLocations);
sort(attributeDeclarationLines);
sort(atAttributeStartLocations);
sort(caseEndLocations);
sort(structInitStartLocations);
sort(structInitEndLocations);
@ -43,14 +51,20 @@ struct ASTInformation
sort(conditionalWithElseLocations);
sort(conditionalStatementLocations);
sort(arrayStartLocations);
sort(assocArrayStartLocations);
sort(contractLocations);
sort(constraintLocations);
sort(constructorDestructorLocations);
sort(staticConstructorDestructorLocations);
sort(sharedStaticConstructorDestructorLocations);
sort!((a,b) => a.endLocation < b.endLocation)
(indentInfoSortedByEndLocation);
sort!((a,b) => a.endLocation < b.endLocation)
(structInfoSortedByEndLocation);
sort(ufcsHintLocations);
ufcsHintLocations = ufcsHintLocations.uniq().array();
sort(ternaryColonLocations);
sort(namedArgumentColonLocations);
}
/// Locations of end braces for struct bodies
@ -65,6 +79,9 @@ struct ASTInformation
/// Lines containing attribute declarations
size_t[] attributeDeclarationLines;
/// Lines containing attribute declarations that can be followed by a new line
size_t[] atAttributeStartLocations;
/// Case statement colon locations
size_t[] caseEndLocations;
@ -80,6 +97,12 @@ struct ASTInformation
/// Closing braces of function literals
size_t[] funLitEndLocations;
/// Locations of aggregate bodies (struct, class, union)
size_t[] aggregateBodyLocations;
/// Locations of function bodies
size_t[] funBodyLocations;
/// Conditional statements that have matching "else" statements
size_t[] conditionalWithElseLocations;
@ -89,6 +112,9 @@ struct ASTInformation
/// Locations of start locations of array initializers
size_t[] arrayStartLocations;
/// Locations of start locations of associative array initializers
size_t[] assocArrayStartLocations;
/// Locations of "in" and "out" tokens that begin contracts
size_t[] contractLocations;
@ -104,7 +130,19 @@ struct ASTInformation
/// Locations of constructor/destructor "this" tokens ?
size_t[] constructorDestructorLocations;
/// Locations of '.' characters that might be UFCS chains.
size_t[] ufcsHintLocations;
BraceIndentInfo[] indentInfoSortedByEndLocation;
/// Opening & closing braces of struct initializers
StructInitializerInfo[] structInfoSortedByEndLocation;
/// Locations ternary expression colons.
size_t[] ternaryColonLocations;
/// Locations of named arguments of function call or struct constructor.
size_t[] namedArgumentColonLocations;
}
/// Collects information from the AST that is useful for the formatter
@ -127,6 +165,19 @@ final class FormatVisitor : ASTVisitor
arrayInitializer.accept(this);
}
override void visit(const ArrayLiteral arrayLiteral)
{
astInformation.arrayStartLocations ~= arrayLiteral.tokens[0].index;
arrayLiteral.accept(this);
}
override void visit(const AssocArrayLiteral assocArrayLiteral)
{
astInformation.arrayStartLocations ~= assocArrayLiteral.tokens[0].index;
astInformation.assocArrayStartLocations ~= assocArrayLiteral.tokens[0].index;
assocArrayLiteral.accept(this);
}
override void visit (const SharedStaticConstructor sharedStaticConstructor)
{
astInformation.sharedStaticConstructorDestructorLocations ~= sharedStaticConstructor.location;
@ -163,6 +214,18 @@ final class FormatVisitor : ASTVisitor
destructor.accept(this);
}
override void visit (const FunctionBody functionBody)
{
if (auto bd = functionBody.specifiedFunctionBody)
{
if (bd.blockStatement)
{
astInformation.funBodyLocations ~= bd.blockStatement.startLocation;
}
}
functionBody.accept(this);
}
override void visit(const ConditionalDeclaration dec)
{
if (dec.hasElse)
@ -205,9 +268,9 @@ final class FormatVisitor : ASTVisitor
override void visit(const FunctionLiteralExpression funcLit)
{
if (funcLit.functionBody !is null)
if (funcLit.specifiedFunctionBody !is null)
{
const bs = funcLit.functionBody.blockStatement;
const bs = funcLit.specifiedFunctionBody.blockStatement;
astInformation.funLitStartLocations ~= bs.startLocation;
astInformation.funLitEndLocations ~= bs.endLocation;
@ -235,21 +298,19 @@ final class FormatVisitor : ASTVisitor
caseRangeStatement.accept(this);
}
override void visit(const FunctionBody functionBody)
override void visit(const SpecifiedFunctionBody specifiedFunctionBody)
{
if (functionBody.blockStatement !is null)
astInformation.doubleNewlineLocations ~= functionBody.blockStatement.endLocation;
if (functionBody.bodyStatement !is null && functionBody.bodyStatement
.blockStatement !is null)
astInformation.doubleNewlineLocations
~= functionBody.bodyStatement.blockStatement.endLocation;
functionBody.accept(this);
if (specifiedFunctionBody.blockStatement !is null)
astInformation.doubleNewlineLocations ~= specifiedFunctionBody.blockStatement.endLocation;
specifiedFunctionBody.accept(this);
}
override void visit(const StructInitializer structInitializer)
{
astInformation.structInitStartLocations ~= structInitializer.startLocation;
astInformation.structInitEndLocations ~= structInitializer.endLocation;
astInformation.structInfoSortedByEndLocation ~=
StructInitializerInfo(structInitializer.startLocation, structInitializer.endLocation);
astInformation.indentInfoSortedByEndLocation ~=
BraceIndentInfo(structInitializer.startLocation, structInitializer.endLocation);
@ -270,12 +331,15 @@ final class FormatVisitor : ASTVisitor
override void visit(const Invariant invariant_)
{
astInformation.doubleNewlineLocations ~= invariant_.blockStatement.endLocation;
if (invariant_.blockStatement !is null)
astInformation.doubleNewlineLocations ~= invariant_.blockStatement.endLocation;
invariant_.accept(this);
}
override void visit(const StructBody structBody)
{
astInformation.aggregateBodyLocations ~= structBody.startLocation;
astInformation.doubleNewlineLocations ~= structBody.endLocation;
structBody.accept(this);
}
@ -295,6 +359,26 @@ final class FormatVisitor : ASTVisitor
override void visit(const UnaryExpression unary)
{
import std.typecons : rebindable;
int chainLength;
auto u = rebindable(unary);
while (u !is null)
{
if (u.identifierOrTemplateInstance !is null
&& u.identifierOrTemplateInstance.templateInstance !is null)
chainLength++;
u = u.unaryExpression;
}
if (chainLength > 1)
{
u = unary;
while (u.unaryExpression !is null)
{
astInformation.ufcsHintLocations ~= u.dotLocation;
u = u.unaryExpression;
}
}
if (unary.prefix.type == tok!"~" || unary.prefix.type == tok!"&"
|| unary.prefix.type == tok!"*"
|| unary.prefix.type == tok!"+" || unary.prefix.type == tok!"-")
@ -310,18 +394,110 @@ final class FormatVisitor : ASTVisitor
attributeDeclaration.accept(this);
}
override void visit(const FunctionAttribute functionAttribute)
{
if (functionAttribute.atAttribute !is null)
astInformation.atAttributeStartLocations ~= functionAttribute.atAttribute.startLocation;
functionAttribute.accept(this);
}
override void visit(const MemberFunctionAttribute memberFunctionAttribute)
{
if (memberFunctionAttribute.atAttribute !is null)
astInformation.atAttributeStartLocations ~= memberFunctionAttribute.atAttribute.startLocation;
memberFunctionAttribute.accept(this);
}
override void visit(const Attribute attribute)
{
if (attribute.atAttribute !is null)
astInformation.atAttributeStartLocations ~= attribute.atAttribute.startLocation;
attribute.accept(this);
}
override void visit(const StorageClass storageClass)
{
if (storageClass.atAttribute !is null)
astInformation.atAttributeStartLocations ~= storageClass.atAttribute.startLocation;
storageClass.accept(this);
}
override void visit(const InContractExpression inContractExpression)
{
astInformation.contractLocations ~= inContractExpression.inTokenLocation;
inContractExpression.accept(this);
}
override void visit(const InStatement inStatement)
{
astInformation.contractLocations ~= inStatement.inTokenLocation;
inStatement.accept(this);
}
override void visit(const OutContractExpression outContractExpression)
{
astInformation.contractLocations ~= outContractExpression.outTokenLocation;
outContractExpression.accept(this);
}
override void visit(const OutStatement outStatement)
{
astInformation.contractLocations ~= outStatement.outTokenLocation;
outStatement.accept(this);
}
override void visit(const TernaryExpression ternaryExpression)
{
astInformation.ternaryColonLocations ~= ternaryExpression.colon.index;
ternaryExpression.accept(this);
}
override void visit(const FunctionCallExpression functionCall)
{
visit(functionCall.arguments);
functionCall.accept(this);
}
override void visit(const NewExpression newCall)
{
visit(newCall.arguments);
newCall.accept(this);
}
override void visit(const NewAnonClassExpression newAnonClassCall)
{
visit(newAnonClassCall.constructorArguments);
newAnonClassCall.accept(this);
}
private void visit(const Arguments arguments)
{
// Check if call has any arguments.
if (!arguments || arguments.namedArgumentList is null)
{
return;
}
foreach (item; arguments.namedArgumentList.items)
{
// Do nothing if not a named argument.
if (item.name == tok!"")
{
continue;
}
// Find first colon if named argument.
foreach (t; item.tokens)
{
if (t.type == tok!":")
{
astInformation.namedArgumentColonLocations ~= t.index;
break;
}
}
}
}
private:
ASTInformation* astInformation;
}

View File

@ -10,18 +10,20 @@ import dfmt.editorconfig;
/// Brace styles
enum BraceStyle
{
unspecified,
_unspecified,
/// $(LINK https://en.wikipedia.org/wiki/Indent_style#Allman_style)
allman,
/// $(LINK https://en.wikipedia.org/wiki/Indent_style#Variant:_1TBS)
otbs,
/// $(LINK https://en.wikipedia.org/wiki/Indent_style#Variant:_Stroustrup)
stroustrup
stroustrup,
/// $(LINK https://en.wikipedia.org/wiki/Indentation_style#K&R_style)
knr,
}
enum TemplateConstraintStyle
{
unspecified,
_unspecified,
conditional_newline_indent,
conditional_newline,
always_newline,
@ -55,6 +57,18 @@ struct Config
TemplateConstraintStyle dfmt_template_constraint_style;
///
OptionalBoolean dfmt_single_template_constraint_indent;
///
OptionalBoolean dfmt_space_before_aa_colon;
///
OptionalBoolean dfmt_keep_line_breaks;
///
OptionalBoolean dfmt_single_indent;
///
OptionalBoolean dfmt_reflow_property_chains;
///
OptionalBoolean dfmt_space_after_statement_keyword;
///
OptionalBoolean dfmt_space_before_named_arg_colon;
mixin StandardEditorConfigFields;
@ -65,7 +79,7 @@ struct Config
void initializeWithDefaults()
{
pattern = "*.d";
end_of_line = EOL.lf;
end_of_line = EOL._default;
indent_style = IndentStyle.space;
indent_size = 4;
tab_width = 4;
@ -82,6 +96,11 @@ struct Config
dfmt_compact_labeled_statements = OptionalBoolean.t;
dfmt_template_constraint_style = TemplateConstraintStyle.conditional_newline_indent;
dfmt_single_template_constraint_indent = OptionalBoolean.f;
dfmt_space_before_aa_colon = OptionalBoolean.f;
dfmt_keep_line_breaks = OptionalBoolean.f;
dfmt_single_indent = OptionalBoolean.f;
dfmt_reflow_property_chains = OptionalBoolean.t;
dfmt_space_before_named_arg_colon = OptionalBoolean.f;
}
/**

View File

@ -26,21 +26,22 @@ private auto commentRe = ctRegex!(`^\s*[#;].*$`);
enum OptionalBoolean : ubyte
{
unspecified = 3,
_unspecified = 3,
t = 1,
f = 0
}
enum IndentStyle : ubyte
{
unspecified,
_unspecified,
tab,
space
}
enum EOL : ubyte
{
unspecified,
_unspecified,
_default,
lf,
cr,
crlf
@ -74,7 +75,7 @@ mixin template StandardEditorConfigFields()
static if (N == "pattern")
continue;
else static if (is(T == enum))
*thisN = otherN != T.unspecified ? otherN : *thisN;
*thisN = otherN != T._unspecified ? otherN : *thisN;
else static if (is(T == int))
*thisN = otherN != -1 ? otherN : *thisN;
else static if (is(T == string))

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ import std.path : filenameCharCmp, isDirSeparator;
// * changes meaning to match all characters except '/'
// ** added to take over the old meaning of *
bool globMatchEditorConfig(CaseSensitive cs = CaseSensitive.osDefault, C, Range)(
Range path, const(C)[] pattern) @safe pure nothrow
Range path, const(C)[] pattern) @safe pure
if (isForwardRange!Range && isSomeChar!(ElementEncodingType!Range)
&& isSomeChar!C && is(Unqual!C == Unqual!(ElementEncodingType!Range)))
in
@ -23,7 +23,7 @@ in
assert(balancedParens(pattern, '[', ']', 0));
assert(balancedParens(pattern, '{', '}', 0));
}
body
do
{
alias RC = Unqual!(ElementEncodingType!Range);

View File

@ -5,8 +5,12 @@
module dfmt.indentation;
import dfmt.config;
import dfmt.editorconfig;
import dparse.lexer;
import std.bitmanip : bitfields;
/**
* Returns: true if the given token type is a wrap indent type
*/
@ -29,6 +33,31 @@ bool isTempIndent(IdType type) pure nothrow @nogc @safe
*/
struct IndentStack
{
/// Configuration
private const Config* config;
this(const Config* config)
{
this.config = config;
}
static struct Details
{
mixin(bitfields!(
// generally true for all operators except {, case, @, ], (, )
bool, "wrap", 1,
// temporary indentation which get's reverted when a block starts
// generally true for all tokens except ), {, case, @
bool, "temp", 1,
// emit minimal newlines
bool, "mini", 1,
// for associative arrays or arrays containing them, break after every item
bool, "breakEveryItem", 1,
// when an item inside an array would break mid-item, definitely break at the comma first
bool, "preferLongBreaking", 1,
uint, "", 27));
}
/**
* Get the indent size at the most recent occurrence of the given indent type
*/
@ -55,7 +84,7 @@ struct IndentStack
int tempIndentCount = 0;
for (size_t i = index; i > 0; i--)
{
if (!isWrapIndent(arr[i - 1]) && arr[i - 1] != tok!"]")
if (!details[i - 1].wrap && arr[i - 1] != tok!"]")
break;
tempIndentCount++;
}
@ -66,8 +95,20 @@ struct IndentStack
* Pushes the given indent type on to the stack.
*/
void push(IdType item) pure nothrow
{
Details detail;
detail.wrap = isWrapIndent(item);
detail.temp = isTempIndent(item);
push(item, detail);
}
/**
* Pushes the given indent type on to the stack.
*/
void push(IdType item, Details detail) pure nothrow
{
arr[index] = item;
details[index] = detail;
//FIXME this is actually a bad thing to do,
//we should not just override when the stack is
//at it's limit
@ -91,7 +132,7 @@ struct IndentStack
*/
void popWrapIndents() pure nothrow @safe @nogc
{
while (index > 0 && isWrapIndent(arr[index - 1]))
while (index > 0 && details[index - 1].wrap)
index--;
}
@ -100,7 +141,7 @@ struct IndentStack
*/
void popTempIndents() pure nothrow @safe @nogc
{
while (index > 0 && isTempIndent(arr[index - 1]))
while (index > 0 && details[index - 1].temp)
index--;
}
@ -125,7 +166,15 @@ struct IndentStack
*/
bool topIsTemp()
{
return index > 0 && index <= arr.length && isTempIndent(arr[index - 1]);
return index > 0 && index <= arr.length && details[index - 1].temp;
}
/**
* Returns: `true` if the top of the indent stack is a temporary indent with the specified token
*/
bool topIsTemp(IdType item)
{
return index > 0 && index <= arr.length && arr[index - 1] == item && details[index - 1].temp;
}
/**
@ -133,7 +182,15 @@ struct IndentStack
*/
bool topIsWrap()
{
return index > 0 && index <= arr.length && isWrapIndent(arr[index - 1]);
return index > 0 && index <= arr.length && details[index - 1].wrap;
}
/**
* Returns: `true` if the top of the indent stack is a temporary indent with the specified token
*/
bool topIsWrap(IdType item)
{
return index > 0 && index <= arr.length && arr[index - 1] == item && details[index - 1].wrap;
}
/**
@ -156,6 +213,11 @@ struct IndentStack
return arr[index - 1];
}
Details topDetails() const pure nothrow @property @safe @nogc
{
return details[index - 1];
}
int indentLevel() const pure nothrow @property @safe @nogc
{
return indentSize();
@ -169,13 +231,16 @@ struct IndentStack
/**
* Dumps the current state of the indentation stack to `stderr`. Used for debugging.
*/
void dump(string file = __FILE__, uint line = __LINE__)
void dump(size_t pos = size_t.max, string file = __FILE__, uint line = __LINE__) const
{
import dparse.lexer : str;
import std.algorithm.iteration : map;
import std.stdio : stderr;
stderr.writefln("\033[31m%s:%d %(%s %)\033[0m", file, line, arr[0 .. index].map!(a => str(a)));
if (pos == size_t.max)
stderr.writefln("\033[31m%s:%d %(%s %)\033[0m", file, line, arr[0 .. index].map!(a => str(a)));
else
stderr.writefln("\033[31m%s:%d at %d %(%s %)\033[0m", file, line, pos, arr[0 .. index].map!(a => str(a)));
}
private:
@ -183,6 +248,7 @@ private:
size_t index;
IdType[256] arr;
Details[arr.length] details;
int indentSize(const size_t k = size_t.max) const pure nothrow @safe @nogc
{
@ -196,17 +262,28 @@ private:
{
immutable int pc = (arr[i] == tok!"!" || arr[i] == tok!"(" || arr[i] == tok!")") ? parenCount + 1
: parenCount;
if ((isWrapIndent(arr[i]) || arr[i] == tok!"(") && parenCount > 1)
if ((details[i].wrap || arr[i] == tok!"(") && parenCount > 1)
{
parenCount = pc;
continue;
}
if (i + 1 < index)
{
if (arr[i] == tok!"]")
if (config.dfmt_single_indent == OptionalBoolean.t && skipDoubleIndent(i, parenCount))
{
parenCount = pc;
continue;
immutable currentIsNonWrapTemp = !isWrapIndent(arr[i])
&& isTempIndent(arr[i]) && arr[i] != tok!")" && arr[i] != tok!"!";
}
immutable currentIsNonWrapTemp = !details[i].wrap
&& details[i].temp && arr[i] != tok!")" && arr[i] != tok!"!";
if (currentIsNonWrapTemp && arr[i + 1] == tok!"]")
{
parenCount = pc;
continue;
}
if (arr[i] == tok!"static"
&& arr[i + 1].among!(tok!"if", tok!"else", tok!"foreach", tok!"foreach_reverse")
&& (i + 2 >= index || arr[i + 2] != tok!"{"))
@ -221,15 +298,23 @@ private:
continue;
}
}
else if (parenCount == 0 && arr[i] == tok!"(")
else if (parenCount == 0 && arr[i] == tok!"(" && config.dfmt_single_indent == OptionalBoolean.f)
size++;
if (arr[i] == tok!"!")
size++;
parenCount = pc;
size++;
}
return size;
}
bool skipDoubleIndent(size_t i, int parenCount) const pure nothrow @safe @nogc
{
return (details[i + 1].wrap && arr[i] == tok!")")
|| (parenCount == 0 && arr[i + 1] == tok!"," && arr[i] == tok!"(");
}
}
unittest

View File

@ -4,6 +4,9 @@
// http://www.boost.org/LICENSE_1_0.txt)
module dfmt.main;
import std.string : strip;
static immutable VERSION = () {
debug
{
@ -14,49 +17,19 @@ static immutable VERSION = () {
enum DEBUG_SUFFIX = "";
}
static if (is(typeof(import("VERSION"))))
version (built_with_dub)
{
// takes the `git describe --tags` output and removes the leading
// 'v' as well as any kind of newline
// if the tag is considered malformed it gets used verbatim
enum gitDescribeOutput = import("VERSION");
string result;
if (gitDescribeOutput[0] == 'v')
result = gitDescribeOutput[1 .. $];
else
result = null;
uint minusCount;
foreach (i, c; result)
{
if (c == '\n' || c == '\r')
{
result = result[0 .. i];
break;
}
if (c == '-')
{
++minusCount;
}
}
if (minusCount > 1)
result = null;
return result ? result ~ DEBUG_SUFFIX
: gitDescribeOutput ~ DEBUG_SUFFIX;
enum DFMT_VERSION = import("dubhash.txt").strip;
}
else
{
return "unknown" ~ DEBUG_SUFFIX ~ "-version";
/**
* Current build's Git commit hash
*/
enum DFMT_VERSION = import("githash.txt").strip;
}
return DFMT_VERSION ~ DEBUG_SUFFIX;
} ();
@ -65,13 +38,13 @@ version (NoMain)
}
else
{
import std.array : front, popFront;
import std.stdio : stdout, stdin, stderr, writeln, File;
import dfmt.config : Config;
import dfmt.formatter : format;
import std.path : buildPath, dirName, expandTilde;
import dfmt.editorconfig : getConfigFor;
import dfmt.formatter : format;
import std.array : appender, front, popFront;
import std.getopt : getopt, GetOptException;
import std.path : buildPath, dirName, expandTilde;
import std.stdio : File, stderr, stdin, stdout, writeln;
int main(string[] args)
{
@ -85,9 +58,9 @@ else
void handleBooleans(string option, string value)
{
import dfmt.editorconfig : OptionalBoolean;
import std.exception : enforceEx;
import std.exception : enforce;
enforceEx!GetOptException(value == "true" || value == "false", "Invalid argument");
enforce!GetOptException(value == "true" || value == "false", "Invalid argument");
immutable OptionalBoolean optVal = value == "true" ? OptionalBoolean.t
: OptionalBoolean.f;
switch (option)
@ -116,6 +89,24 @@ else
case "single_template_constraint_indent":
optConfig.dfmt_single_template_constraint_indent = optVal;
break;
case "space_before_aa_colon":
optConfig.dfmt_space_before_aa_colon = optVal;
break;
case "space_before_named_arg_colon":
optConfig.dfmt_space_before_named_arg_colon = optVal;
break;
case "keep_line_breaks":
optConfig.dfmt_keep_line_breaks = optVal;
break;
case "single_indent":
optConfig.dfmt_single_indent = optVal;
break;
case "reflow_property_chains":
optConfig.dfmt_reflow_property_chains = optVal;
break;
case "space_after_keywords":
optConfig.dfmt_space_after_keywords = optVal;
break;
default:
assert(false, "Invalid command-line switch");
}
@ -138,13 +129,19 @@ else
"soft_max_line_length", &optConfig.dfmt_soft_max_line_length,
"outdent_attributes", &handleBooleans,
"space_after_cast", &handleBooleans,
"space_after_keywords", &handleBooleans,
"selective_import_space", &handleBooleans,
"space_before_function_parameters", &handleBooleans,
"split_operator_at_line_end", &handleBooleans,
"compact_labeled_statements", &handleBooleans,
"single_template_constraint_indent", &handleBooleans,
"space_before_aa_colon", &handleBooleans,
"space_before_named_arg_colon", &handleBooleans,
"tab_width", &optConfig.tab_width,
"template_constraint_style", &optConfig.dfmt_template_constraint_style);
"template_constraint_style", &optConfig.dfmt_template_constraint_style,
"keep_line_breaks", &handleBooleans,
"single_indent", &handleBooleans,
"reflow_property_chains", &handleBooleans);
// dfmt on
}
catch (GetOptException e)
@ -168,14 +165,13 @@ else
args.popFront();
immutable bool readFromStdin = args.length == 0;
File output = stdout;
version (Windows)
{
// On Windows, set stdout to binary mode (needed for correct EOL writing)
// See Phobos' stdio.File.rawWrite
{
import std.stdio : _O_BINARY;
immutable fd = output.fileno;
immutable fd = stdout.fileno;
_setmode(fd, _O_BINARY);
version (CRuntime_DigitalMars)
{
@ -196,7 +192,7 @@ else
if (!exists(explicitConfigDir) || !isDir(explicitConfigDir))
{
stderr.writeln("--config_dir|c must specify existing directory path");
stderr.writeln("--config|c must specify existing directory path");
return 1;
}
explicitConfig = getConfigFor!Config(explicitConfigDir);
@ -234,7 +230,9 @@ else
else
break;
}
format("stdin", buffer, output.lockingTextWriter(), &config);
immutable bool formatSuccess = format("stdin", buffer,
stdout.lockingTextWriter(), &config);
return formatSuccess ? 0 : 1;
}
else
{
@ -242,6 +240,7 @@ else
if (args.length >= 2)
inplace = true;
int retVal;
while (args.length > 0)
{
const path = args.front;
@ -274,13 +273,21 @@ else
{
buffer = new ubyte[](cast(size_t) f.size);
f.rawRead(buffer);
if (inplace)
output = File(path, "wb");
format(path, buffer, output.lockingTextWriter(), &config);
auto output = appender!string;
immutable bool formatSuccess = format(path, buffer, output, &config);
if (formatSuccess)
{
if (inplace)
File(path, "wb").rawWrite(output.data);
else
stdout.rawWrite(output.data);
}
else
retVal = 1;
}
}
return retVal;
}
return 0;
}
}
@ -299,12 +306,14 @@ private version (Windows)
template optionsToString(E) if (is(E == enum))
{
import std.algorithm.searching : startsWith;
enum optionsToString = () {
string result = "(";
foreach (s; [__traits(allMembers, E)])
{
if (s != "unspecified")
if (!s.startsWith("_"))
result ~= s ~ "|";
}
result = result[0 .. $ - 1] ~ ")";
@ -315,12 +324,12 @@ template optionsToString(E) if (is(E == enum))
private void printHelp()
{
writeln(`dfmt `, VERSION, `
https://github.com/Hackerpilot/dfmt
https://github.com/dlang-community/dfmt
Options:
--help, -h Print this help message
--inplace, -i Edit files in place
--config_dir, -c Path to directory to load .editorconfig file from.
--config, -c Path to directory to load .editorconfig file from.
--version Print the version number and then exit
Formatting Options:
@ -331,16 +340,22 @@ Formatting Options:
--indent_size
--indent_style, -t `,
optionsToString!(typeof(Config.indent_style)), `
--keep_line_breaks
--soft_max_line_length
--max_line_length
--outdent_attributes
--space_after_cast
--space_before_function_parameters
--space_after_keywords
--selective_import_space
--single_template_constraint_indent
--split_operator_at_line_end
--compact_labeled_statements
--template_constraint_style
--space_before_aa_colon
--space_before_named_arg_colon
--single_indent
--reflow_property_chains
`,
optionsToString!(typeof(Config.dfmt_template_constraint_style)));
}

View File

@ -15,7 +15,7 @@ in
{
assert(tokens[0].type == tok!"(");
}
body
do
{
uint length = 0;
size_t i = 1;
@ -134,7 +134,6 @@ int breakCost(IdType p, IdType c) pure nothrow @safe @nogc
case tok!"||":
case tok!"&&":
case tok!",":
case tok!":":
case tok!"?":
return 0;
case tok!"(":
@ -184,6 +183,10 @@ int breakCost(IdType p, IdType c) pure nothrow @safe @nogc
case tok!"~":
case tok!"+=":
return 200;
case tok!":":
// colon could be after a label or an import, where it should normally wrap like before
// for everything else (associative arrays) try not breaking around colons
return p == tok!"identifier" ? 0 : 300;
case tok!".":
return p == tok!")" ? 0 : 300;
default:
@ -217,7 +220,7 @@ private string generateFixedLengthCases()
a => format(`case tok!"%s": return %d + 1;`, a, a.length)).join("\n\t");
string[] identifierTokens = [
"abstract", "alias", "align", "asm", "assert", "auto", "body", "bool",
"abstract", "alias", "align", "asm", "assert", "auto", "bool",
"break", "byte", "case", "cast", "catch", "cdouble", "cent", "cfloat", "char", "class",
"const", "continue", "creal", "dchar", "debug", "default", "delegate", "delete", "deprecated",
"do", "double", "else", "enum", "export", "extern", "false", "final", "finally", "float",
@ -227,7 +230,7 @@ private string generateFixedLengthCases()
"package", "pragma", "private", "protected", "public", "pure", "real", "ref", "return", "scope",
"shared", "short", "static", "struct", "super", "switch", "synchronized", "template", "this",
"throw", "true", "try", "typedef", "typeid", "typeof", "ubyte", "ucent", "uint", "ulong",
"union", "unittest", "ushort", "version", "void", "volatile", "wchar",
"union", "unittest", "ushort", "version", "void", "wchar",
"while", "with", "__DATE__", "__EOF__", "__FILE__",
"__FUNCTION__", "__gshared", "__LINE__", "__MODULE__", "__parameters",
"__PRETTY_FUNCTION__", "__TIME__", "__TIMESTAMP__",

View File

@ -172,9 +172,6 @@ size_t[] chooseLineBreakTokens(size_t index, const Token[] tokens,
void validMoves(OR)(auto ref OR output, const Token[] tokens, immutable short[] depths,
uint current, const Config* config, int currentLineLength, int indentLevel)
{
import std.algorithm : sort, canFind, min;
import std.array : insertInPlace;
foreach (i, token; tokens)
{
if (!isBreakToken(token.type) || (((1 << i) & current) != 0))

@ -1 +1 @@
Subproject commit 7487970b58f4a2c0d495679329a8a2857111f3fd
Subproject commit ae237cabd1843774cc78aad0729c914a3dd579db

17
tests/2d_arrays.d Normal file
View File

@ -0,0 +1,17 @@
unittest
{
targets = [[RectangleShape.create(tex, vec2(-8 * scale, -32 * scale),
vec2(16 * scale, 48 * scale), vec4(14 / 16.0, 0, 16 / 16.0, 3 / 16.0)),
RectangleShape.create(tex, vec2(-8 * scale, -32 * scale), vec2(16 * scale,
32 * scale), vec4(14 / 16.0, 3 / 16.0, 16 / 16.0, 5 / 16.0))],
[RectangleShape.create(tex, vec2(-8 * scale, -8 * scale), vec2(16 * scale,
16 * scale), vec4(14 / 16.0, 5 / 16.0, 15 / 16.0, 6 / 16.0)), RectangleShape.create(tex,
vec2(-8 * scale, -8 * scale), vec2(16 * scale, 16 * scale),
vec4(15 / 16.0, 5 / 16.0, 16 / 16.0, 6 / 16.0))]];
int[][] foo = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32], [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]];
float[3][3] mat = [[234.3456,42435.8653,23.5],[3.245,235.3,234.664],[14324.6453,23434.645,9678.345]];
}
string[][] globalArray = [["123456789012345678901234567890", "123456789012345678901234567890"], ["123456789012345678901234567890", "123456789012345678901234567890"]];

View File

@ -0,0 +1,38 @@
unittest
{
targets = [
[
RectangleShape.create(tex, vec2(-8 * scale, -32 * scale),
vec2(16 * scale, 48 * scale), vec4(14 / 16.0, 0, 16 / 16.0, 3 / 16.0)),
RectangleShape.create(tex, vec2(-8 * scale, -32 * scale),
vec2(16 * scale, 32 * scale), vec4(14 / 16.0, 3 / 16.0, 16 / 16.0, 5 / 16.0))
],
[
RectangleShape.create(tex, vec2(-8 * scale, -8 * scale),
vec2(16 * scale, 16 * scale), vec4(14 / 16.0, 5 / 16.0, 15 / 16.0, 6 / 16.0)),
RectangleShape.create(tex, vec2(-8 * scale, -8 * scale),
vec2(16 * scale, 16 * scale), vec4(15 / 16.0, 5 / 16.0, 16 / 16.0, 6 / 16.0))
]
];
int[][] foo = [
[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
],
[
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
]
];
float[3][3] mat = [
[234.3456, 42435.8653, 23.5], [3.245, 235.3, 234.664],
[14324.6453, 23434.645, 9678.345]
];
}
string[][] globalArray = [
["123456789012345678901234567890", "123456789012345678901234567890"],
["123456789012345678901234567890", "123456789012345678901234567890"]
];

View File

@ -0,0 +1,23 @@
class C
{
void f()
{
if (true)
{
f(map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map
.map.map.map.map.map.map, __FILE__, __FILE__, __FILE__, __FILE__, __FILE__,
__FILE__, __FILE__, __FILE__, __FILE__, __FILE__, __FILE__,
__FILE__, __FILE__, __FILE__, __FILE__, __FILE__, __LINE__);
g(map && map && map && map && map && map && map && map && map && map && map
&& map, __FILE__, __FILE__, __FILE__, __FILE__, __FILE__,
__FILE__, __FILE__, __LINE__);
h(map || map || map || map || map || map || map || map || map || map || map
|| map, __FILE__, __FILE__, __FILE__, __FILE__, __FILE__,
__FILE__, __FILE__, __LINE__);
i(map + map + map + map + map + map + map + map + map + map + map + map + map
+ map + map + map + map + map, __FILE__, __FILE__, __FILE__,
__FILE__, __FILE__, __FILE__, __FILE__, __LINE__);
}
}
}

View File

@ -0,0 +1,31 @@
class C
{
void f()
{
if (true)
{
f(
array.map!(a => a.prop)
.array
.to!string,
__FILE__,
__LINE__);
g(
map &&
map,
__FILE__,
__LINE__);
h(
map ||
map,
__FILE__,
__LINE__);
i(
map
+ map,
__FILE__,
__LINE__);
}
}
}

View File

@ -0,0 +1,7 @@
unittest
{
foo([
target.value.region[1], target.value.region[1], target.value.region[1],
target.value.region[1], target.value.region[1]
]);
}

View File

@ -0,0 +1,8 @@
void main()
{
string key;
int[string] var = [
key: 5
];
}

View File

@ -0,0 +1,26 @@
unittest
{
Bson base = Bson([
"maps": Bson([
Bson(["id": Bson(4), "comment": Bson("hello")]),
Bson(["id": Bson(49), "comment": Bson(null)])
]),
"short": Bson(["a": "b", "c": "d"]),
"numbers": Bson([
1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 0
]),
"shuffleOnReset": serializeToBson([
"all": false,
"selected": true,
"maybe": false
]),
"resetOnEmpty": Bson(false),
"applyMods": Bson(true),
"sendComments": Bson(true)
]);
int[] x = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
];
}

View File

@ -0,0 +1,25 @@
auto find()
{
return Map.findRange([
"$and": [
["deleted": Bson(false)],
[
"$or": Bson([
serializeToBson(["forceUpdate": Bson(true)]),
serializeToBson([
"info.approved": ["$eq": Bson(1)],
"fetchDate": [
"$lte": Bson(BsonDate(currentTime - 60.days))
]
]),
serializeToBson([
"info.approved": ["$ne": Bson(1)],
"fetchDate": [
"$lte": Bson(BsonDate(currentTime - 14.days))
]
])
])
]
]
]);
}

View File

@ -6,7 +6,7 @@ struct SomeStructName
{
static if (condition)
{
void longFunctionName(AAAAAAAA)(AAAAAAAA a) @property
void longFunctionName(AAAAAAAA)(AAAAAAAA a) @property
if (someThingsAreTrue!AAAAAAAA && long_condition
&& is(elaborate == expression))
{

View File

@ -3,7 +3,8 @@ unittest
{
{
foreach (abcde, def; abcdef.map!(battlecruiser => battlecruiser[123 .. 1231231])
.filter!(bravo => charlie[10] > 90000).sum())
.filter!(bravo => charlie[10] > 90000)
.sum())
{
}

View File

@ -2,6 +2,6 @@ int /*sneaky*/ foo( /*comments*/ ) /*everywhere*/
{
// comment on its own line
foo() // comment on same line
.bar(); // also on same line
.bar(); // also on same line
/* again */ // same line
}

View File

@ -0,0 +1,8 @@
void main()
{
if (true)
debug
{
foo();
}
}

View File

@ -0,0 +1,7 @@
void main()
{
debug (0)
foo();
else
bar();
}

View File

@ -0,0 +1,21 @@
int foo(int arg)
in
{
assert(arg > 0);
}
out (result)
{
assert(result == 0);
}
do
{
return 0;
}
int bar(int arg)
in (arg > 0)
out (; true)
out /*Major*/ ( /*Tom*/ result /*To ground control*/ ; result == 0)
{
return 0;
}

View File

@ -0,0 +1,19 @@
import character.body;
void body() @nogc
in
{
}
body
{
body = null;
}
void body()
in
{
}
do
{
body = null;
}

View File

@ -0,0 +1,6 @@
enum Foo
{
deprecated member0,
@UDA(0) member1
}

View File

@ -0,0 +1,54 @@
static foreach (x; [
1,
2,
3,
])
{
}
static foreach_reverse (x; [
1,
2,
3,
])
{
}
void f()
{
foreach (x; [
1,
2,
3,
])
{
}
foreach_reverse (x; [
1,
2,
3,
])
{
}
if (!SymbolTool.instance.workspacesFilesUris.canFind!sameFile(uri))
{
send(TextDocument.publishDiagnostics, new PublishDiagnosticsParams(uri, [
]));
}
foreach (x; map([
1,
2,
3,
]))
{
}
foreach (x; foo!(map!([
1,
2,
3,
])))
{
}
}

View File

@ -0,0 +1 @@
void foo(@UDA(0) @UDA(1) Bar bar);

View File

@ -0,0 +1 @@
alias u8 = ubyte

View File

@ -1,3 +1,4 @@
immutable NameId[] namesA = [{"Aacgr", 0x00386}, // GREEK CAPITAL LETTER ALPHA WITH TONOS
{"aacgr", 0x003AC}, // GREEK SMALL LETTER ALPHA WITH TONOS
immutable NameId[] namesA = [
{"Aacgr", 0x00386}, // GREEK CAPITAL LETTER ALPHA WITH TONOS
{"aacgr", 0x003AC}, // GREEK SMALL LETTER ALPHA WITH TONOS
];

View File

@ -9,25 +9,28 @@ string generateFixedLengthCases()
string[] fixedLengthTokens = [
"abstract", "alias", "align", "asm", "assert", "auto", "body", "bool",
"break", "byte", "case", "cast", "catch", "cdouble", "cent", "cfloat", "char", "class",
"const", "continue", "creal", "dchar", "debug", "default", "delegate", "delete", "deprecated",
"do", "double", "else", "enum", "export", "extern", "false", "final", "finally", "float",
"for", "foreach", "foreach_reverse", "function", "goto", "idouble", "if", "ifloat", "immutable",
"import", "in", "inout", "int", "interface", "invariant", "ireal", "is",
"lazy", "long", "macro", "mixin", "module", "new", "nothrow", "null", "out", "override",
"package", "pragma", "private", "protected", "public", "pure", "real", "ref", "return", "scope",
"shared", "short", "static", "struct", "super", "switch", "synchronized", "template", "this",
"throw", "true", "try", "typedef", "typeid", "typeof", "ubyte", "ucent", "uint", "ulong",
"union", "unittest", "ushort", "version", "void", "volatile", "wchar",
"while", "with", "__DATE__", "__EOF__", "__FILE__",
"__FUNCTION__", "__gshared", "__LINE__", "__MODULE__", "__parameters",
"__PRETTY_FUNCTION__", "__TIME__", "__TIMESTAMP__",
"__traits", "__vector", "__VENDOR__", "__VERSION__", ",", ".", "..",
"...", "/", "/=", "!", "!<", "!<=", "!<>", "!<>=", "!=", "!>", "!>=",
"$", "%", "%=", "&", "&&", "&=", "(", ")", "*", "*=", "+", "++",
"+=", "-", "--", "-=", ":", ";", "<", "<<", "<<=", "<=", "<>", "<>=",
"=", "==", "=>", ">", ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
"]", "^", "^=", "^^", "^^=", "{", "|", "|=", "||", "}", "~", "~="
"break", "byte", "case", "cast", "catch", "cdouble", "cent", "cfloat",
"char", "class", "const", "continue", "creal", "dchar", "debug", "default",
"delegate", "delete", "deprecated", "do", "double", "else", "enum",
"export", "extern", "false", "final", "finally", "float", "for", "foreach",
"foreach_reverse", "function", "goto", "idouble", "if", "ifloat",
"immutable", "import", "in", "inout", "int", "interface", "invariant",
"ireal", "is", "lazy", "long", "macro", "mixin", "module", "new",
"nothrow", "null", "out", "override", "package", "pragma", "private",
"protected", "public", "pure", "real", "ref", "return", "scope", "shared",
"short", "static", "struct", "super", "switch", "synchronized", "template",
"this", "throw", "true", "try", "typedef", "typeid", "typeof", "ubyte",
"ucent", "uint", "ulong", "union", "unittest", "ushort", "version", "void",
"volatile", "wchar", "while", "with", "__DATE__", "__EOF__",
"__FILE__", "__FUNCTION__", "__gshared", "__LINE__",
"__MODULE__", "__parameters", "__PRETTY_FUNCTION__", "__TIME__",
"__TIMESTAMP__", "__traits", "__vector", "__VENDOR__", "__VERSION__",
",", ".", "..", "...", "/", "/=", "!", "!<", "!<=", "!<>", "!<>=",
"!=", "!>", "!>=", "$", "%", "%=", "&", "&&", "&=", "(", ")", "*",
"*=", "+", "++", "+=", "-", "--", "-=", ":", ";", "<", "<<", "<<=",
"<=", "<>", "<>=", "=", "==", "=>", ">", ">=", ">>", ">>=", ">>>",
">>>=", "?", "@", "[", "]", "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
"}", "~", "~="
];
}

View File

@ -0,0 +1,15 @@
unittest
{
testScene = new Scene(longArgument, longArgument, longArgument,
longArgument, longArgument, longArgument, delegate(Scene scene) {
import std.stdio;
if (!scene.alreadyEntered)
{
fwriteln(
"This is a test. This is a test. This is a test. This is a test. This is a test. Test12.");
auto p = cast(Portal) sceneManager.previousScene;
scene.destroyCurrentScript();
}
});
}

View File

@ -1,5 +1,5 @@
auto fun = function() { };
auto fun = () { };
auto fun = function() {};
auto fun = () {};
auto fun = {};
auto fun = { int i; };

View File

@ -0,0 +1,15 @@
void foo()
{
string command;
version (Posix)
command ~= " 2> /dev/null 1> /dev/null";
version (Posix)
command ~= " 2> /dev/null 1> /dev/null";
unittest
{
version (Posix)
command ~= " 2> /dev/null 1> /dev/null";
}
}

View File

@ -1,4 +1,4 @@
class Foo(T) : FirstInterfaceWithVeryLongName, SecondInterfaceWithVeryLongName
class Foo(T) : FirstInterfaceWithVeryLongName, SecondInterfaceWithVeryLongName
if (is(T : Bar))
{
void foo()

View File

@ -0,0 +1,16 @@
void main()
{
auto myTid = runTask({
auto conn = connectTCP("localhost", 4222);
auto l = Lexer(conn);
foreach (t; l)
{
}
conn.close();
});
// foo
runEventLoop();
}

View File

@ -0,0 +1,8 @@
/* This test relies on ../.gitattributes to contain these lines:
tests/issue0228.d text eol=lf
tests/allman/issue0228.d.ref text eol=crlf
tests/knr/issue0228.d.ref text eol=crlf
tests/otbs/issue0228.d.ref text eol=crlf
*/

View File

@ -0,0 +1,5 @@
enum Status : bool
{
abort = true,
ignore = false
}

View File

@ -0,0 +1,23 @@
unittest
{
with (Object)
{
// do something
}
with (Object) with (Object)
{
// do something
}
with (Object) with (Object) with (Object)
{
// do something
}
with (Object)
{
with (Object)
{
// do something
}
}
}

View File

@ -0,0 +1,11 @@
void main()
{
S s1 = {a: 3};
S s2 = {a: 3, b: "test string"};
S s3 = {a: 3, b: "test string", c: {x: 3.14, y: 3 + 4}};
T t = {
someStructMember1: 2, someStructMember2: 42, someStructMember3: null, // foobar
someOtherMember1: objA, someOtherMember2: objB, someOtherMember3: 0,
somethingMore: null, someFlagInThisStruct: -1
};
}

View File

@ -0,0 +1,19 @@
void main()
{
debug foo();
else bar();
debug (0)
foo();
else
bar();
// inlineElse reset check
debug foo();
if (true)
foo();
else
bar();
}

View File

@ -0,0 +1,16 @@
void foo()
{
if (true)
enum vectorizeable = aLongExpressionThatCausesWrapping()
&& aLongExpressionThatCausesWrapping();
else
enum vectorizeable = false;
if (true)
{
enum vectorizeable = aLongExpressionThatCausesWrapping()
&& aLongExpressionThatCausesWrapping();
}
else
enum vectorizeable = false;
}

View File

@ -0,0 +1,3 @@
alias foo = typeof({ import std.math; });
alias bar = typeof({ write("aaa"); });
alias baz = typeof({});

View File

@ -0,0 +1,4 @@
void main()
{
() @trusted { stderr.writeln("\033[01;33m", url, "\033[0m"); }();
}

View File

@ -0,0 +1,4 @@
class Bar(A) : Foo
if (isFloating!A)
{
}

View File

@ -0,0 +1,6 @@
import super_long_import_module_name : withSuperLongSymbolNames, andAlsoLotsOfThem;
import super_long_import_module_name : withSuperLongSymbolNames,
andAlsoLotsOfThem, lotsAnsLots, andLots, andLotsOfThem, lineExceeds120;
private:
void foo();

View File

@ -0,0 +1,15 @@
void foo() /**/
in
{
}
body
{
}
void bar() /**/
out
{
}
body
{
}

View File

@ -0,0 +1,22 @@
void main(string[] args)
{
// Test with catch
if (args.length > 1)
try
doSomeStuff();
catch (Exception error)
ohNoSomeErrorHappened();
else
thatsNotHowYouUseThisProgram();
// Test with finally
if (args.length > 2)
try
doOtherStuff();
catch (Exception error)
ohNoSomeErrorHappened();
finally
doSomeCleanup();
else
dontDoOtherStuff();
}

View File

@ -0,0 +1,30 @@
import std.stdio : readln, /* comment1 */ writeln;
import std.stdio : readln, // comment2
writeln;
import std.stdio : readln,
// comment3
writeln;
import std.stdio : readln,
/* comment4 */
writeln;
import std.stdio : readln, readln, readln, readln, readln, readln, readln,
readln, readln, readln, readln,
// comment5
writeln;
import std.stdio : // comment6
readln, readln, readln, readln, readln, readln, // comment7
// comment8
writeln;
import std.stdio : /* comment9 */
readln, readln, readln, readln, readln, readln, /* comment10 */
// comment11
writeln;
import std.stdio : readln, // comment12
readln, readln, readln, readln, readln, readln, // comment13
// comment14
writeln;
import std.stdio : readln,
// comment15
readln, readln, readln, readln, readln, readln, // comment16
// comment17
writeln;

View File

@ -0,0 +1,6 @@
import std.stdio;
@safe extern (C) void main()
{
writeln("Hello World!");
}

View File

@ -0,0 +1,6 @@
void f(bool body)
{
if (body)
{
}
}

View File

@ -0,0 +1,40 @@
struct S1
{
ulong x;
ulong y;
ulong function(ulong) f;
}
struct S2
{
ulong x;
ulong y;
ulong z;
ulong w;
}
// -----------------------------------------------------------------------------
// Example 1
// Anonymous function in struct, long struct initializer
immutable S1 s1 = {
1111111111111111111, 1111111111111111111, (x) { return x + 1111; },
};
void f1()
{
}
// -----------------------------------------------------------------------------
// Example 2
// Anonymous function anywhere, long struct initializer
int function(int) f2 = (x) { return x + 1111; };
immutable S2 s = {
1111111111111111111, 1111111111111111111, 1111111111111111111, 1111111111111111111,
};
void f2()
{
}

View File

@ -0,0 +1,7 @@
int abs(int x)
{
if (x < 0) // x negative, must negate
return -x;
else // x already non-negative, just return it
return x;
}

View File

@ -0,0 +1 @@
extern (Objective-C) int a;

View File

@ -0,0 +1,4 @@
struct S
{
invariant (true);
}

View File

@ -0,0 +1,40 @@
class C
{
abstract void f1() //
in (true);
abstract void f2() /* */
in (true);
abstract bool f3() //
out (r; r);
abstract bool f4() /* */
out (r; r);
abstract void f5() //
do
{
}
abstract void f6() /* */
do
{
}
abstract bool f7() //
in (true) //
out (r; r) //
do //
{
return true;
}
abstract bool f8() /* */
in (true) /* */
out (r; r) /* */
do /* */
{
return true;
}
}

View File

@ -0,0 +1,2 @@
@nogc //
void foo();

View File

@ -0,0 +1,10 @@
void main()
{
format!"%s" //
("");
format!("%s") //
("");
format!("%s") //
("", argument1, argument2, argument3, argument4, argument5,
argument6, argument7, argument8, argument9, argument10);
}

View File

@ -0,0 +1,8 @@
bool asdf(const string owner, const string mail) @safe
{
requestHTTP(url, (scope HTTPClientRequest request) {
request.writeFormBody([owner: owner, mail: mail]);
}, (scope HTTPClientResponse response) {});
return true;
}

View File

@ -0,0 +1,7 @@
string BuildForwardCall()
{
return `static if (is(typeof(mocked___.` ~ methodString ~ argsPassed ~ `)))
{
return (mocked___.` ~ methodString ~ argsPassed ~ `);
}`;
}

View File

@ -0,0 +1,15 @@
module tests.issue0483;
void main()
{
switch (0)
{
case 1:
case 2:
label:
case 3:
break;
default:
break;
}
}

View File

@ -0,0 +1,5 @@
void main()
{
int a;
int[int] hashmap = [a : a, a : a, a : a];
}

View File

@ -0,0 +1,5 @@
void main()
{
auto someAutoVariableName = this.firstLink.secondLink
.filter!(shouldBeProbablySomeIdentifierOrNot);
}

View File

@ -0,0 +1,29 @@
void main()
{
const a1 = [
builder.rebuild!((x, y, z) => x + y + z)
.rebuild!(x => x)
.rebuild!(x => x),
];
const a2 = [
builder.rebuild!(x => x)
.rebuild!(x => x)
.rebuild!(x => x),
builder.rebuild!(x => x)
.rebuild!(x => x)
.rebuild!(x => x),
];
foo([
line1,
value_line2_bla_bla_bla.propertyCallBlaBlaBla(a, b, c)
.propertyCallBlaBlaBla(a, b, c, d).propertyCallBlaBlaBla(a, b, c)
.propertyCallBlaBlaBla(a, b, c).value,
]);
}
void foo()
{
afdsafds.asdf.flub;
}

View File

@ -0,0 +1,74 @@
private void selectMember(Args...)(Args args)
{
static if (true)
{
static if (args[0])
{
}
else
{
}
}
if (true)
{
if (args[0])
{
}
else
{
}
}
}
private void selectMember(Args...)(Args args)
{
static if (true)
{
static if ([
0,
1,
2,
3,
4,
])
{
}
else
{
}
}
if (true)
{
if (args[
0,
1,
2,
3,
4,
])
{
}
else
{
}
}
}
void f()
{
foreach (x; y)
if (foo)
{
}
else
{
}
if (a)
if (b)
{
}
else
{
}
}

View File

@ -0,0 +1,34 @@
void main()
{
const a1 = [
builder
.rebuild!((x, y, z) => x + y + z)
.rebuild!(x => x)
.rebuild!(x => x),
];
const a2 = [
builder
.rebuild!(x => x)
.rebuild!(x => x)
.rebuild!(x => x),
builder
.rebuild!(x => x)
.rebuild!(x => x)
.rebuild!(x => x),
];
foo([
line1,
value_line2_bla_bla_bla.propertyCallBlaBlaBla(a, b, c)
.propertyCallBlaBlaBla(a, b, c, d).propertyCallBlaBlaBla(a, b, c)
.propertyCallBlaBlaBla(a, b, c).value,
]);
}
void foo()
{
afdsafds
.asdf
.flub;
}

View File

@ -0,0 +1,5 @@
alias f1 = S function();
alias f2 = S!"foo" function();
alias f3 = S!5 function();
alias f4 = S!S function();
alias f5 = S!(S) function();

View File

@ -0,0 +1,4 @@
void main()
{
auto aa = ["aaa": 1, "bbb": 2];
}

View File

@ -0,0 +1,15 @@
string f()
{
return duration.total!"seconds".to!string;
}
string g()
{
return duration.total!"seconds"().to!string;
}
string h()
{
return duration.total!"seconds"().to!string.to!string.to!string.to!string.to!string.to!string
.to!string.to!string.to!string;
}

View File

@ -0,0 +1,40 @@
deprecated("foo")
void test()
{
}
package(foo)
void bar()
{
}
@uda()
void baz()
{
}
deprecated
deprecated_()
{
}
@uda
void uda_()
{
}
@property
void property()
{
}
deprecated("Reason") @uda
void propertyuda()
{
}
deprecated("Reason")
@uda
void udaproperty()
{
}

View File

@ -0,0 +1,7 @@
struct S
{
@safe invariant
{
assert(true);
}
}

View File

@ -0,0 +1,34 @@
void main()
{
string a = "foo"
~ "bar" // bar
~ "baz";
}
void foo()
{
afdsafds
.asdf // blah
.flub;
}
void main()
{
string a = "foo"
~ "bar" /* bar */
~ "baz";
}
void foo()
{
afdsafds
.asdf /* blah */
.flub;
}
void foo() // hello
{ // world
// ok
writeln("hi"); // hi!
} // done
//finish

View File

@ -0,0 +1,7 @@
struct S
{
ref S foo() return
{
return this;
}
}

View File

@ -0,0 +1,17 @@
public int f() return
in (true)
{
return 0;
}
public int g() return
out (; true)
{
return 0;
}
public int h() return
body
{
return 0;
}

View File

@ -0,0 +1,4 @@
void f() return
do
{
}

View File

@ -0,0 +1 @@
/// Testing CR line endings. void main() { }

View File

@ -0,0 +1,4 @@
/// Testing CRLF line endings.
void main()
{
}

View File

@ -0,0 +1,4 @@
/// Testing LF line endings.
void main()
{
}

Some files were not shown because too many files have changed in this diff Show More