diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/Main.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/Main.scala index 70354765f93c..1a1773946425 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/Main.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/Main.scala @@ -22,7 +22,7 @@ private object Frontend { programName("rubysrc2cpg"), opt[Unit]("enableDependencyDownload") .hidden() - .action((_, c) => c.withEnableDependencyDownload(false)) + .action((_, c) => c.withEnableDependencyDownload(true)) .text("enable dependency download for Unix System only") ) } diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AntlrParser.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AntlrParser.scala new file mode 100644 index 000000000000..70483be76f26 --- /dev/null +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AntlrParser.scala @@ -0,0 +1,16 @@ +package io.joern.rubysrc2cpg.astcreation + +import io.joern.rubysrc2cpg.parser.{RubyLexer, RubyParser} +import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, ParserRuleContext, Token} + +class AntlrParser { + + def parse(filename: String): RubyParser.ProgramContext = { + val charStream = CharStreams.fromFileName(filename) + val lexer = new RubyLexer(charStream) + val tokenStream = new CommonTokenStream(lexer) + val parser = new RubyParser(tokenStream) + parser.program() + } + +} diff --git a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala index c1719f1f5aee..ffbc0153c915 100644 --- a/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala +++ b/joern-cli/frontends/rubysrc2cpg/src/main/scala/io/joern/rubysrc2cpg/astcreation/AstCreator.scala @@ -9,8 +9,8 @@ import io.joern.x2cpg.datastructures.{Global, Scope} import io.joern.x2cpg.{Ast, AstCreatorBase, AstNodeBuilder, Defines as XDefines} import io.shiftleft.codepropertygraph.generated.* import io.shiftleft.codepropertygraph.generated.nodes.* +import org.antlr.v4.runtime.{ParserRuleContext, Token} import org.antlr.v4.runtime.tree.TerminalNode -import org.antlr.v4.runtime.{CharStreams, CommonTokenStream, ParserRuleContext, Token} import org.slf4j.LoggerFactory import overflowdb.{BatchedUpdate, NodeOrDetachedNode} @@ -19,6 +19,7 @@ import scala.collection.immutable.Seq import scala.collection.mutable import scala.collection.mutable.ListBuffer import scala.jdk.CollectionConverters.* +import scala.util.{Failure, Success, Try} class AstCreator( protected val filename: String, @@ -105,12 +106,19 @@ class AstCreator( methodAliases.getOrElse(name, name) } override def createAst(): BatchedUpdate.DiffGraphBuilder = { - val charStream = CharStreams.fromFileName(filename) - val lexer = new RubyLexer(charStream) - val tokenStream = new CommonTokenStream(lexer) - val parser = new RubyParser(tokenStream) - val programCtx = parser.program() + Try { + new AntlrParser().parse(filename) + } match { + case Success(programCtx) => + createAstForProgramCtx(programCtx) + case Failure(exc) => + logger.warn(s"Could not parse file: $filename, skipping") + logger.warn(exc.getMessage) + diffGraph + } + } + private def createAstForProgramCtx(programCtx: RubyParser.ProgramContext) = { val name = ":program" val fullName = s"$relativeFilename:$name" val programMethod =