From d65779607b095a873a5ce2a21479f43f65950a47 Mon Sep 17 00:00:00 2001 From: Johannes Coetzee Date: Fri, 10 Jan 2025 10:19:25 +0100 Subject: [PATCH] [javasrc2cpg] Have enums and records extend java.lang.Enum and java.lang.Record respectively (#5218) --- .../astcreation/declarations/AstForTypeDeclsCreator.scala | 4 ++++ .../io/joern/javasrc2cpg/typesolvers/TypeInfoCalculator.scala | 2 ++ .../test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala | 4 ++++ .../scala/io/joern/javasrc2cpg/querying/RecordTests.scala | 4 ++++ 4 files changed, 14 insertions(+) diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForTypeDeclsCreator.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForTypeDeclsCreator.scala index b74c873d3572..cb86444af5d5 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForTypeDeclsCreator.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/astcreation/declarations/AstForTypeDeclsCreator.scala @@ -694,6 +694,10 @@ private[declarations] trait AstForTypeDeclsCreator { this: AstCreator => Seq() } maybeJavaObjectType ++ inheritsFromTypeNames + } else if (typ.isEnumDeclaration) { + TypeConstants.Enum :: Nil + } else if (typ.isRecordDeclaration) { + TypeConstants.Record :: Nil } else { List.empty[String] } diff --git a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeInfoCalculator.scala b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeInfoCalculator.scala index 7853bfa04773..a37410c6384a 100644 --- a/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeInfoCalculator.scala +++ b/joern-cli/frontends/javasrc2cpg/src/main/scala/io/joern/javasrc2cpg/typesolvers/TypeInfoCalculator.scala @@ -260,6 +260,8 @@ object TypeInfoCalculator { val Object: String = "java.lang.Object" val Class: String = "java.lang.Class" val Iterator: String = "java.util.Iterator" + val Enum: String = "java.lang.Enum" + val Record: String = "java.lang.Record" val Void: String = "void" val Any: String = "ANY" } diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala index 5130397d3462..e4852d019694 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/EnumTests.scala @@ -24,6 +24,10 @@ class EnumTests extends JavaSrcCode2CpgFixture { |} |""".stripMargin) + "the enum type should extends java.lang.Enum" in { + cpg.typeDecl.name("FuzzyBool").inheritsFromTypeFullName.l shouldBe List("java.lang.Enum") + } + "it should parse a basic enum without values" in { inside(cpg.typeDecl.name(".*FuzzyBool.*").l) { case List(typeDecl) => typeDecl.code shouldBe "public enum FuzzyBool" diff --git a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/RecordTests.scala b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/RecordTests.scala index d2d28406f927..a3d8d0166a5b 100644 --- a/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/RecordTests.scala +++ b/joern-cli/frontends/javasrc2cpg/src/test/scala/io/joern/javasrc2cpg/querying/RecordTests.scala @@ -18,6 +18,10 @@ class RecordTests extends JavaSrcCode2CpgFixture { |} |""".stripMargin) + "extend java.lang.Record" in { + cpg.typeDecl("Foo").inheritsFromTypeFullName.l shouldBe List("java.lang.Record") + } + "have the correct representation for the compact constructor" in { inside(cpg.method.nameExact("").l) { case List(constructor) => constructor.fullName shouldBe "foo.Foo.:void(java.lang.String)"