8000 Merge pull request #10016 from Jasper-M/backport-2.12/12565 · scala/scala@c850a83 · GitHub
[go: up one dir, main page]

Skip to content

Commit c850a83

Browse files
authored
Merge pull request #10016 from Jasper-M/backport-2.12/12565
Add synthetic constructors only to Java annotations
2 parents 5bd9520 + 1a33a74 commit c850a83

File tree

4 files changed

+27
-27
lines changed

4 files changed

+27
-27
lines changed

src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
7575
protected var classTParams = Map[Name,Symbol]()
7676
protected var srcfile0 : Option[AbstractFile] = None
7777
protected def moduleClass: Symbol = staticModule.moduleClass
78-
private var sawPrivateConstructor = false
7978

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

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

533532
in.bp = fieldsStartBp
534533
0 until u2 foreach (_ => parseField())
535-
sawPrivateConstructor = false
536534
0 until u2 foreach (_ => parseMethod())
537-
val needsConstructor = (
538-
!sawPrivateConstructor
539-
&& !(instanceScope containsName nme.CONSTRUCTOR)
540-
&& ((sflags & INTERFACE) == 0)
541-
)
535+
val needsConstructor = (sflags & JAVA_ANNOTATION) != 0
542536
if (needsConstructor)
543537
instanceScope enter clazz.newClassConstructor(NoPosition)
544538

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

604598
def parseMethod() {
605599
val jflags = readMethodFlags()
606-
val sflags = jflags.toScalaFlags
607600
if (jflags.isPrivate) {
608-
val isConstructor = pool.getName(u2).value == "<init>" // opt avoid interning a Name for private methods we're about to discard
609-
if (isConstructor)
610-
sawPrivateConstructor = true
611-
in.skip(2); skipAttributes()
601+
in.skip(4); skipAttributes()
612602
} else {
613-
if ((sflags & PRIVATE) != 0L) {
614-
in.skip(4); skipAttributes()
615-
} else {
616-
val name = readName()
617-
val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition, sflags)
618-
// Note: the info may be overwritten later with a generic signature
619-
// parsed from SignatureATTR
620-
val lazyInfo = new MemberTypeCompleter(name, jflags, pool.getExternalName(u2).value)
621-
sym.info = lazyInfo
622-
propagatePackageBoundary(jflags, sym)
623-
parseAttributes(sym, lazyInfo)
624-
addJavaFlagsAnnotations(sym, jflags)
625-
getScope(jflags) enter sym
626-
}
603+
val name = readName()
604+
val sflags = jflags.toScalaFlags
605+
val sym = ownerForFlags(jflags).newMethod(name.toTermName, NoPosition, sflags)
606+
// Note: the info may be overwritten later with a generic signature
607+
// parsed from SignatureATTR
608+
val lazyInfo = new MemberTypeCompleter(name, jflags, pool.getExternalName(u2).value)
609+
sym.info = lazyInfo
610+
propagatePackageBoundary(jflags, sym)
611+
parseAttributes(sym, lazyInfo)
612+
addJavaFlagsAnnotations(sym, jflags)
613+
getScope(jflags) enter sym
627614
}
628615
}
629616

src/compiler/scala/tools/nsc/typechecker/Typers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5066,7 +5066,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper
50665066
wrapErrors(t, (_.typed1(t, mode, pt)))
50675067
}
50685068

5069-
val sym = tree.symbol orElse member(qual.tpe, name) orElse inCompanionForJavaStatic(qual.symbol, name)
5069+
val sym = tree.symbol orElse member(qual.tpe, name) orElse inCompanionForJavaStatic(qual.tpe.typeSymbol, name)
50705070
if ((sym eq NoSymbol) && name != nme.CONSTRUCTOR && mode.inAny(EXPRmode | PATTERNmode)) {
50715071
// symbol not found? --> try to convert implicitly to a type that does have the required
50725072
// member. Added `| PATTERNmode` to allow enrichment in patterns (so we can add e.g., an

test/files/neg/t12565.check

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
t12565.scala:5: error: java.time.Instant does not have a constructor
2+
def f = new java.time.Instant
3+
^
4+
one error found

test/files/neg/t12565.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// scalac: -Xfatal-warnings -release 8
2+
// javaVersion: 9+
3+
4+
class C {
5+
def f = new java.time.Instant
6+
}
7+
object Test extends App {
8+
println(new C().f)
9+
}

0 commit comments

Comments
 (0)
0