-
Notifications
You must be signed in to change notification settings - Fork 3.1k
/
StdAttachments.scala
152 lines (120 loc) · 6.37 KB
/
StdAttachments.scala
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
* Scala (https://www.scala-lang.org)
*
* Copyright EPFL and Lightbend, Inc.
*
* Licensed under Apache License 2.0
* (http://www.apache.org/licenses/LICENSE-2.0).
*
* See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*/
package scala
package reflect
package internal
trait StdAttachments {
self: SymbolTable =>
/**
* Common code between reflect-internal Symbol and Tree related to Attachments.
*/
trait Attachable {
protected var rawatt: scala.reflect.macros.Attachments { type Pos = Position } = NoPosition
def attachments = rawatt
def setAttachments(attachments: scala.reflect.macros.Attachments { type Pos = Position }): this.type = { rawatt = attachments; this }
def updateAttachment[T: ClassTag](attachment: T): this.type = { rawatt = rawatt.update(attachment); this }
def removeAttachment[T: ClassTag]: this.type = { rawatt = rawatt.remove[T]; this }
def getAndRemoveAttachment[T: ClassTag]: Option[T] = {
val r = attachments.get[T]
if (r.nonEmpty) removeAttachment[T]
r
}
def hasAttachment[T: ClassTag]: Boolean = rawatt.contains[T]
// cannot be final due to SynchronizedSymbols
def pos: Position = rawatt.pos
def pos_=(pos: Position): Unit = rawatt = (rawatt withPos pos)
def setPos(newpos: Position): this.type = { pos = newpos; this }
}
/** Attachment that knows how to import itself into another universe. */
trait ImportableAttachment {
def importAttachment(importer: Importer): this.type
}
/** Attachment that doesn't contain any reflection artifacts and can be imported as-is. */
trait PlainAttachment extends ImportableAttachment {
def importAttachment(importer: Importer): this.type = this
}
/** Stores the trees that give rise to a refined type to be used in reification.
* Unfortunately typed `CompoundTypeTree` is lacking essential info, and the reifier cannot use `CompoundTypeTree.tpe`.
* Therefore we need this hack (see `Reshape.toPreTyperTypeTree` for a detailed explanation).
*/
case class CompoundTypeTreeOriginalAttachment(parents: List[Tree], stats: List[Tree])
/** Attached to a Function node during type checking when the expected type is a SAM type (and not a built-in FunctionN).
*
* Ideally, we'd move to Dotty's Closure AST, which tracks the environment,
* the lifted method that has the implementation, and the target type.
* For backwards compatibility, an attachment is the best we can do right now.
*
* @param samTp the expected type that triggered sam conversion (may be a subtype of the type corresponding to sam's owner)
* @param sam the single abstract method implemented by the Function we're attaching this to
* @param synthCls the (synthetic) class representing the eventual implementation class (spun at runtime by LMF on the JVM)
*/
case class SAMFunction(samTp: Type, sam: Symbol, synthCls: Symbol) extends PlainAttachment
case object DelambdafyTarget extends PlainAttachment
/** When present, indicates that the host `Ident` has been created from a backquoted identifier.
*/
case object BackquotedIdentifierAttachment extends PlainAttachment
/** Indicates that a selection was postfix (on Select tree) */
case object PostfixAttachment extends PlainAttachment
/** Indicates that an application was infix (on Apply tree) */
case object InfixAttachment extends PlainAttachment
/** Indicates that an application to `()` was inserted by the compiler */
case object AutoApplicationAttachment extends PlainAttachment
/** A pattern binding exempt from unused warning.
*
* Its host `Ident` has been created from a pattern2 binding, `case x @ p`.
* In the absence of named parameters in patterns, allows nuanced warnings for unused variables.
* Hence, `case X(x = _) =>` would not warn; for now, `case X(x @ _) =>` is documentary if x is unused.
*/
case object NoWarnAttachment extends PlainAttachment
/** Indicates that a `ValDef` was synthesized from a pattern definition, `val P(x)`.
*/
case object PatVarDefAttachment extends PlainAttachment
/** Identifies trees are either result or intermediate value of for loop desugaring.
*/
case object ForAttachment extends PlainAttachment
/** Identifies unit constants which were inserted by the compiler (e.g. gen.mkBlock)
*/
case object SyntheticUnitAttachment extends PlainAttachment
/** Untyped list of subpatterns attached to selector dummy. */
case class SubpatternsAttachment(patterns: List[Tree])
abstract class InlineAnnotatedAttachment
case object NoInlineCallsiteAttachment extends InlineAnnotatedAttachment
case object InlineCallsiteAttachment extends InlineAnnotatedAttachment
/** Attached to a local class that has its outer field elided. A `null` constant may be passed
* in place of the outer parameter, can help callers to avoid capturing the outer instance.
*/
case object OuterArgCanBeElided extends PlainAttachment
case object UseInvokeSpecial extends PlainAttachment
/** An attachment carrying information between uncurry and erasure */
case class TypeParamVarargsAttachment(val typeParamRef: Type)
/** Attached to a class symbol to indicate that its children have been observed
* via knownDirectSubclasses. Children added subsequently will trigger an
* error to indicate that the earlier observation was incomplete.
*/
case object KnownDirectSubclassesCalled extends PlainAttachment
case object DottyEnumSingleton extends PlainAttachment
class DottyParameterisedTrait(val params: List[Symbol])
class DottyOpaqueTypeAlias(val tpe: Type)
class QualTypeSymAttachment(val sym: Symbol)
case object ConstructorNeedsFence extends PlainAttachment
/** Mark the syntax for linting purposes. */
case object MultiargInfixAttachment extends PlainAttachment
case object NullaryOverrideAdapted extends PlainAttachment
// When typing a Def with this attachment, change the owner of its RHS from origalOwner to the symbol of the Def
case class ChangeOwnerAttachment(originalOwner: Symbol)
case object InterpolatedString extends PlainAttachment
// Use of _root_ is in correct leading position of selection
case object RootSelection extends PlainAttachment
/** Marks a Typed tree with Unit tpt. */
case object TypedExpectingUnitAttachment
def explicitlyUnit(tree: Tree): Boolean = tree.hasAttachment[TypedExpectingUnitAttachment.type]
}