Skip to content

Commit d0f7846

Browse files
authored
Merge pull request #4443 from ingarabr/compiler-messages
Improve compiler messages
2 parents 4ca71e0 + e063257 commit d0f7846

File tree

10 files changed

+170
-151
lines changed

10 files changed

+170
-151
lines changed

compiler/src/dotty/tools/backend/jvm/GenBCode.scala

+8-17
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,32 @@ import dotty.tools.dotc.CompilationUnit
44
import dotty.tools.dotc.ast.Trees.{PackageDef, ValDef}
55
import dotty.tools.dotc.ast.tpd
66
import dotty.tools.dotc.core.Phases.Phase
7-
import dotty.tools.dotc.core.Names.TypeName
87

98
import scala.collection.mutable
10-
import scala.collection.JavaConverters._
11-
import scala.tools.asm.{ClassVisitor, CustomAttr, FieldVisitor, MethodVisitor}
9+
import scala.tools.asm.CustomAttr
1210
import scala.tools.nsc.backend.jvm._
13-
import dotty.tools.dotc
14-
import dotty.tools.dotc.transform.Erasure
1511
import dotty.tools.dotc.transform.SymUtils._
1612
import dotty.tools.dotc.interfaces
1713
import java.util.Optional
1814

19-
import scala.reflect.ClassTag
2015
import dotty.tools.dotc.core._
2116
import dotty.tools.dotc.sbt.ExtractDependencies
22-
import Periods._
23-
import SymDenotations._
2417
import Contexts._
25-
import Types._
2618
import Symbols._
27-
import Denotations._
2819
import Decorators._
2920

30-
import Phases._
31-
import java.lang.AssertionError
32-
import java.io.{DataOutputStream, File => JFile}
33-
import java.nio.file.{Files, FileSystem, FileSystems, Path => JPath}
21+
import java.io.DataOutputStream
3422

35-
import dotty.tools.io.{Directory, File, Jar}
23+
import dotty.tools.io.Directory
3624

3725
import scala.tools.asm
3826
import scala.tools.asm.tree._
39-
import dotty.tools.dotc.util.{DotClass, Positions}
4027
import tpd._
4128
import StdNames._
4229
import dotty.tools.io._
4330

4431
class GenBCode extends Phase {
45-
def phaseName: String = "genBCode"
32+
def phaseName: String = GenBCode.name
4633
private val entryPoints = new mutable.HashSet[Symbol]()
4734
def registerEntryPoint(sym: Symbol) = entryPoints += sym
4835

@@ -80,6 +67,10 @@ class GenBCode extends Phase {
8067
}
8168
}
8269

70+
object GenBCode {
71+
val name: String = "genBCode"
72+
}
73+
8374
class GenBCodePipeline(val entryPoints: List[Symbol], val int: DottyBackendInterface)(implicit val ctx: Context) extends BCodeSyncAndTry {
8475

8576
var tree: Tree = _

compiler/src/dotty/tools/dotc/reporting/diagnostic/ErrorMessageID.java

+1
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public enum ErrorMessageID {
129129
JavaSymbolIsNotAValueID,
130130
DoubleDeclarationID,
131131
MatchCaseOnlyNullWarningID,
132+
ImportRenamedTwiceID,
132133
;
133134

134135
public int errorNumber() {

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

+14-2
Original file line numberDiff line numberDiff line change
@@ -1825,10 +1825,15 @@ object messages {
18251825
}
18261826
}
18271827

1828-
case class TailrecNotApplicable(method: Symbol)(implicit ctx: Context)
1828+
case class TailrecNotApplicable(symbol: Symbol)(implicit ctx: Context)
18291829
extends Message(TailrecNotApplicableID) {
18301830
val kind = "Syntax"
1831-
val msg = hl"TailRec optimisation not applicable, $method is neither ${"private"} nor ${"final"}."
1831+
val symbolKind = symbol.showKind
1832+
val msg =
1833+
if (symbol.is(Method))
1834+
hl"TailRec optimisation not applicable, $symbol is neither ${"private"} nor ${"final"}."
1835+
else
1836+
hl"TailRec optimisation not applicable, ${symbolKind} isn't a method."
18321837
val explanation =
18331838
hl"A method annotated ${"@tailrec"} must be declared ${"private"} or ${"final"} so it can't be overridden."
18341839
}
@@ -2105,4 +2110,11 @@ object messages {
21052110
}
21062111
val explanation = ""
21072112
}
2113+
2114+
case class ImportRenamedTwice(ident: untpd.Ident)(implicit ctx: Context) extends Message(ImportRenamedTwiceID) {
2115+
val kind = "Syntax"
2116+
val msg: String = s"${ident.show} is renamed twice on the same import line."
2117+
val explanation: String = ""
2118+
}
2119+
21082120
}

compiler/src/dotty/tools/dotc/transform/CheckStatic.scala

+5-15
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,12 @@ package dotty.tools.dotc
22
package transform
33

44
import core._
5-
import Names._
6-
import StdNames.nme
7-
import Types._
85
import dotty.tools.dotc.transform.MegaPhase._
9-
import ast.Trees._
106
import Flags._
117
import Contexts.Context
128
import Symbols._
13-
import Constants._
14-
import Denotations._
15-
import SymDenotations._
16-
import Decorators.StringInterpolators
179
import dotty.tools.dotc.ast.tpd
18-
import dotty.tools.dotc.core.Annotations.ConcreteAnnotation
19-
import scala.collection.mutable
20-
import DenotTransformers._
21-
import Names.Name
22-
import NameOps._
2310
import Decorators._
24-
import TypeUtils._
2511
import reporting.diagnostic.messages.{MissingCompanionForStatic, StaticFieldsOnlyAllowedInObjects}
2612

2713
/** A transformer that check that requirements of Static fields\methods are implemented:
@@ -39,7 +25,7 @@ import reporting.diagnostic.messages.{MissingCompanionForStatic, StaticFieldsOnl
3925
class CheckStatic extends MiniPhase {
4026
import ast.tpd._
4127

42-
override def phaseName = "checkStatic"
28+
override def phaseName = CheckStatic.name
4329

4430
override def transformTemplate(tree: tpd.Template)(implicit ctx: Context): tpd.Tree = {
4531
val defns = tree.body.collect{case t: ValOrDefDef => t}
@@ -91,3 +77,7 @@ class CheckStatic extends MiniPhase {
9177
} else tree
9278
}
9379
}
80+
81+
object CheckStatic {
82+
val name = "checkStatic"
83+
}

compiler/src/dotty/tools/dotc/transform/PostTyper.scala

+6-11
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,14 @@ package dotty.tools.dotc
22
package transform
33

44
import dotty.tools.dotc.ast.{Trees, tpd, untpd}
5-
import scala.collection.{ mutable, immutable }
6-
import ValueClasses._
7-
import scala.annotation.tailrec
5+
import scala.collection.mutable
86
import core._
9-
import typer.ErrorReporting._
107
import typer.Checking
11-
import Types._, Contexts._, Constants._, Names._, NameOps._, Flags._, DenotTransformers._
12-
import SymDenotations._, Symbols._, StdNames._, Annotations._, Trees._, Scopes._, Denotations._
13-
import util.Positions._
8+
import Types._, Contexts._, Names._, Flags._, DenotTransformers._
9+
import SymDenotations._, StdNames._, Annotations._, Trees._
1410
import Decorators._
15-
import config.Printers.typr
16-
import Symbols._, TypeUtils._, SymUtils._
17-
import reporting.diagnostic.messages.{NotAMember, SuperCallsNotAllowedInline}
11+
import Symbols._, SymUtils._
12+
import reporting.diagnostic.messages.{ImportRenamedTwice, NotAMember, SuperCallsNotAllowedInline}
1813

1914
object PostTyper {
2015
val name = "posttyper"
@@ -293,7 +288,7 @@ class PostTyper extends MacroTransform with IdentityDenotTransformer { thisPhase
293288
if (name != nme.WILDCARD && !exprTpe.member(name).exists && !exprTpe.member(name.toTypeName).exists)
294289
ctx.error(NotAMember(exprTpe, name, "value"), ident.pos)
295290
if (seen(ident.name))
296-
ctx.error(s"${ident.show} is renamed twice", ident.pos)
291+
ctx.error(ImportRenamedTwice(ident), ident.pos)
297292
seen += ident.name
298293
}
299294
selectors.foreach {

compiler/src/dotty/tools/dotc/transform/TailRec.scala

-5
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import ast.{TreeTypeMap, tpd}
66
import core._
77
import Contexts.Context
88
import Decorators._
9-
import DenotTransformers.IdentityDenotTransformer
10-
import Denotations.SingleDenotation
119
import Symbols._
1210
import Types._
1311
import NameKinds.TailLabelName
@@ -161,9 +159,6 @@ class TailRec extends MiniPhase with FullParameterization {
161159
case d: DefDef if d.symbol.hasAnnotation(defn.TailrecAnnot) || methodsWithInnerAnnots.contains(d.symbol) =>
162160
ctx.error(TailrecNotApplicable(sym), sym.pos)
163161
d
164-
case d if d.symbol.hasAnnotation(defn.TailrecAnnot) || methodsWithInnerAnnots.contains(d.symbol) =>
165-
ctx.error("TailRec optimisation not applicable, not a method", sym.pos)
166-
d
167162
case _ => tree
168163
}
169164

compiler/src/dotty/tools/dotc/typer/Checking.scala

+4-9
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,25 @@ import ast._
77
import Contexts._
88
import Types._
99
import Flags._
10-
import Denotations._
1110
import Names._
1211
import StdNames._
13-
import NameOps._
1412
import Symbols._
1513
import Trees._
1614
import TreeInfo._
1715
import ProtoTypes._
18-
import Constants._
19-
import Scopes._
2016
import CheckRealizable._
2117
import ErrorReporting.errorTree
2218

23-
import annotation.unchecked
2419
import util.Positions._
25-
import util.Stats
26-
import util.common._
2720
import transform.SymUtils._
2821
import Decorators._
29-
import Uniques._
3022
import ErrorReporting.{err, errorType}
3123
import config.Printers.typr
3224
import NameKinds.DefaultGetterName
3325

3426
import collection.mutable
3527
import SymDenotations.{NoCompleter, NoDenotation}
36-
import dotty.tools.dotc.reporting.diagnostic.{ErrorMessageID, Message}
28+
import dotty.tools.dotc.reporting.diagnostic.Message
3729
import dotty.tools.dotc.reporting.diagnostic.messages._
3830
import dotty.tools.dotc.transform.ValueClasses._
3931

@@ -358,6 +350,9 @@ object Checking {
358350
fail(AbstractOverrideOnlyInTraits(sym))
359351
if (sym.is(Trait) && sym.is(Final))
360352
fail(TraitsMayNotBeFinal(sym))
353+
// Skip ModuleVal since the annotation will also be on the ModuleClass
354+
if (sym.hasAnnotation(defn.TailrecAnnot) && !sym.is(Method | ModuleVal))
355+
fail(TailrecNotApplicable(sym))
361356
if (sym.hasAnnotation(defn.NativeAnnot)) {
362357
if (!sym.is(Deferred))
363358
fail(NativeMembersMayNotHaveImplementation(sym))

compiler/src/dotty/tools/dotc/typer/FrontEnd.scala

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import ast.Trees._
1515

1616
class FrontEnd extends Phase {
1717

18-
override def phaseName = "frontend"
18+
override def phaseName = FrontEnd.name
1919
override def isTyper = true
2020
import ast.tpd
2121

@@ -103,3 +103,7 @@ class FrontEnd extends Phase {
103103
typeCheck
104104
}
105105
}
106+
107+
object FrontEnd {
108+
val name = "frontend"
109+
}

compiler/src/dotty/tools/dotc/typer/RefChecks.scala

+7-8
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ package typer
33

44
import transform._
55
import core._
6-
import config._
7-
import Symbols._, SymDenotations._, Types._, Contexts._, Decorators._, Flags._, Names._, NameOps._
8-
import StdNames._, Denotations._, Scopes._, Constants.Constant, SymUtils._
6+
import Symbols._, Types._, Contexts._, Flags._, Names._, NameOps._
7+
import StdNames._, Denotations._, SymUtils._
98
import NameKinds.DefaultGetterName
109
import Annotations._
1110
import util.Positions._
@@ -16,17 +15,17 @@ import Trees._
1615
import MegaPhase._
1716
import config.Printers.{checks, noPrinter}
1817
import util.DotClass
19-
import scala.util.{Try, Success, Failure}
20-
import config.{ScalaVersion, NoScalaVersion}
18+
import scala.util.Failure
19+
import config.NoScalaVersion
2120
import Decorators._
2221
import typer.ErrorReporting._
23-
import DenotTransformers._
2422

2523
object RefChecks {
2624
import tpd._
27-
import reporting.diagnostic.Message
2825
import reporting.diagnostic.messages._
2926

27+
val name = "refchecks"
28+
3029
private val defaultMethodFilter = new NameFilter {
3130
def apply(pre: Type, name: Name)(implicit ctx: Context): Boolean = name.is(DefaultGetterName)
3231
}
@@ -910,7 +909,7 @@ class RefChecks extends MiniPhase { thisPhase =>
910909
import reporting.diagnostic.messages.ForwardReferenceExtendsOverDefinition
911910
import dotty.tools.dotc.reporting.diagnostic.messages.UnboundPlaceholderParameter
912911

913-
override def phaseName: String = "refchecks"
912+
override def phaseName: String = RefChecks.name
914913

915914
// Needs to run after ElimRepeated for override checks involving varargs methods
916915
override def runsAfter = Set(ElimRepeated.name)

0 commit comments

Comments
 (0)