Skip to content

Commit c40f573

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

File tree

10 files changed

+146
-55
lines changed

10 files changed

+146
-55
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/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: 91 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,36 @@ 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)(implicit ctx: Context): TypeTree = caseDef.pat
81+
def TypeCaseDef_rhs(caseDef: TypeCaseDef)(implicit ctx: Context): TypeTree = caseDef.body
82+
83+
//
84+
// PATTERNS
85+
//
86+
5487
type Pattern = tpd.Tree
5588
type Value = tpd.Tree
5689
type Bind = tpd.Bind
5790
type Unapply = tpd.UnApply
5891
type Alternatives = tpd.Alternative
5992
type TypeTest = tpd.Typed
6093

94+
//
95+
// TYPE TREES
96+
//
97+
6198
type TypeOrBoundsTree = tpd.Tree
6299
type TypeTree = tpd.Tree
63100
type TypeTree_Inferred = tpd.TypeTree
@@ -77,6 +114,10 @@ class KernelImpl extends Kernel {
77114
type TypeBoundsTree = tpd.TypeBoundsTree
78115
type WildcardType = tpd.TypeTree
79116

117+
//
118+
// TYPES
119+
//
120+
80121
type TypeOrBounds = Types.Type
81122
type NoPrefix = Types.NoPrefix.type
82123
type TypeBounds = Types.TypeBounds
@@ -102,16 +143,44 @@ class KernelImpl extends Kernel {
102143
type PolyType = Types.PolyType
103144
type TypeLambda = Types.TypeLambda
104145

146+
//
147+
// IMPORT SELECTORS
148+
//
149+
105150
type ImportSelector = untpd.Tree
106151

152+
//
153+
// IDENTIFIERS
154+
//
155+
107156
type Id = untpd.Ident
108157

158+
def Id_pos(id: Id)(ctx: Context): Position = id.sourcePos(ctx)
159+
160+
def Id_name(id: Id)(ctx: Context): String = id.name.toString
161+
162+
//
163+
// SIGNATURES
164+
//
165+
109166
type Signature = core.Signature
110167

168+
//
169+
// POSITIONS
170+
//
171+
111172
type Position = util.SourcePosition
112173

174+
//
175+
// CONSTANTS
176+
//
177+
113178
type Constant = Constants.Constant
114179

180+
//
181+
// SYMBOLS
182+
//
183+
115184
type Symbol = core.Symbols.Symbol
116185
type PackageSymbol = core.Symbols.Symbol
117186
type ClassSymbol = core.Symbols.ClassSymbol
@@ -121,5 +190,26 @@ class KernelImpl extends Kernel {
121190
type ValSymbol = core.Symbols.TermSymbol
122191
type NoSymbol = core.Symbols.NoSymbol.type
123192

193+
//
194+
// FLAGS
195+
//
196+
124197
type Flags = core.Flags.FlagSet
198+
199+
/** Is the given flag set a subset of this flag sets */
200+
def Flags_is(self: Flags)(that: Flags): Boolean = self.is(that)
201+
202+
/** Union of the two flag sets */
203+
def Flags_or(self: Flags)(that: Flags): Flags = self | that
204+
205+
/** Intersection of the two flag sets */
206+
def Flags_and(self: Flags)(that: Flags): Flags = self & that
207+
208+
//
209+
// HELPERS
210+
//
211+
212+
private def optional[T <: Trees.Tree[_]](tree: T): Option[tree.type] =
213+
if (tree.isEmpty) None else Some(tree)
214+
125215
}

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 CaseDefDeco(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 TypeCaseDefDeco(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/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 ContextDeco(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 FlagsDeco(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 {

library/src/scala/tasty/reflect/IdOps.scala

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

44
trait IdOps extends Core {
55

6-
trait IdAPI {
6+
implicit class IdDeco(id: Id) {
7+
78
/** Position in the source code */
8-
def pos(implicit ctx: Context): Position
9-
def name(implicit ctx: Context): String
9+
def pos(implicit ctx: Context): Position = kernel.Id_pos(id)(ctx)
10+
11+
/** Name of the identifier */
12+
def name(implicit ctx: Context): String = kernel.Id_name(id)(ctx)
13+
1014
}
11-
implicit def IdDeco(id: Id): IdAPI
1215

1316
val Id: IdModule
1417
abstract class IdModule {

library/src/scala/tasty/reflect/Kernel.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ trait Kernel {
122122
/** Compilation context */
123123
type Context <: AnyRef
124124

125+
/** Returns the owner of the context */
126+
def Context_owner(ctx: Context): Symbol
127+
128+
/** Returns the source file being compiled. The path is relative to the current working directory. */
129+
def Context_source(ctx: Context): java.nio.file.Path
130+
125131
//
126132
// Settings
127133
//
@@ -243,9 +249,16 @@ trait Kernel {
243249
/** Branch of a pattern match or catch clause */
244250
type CaseDef <: AnyRef
245251

252+
def CaseDef_pattern(caseDef: CaseDef)(ctx: Context): Pattern
253+
def CaseDef_guard(caseDef: CaseDef)(ctx: Context): Option[Term]
254+
def CaseDef_rhs(caseDef: CaseDef)(ctx: Context): Term
255+
246256
/** Branch of a type pattern match */
247257
type TypeCaseDef <: AnyRef
248258

259+
def TypeCaseDef_pattern(caseDef: TypeCaseDef)(implicit ctx: Context): TypeTree
260+
def TypeCaseDef_rhs(caseDef: TypeCaseDef)(implicit ctx: Context): TypeTree
261+
249262
//
250263
// PATTERNS
251264
//
@@ -422,6 +435,12 @@ trait Kernel {
422435
/** Untyped identifier */
423436
type Id <: AnyRef
424437

438+
/** Position in the source code */
439+
def Id_pos(id: Id)(ctx: Context): Position
440+
441+
/** Name of the identifier */
442+
def Id_name(id: Id)(ctx: Context): String
443+
425444
//
426445
// SIGNATURES
427446
//
@@ -480,4 +499,13 @@ trait Kernel {
480499
/** FlagSet of a Symbol */
481500
type Flags
482501

502+
/** Is the given flag set a subset of this flag sets */
503+
def Flags_is(self: Flags)(that: Flags): Boolean
504+
505+
/** Union of the two flag sets */
506+
def Flags_or(self: Flags)(that: Flags): Flags
507+
508+
/** Intersection of the two flag sets */
509+
def Flags_and(self: Flags)(that: Flags): Flags
510+
483511
}

0 commit comments

Comments
 (0)