mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Swift: remove getOpaqueExpr from OpenExistentialExpr's children
This commit is contained in:
9
swift/ql/.generated.list
generated
9
swift/ql/.generated.list
generated
@@ -381,10 +381,10 @@ lib/codeql/swift/generated/KeyPathComponent.qll 00b1e586b8532f0193b3f61111e70d4e
|
||||
lib/codeql/swift/generated/Locatable.qll bfdf2dafae2829cac8d1e863a93676228d131b5a7f3df87c40d2f3b1839962b8 af243098af0955a40862387edf7526826fde62a64e5e6ca28de9e9603a8622bf
|
||||
lib/codeql/swift/generated/Location.qll 921922352d39449067d9f2788309b5f3490091097ffe35e6aa98f9368626ce2c 0795c63565c4308e745400bc70ea73675160201590a95bb418de4e2ebca32764
|
||||
lib/codeql/swift/generated/OtherAvailabilitySpec.qll 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5
|
||||
lib/codeql/swift/generated/ParentChild.qll f490202e849b9cbd550ee9d758644b85d43e60d81413e6c28df2850fb1e9a2d6 6b95aeab6b53a880b230ad0c96b6deb519a7368898c844632ae96090de59df99
|
||||
lib/codeql/swift/generated/ParentChild.qll 01b27b48a12955a45ea26d0f7888a160faac9fd5fb57a19e87365318e9b21a30 88090ef26a7ce63f4ba88fa735e2c8207fd1de00076532083d93a7a02553797e
|
||||
lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll f82d9ca416fe8bd59b5531b65b1c74c9f317b3297a6101544a11339a1cffce38 7f5c6d3309e66c134107afe55bae76dfc9a72cb7cdd6d4c3706b6b34cee09fa0
|
||||
lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98
|
||||
lib/codeql/swift/generated/Raw.qll 8d4880e5ee1fdd120adeb7bf0dfa1399e7b1a53b2cc7598aed8e15cbf996d1c0 da0d446347d29f5cd05281c17c24e87610f31c32adb7e05ab8f3a26bed55bd90
|
||||
lib/codeql/swift/generated/Raw.qll 13cf09f9b2f628831b6b715448779366959a4c44b1b5ffc97397654fc8620486 03d60bdb6543d87a83ca50a3977c98c08d936d435981ae0b373f98ecde7a142b
|
||||
lib/codeql/swift/generated/Synth.qll 551fdf7e4b53f9ee1314d1bb42c2638cf82f45bfa1f40a635dfa7b6072e4418c 9ab178464700a19951fc5285acacda4913addee81515d8e072b3d7055935a814
|
||||
lib/codeql/swift/generated/SynthConstructors.qll 2f801bd8b0db829b0253cd459ed3253c1fdfc55dce68ebc53e7fec138ef0aca4 2f801bd8b0db829b0253cd459ed3253c1fdfc55dce68ebc53e7fec138ef0aca4
|
||||
lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6
|
||||
@@ -521,7 +521,7 @@ lib/codeql/swift/generated/expr/ObjCSelectorExpr.qll efc72580627467dce30ab784bfb
|
||||
lib/codeql/swift/generated/expr/ObjectLiteralExpr.qll 199b3a5196bff35681ba2e4bdb546cfbe0a2e265f535d05cfdb89af9c382c1a6 7c6b962565841a634c850d088fd404a3e6f3045e05ff555e1cde0ec02ba8dc8d
|
||||
lib/codeql/swift/generated/expr/OneWayExpr.qll 8464649694b671a8462476fcd3827b07f8448069c7caa9e9efce44d7ce87aee0 c3e143ecd28238342a1d911a468087cc58a751106385f01cbe5a44e19c862d0e
|
||||
lib/codeql/swift/generated/expr/OpaqueValueExpr.qll 354f23d00d5ea2e734fd192130620d26c76c14d5bb7b0a1aa69f17ffb5289793 354f23d00d5ea2e734fd192130620d26c76c14d5bb7b0a1aa69f17ffb5289793
|
||||
lib/codeql/swift/generated/expr/OpenExistentialExpr.qll 55ff1b4fdf23b787538f8b8cdc5f382d874221cec230f8fa35189ebf6de09b58 8235fe3387753a0ac389e297bf67b416991117587a98a566620ac9b328887dd6
|
||||
lib/codeql/swift/generated/expr/OpenExistentialExpr.qll dfa76a8ce3613f6beb15a1e1ef37588b3862b02044aedad39a70a72d53b0dd4b 0bb2c70df80bccac424e281c772d9cdeac184dabfdbacf609a5a8519e80e923e
|
||||
lib/codeql/swift/generated/expr/OptionalEvaluationExpr.qll 76a3a789b3a4f17dd494f973f099766aa1db97c38cbbd93542e664a7cd7e1680 f56ce693b59cee6713a7cfdb2937a8a4e791d6e80c241ecd333ab197482a2d1b
|
||||
lib/codeql/swift/generated/expr/OptionalTryExpr.qll f0c8dff90faee4fbf07772efda53afe1acc1fd148c16ee4d85a1502a36178e71 f0c8dff90faee4fbf07772efda53afe1acc1fd148c16ee4d85a1502a36178e71
|
||||
lib/codeql/swift/generated/expr/OtherInitializerRefExpr.qll 9e695cca00e162beadad513d6833f117cee0f364da6f16c7ed3809573c1fbfe2 ff29f1f265e22eefc9166f77fa8adca7f89d3f769591149e21c58c0789577a88
|
||||
@@ -819,7 +819,8 @@ test/extractor-tests/generated/expr/ObjectLiteralExpr/ObjectLiteralExpr_getArgum
|
||||
test/extractor-tests/generated/expr/ObjectLiteralExpr/ObjectLiteralExpr_getType.ql 07d59d9962f3705f8f32302c0d730c179ca980172dd000b724a72e768fbf39db cd146e19249590316bb83efec19dd41234723513025cf9df45313f78f2b364dd
|
||||
test/extractor-tests/generated/expr/OneWayExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
test/extractor-tests/generated/expr/OpaqueValueExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
test/extractor-tests/generated/expr/OpenExistentialExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr.ql 48da42e3a2d44f4ca6b159bc8ba273352984b34fd14a3d6ca15ec9d6c38a2608 ba6a769c8c3c8cea40d64e0339515f59aded493d2c8f9c2447b10bcc43bed5f7
|
||||
test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr_getType.ql f8d4ddc40e4bef7760446bfb90f3d2b7438fd5a0a2aa092efd59493fa8a98b23 e54f77a98a38c2c68414a5e6de8de18189ce7f0e68f9c945ab387e52d7e04a12
|
||||
test/extractor-tests/generated/expr/OptionalEvaluationExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
test/extractor-tests/generated/expr/OptionalTryExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
test/extractor-tests/generated/expr/OtherInitializerRefExpr/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
|
||||
3
swift/ql/.gitattributes
generated
vendored
3
swift/ql/.gitattributes
generated
vendored
@@ -821,7 +821,8 @@
|
||||
/test/extractor-tests/generated/expr/ObjectLiteralExpr/ObjectLiteralExpr_getType.ql linguist-generated
|
||||
/test/extractor-tests/generated/expr/OneWayExpr/MISSING_SOURCE.txt linguist-generated
|
||||
/test/extractor-tests/generated/expr/OpaqueValueExpr/MISSING_SOURCE.txt linguist-generated
|
||||
/test/extractor-tests/generated/expr/OpenExistentialExpr/MISSING_SOURCE.txt linguist-generated
|
||||
/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr.ql linguist-generated
|
||||
/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr_getType.ql linguist-generated
|
||||
/test/extractor-tests/generated/expr/OptionalEvaluationExpr/MISSING_SOURCE.txt linguist-generated
|
||||
/test/extractor-tests/generated/expr/OptionalTryExpr/MISSING_SOURCE.txt linguist-generated
|
||||
/test/extractor-tests/generated/expr/OtherInitializerRefExpr/MISSING_SOURCE.txt linguist-generated
|
||||
|
||||
@@ -1615,13 +1615,12 @@ private module Impl {
|
||||
private Element getImmediateChildOfOpenExistentialExpr(
|
||||
OpenExistentialExpr e, int index, string partialPredicateCall
|
||||
) {
|
||||
exists(int b, int bExpr, int n, int nSubExpr, int nExistential, int nOpaqueExpr |
|
||||
exists(int b, int bExpr, int n, int nSubExpr, int nExistential |
|
||||
b = 0 and
|
||||
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
|
||||
n = bExpr and
|
||||
nSubExpr = n + 1 and
|
||||
nExistential = nSubExpr + 1 and
|
||||
nOpaqueExpr = nExistential + 1 and
|
||||
(
|
||||
none()
|
||||
or
|
||||
@@ -1632,10 +1631,6 @@ private module Impl {
|
||||
index = nSubExpr and
|
||||
result = e.getImmediateExistential() and
|
||||
partialPredicateCall = "Existential()"
|
||||
or
|
||||
index = nExistential and
|
||||
result = e.getImmediateOpaqueExpr() and
|
||||
partialPredicateCall = "OpaqueExpr()"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
17
swift/ql/lib/codeql/swift/generated/Raw.qll
generated
17
swift/ql/lib/codeql/swift/generated/Raw.qll
generated
@@ -1434,22 +1434,35 @@ module Raw {
|
||||
|
||||
/**
|
||||
* INTERNAL: Do not use.
|
||||
* An implicit expression created by the compiler when a method is called on a protocol. For example in
|
||||
* ```
|
||||
* protocol P {
|
||||
* func foo() -> Int
|
||||
* }
|
||||
* func bar(x: P) -> Int {
|
||||
* return x.foo()
|
||||
* }
|
||||
* `x.foo()` is actually wrapped in an `OpenExistentialExpr` that "opens" `x` replacing it in its subexpression with
|
||||
* an `OpaqueValueExpr`.
|
||||
* ```
|
||||
*/
|
||||
class OpenExistentialExpr extends @open_existential_expr, Expr {
|
||||
override string toString() { result = "OpenExistentialExpr" }
|
||||
|
||||
/**
|
||||
* Gets the sub expression of this open existential expression.
|
||||
*
|
||||
* This wrapped subexpression is where the opaque value and the dynamic type under the protocol type may be used.
|
||||
*/
|
||||
Expr getSubExpr() { open_existential_exprs(this, result, _, _) }
|
||||
|
||||
/**
|
||||
* Gets the existential of this open existential expression.
|
||||
* Gets the protocol-typed expression opened by this expression.
|
||||
*/
|
||||
Expr getExistential() { open_existential_exprs(this, _, result, _) }
|
||||
|
||||
/**
|
||||
* Gets the opaque expression of this open existential expression.
|
||||
* Gets the opaque value expression embedded within `getSubExpr()`.
|
||||
*/
|
||||
OpaqueValueExpr getOpaqueExpr() { open_existential_exprs(this, _, _, result) }
|
||||
}
|
||||
|
||||
@@ -5,6 +5,19 @@ import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.expr.OpaqueValueExpr
|
||||
|
||||
module Generated {
|
||||
/**
|
||||
* An implicit expression created by the compiler when a method is called on a protocol. For example in
|
||||
* ```
|
||||
* protocol P {
|
||||
* func foo() -> Int
|
||||
* }
|
||||
* func bar(x: P) -> Int {
|
||||
* return x.foo()
|
||||
* }
|
||||
* `x.foo()` is actually wrapped in an `OpenExistentialExpr` that "opens" `x` replacing it in its subexpression with
|
||||
* an `OpaqueValueExpr`.
|
||||
* ```
|
||||
*/
|
||||
class OpenExistentialExpr extends Synth::TOpenExistentialExpr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "OpenExistentialExpr" }
|
||||
|
||||
@@ -23,6 +36,8 @@ module Generated {
|
||||
|
||||
/**
|
||||
* Gets the sub expression of this open existential expression.
|
||||
*
|
||||
* This wrapped subexpression is where the opaque value and the dynamic type under the protocol type may be used.
|
||||
*/
|
||||
final Expr getSubExpr() {
|
||||
exists(Expr immediate |
|
||||
@@ -32,7 +47,7 @@ module Generated {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the existential of this open existential expression.
|
||||
* Gets the protocol-typed expression opened by this expression.
|
||||
*
|
||||
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
|
||||
* behavior of both the `Immediate` and non-`Immediate` versions.
|
||||
@@ -45,7 +60,7 @@ module Generated {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the existential of this open existential expression.
|
||||
* Gets the protocol-typed expression opened by this expression.
|
||||
*/
|
||||
final Expr getExistential() {
|
||||
exists(Expr immediate |
|
||||
@@ -55,7 +70,7 @@ module Generated {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the opaque expression of this open existential expression.
|
||||
* Gets the opaque value expression embedded within `getSubExpr()`.
|
||||
*
|
||||
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
|
||||
* behavior of both the `Immediate` and non-`Immediate` versions.
|
||||
@@ -68,7 +83,7 @@ module Generated {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the opaque expression of this open existential expression.
|
||||
* Gets the opaque value expression embedded within `getSubExpr()`.
|
||||
*/
|
||||
final OpaqueValueExpr getOpaqueExpr() {
|
||||
exists(OpaqueValueExpr immediate |
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
doubleParents
|
||||
| dynamic_lookup.swift:15:1:15:3 | [DynamicMemberRefExpr] .foo(_:) | getBase() | dynamic_lookup.swift:15:1:15:3 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | dynamic_lookup.swift:15:1:15:1 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| dynamic_lookup.swift:15:1:15:3 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | dynamic_lookup.swift:15:1:15:3 | [DynamicMemberRefExpr] .foo(_:) | getBase() | dynamic_lookup.swift:15:1:15:1 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| dynamic_lookup.swift:16:5:16:9 | [DynamicSubscriptExpr] subscript ...[...] | getBase() | dynamic_lookup.swift:16:5:16:9 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | dynamic_lookup.swift:16:5:16:5 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| dynamic_lookup.swift:16:5:16:9 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | dynamic_lookup.swift:16:5:16:9 | [DynamicSubscriptExpr] subscript ...[...] | getBase() | dynamic_lookup.swift:16:5:16:5 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
@@ -1,4 +0,0 @@
|
||||
// generated by codegen/codegen.py
|
||||
|
||||
After a source file is added in this directory and codegen/codegen.py is run again, test queries
|
||||
will appear and this file will be deleted
|
||||
@@ -0,0 +1 @@
|
||||
| open_existentials.swift:14:5:14:19 | OpenExistentialExpr | hasType: | yes | getSubExpr: | open_existentials.swift:14:5:14:19 | call to foo() | getExistential: | open_existentials.swift:14:5:14:13 | call to createP() | getOpaqueExpr: | open_existentials.swift:14:5:14:13 | OpaqueValueExpr |
|
||||
16
swift/ql/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr.ql
generated
Normal file
16
swift/ql/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr.ql
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from
|
||||
OpenExistentialExpr x, string hasType, Expr getSubExpr, Expr getExistential,
|
||||
OpaqueValueExpr getOpaqueExpr
|
||||
where
|
||||
toBeTested(x) and
|
||||
not x.isUnknown() and
|
||||
(if x.hasType() then hasType = "yes" else hasType = "no") and
|
||||
getSubExpr = x.getSubExpr() and
|
||||
getExistential = x.getExistential() and
|
||||
getOpaqueExpr = x.getOpaqueExpr()
|
||||
select x, "hasType:", hasType, "getSubExpr:", getSubExpr, "getExistential:", getExistential,
|
||||
"getOpaqueExpr:", getOpaqueExpr
|
||||
@@ -0,0 +1 @@
|
||||
| open_existentials.swift:14:5:14:19 | OpenExistentialExpr | () |
|
||||
7
swift/ql/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr_getType.ql
generated
Normal file
7
swift/ql/test/extractor-tests/generated/expr/OpenExistentialExpr/OpenExistentialExpr_getType.ql
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from OpenExistentialExpr x
|
||||
where toBeTested(x) and not x.isUnknown()
|
||||
select x, x.getType()
|
||||
@@ -0,0 +1,15 @@
|
||||
protocol P {
|
||||
func foo() -> ()
|
||||
}
|
||||
|
||||
class C : P {
|
||||
func foo() {}
|
||||
}
|
||||
|
||||
func createP() -> P {
|
||||
return C()
|
||||
}
|
||||
|
||||
func test() {
|
||||
createP().foo()
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
doubleParents
|
||||
| opened_archetypes.swift:24:10:24:16 | [MemberRefExpr] .isFooMember | getBase() | opened_archetypes.swift:24:10:24:16 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | opened_archetypes.swift:24:10:24:10 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| opened_archetypes.swift:24:10:24:16 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | opened_archetypes.swift:24:10:24:16 | [MemberRefExpr] .isFooMember | getBase() | opened_archetypes.swift:24:10:24:10 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
@@ -1,13 +0,0 @@
|
||||
doubleParents
|
||||
| generics.swift:93:9:93:15 | [MemberRefExpr] .source0 | getBase() | generics.swift:93:9:93:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:93:9:93:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:93:9:93:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:93:9:93:15 | [MemberRefExpr] .source0 | getBase() | generics.swift:93:9:93:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:94:9:94:15 | [MemberRefExpr] .source1 | getBase() | generics.swift:94:9:94:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:94:9:94:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:94:9:94:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:94:9:94:15 | [MemberRefExpr] .source1 | getBase() | generics.swift:94:9:94:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:95:9:95:15 | [MemberRefExpr] .source2 | getBase() | generics.swift:95:9:95:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:95:9:95:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:95:9:95:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:95:9:95:15 | [MemberRefExpr] .source2 | getBase() | generics.swift:95:9:95:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:125:9:125:15 | [MemberRefExpr] .source0 | getBase() | generics.swift:125:9:125:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:125:9:125:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:125:9:125:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:125:9:125:15 | [MemberRefExpr] .source0 | getBase() | generics.swift:125:9:125:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:126:9:126:15 | [MemberRefExpr] .source1 | getBase() | generics.swift:126:9:126:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:126:9:126:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:126:9:126:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:126:9:126:15 | [MemberRefExpr] .source1 | getBase() | generics.swift:126:9:126:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:127:9:127:15 | [MemberRefExpr] .source2 | getBase() | generics.swift:127:9:127:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:127:9:127:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| generics.swift:127:9:127:15 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | generics.swift:127:9:127:15 | [MemberRefExpr] .source2 | getBase() | generics.swift:127:9:127:9 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
@@ -1,3 +0,0 @@
|
||||
doubleParents
|
||||
| file://:0:0:0:0 | [MethodLookupExpr] .container(keyedBy:) | getBase() | file://:0:0:0:0 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | file://:0:0:0:0 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
| file://:0:0:0:0 | [OpenExistentialExpr] OpenExistentialExpr | getOpaqueExpr() | file://:0:0:0:0 | [MethodLookupExpr] .container(keyedBy:) | getBase() | file://:0:0:0:0 | [OpaqueValueExpr] OpaqueValueExpr |
|
||||
@@ -516,9 +516,22 @@ class OpaqueValueExpr(Expr):
|
||||
pass
|
||||
|
||||
class OpenExistentialExpr(Expr):
|
||||
sub_expr: Expr | child
|
||||
existential: Expr | child
|
||||
opaque_expr: OpaqueValueExpr | child
|
||||
""" An implicit expression created by the compiler when a method is called on a protocol. For example in
|
||||
```
|
||||
protocol P {
|
||||
func foo() -> Int
|
||||
}
|
||||
func bar(x: P) -> Int {
|
||||
return x.foo()
|
||||
}
|
||||
`x.foo()` is actually wrapped in an `OpenExistentialExpr` that "opens" `x` replacing it in its subexpression with
|
||||
an `OpaqueValueExpr`.
|
||||
```
|
||||
"""
|
||||
sub_expr: Expr | child | desc("""
|
||||
This wrapped subexpression is where the opaque value and the dynamic type under the protocol type may be used.""")
|
||||
existential: Expr | child | doc("protocol-typed expression opened by this expression")
|
||||
opaque_expr: OpaqueValueExpr | doc("opaque value expression embedded within `getSubExpr()`")
|
||||
|
||||
class OptionalEvaluationExpr(Expr):
|
||||
sub_expr: Expr | child
|
||||
|
||||
Reference in New Issue
Block a user