Skip to content

Commit 42b476a

Browse files
committed
add default kw constructor for immutables
Closes #5333.
1 parent 1b4424d commit 42b476a

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

src/julia-syntax.scm

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -724,22 +724,27 @@
724724
(map (lambda (x) (gensy)) field-names)
725725
field-names))
726726

727-
(define (default-inner-ctors name field-names field-types gen-specific?)
728-
(let* ((field-names (safe-field-names field-names field-types))
729-
(any-ctor
730-
;; definition with Any for all arguments
731-
`(function (call ,name ,@field-names)
732-
(block
733-
(call new ,@field-names)))))
734-
(if gen-specific?
735-
(list
736-
;; definition with field types for all arguments
737-
`(function (call ,name
738-
,@(map make-decl field-names field-types))
739-
(block
740-
(call new ,@field-names)))
741-
any-ctor)
742-
(list any-ctor))))
727+
(define (default-inner-ctors name field-names field-types gen-specific? mutabl)
728+
(let* ((arg-names (safe-field-names field-names field-types))
729+
(any-ctor `(function (call ,name ,@arg-names)
730+
(block (call new ,@arg-names))))
731+
(ctors (if gen-specific?
732+
(list
733+
;; definition with field types for all arguments
734+
`(function (call ,name ,@(map make-decl arg-names field-types))
735+
(block (call new ,@arg-names)))
736+
any-ctor)
737+
(list any-ctor))))
738+
(if (and (not mutabl)
739+
(length> field-names 1)
740+
(eq? arg-names field-names))
741+
(let ((g (gensy)))
742+
(cons `(function (call ,name
743+
(parameters ,@(map (lambda (k) `(kw ,k (|.| ,g ',k))) field-names))
744+
(|::| ,g ,name))
745+
(block (call new ,@field-names)))
746+
ctors))
747+
ctors)))
743748

744749
(define (default-outer-ctor name field-names field-types params bounds)
745750
(let ((field-names (safe-field-names field-names field-types)))
@@ -828,7 +833,7 @@
828833
(field-names (map decl-var fields))
829834
(field-types (map decl-type fields))
830835
(defs2 (if (null? defs)
831-
(default-inner-ctors name field-names field-types (null? params))
836+
(default-inner-ctors name field-names field-types (null? params) mut)
832837
defs)))
833838
(for-each (lambda (v)
834839
(if (not (symbol? v))

test/core.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1859,3 +1859,19 @@ let ex = Expr(:(=), :(f8338(x;y=4)), :(x*y))
18591859
eval(ex)
18601860
@test f8338(2) == 8
18611861
end
1862+
1863+
# issue #5333
1864+
immutable I5333
1865+
a::Int
1866+
b::Int
1867+
end
1868+
type T5333
1869+
a::Int
1870+
b::Int
1871+
end
1872+
let i = I5333(1,2), t = T5333(1,2)
1873+
@test I5333(i;b=3) === I5333(1,3)
1874+
@test I5333(i;a=3) === I5333(3,2)
1875+
@test_throws ErrorException T5333(t;a=3)
1876+
@test_throws ErrorException T5333(t;b=3)
1877+
end

0 commit comments

Comments
 (0)