Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Looking up some JDK symbols fails with JDK21 #3376

Closed
bjaglin opened this issue Oct 28, 2023 · 3 comments · Fixed by #3386
Closed

Looking up some JDK symbols fails with JDK21 #3376

bjaglin opened this issue Oct 28, 2023 · 3 comments · Fixed by #3386

Comments

@bjaglin
Copy link
Member

bjaglin commented Oct 28, 2023

Lookups that work with JDK20 do not work with JDK21:

scala.meta.internal.symtab.GlobalSymbolTable(scala.meta.Classpath(Nil), true).info("java/lang/System#lineSeparator().")
scala.meta.internal.symtab.GlobalSymbolTable(scala.meta.Classpath(Nil), true).info("java/nio/file/LinkOption#NOFOLLOW_LINKS.")
java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "$this" is null
  at scala.collection.StringOps$.head$extension(StringOps.scala:1124)
  at scala.meta.internal.semanticdb.Scala$Names$.encode(Scala.scala:181)
  at scala.meta.internal.semanticdb.Scala$Descriptor.toString(Scala.scala:147)
  at scala.meta.internal.semanticdb.Scala$Descriptor.toString$(Scala.scala:140)
  at scala.meta.internal.semanticdb.Scala$Descriptor$Parameter.toString(Scala.scala:158)
  at scala.meta.internal.semanticdb.Scala$Symbols$.Global(Scala.scala:14)
  at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$13(Javacp.scala:175)
  at scala.collection.immutable.List.map(List.scala:246)
  at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$9(Javacp.scala:169)
  at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
  at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
  at scala.collection.AbstractIterable.foreach(Iterable.scala:933)
  at scala.meta.internal.javacp.Javacp$.sinfos(Javacp.scala:135)
  at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$17(Javacp.scala:233)
  at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
  at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
  at scala.collection.AbstractIterable.foreach(Iterable.scala:933)
  at scala.meta.internal.javacp.Javacp$.sinfos(Javacp.scala:225)
  at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$17(Javacp.scala:233)
  at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
  at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
  at scala.collection.AbstractIterable.foreach(Iterable.scala:933)
  at scala.meta.internal.javacp.Javacp$.sinfos(Javacp.scala:225)
  at scala.meta.internal.javacp.Javacp$.parse(Javacp.scala:26)
  at scala.meta.internal.metacp.ClassfileInfos$.fromClassNode(ClassfileInfos.scala:55)
  at scala.meta.internal.symtab.GlobalSymbolTable.loadSymbol(GlobalSymbolTable.scala:39)
  at scala.meta.internal.symtab.GlobalSymbolTable.info(GlobalSymbolTable.scala:70)
  ... 57 elided

Found through scalacenter/scalafix#1810

@bjaglin
Copy link
Member Author

bjaglin commented Oct 28, 2023

The current test suite does exhibit the problem

scala.meta.tests.symtab.SymbolTableSuite:
  + _empty_/ 0.001s
  + _root_/ 0.0s
==> X scala.meta.tests.symtab.SymbolTableSuite.java/util/ArrayList#size.  0.006s java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because "$this" is null
    at scala.collection.StringOps$.head$extension(StringOps.scala:1124)
    at scala.meta.internal.semanticdb.Scala$Names$.encode(Scala.scala:181)
    at scala.meta.internal.semanticdb.Scala$Descriptor.toString(Scala.scala:147)
    at scala.meta.internal.semanticdb.Scala$Descriptor.toString$(Scala.scala:140)
    at scala.meta.internal.semanticdb.Scala$Descriptor$Parameter.toString(Scala.scala:158)
    at scala.meta.internal.semanticdb.Scala$Symbols$.Global(Scala.scala:14)
    at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$13(Javacp.scala:175)
    at scala.collection.immutable.List.map(List.scala:246)
    at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$9(Javacp.scala:169)
    at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
    at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:933)
    at scala.meta.internal.javacp.Javacp$.sinfos(Javacp.scala:135)
    at scala.meta.internal.javacp.Javacp$.$anonfun$sinfos$17(Javacp.scala:233)
    at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:576)
    at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:574)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:933)
    at scala.meta.internal.javacp.Javacp$.sinfos(Javacp.scala:225)
    at scala.meta.internal.javacp.Javacp$.parse(Javacp.scala:26)
    at scala.meta.internal.metacp.ClassfileInfos$.fromClassNode(ClassfileInfos.scala:55)
    at scala.meta.internal.symtab.GlobalSymbolTable.loadSymbol(GlobalSymbolTable.scala:39)
    at scala.meta.internal.symtab.GlobalSymbolTable.info(GlobalSymbolTable.scala:70)
    at scala.meta.tests.symtab.SymbolTableSuite.$anonfun$check$1(SymbolTableSuite.scala:29)

https://github.com/scalameta/scalameta/actions/runs/6675947301/job/18144511902?pr=3377

@bjaglin
Copy link
Member Author

bjaglin commented Oct 28, 2023

With JDK<21, method.node.parameters is null for java/util/ArrayList#ListItr#`<init>`(). and java/nio/file/LinkOption#valueOf()., while for JDK21, it's a non-empty list with null-name parameter(s), which causes the failure as all methods get scanned to populate the symtab.

java/lang/System#Logger#Level#valueOf(). (JDK21 only) also has a non-empty method.node.parameters with a null-name parameter, so the 3 symbols seem to have the same failure mode.

import scala.meta.internal.metacp._
scala.meta.internal.classpath.ClasspathIndex(scala.meta.Classpath(Nil), true).getClassfile("java/util/ArrayList$ListItr.class").get.toClassNode.methods.get(0).parameters

From there, I am not sure what to do...

@SethTisue
Copy link
Contributor

SethTisue commented Nov 6, 2023

seems reminiscent of scala/bug#12783 (fixed by scala/scala#10397)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants