// RUN: %target-swift-ide-test -syntax-coloring -source-filename %s | %FileCheck %s // RUN: %target-swift-ide-test -syntax-coloring -typecheck -source-filename %s | %FileCheck %s enum List { case Nil // rdar://21927124 // CHECK: indirect case Cons(T, List) indirect case Cons(T, List) } // CHECK: struct S { struct S { // CHECK: var x : Int var x : Int // CHECK: var y : Int.Int var y : Int.Int // CHECK: var a, b : Int var a, b : Int } enum EnumWhereCaseHasADefaultedFunctionTypeParam { // CHECK: enum EnumWhereCaseHasADefaultedFunctionTypeParam { case foo(x: () -> () = { // CHECK: case foo(x: () -> () = { func inner(x: S) {} // CHECK: func inner(x: S) {} }) } enum EnumWithDerivedEquatableConformance : Int { // CHECK-LABEL: enum EnumWithDerivedEquatableConformance : {{()}}Int{{()?}} { case CaseA // CHECK-NEXT: case CaseA case CaseB, CaseC // CHECK-NEXT: case CaseB, CaseC case CaseD = 30, CaseE // CHECK-NEXT: case CaseD = 30, CaseE } // CHECK-NEXT: } // CHECK: class MyCls { class MyCls { // CHECK: var www : Int var www : Int // CHECK: func foo(x: Int) {} func foo(x: Int) {} // CHECK: var aaa : Int { var aaa : Int { // CHECK: get {} get {} // CHECK: set {} set {} } // CHECK: var bbb : Int { var bbb : Int { // CHECK: set { set { // CHECK: var tmp : Int var tmp : Int } // CHECK: get { get { // CHECK: var tmp : Int var tmp : Int } } // CHECK: subscript (i : Int, j : Int) -> Int { subscript (i : Int, j : Int) -> Int { // CHECK: get { get { // CHECK: return i + j return i + j } // CHECK: set(v) { set(v) { // CHECK: v + i - j v + i - j } } // CHECK: func multi(_ name: Int, otherpart x: Int) {} func multi(_ name: Int, otherpart x: Int) {} } // CHECK-LABEL: class Attributes { class Attributes { // CHECK: @IBOutlet var v0: Int @IBOutlet var v0: Int // CHECK: @IBOutlet @IBOutlet var v1: String @IBOutlet @IBOutlet var v1: String // CHECK: @objc @IBOutlet var v2: String @objc @IBOutlet var v2: String // CHECK: @IBOutlet @objc var v3: String @IBOutlet @objc var v3: String // CHECK: @available(*, unavailable) func f1() {} @available(*, unavailable) func f1() {} // CHECK: @available(*, unavailable) @IBAction func f2() {} @available(*, unavailable) @IBAction func f2() {} // CHECK: @IBAction @available(*, unavailable) func f3() {} @IBAction @available(*, unavailable) func f3() {} // CHECK: mutating func func_mutating_1() {} mutating func func_mutating_1() {} // CHECK: nonmutating func func_mutating_2() {} nonmutating func func_mutating_2() {} } func stringLikeLiterals() { // CHECK: var us1: UnicodeScalar = "a" var us1: UnicodeScalar = "a" // CHECK: var us2: UnicodeScalar = "ы" var us2: UnicodeScalar = "ы" // CHECK: var ch1: Character = "a" var ch1: Character = "a" // CHECK: var ch2: Character = "あ" var ch2: Character = "あ" // CHECK: var s1 = "abc абвгд あいうえお" var s1 = "abc абвгд あいうえお" } // CHECK: var globComp : Int var globComp : Int { // CHECK: get { get { // CHECK: return 0 return 0 } } // CHECK: func foo(n: Float) -> Int { func foo(n: Float) -> Int { // CHECK: var fnComp : Int var fnComp : Int { // CHECK: get { get { // CHECK: var a: Int // CHECK: return 0 var a: Int return 0 } } // CHECK: var q = {{()?}}MyCls{{()?}}() var q = MyCls() // CHECK: var ee = "yoo"; var ee = "yoo"; // CHECK: return 100009 return 100009 } // CHECK: protocol Prot protocol Prot { // CHECK: associatedtype Assoc1 = Array<Never> associatedtype Assoc1 = Array // CHECK: associatedtype Assoc2 = Void where Assoc2: Equatable associatedtype Assoc2 = Void where Assoc2: Equatable // CHECK: associatedtype Assoc3: Prot, Prot = Void where Assoc3: Prot associatedtype Assoc3: Prot, Prot = Void where Assoc3: Prot // CHECK: typealias Blarg typealias Blarg // CHECK: func protMeth(x: Int) func protMeth(x: Int) // CHECK: var protocolProperty1: Int { get } var protocolProperty1: Int { get } // CHECK: var protocolProperty2: Int { get set } var protocolProperty2: Int { get set } // CHECK: var protoAsyncProp: Int { get async } var protoAsyncProp: Int { get async } } // CHECK: infix operator *-* : FunnyPrecedence{{$}} infix operator *-* : FunnyPrecedence // CHECK: precedencegroup FunnyPrecedence // CHECK-NEXT: associativity: left{{$}} // CHECK-NEXT: higherThan: MultiplicationPrecedence precedencegroup FunnyPrecedence { associativity: left higherThan: MultiplicationPrecedence } // CHECK: func *-*(l: Int, r: Int) -> Int { return l }{{$}} func *-*(l: Int, r: Int) -> Int { return l } // CHECK: infix operator *-+* : FunnyPrecedence infix operator *-+* : FunnyPrecedence // CHECK: func *-+*(l: Int, r: Int) -> Int { return l }{{$}} func *-+*(l: Int, r: Int) -> Int { return l } // CHECK: infix operator *--*{{$}} infix operator *--* // CHECK: func *--*(l: Int, r: Int) -> Int { return l }{{$}} func *--*(l: Int, r: Int) -> Int { return l } // CHECK: protocol Prot2 : Prot {} protocol Prot2 : Prot {} // CHECK: class SubCls : MyCls, Prot {} class SubCls : MyCls, Prot {} // CHECK: func genFnProt where T.Blarg : Prot2>(_: T) -> Int {}{{$}} func genFn(_: T) -> Int {} func f(x: Int) -> Int { // CHECK: #"This is a raw string"# #"This is a raw string"# // CHECK: ##"This is also a raw string"## ##"This is also a raw string"## // CHECK: ###"This is an unterminated raw string" ###"This is an unterminated raw string" // CHECK: #"""This is a multiline raw string"""# #"""This is a multiline raw string"""# // CHECK: #"This is an \#(interpolated) raw string"# #"This is an \#(interpolated) raw string"# // CHECK: #"This is a raw string with an invalid \##() interpolation"# #"This is a raw string with an invalid \##() interpolation"# // CHECK: "This is string \(genFn({(a:Int -> Int) in a})) interpolation" "This is string \(genFn({(a:Int -> Int) in a})) interpolation" // CHECK: "This is unterminated "This is unterminated // CHECK: "This is unterminated with ignored \(interpolation) in it "This is unterminated with ignored \(interpolation) in it // CHECK: "This is terminated with invalid \(interpolation" + "in it" "This is terminated with invalid \(interpolation" + "in it" // CHECK: """ // CHECK-NEXT: This is a multiline string. // CHECK-NEXT: """ """ This is a multiline string. """ // CHECK: """ // CHECK-NEXT: This is a multiline\( "interpolated" )string // CHECK-NEXT: \( // CHECK-NEXT: """ // CHECK-NEXT: inner // CHECK-NEXT: """ // CHECK-NEXT: ) // CHECK-NEXT: """ """ This is a multiline\( "interpolated" )string \( """ inner """ ) """ // CHECK: "\(1)\(1)" "\(1)\(1)" } // CHECK: func bar(x: Int) -> (Int, Float) { func bar(x: Int) -> (Int, Float) { // CHECK: foo({{()?}}Float{{()?}}()) foo(Float()) } // Check cases where an ObjectLiteralExpr appears in the AST // #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) // CHECK: #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) test(#imageLiteral(resourceName: "test"), test: 0) // CHECK: test(#imageLiteral(resourceName: "test"), test: 0) // Check best-effort fallback handling when no ObjectLiteralExpr appears in the // AST. // _: Foo = #colorLiteral(red: 1.0, green: 0, blue: 1.0, alpha: 1.0) // CHECK: _: Foo = #colorLiteral(red: 1.0, green: 0, blue: 1.0, alpha: 1.0) _ = [#imageLiteral(resourceName: "foo.png")] + ; // CHECK: _ = [#imageLiteral(resourceName: "foo.png")] + ; import let bad = #fileLiteral(resourceName: "foo.txt") // CHECK: import let bad = #fileLiteral(resourceName: "foo.txt") import let fixme = #fileLiteral(badArg: 65); // CHECK: import let fixme = #fileLiteral(badArg: 65); let x = #colorLiteral(red: 1.0 / 2.0, green: 0.1 + 0.2, blue: 0.5, alpha: 0.5) // CHECK: let x = #colorLiteral(red: 1.0 / 2.0, green: 0.1 + 0.2, blue: 0.5, alpha: 0.5) // Some editors (including Xcode) don't support multi-line object literals well, so // check we don't report them regardless of whether they exist in the AST or not. // _: Foo = #colorLiteral(red: 1.0, green: 0, // CHECK: _: Foo = #colorLiteral(red: 1.0, green: 0, blue: 1.0, alpha: 1.0) // CHECK: blue: 1.0, alpha: 1.0) // CHECK: let x = #colorLiteral(red: 1.0, green: 1.0, let x = #colorLiteral(red: 1.0, green: 1.0, // CHECK: blue: 1.0, alpha: 1.0) blue: 1.0, alpha: 1.0) class GenC {} func test() { // CHECK: {{()?}}GenC{{()?}}<Int, Float>() var x = GenC() } // CHECK: typealias MyInt = Int typealias MyInt = Int func test2(x: Int) { // CHECK: "\(x)" "\(x)" } // CHECK: #colorLiteral #colorLiteral // CHECK: class Observers { class Observers { // CHECK: var p1 : Int { var p1 : Int { // CHECK: willSet(newValue) {} willSet(newValue) {} // CHECK: didSet {} didSet {} } // CHECK: var p2 : Int { var p2 : Int { // CHECK: didSet {} didSet {} // CHECK: willSet {} willSet {} } } // CHECK: func test3(o: AnyObject) { func test3(o: AnyObject) { // CHECK: _ = o is MyCls ? o as MyCls : o as! MyCls as MyCls + 1 _ = o is MyCls ? o as MyCls : o as! MyCls as MyCls + 1 } // CHECK: class MySubClass : MyCls { class MySubClass : MyCls { // CHECK: override func foo(x: Int) {} override func foo(x: Int) {} // CHECK: convenience init(a: Int) {} convenience init(a: Int) {} } // CHECK: var g1 = { (x: Int) -> Int in return 0 } var g1 = { (x: Int) -> Int in return 0 } // CHECK: infix operator ~~ { infix operator ~~ {} // CHECK: prefix operator *~~ { prefix operator *~~ {} // CHECK: postfix operator ~~* { postfix operator ~~* {} func test_defer() { defer { // CHECK: let x : Int = 0 let x : Int = 0 } } func test6(x: T) {} // CHECK: func test6Prot>(x: T) {}{{$}} // CHECK: func <#test1#> () {} func <#test1#> () {} func funcTakingFor(for internalName: Int) {} // CHECK: func funcTakingFor(for internalName: Int) {} func funcTakingIn(in internalName: Int) {} // CHECK: func funcTakingIn(in internalName: Int) {} _ = 123 // CHECK: 123 _ = -123 // CHECK: -123 _ = -1 // CHECK: -1 _ = -0x123 // CHECK: -0x123 _ = -3.1e-5 // CHECK: -3.1e-5 "--\"\(x) --" // CHECK: "--\"\(x) --" func keywordAsLabel1(in: Int) {} // CHECK: func keywordAsLabel1(in: Int) {} func keywordAsLabel2(for: Int) {} // CHECK: func keywordAsLabel2(for: Int) {} func keywordAsLabel3(if: Int, for: Int) {} // CHECK: func keywordAsLabel3(if: Int, for: Int) {} func keywordAsLabel4(_: Int) {} // CHECK: func keywordAsLabel4(_: Int) {} func keywordAsLabel5(_: Int, for: Int) {} // CHECK: func keywordAsLabel5(_: Int, for: Int) {} func keywordAsLabel6(if func: Int) {} // CHECK: func keywordAsLabel6(if func: Int) {} func foo1() { // CHECK: func foo1() { keywordAsLabel1(in: 1) // CHECK: keywordAsLabel1(in: 1) keywordAsLabel2(for: 1) // CHECK: keywordAsLabel2(for: 1) keywordAsLabel3(if: 1, for: 2) // CHECK: keywordAsLabel3(if: 1, for: 2) keywordAsLabel5(1, for: 2) // CHECK: keywordAsLabel5(1, for: 2) _ = (if: 0, for: 2) // CHECK: _ = (if: 0, for: 2) _ = (_: 0, _: 2) // CHECK: _ = (_: 0, _: 2) } func foo2(O1 : Int?, O2: Int?, O3: Int?) { guard let _ = O1, var _ = O2, let _ = O3 else { } // CHECK: guard let _ = O1, var _ = O2, let _ = O3 else { } if let _ = O1, var _ = O2, let _ = O3 {} // CHECK: if let _ = O1, var _ = O2, let _ = O3 {} } func keywordInCaseAndLocalArgLabel(_ for: Int, for in: Int, class _: Int) { // CHECK: func keywordInCaseAndLocalArgLabel(_ for: Int, for in: Int, class _: Int) { switch(`for`, `in`) { case (let x, let y): // CHECK: case (let x, let y): print(x, y) @unknown default: // CHECK: @unknown default: () } } enum CasesWithMissingElement { case a(Int, String), // CHECK: case a(Int, String) case b(Int, String), // CHECK: case b(Int, String) } // CHECK: class Ownership { class Ownership { // CHECK: weak var w weak var w // CHECK: unowned var u unowned var u // CHECK: unowned(unsafe) var uu unowned(unsafe) var uu } // CHECK: let closure = { [weak x=bindtox, unowned y=bindtoy, unowned(unsafe) z=bindtoz] in } let closure = { [weak x=bindtox, unowned y=bindtoy, unowned(unsafe) z=bindtoz] in } protocol FakeClassRestrictedProtocol : `class` {} // CHECK: protocol FakeClassRestrictedProtocol : `class` {} // FIXME: rdar://42801404: OLD and NEW should be the same '`class`'. // CHECK: func foo() -> some P {} func foo() -> some P {} // CHECK: func foo() -> some P & Q {} func foo() -> some P & Q {} // CHECK: class PropertyDelegate { class PropertyDelegate { // CHECK: @MyDelegate(1, receiveClosure { @MyDelegate(1, receiveClosure { // CHECK: var x = 1; x var x = 1; x }) var something } // CHECK: func acceptBuilder( func acceptBuilder( // CHECK: @SomeBuilder<Element> label param: () -> T @SomeBuilder label param: () -> T ) {} // CHECK: func typeAttr(a: @escaping () -> Int) {} func typeAttr(a: @escaping () -> Int) {} // CHECK: func typeAttr3(a: @ escaping () -> Int) {} func typeAttr3(a: @ escaping () -> Int) {} // CHECK: func typeAttr2(a: @ /*this is fine...*/ escaping () -> Int, b: @ escaping () -> Int) {} func typeAttr2(a: @ /*this is fine...*/ escaping () -> Int, b: @ escaping () -> Int) {} // CHECK: @available(iOS 99, *) // CHECK: var iHave = 10, multipleVars = 20 @available(iOS 99, *) var iHave = 10, multipleVars = 20 enum MultipleCaseElements { // CHECK: @available(iOS 99, *) // CHECK: case foo, bar @available(iOS 99, *) case foo, bar } protocol P {} enum E { // CHECK: @available(iOS 99, *) // CHECK: case a(P) @available(iOS 99, *) case a(P) } // Ideally this would be attr-builtin, but we don't actually have the attribute // in the AST at all. // // CHECK: @available(iOS 99, *) // CHECK: var _ = 10 @available(iOS 99, *) var _ = 10 // CHECK: Array<T> where T: Equatable typealias GenericAlias = Array where T: Equatable // Where clauses on contextually generic declarations // struct FreeWhere { // CHECK: func foo() where T == Int func foo() where T == Int {} // CHECK: subscript() -> Int where T: Sequence subscript() -> Int where T: Sequence {} // CHECK: enum Enum where T == Int enum Enum where T == Int {} // CHECK: typealias Alias = Int where T == Int typealias Alias = Int where T == Int } // Renamed attribute ('fixed' to @available by the parser after emitting an error, so not treated as a custom attribute) // CHECK: @availability(macOS 10.11, *) @availability(macOS 10.11, *) class HasMisspelledAttr {}