-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Add restricted capabilities x.only[C]
#23485
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
@@ -597,7 +597,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser: | |||
* - If the reference is to a this type of the enclosing class, the | |||
* access must be in a @consume method. | |||
* | |||
* References that extend SharedCapability are excluded from checking. | |||
* References that extend cpas.Sharable are excluded from checking. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* References that extend cpas.Sharable are excluded from checking. | |
* References that extend caps.Sharable are excluded from checking. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
No more detour via PostfixOps of compiler-generated names.
Basic representations and definitions, so that we can parse only-capabilities, convert them to internal representation `Restrict(c, cls)`, not crash on them during capture checking and print them out correctly.
The previous version failed in the "Scala-3 with Capture Checking" test.
* (x.rd)? = (x*)? | ||
* (x?).reach = (x.reach)? | ||
* (x.rd).reach = (x.reach).rd | ||
* (x.only[T]).reach = (x*).only[T] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* (x.only[T]).reach = (x*).only[T] | |
* (x.only[T]).reach = (x.reach).only[T] |
or use .*
consistently
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we also have the example from the github discussion?
|
||
/** The least classifier between `cls1` and `cls2`, which are either | ||
* AnyClass, NothingClass, or a class directly extending caps.Classifier. | ||
* @return if oen of cls1, cls2 is a subclass of the other, the subclass |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
* @return if oen of cls1, cls2 is a subclass of the other, the subclass | |
* @return if one of cls1, cls2 is a subclass of the other, the subclass |
Implementation along the lines of #23463
only
-capabilities.Classifier
base trait.only
-capabilities.captureSetOfInfo
foronly
capabilities.x.only[Nothing]
. It should have emptycaptureSetOfInfo
.only
must refer to a classified capability class.- it's
*
, then.only
, then.rd
,- multiple
.only
normalize to the smallest one if the classes are related,- multiple
.only
normalize to the empty capability if the classes are not related.FreshCap
andResultCap
.capToFresh
andtoResultInResults
so that the classifier field is correctly set.tcs
, define when a capability is classified by a classifier class.C
can subsume only capabilities that are classified asC
.-
c.as[C] <: d
ifc <: d
orc.as[D] <: empty
-
c.as[C] <: d.as[D]
ifc <: d
andC
derives fromD
-
c <: d.as[D]
ifc <: d
andc
is classified asD
-
c.as[D] <: empty
iftcs(c)
consists of capabilities that all derive from classifier classes unrelated toD
.