File: class_codable_failure_diagnostics.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (132 lines) | stat: -rw-r--r-- 4,732 bytes parent folder | download
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -typecheck -parse-as-library -swift-version 4 %s -verify

// Codable class with non-Codable property.
class C1 : Codable {
  // expected-error@-1 {{type 'C1' does not conform to protocol 'Decodable'}}
  // expected-error@-2 {{type 'C1' does not conform to protocol 'Encodable'}}

  class Nested {}
  var a: String = ""
  var b: Int = 0
  var c: Nested = Nested()
  // expected-note@-1 {{cannot automatically synthesize 'Decodable' because 'Nested' does not conform to 'Decodable'}}
  // expected-note@-2 {{cannot automatically synthesize 'Encodable' because 'Nested' does not conform to 'Encodable'}}
}

// Codable class with non-enum CodingKeys.
class C2 : Codable {
  // expected-error@-1 {{type 'C2' does not conform to protocol 'Decodable'}}
  // expected-error@-2 {{type 'C2' does not conform to protocol 'Encodable'}}

  var a: String = ""
  var b: Int = 0
  var c: Double?

  struct CodingKeys : CodingKey {
  // expected-note@-1 {{cannot automatically synthesize 'Decodable' because 'CodingKeys' is not an enum}}
  // expected-note@-2 {{cannot automatically synthesize 'Encodable' because 'CodingKeys' is not an enum}}
    var stringValue = ""
    var intValue = nil
    // expected-error@-1 {{'nil' requires a contextual type}}
    init?(stringValue: String) {}
    init?(intValue: Int) {}
  }
}

// Codable class with CodingKeys not conforming to CodingKey.
class C3 : Codable {
  // expected-error@-1 {{type 'C3' does not conform to protocol 'Decodable'}}
  // expected-error@-2 {{type 'C3' does not conform to protocol 'Encodable'}}

  var a: String = ""
  var b: Int = 0
  var c: Double?

  enum CodingKeys : String {
  // expected-note@-1 {{cannot automatically synthesize 'Decodable' because 'CodingKeys' does not conform to CodingKey}}
  // expected-note@-2 {{cannot automatically synthesize 'Encodable' because 'CodingKeys' does not conform to CodingKey}}
    case a
    case b
    case c
  }
}

// Codable class with extraneous CodingKeys
class C4 : Codable {
  // expected-error@-1 {{type 'C4' does not conform to protocol 'Decodable'}}
  // expected-error@-2 {{type 'C4' does not conform to protocol 'Encodable'}}

  var a: String = ""
  var b: Int = 0
  var c: Double?

  enum CodingKeys : String, CodingKey {
    case a
    case a2
    // expected-note@-1 2{{CodingKey case 'a2' does not match any stored properties}}
    case b
    case b2
    // expected-note@-1 2{{CodingKey case 'b2' does not match any stored properties}}
    case c
    case c2
    // expected-note@-1 2{{CodingKey case 'c2' does not match any stored properties}}
  }
}

// Codable class with non-decoded property (which has no default value).
class C5 : Codable {
  // expected-error@-1 {{type 'C5' does not conform to protocol 'Decodable'}}
  // expected-error@-2 {{class 'C5' has no initializers}}

  var a: String = ""
  var b: Int
  // expected-note@-1 {{cannot automatically synthesize 'Decodable' because 'b' does not have a matching CodingKey and does not have a default value}}
  // expected-note@-2 {{stored property 'b' without initial value prevents synthesized initializers}}
  var c: Double?

  enum CodingKeys : String, CodingKey {
    case a
    case c
  }
}

// Codable class with non-decoded property (which has no default value).
class C6 : Codable {
  // expected-error@-1 {{type 'C6' does not conform to protocol 'Decodable'}}

  var a: String = ""
  var b: Int
  // expected-note@-1 {{cannot automatically synthesize 'Decodable' because 'b' does not have a matching CodingKey and does not have a default value}}
  var c: Double?

  enum CodingKeys : String, CodingKey {
    case a
    case c
  }

  init() {
    b = 5
  }
}

// Non-final classes cannot synthesize Decodable in an extension.
class C7 {}
extension C7 : Decodable {}
// expected-error@-1 {{implementation of 'Decodable' for non-final class cannot be automatically synthesized in extension because initializer requirement 'init(from:)' can only be satisfied by a 'required' initializer in the class definition}}

// Check that the diagnostics from an extension end up on the extension
class C8 {
// expected-note@-1 {{cannot automatically synthesize 'init(from:)' because superclass does not have a callable 'init()'}}
    private init?(from: Decoder) {}
}
final class C9: C8 {}
extension C9: Codable {}
// expected-error@-1 {{type 'C9' does not conform to protocol 'Decodable'}}

struct NotEncodable {}
class C10 {
    var x: NotEncodable = NotEncodable()
    // expected-note@-1 {{cannot automatically synthesize 'Encodable' because 'NotEncodable' does not conform to 'Encodable'}}
}
extension C10: Encodable {}
// expected-error@-1 {{type 'C10' does not conform to protocol 'Encodable'}}