Skip to content

Commit d00f754

Browse files
committed
Fix #2760: Support defaults in Java annotations parsed from sources
1 parent 52bddff commit d00f754

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ object JavaParsers {
132132

133133
def makeSyntheticParam(count: Int, tpt: Tree): ValDef =
134134
makeParam(nme.syntheticParamName(count), tpt)
135-
def makeParam(name: TermName, tpt: Tree): ValDef =
136-
ValDef(name, tpt, EmptyTree).withMods(Modifiers(Flags.JavaDefined | Flags.ParamAccessor))
135+
def makeParam(name: TermName, tpt: Tree, defaultValue: Tree = EmptyTree): ValDef =
136+
ValDef(name, tpt, defaultValue).withMods(Modifiers(Flags.JavaDefined | Flags.ParamAccessor))
137137

138138
def makeConstructor(formals: List[Tree], tparams: List[TypeDef], flags: FlagSet = Flags.JavaDefined) = {
139139
val vparams = formals.zipWithIndex.map { case (p, i) => makeSyntheticParam(i + 1, p) }
@@ -772,7 +772,18 @@ object JavaParsers {
772772
val name = identForType()
773773
val (statics, body) = typeBody(AT, name, List())
774774
val constructorParams = body.collect {
775-
case dd: DefDef => makeParam(dd.name, dd.tpt)
775+
case dd: DefDef =>
776+
val hasDefault =
777+
dd.mods.annotations.exists {
778+
case Apply(Select(New(Select(_, tpnme.AnnotationDefaultATTR)), nme.CONSTRUCTOR), Nil) =>
779+
true
780+
case _ =>
781+
false
782+
}
783+
// If the annotation has a default value we don't need to parse it, providing
784+
// any value at all is enough to typecheck usages of annotations correctly.
785+
val defaultParam = if (hasDefault) unimplementedExpr else EmptyTree
786+
makeParam(dd.name, dd.tpt, defaultParam)
776787
}
777788
val constr = DefDef(nme.CONSTRUCTOR,
778789
List(), List(constructorParams), TypeTree(), EmptyTree).withMods(Modifiers(Flags.JavaDefined))
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
public @interface Fork {
2+
int value() default -1;
3+
int warmups() default -1;
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@Fork(value = 16) class Test

0 commit comments

Comments
 (0)