Skip to content

Commit

Permalink
Merge pull request #10016 from Jasper-M/backport-2.12/12565
Browse files Browse the repository at this point in the history
Add synthetic constructors only to Java annotations
  • Loading branch information
lrytz committed May 10, 2022
2 parents 5bd9520 + 1a33a74 commit c850a83
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 27 deletions.
39 changes: 13 additions & 26 deletions src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
protected var classTParams = Map[Name,Symbol]()
protected var srcfile0 : Option[AbstractFile] = None
protected def moduleClass: Symbol = staticModule.moduleClass
private var sawPrivateConstructor = false

private def ownerForFlags(jflags: JavaAccFlags) = if (jflags.isStatic) moduleClass else clazz

Expand Down Expand Up @@ -532,13 +531,8 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {

in.bp = fieldsStartBp
0 until u2 foreach (_ => parseField())
sawPrivateConstructor = false
0 until u2 foreach (_ => parseMethod())
val needsConstructor = (
!sawPrivateConstructor
&& !(instanceScope containsName nme.CONSTRUCTOR)
&& ((sflags & INTERFACE) == 0)
)
val needsConstructor = (sflags & JAVA_ANNOTATION) != 0
if (needsConstructor)
instanceScope enter clazz.newClassConstructor(NoPosition)

Expand Down Expand Up @@ -603,27 +597,20 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {

def parseMethod() {
val jflags = readMethodFlags()
val sflags = jflags.toScalaFlags
if (jflags.isPrivate) {
val isConstructor = pool.getName(u2).value == "<init>" // opt avoid interning a Name for private methods we're about to discard
if (isConstructor)
sawPrivateConstructor = true
in.skip(2); skipAttributes()
in.skip(4); skipAttributes()
} else {
if ((sflags & PRIVATE) != 0L) {
in.skip(4); skipAttributes()
} else {
val name = readName()
val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition, sflags)
// Note: the info may be overwritten later with a generic signature
// parsed from SignatureATTR
val lazyInfo = new MemberTypeCompleter(name, jflags, pool.getExternalName(u2).value)
sym.info = lazyInfo
propagatePackageBoundary(jflags, sym)
parseAttributes(sym, lazyInfo)
addJavaFlagsAnnotations(sym, jflags)
getScope(jflags) enter sym
}
val name = readName()
val sflags = jflags.toScalaFlags
val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition, sflags)
// Note: the info may be overwritten later with a generic signature
// parsed from SignatureATTR
val lazyInfo = new MemberTypeCompleter(name, jflags, pool.getExternalName(u2).value)
sym.info = lazyInfo
propagatePackageBoundary(jflags, sym)
parseAttributes(sym, lazyInfo)
addJavaFlagsAnnotations(sym, jflags)
getScope(jflags) enter sym
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/typechecker/Typers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5066,7 +5066,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
wrapErrors(t, (_.typed1(t, mode, pt)))
}

val sym = tree.symbol orElse member(qual.tpe, name) orElse inCompanionForJavaStatic(qual.symbol, name)
val sym = tree.symbol orElse member(qual.tpe, name) orElse inCompanionForJavaStatic(qual.tpe.typeSymbol, name)
if ((sym eq NoSymbol) && name != nme.CONSTRUCTOR && mode.inAny(EXPRmode | PATTERNmode)) {
// symbol not found? --> try to convert implicitly to a type that does have the required
// member. Added `| PATTERNmode` to allow enrichment in patterns (so we can add e.g., an
Expand Down
4 changes: 4 additions & 0 deletions test/files/neg/t12565.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
t12565.scala:5: error: java.time.Instant does not have a constructor
def f = new java.time.Instant
^
one error found
9 changes: 9 additions & 0 deletions test/files/neg/t12565.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// scalac: -Xfatal-warnings -release 8
// javaVersion: 9+

class C {
def f = new java.time.Instant
}
object Test extends App {
println(new C().f)
}

0 comments on commit c850a83

Please sign in to comment.