Skip to content

Commit ec848ea

Browse files
committed
WIP Implement extension method in kernel
1 parent 8bb5b5d commit ec848ea

14 files changed

+212
-117
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/CaseDefOpsImpl.scala

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@ import dotty.tools.dotc.ast.tpd
44

55
trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with CoreImpl with Helpers {
66

7-
def CaseDefDeco(caseDef: CaseDef): CaseDefAPI = new CaseDefAPI {
8-
def pattern(implicit ctx: Context): Pattern = caseDef.pat
9-
def guard(implicit ctx: Context): Option[Term] = optional(caseDef.guard)
10-
def rhs(implicit ctx: Context): Term = caseDef.body
11-
}
12-
137
object CaseDef extends CaseDefModule {
148
def apply(pattern: Pattern, guard: Option[Term], body: Term)(implicit ctx: Context): CaseDef =
159
tpd.CaseDef(pattern, guard.getOrElse(tpd.EmptyTree), body)
@@ -20,11 +14,6 @@ trait CaseDefOpsImpl extends scala.tasty.reflect.CaseDefOps with CoreImpl with H
2014
def unapply(x: CaseDef): Some[(Pattern, Option[Term], Term)] = Some(x.pat, optional(x.guard), x.body)
2115
}
2216

23-
def TypeCaseDefDeco(caseDef: TypeCaseDef): TypeCaseDefAPI = new TypeCaseDefAPI {
24-
def pattern(implicit ctx: Context): Pattern = caseDef.pat
25-
def rhs(implicit ctx: Context): Term = caseDef.body
26-
}
27-
2817
object TypeCaseDef extends TypeCaseDefModule {
2918
def apply(pattern: TypeTree, body: TypeTree)(implicit ctx: Context): TypeCaseDef =
3019
tpd.CaseDef(pattern, tpd.EmptyTree, body)

compiler/src/dotty/tools/dotc/tastyreflect/ConstantOpsImpl.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ import dotty.tools.dotc.core.Constants
55

66
trait ConstantOpsImpl extends scala.tasty.reflect.ConstantOps with CoreImpl {
77

8-
def ConstantDeco(const: Constant): ConstantAPI = new ConstantAPI {
9-
def value: Any = const.value
10-
}
11-
128
object Constant extends ConstantModule {
139

1410
object Unit extends UnitModule {

compiler/src/dotty/tools/dotc/tastyreflect/ContextOpsImpl.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,4 @@ trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with CoreImpl {
44

55
val rootContext: Context
66

7-
def ContextDeco(ctx: Context): ContextAPI = new ContextAPI {
8-
def owner: Symbol = ctx.owner
9-
10-
def source: java.nio.file.Path = ctx.compilationUnit.source.file.jpath
11-
}
12-
137
}

compiler/src/dotty/tools/dotc/tastyreflect/FlagsOpsImpl.scala

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,8 @@
11
package dotty.tools.dotc
22
package tastyreflect
33

4-
import dotty.tools.dotc.core.Decorators._
5-
6-
import scala.tasty.reflect
7-
84
trait FlagsOpsImpl extends scala.tasty.reflect.FlagsOps with CoreImpl {
95

10-
def FlagsDeco(flagSet: Flags): FlagsAPI = new FlagsAPI {
11-
def is(that: Flags): Boolean = flagSet is that
12-
def |(that: Flags): Flags = flagSet | that
13-
def &(that: Flags): Flags = flagSet & that
14-
}
15-
166
object Flags extends FlagsModule {
177
def Private: Flags = core.Flags.Private
188
def Protected: Flags = core.Flags.Protected

compiler/src/dotty/tools/dotc/tastyreflect/IdOpsImpl.scala

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,6 @@ import dotty.tools.dotc.core.Decorators._
44

55
trait IdOpsImpl extends scala.tasty.reflect.IdOps with CoreImpl {
66

7-
def IdDeco(id: Id): IdAPI = new IdAPI {
8-
def pos(implicit ctx: Context): Position = id.sourcePos
9-
def name(implicit ctx: Context): String = id.name.toString
10-
}
11-
127
object Id extends IdModule {
138
def unapply(id: Id): Option[String] = Some(id.name.toString)
149
}

compiler/src/dotty/tools/dotc/tastyreflect/KernelImpl.scala

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,34 @@
11
package dotty.tools.dotc
22
package tastyreflect
33

4-
import dotty.tools.dotc.ast.{tpd, untpd}
4+
import dotty.tools.dotc.ast.{Trees, tpd, untpd}
55
import dotty.tools.dotc.core.Constants
66
import dotty.tools.dotc.core.Types
77

88
import scala.tasty.reflect.Kernel
99

1010
class KernelImpl extends Kernel {
11+
12+
//
13+
// CONTEXT
14+
//
15+
1116
type Context = core.Contexts.Context
1217

18+
def Context_owner(ctx: Context): Symbol = ctx.owner
19+
20+
def Context_source(ctx: Context): java.nio.file.Path = ctx.compilationUnit.source.file.jpath
21+
22+
//
23+
// Settings
24+
//
25+
1326
type Settings = config.ScalaSettings
1427

28+
//
29+
// TREES
30+
//
31+
1532
type TermOrTypeTree = tpd.Tree
1633

1734
type Tree = tpd.Tree
@@ -48,16 +65,59 @@ class KernelImpl extends Kernel {
4865
type Term_SelectOuter = tpd.Select
4966
type Term_While = tpd.WhileDo
5067

68+
//
69+
// CASES
70+
//
71+
5172
type CaseDef = tpd.CaseDef
73+
74+
def CaseDef_pattern(caseDef: CaseDef)(ctx: Context): Pattern = caseDef.pat
75+
def CaseDef_guard(caseDef: CaseDef)(ctx: Context): Option[Term] = optional(caseDef.guard)
76+
def CaseDef_rhs(caseDef: CaseDef)(ctx: Context): Term = caseDef.body
77+
5278
type TypeCaseDef = tpd.CaseDef
5379

80+
def TypeCaseDef_pattern(caseDef: TypeCaseDef)(ctx: Context): TypeTree = caseDef.pat
81+
def TypeCaseDef_rhs(caseDef: TypeCaseDef)(ctx: Context): TypeTree = caseDef.body
82+
83+
//
84+
// PATTERNS
85+
//
86+
5487
type Pattern = tpd.Tree
5588
type Value = tpd.Tree
89+
90+
def Pattern_Value_value(value: Value)(ctx: Context): Term = value
91+
5692
type Bind = tpd.Bind
93+
94+
def Pattern_Bind_name(bind: Bind)(ctx: Context): String = bind.name.toString
95+
96+
def Pattern_Bind_pattern(bind: Bind)(ctx: Context): Pattern = bind.body
97+
5798
type Unapply = tpd.UnApply
99+
100+
def Pattern_Unapply_fun(unapply: Unapply)(ctx: Context): Term = unapply.fun
101+
def Pattern_Unapply_implicits(unapply: Unapply)(ctx: Context): List[Term] = unapply.implicits
102+
def Pattern_Unapply_patterns(unapply: Unapply)(ctx: Context): List[Pattern] = effectivePatterns(unapply.patterns)
103+
104+
private def effectivePatterns(patterns: List[Pattern]): List[Pattern] = patterns match {
105+
case patterns0 :+ Trees.SeqLiteral(elems, _) => patterns0 ::: elems
106+
case _ => patterns
107+
}
108+
58109
type Alternatives = tpd.Alternative
110+
111+
def Pattern_Alternatives_patterns(alternatives: Alternatives)(ctx: Context): List[Pattern] = alternatives.trees
112+
59113
type TypeTest = tpd.Typed
60114

115+
def Pattern_TypeTest_tpt(typeTest: TypeTest)(ctx: Context): TypeTree = typeTest.tpt
116+
117+
//
118+
// TYPE TREES
119+
//
120+
61121
type TypeOrBoundsTree = tpd.Tree
62122
type TypeTree = tpd.Tree
63123
type TypeTree_Inferred = tpd.TypeTree
@@ -77,6 +137,10 @@ class KernelImpl extends Kernel {
77137
type TypeBoundsTree = tpd.TypeBoundsTree
78138
type WildcardType = tpd.TypeTree
79139

140+
//
141+
// TYPES
142+
//
143+
80144
type TypeOrBounds = Types.Type
81145
type NoPrefix = Types.NoPrefix.type
82146
type TypeBounds = Types.TypeBounds
@@ -102,16 +166,46 @@ class KernelImpl extends Kernel {
102166
type PolyType = Types.PolyType
103167
type TypeLambda = Types.TypeLambda
104168

169+
//
170+
// IMPORT SELECTORS
171+
//
172+
105173
type ImportSelector = untpd.Tree
106174

175+
//
176+
// IDENTIFIERS
177+
//
178+
107179
type Id = untpd.Ident
108180

181+
def Id_pos(id: Id)(ctx: Context): Position = id.sourcePos(ctx)
182+
183+
def Id_name(id: Id)(ctx: Context): String = id.name.toString
184+
185+
//
186+
// SIGNATURES
187+
//
188+
109189
type Signature = core.Signature
110190

191+
//
192+
// POSITIONS
193+
//
194+
111195
type Position = util.SourcePosition
112196

197+
//
198+
// CONSTANTS
199+
//
200+
113201
type Constant = Constants.Constant
114202

203+
final def Constant_value(const: Constant): Any = const.value
204+
205+
//
206+
// SYMBOLS
207+
//
208+
115209
type Symbol = core.Symbols.Symbol
116210
type PackageSymbol = core.Symbols.Symbol
117211
type ClassSymbol = core.Symbols.ClassSymbol
@@ -121,5 +215,26 @@ class KernelImpl extends Kernel {
121215
type ValSymbol = core.Symbols.TermSymbol
122216
type NoSymbol = core.Symbols.NoSymbol.type
123217

218+
//
219+
// FLAGS
220+
//
221+
124222
type Flags = core.Flags.FlagSet
223+
224+
/** Is the given flag set a subset of this flag sets */
225+
def Flags_is(self: Flags)(that: Flags): Boolean = self.is(that)
226+
227+
/** Union of the two flag sets */
228+
def Flags_or(self: Flags)(that: Flags): Flags = self | that
229+
230+
/** Intersection of the two flag sets */
231+
def Flags_and(self: Flags)(that: Flags): Flags = self & that
232+
233+
//
234+
// HELPERS
235+
//
236+
237+
private def optional[T <: Trees.Tree[_]](tree: T): Option[tree.type] =
238+
if (tree.isEmpty) None else Some(tree)
239+
125240
}

compiler/src/dotty/tools/dotc/tastyreflect/PatternOpsImpl.scala

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,6 @@ import dotty.tools.dotc.core.StdNames.nme
77

88
trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with RootPositionImpl {
99

10-
def ValueDeco(value: Value): Pattern.ValueAPI = new Pattern.ValueAPI {
11-
def value(implicit ctx: Context): Term = value
12-
}
13-
def BindDeco(bind: Bind): Pattern.BindAPI = new Pattern.BindAPI {
14-
def name(implicit ctx: Context): String = bind.name.toString
15-
def pattern(implicit ctx: Context): Pattern = bind.body
16-
}
17-
def UnapplyDeco(unapply: Unapply): Pattern.UnapplyAPI = new Pattern.UnapplyAPI {
18-
def fun(implicit ctx: Context): Term = unapply.fun
19-
def implicits(implicit ctx: Context): List[Term] = unapply.implicits
20-
def patterns(implicit ctx: Context): List[Pattern] = effectivePatterns(unapply.patterns)
21-
22-
private def effectivePatterns(patterns: List[Pattern]): List[Pattern] = patterns match {
23-
case patterns0 :+ Trees.SeqLiteral(elems, _) => patterns0 ::: elems
24-
case _ => patterns
25-
}
26-
}
27-
def AlternativeDeco(alternatives: Alternatives): Pattern.AlternativesAPI = new Pattern.AlternativesAPI {
28-
def patterns(implicit ctx: Context): List[Pattern] = alternatives.trees
29-
}
30-
def TypeTestDeco(typeTest: TypeTest): Pattern.TypeTestAPI = new Pattern.TypeTestAPI {
31-
def tpt(implicit ctx: Context): TypeTree = typeTest.tpt
32-
}
33-
34-
// ----- Patterns -------------------------------------------------
35-
3610
def PatternDeco(pattern: Pattern): PatternAPI = new PatternAPI {
3711
def pos(implicit ctx: Context): Position = pattern.sourcePos
3812
def tpe(implicit ctx: Context): Type = pattern.tpe.stripTypeVar
@@ -96,7 +70,7 @@ trait PatternOpsImpl extends scala.tasty.reflect.PatternOps with RootPositionImp
9670
withDefaultPos(ctx => tpd.cpy.UnApply(original)(fun, implicits, patterns)(ctx))
9771

9872
def unapply(x: Pattern)(implicit ctx: Context): Option[(Term, List[Term], List[Pattern])] = x match {
99-
case IsUnapply(x) => Some((x.fun, x.implicits, UnapplyDeco(x).patterns))
73+
case IsUnapply(x) => Some((x.fun, x.implicits, UnapplyAPI(x).patterns))
10074
case _ => None
10175
}
10276
}

library/src/scala/tasty/reflect/CaseDefOps.scala

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ package reflect
44
/** Tasty reflect case definition */
55
trait CaseDefOps extends Core {
66

7-
trait CaseDefAPI {
8-
def pattern(implicit ctx: Context): Pattern
9-
def guard(implicit ctx: Context): Option[Term]
10-
def rhs(implicit ctx: Context): Term
7+
implicit class CaseDefAPI(caseDef: CaseDef) {
8+
def pattern(implicit ctx: Context): Pattern = kernel.CaseDef_pattern(caseDef)(ctx)
9+
def guard(implicit ctx: Context): Option[Term] = kernel.CaseDef_guard(caseDef)(ctx)
10+
def rhs(implicit ctx: Context): Term = kernel.CaseDef_rhs(caseDef)(ctx)
1111
}
12-
implicit def CaseDefDeco(caseDef: CaseDef): CaseDefAPI
1312

1413
val CaseDef: CaseDefModule
1514
abstract class CaseDefModule {
@@ -22,11 +21,10 @@ trait CaseDefOps extends Core {
2221
}
2322

2423

25-
trait TypeCaseDefAPI {
26-
def pattern(implicit ctx: Context): TypeTree
27-
def rhs(implicit ctx: Context): TypeTree
24+
implicit class TypeCaseDefAPI(caseDef: TypeCaseDef) {
25+
def pattern(implicit ctx: Context): TypeTree = kernel.TypeCaseDef_pattern(caseDef)(ctx)
26+
def rhs(implicit ctx: Context): TypeTree = kernel.TypeCaseDef_rhs(caseDef)(ctx)
2827
}
29-
implicit def TypeCaseDefDeco(caseDef: TypeCaseDef): TypeCaseDefAPI
3028

3129
val TypeCaseDef: TypeCaseDefModule
3230
abstract class TypeCaseDefModule {

library/src/scala/tasty/reflect/ConstantOps.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ package reflect
33

44
trait ConstantOps extends Core {
55

6-
trait ConstantAPI {
7-
def value: Any
6+
implicit class ConstantAPI(const: Constant) {
7+
def value: Any = kernel.Constant_value(const)
88
}
9-
implicit def ConstantDeco(const: Constant): ConstantAPI
109

1110
/** Module of Constant literals */
1211
val Constant: ConstantModule

library/src/scala/tasty/reflect/ContextOps.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package reflect
33

44
trait ContextOps extends Core {
55

6-
trait ContextAPI {
7-
def owner: Symbol
6+
implicit class ContextAPI(ctx: Context) {
7+
/** Returns the owner of the context */
8+
def owner: Symbol = kernel.Context_owner(ctx)
89

910
/** Returns the source file being compiled. The path is relative to the current working directory. */
10-
def source: java.nio.file.Path
11+
def source: java.nio.file.Path = kernel.Context_source(ctx)
1112
}
12-
implicit def ContextDeco(ctx: Context): ContextAPI
1313

14+
/** Context of the macro expansion */
1415
implicit def rootContext: Context
1516

1617
}

library/src/scala/tasty/reflect/FlagsOps.scala

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@ package scala.tasty.reflect
22

33
trait FlagsOps extends Core {
44

5-
trait FlagsAPI {
5+
implicit class FlagsAPI(self: Flags) {
6+
67
/** Is the given flag set a subset of this flag sets */
7-
def is(flagSet: Flags): Boolean
8+
def is(that: Flags): Boolean = kernel.Flags_is(self)(that)
9+
810
/** Union of the two flag sets */
9-
def |(flagSet: Flags): Flags
11+
def |(that: Flags): Flags = kernel.Flags_or(self)(that)
12+
1013
/** Intersection of the two flag sets */
11-
def &(flagSet: Flags): Flags
14+
def &(that: Flags): Flags = kernel.Flags_and(self)(that)
15+
1216
}
13-
implicit def FlagsDeco(flagSet: Flags): FlagsAPI
1417

1518
val Flags: FlagsModule
1619
abstract class FlagsModule {

0 commit comments

Comments
 (0)