Skip to content

ConstructingParser throws NoSuchMethodError in Scala 3 #541

Closed
@cayhorstmann

Description

@cayhorstmann

Save https://horstmann.com/unblog/2020-11-27/index.html to a local file and run

import java.io.File
import scala.xml.parsing.ConstructingParser
val filename="..."
val file = new File(filename)
val parser = ConstructingParser.fromFile(file, preserveWS = true)
val doc = parser.document().docElem

In Scala 2, this works perfectly. In Scala 3.0.0, an exception is thrown:

java.lang.NoSuchMethodError: 'scala.xml.parsing.MarkupParser scala.xml.parsing.MarkupParser$WithLookAhead.scala$xml$parsing$MarkupParser$WithLookAhead$$$outer()'
  at scala.xml.parsing.MarkupParser.lookahead(MarkupParser.scala:77)
  at scala.xml.parsing.MarkupParser.lookahead$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.lookahead(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParserCommon.peek(MarkupParserCommon.scala:267)
  at scala.xml.parsing.MarkupParserCommon.xTakeUntil(MarkupParserCommon.scala:249)
  at scala.xml.parsing.MarkupParserCommon.xTakeUntil$(MarkupParserCommon.scala:25)
  at scala.xml.parsing.ConstructingParser.xTakeUntil(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.xCharData(MarkupParser.scala:382)
  at scala.xml.parsing.MarkupParser.xCharData$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.xCharData(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content1(MarkupParser.scala:427)
  at scala.xml.parsing.MarkupParser.content1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content(MarkupParser.scala:462)
  at scala.xml.parsing.MarkupParser.content$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.element1(MarkupParser.scala:591)
  at scala.xml.parsing.MarkupParser.element1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.element1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content1(MarkupParser.scala:436)
  at scala.xml.parsing.MarkupParser.content1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content(MarkupParser.scala:462)
  at scala.xml.parsing.MarkupParser.content$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.element1(MarkupParser.scala:591)
  at scala.xml.parsing.MarkupParser.element1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.element1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content1(MarkupParser.scala:436)
  at scala.xml.parsing.MarkupParser.content1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content(MarkupParser.scala:462)
  at scala.xml.parsing.MarkupParser.content$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.element1(MarkupParser.scala:591)
  at scala.xml.parsing.MarkupParser.element1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.element1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content1(MarkupParser.scala:436)
  at scala.xml.parsing.MarkupParser.content1$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content1(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.content(MarkupParser.scala:462)
  at scala.xml.parsing.MarkupParser.content$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.content(ConstructingParser.scala:52)
  at scala.xml.parsing.MarkupParser.document(MarkupParser.scala:251)
  at scala.xml.parsing.MarkupParser.document$(MarkupParser.scala:33)
  at scala.xml.parsing.ConstructingParser.document(ConstructingParser.scala:52)

The offending code is

def lookahead(): BufferedIterator[Char] = curInput match {
    case curInputWLA: WithLookAhead =>
      curInputWLA.lookahead()

The library dependency in build.sbt:

libraryDependencies ++= Seq(
  "org.scala-lang.modules" %% "scala-xml" % "2.0.0",
)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions