Skip to content

Commit 172cc48

Browse files
authored
Add tailrec annotations wherever possible (#945)
IntelliJ has a button for adding `@tailrec` wherever needed. So I clicked it. Let's see what happens now!
1 parent 8f9f5f0 commit 172cc48

File tree

8 files changed

+15
-1
lines changed

8 files changed

+15
-1
lines changed

effekt/jvm/src/main/scala/effekt/util/PathUtils.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ object paths extends PathUtils {
4444
implicit def file(uri: URI): File = file(uri.getPath)
4545
implicit def file(filepath: String) =
4646
if (filepath.startsWith("file:"))
47-
file(new URI(filepath).getPath)
47+
file(new URI(filepath))
4848
else
4949
file(new JFile(filepath))
5050
}

effekt/shared/src/main/scala/effekt/Namer.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import effekt.util.messages.ErrorMessageReifier
1313
import effekt.symbols.scopes.*
1414
import effekt.source.FeatureFlag.supportedByFeatureFlags
1515

16+
import scala.annotation.tailrec
1617
import scala.util.DynamicVariable
1718

1819
/**
@@ -944,6 +945,7 @@ trait NamerOps extends ContextOps { Context: Context =>
944945
* 2) If the tighest scope contains blocks, then we will ignore all values
945946
* and resolve to an overloaded target.
946947
*/
948+
@tailrec
947949
private def resolveFunctionCalltarget(id: IdRef, candidates: List[Set[TermSymbol]]): Either[TermSymbol, List[Set[BlockSymbol]]] =
948950

949951
// Mutable variables are treated as values, not as blocks. Maybe we should change the representation.

effekt/shared/src/main/scala/effekt/core/optimizer/Normalizer.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ object Normalizer { normal =>
125125
* A good testcase to look at for this is:
126126
* examples/pos/capture/regions.effekt
127127
*/
128+
@tailrec
128129
private def active[R](b: Block)(using C: Context): NormalizedBlock =
129130
normalize(b) match {
130131
case b: Block.BlockLit => NormalizedBlock.Known(b, None)

effekt/shared/src/main/scala/effekt/core/vm/VM.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ class Interpreter(instrumentation: Instrumentation, runtime: Runtime) {
205205
stack match {
206206
case Stack.Empty => ???
207207
case Stack.Segment(frames, prompt, rest) =>
208+
@tailrec
208209
def go(frames: List[Frame], acc: List[Frame]): Stack =
209210
frames match {
210211
case Nil =>

effekt/shared/src/main/scala/effekt/generator/llvm/Transformer.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import effekt.util.intercalate
77
import effekt.util.messages.ErrorReporter
88
import effekt.machine.analysis.*
99

10+
import scala.annotation.tailrec
1011
import scala.collection.mutable
1112

1213
object Transformer {
@@ -633,6 +634,7 @@ object Transformer {
633634
}
634635

635636
def shareValues(values: machine.Environment, freeInBody: Set[machine.Variable])(using FunctionContext, BlockContext): Unit = {
637+
@tailrec
636638
def loop(values: machine.Environment): Unit = {
637639
values match {
638640
case Nil => ()

effekt/shared/src/main/scala/effekt/source/Tree.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ package source
44
import effekt.context.Context
55
import effekt.symbols.Symbol
66

7+
import scala.annotation.tailrec
8+
79
/**
810
* Data type representing source program trees.
911
*
@@ -125,6 +127,7 @@ enum FeatureFlag extends Tree {
125127
}
126128
object FeatureFlag {
127129
extension (self: List[ExternBody]) {
130+
@tailrec
128131
def supportedByFeatureFlags(names: List[String]): Boolean = names match {
129132
case Nil => false
130133
case name :: other =>

effekt/shared/src/main/scala/effekt/symbols/Scope.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package symbols
44
import effekt.source.IdRef
55
import effekt.util.messages.ErrorReporter
66

7+
import scala.annotation.tailrec
78
import scala.collection.mutable
89

910
/**
@@ -100,6 +101,7 @@ object scopes {
100101

101102
case class Scoping(modulePath: List[String], var scope: Scope) {
102103
def importAs(imports: Bindings, path: List[String])(using E: ErrorReporter): Unit =
104+
@tailrec
103105
def go(path: List[String], in: Namespace): Unit = path match {
104106
case pathSeg :: rest => go(rest, in.getNamespace(pathSeg))
105107
case Nil => in.importAll(imports)

effekt/shared/src/main/scala/effekt/util/Structural.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package effekt
22
package util
33

4+
import scala.annotation.tailrec
45
import scala.quoted.*
56

67
/**
@@ -128,6 +129,7 @@ class StructuralMacro[Self: Type, Q <: Quotes](debug: Boolean)(using val q: Q) {
128129
val self = TypeRepr.of[Self].typeSymbol
129130

130131
val rewriteMethod =
132+
@tailrec
131133
def findMethod(sym: Symbol): Symbol =
132134
if (sym.isDefDef && !sym.isAnonymousFunction) sym else findMethod(sym.owner)
133135

@@ -145,6 +147,7 @@ class StructuralMacro[Self: Type, Q <: Quotes](debug: Boolean)(using val q: Q) {
145147
val rewrites: List[RewriteMethod] = self.methodMember(rewriteName).map { m =>
146148
TypeRepr.of[Self].memberType(m) match {
147149
case tpe: MethodType =>
150+
@tailrec
148151
def findResult(tpe: TypeRepr): TypeRepr = tpe match {
149152
case tpe: LambdaType => findResult(tpe.resType)
150153
case _ => tpe

0 commit comments

Comments
 (0)