All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.joern.kotlin2cpg.files.SourceFilesPicker.scala Maven / Gradle / Ivy

The newest version!
package io.joern.kotlin2cpg.files

import io.joern.x2cpg.SourceFiles

import org.slf4j.LoggerFactory

object SourceFilesPicker {
  private val logger = LoggerFactory.getLogger(getClass)

  private val substringsToFilterFor = List(
    ".idea",
    "target",
    "build",
    "integrationTest",
    "integrationtest",
    "androidTest",
    "sharedTest",
    "fixtures",
    "commonTest",
    "jvmTest",
    "test"
  )

  def shouldFilter(fileName: String): Boolean = {
    val containsUnwantedSubstring = substringsToFilterFor.exists(fileName.contains)

    val isAndroidLayoutXml = fileName.endsWith("xml") && (fileName.contains("drawable") || fileName.contains("layout"))
    val containsSrcTest    = fileName.contains("src/test")
    val isSettingsXml      = fileName.endsWith("strings.xml") // some projects contain many i18n files
    val containsBenchmarks = fileName.contains("benchmarks")
    val isBuildGradle      = fileName.endsWith("build.gradle") || fileName.endsWith("build.gradle.kts")

    (containsUnwantedSubstring && !isBuildGradle) ||
    isSettingsXml ||
    containsSrcTest ||
    isAndroidLayoutXml ||
    containsBenchmarks
  }

  private def isConfigFile(fileName: String): Boolean = {
    isXmlFile(fileName) || isGradleFile(fileName) || isKotlinScript(fileName)
  }

  private def isXmlFile(fileName: String): Boolean = {
    val xmlFileExtensions = Seq(".xml")
    xmlFileExtensions.exists(fileName.endsWith)
  }

  private def isGradleFile(fileName: String): Boolean = {
    val gradleRelatedFiles = Seq("build.gradle", "settings.gradle", "gradle.properties", "build.gradle.kts")
    gradleRelatedFiles.exists(fileName.endsWith)
  }

  private def isKotlinScript(fileName: String): Boolean = {
    val ktsExtensions = Seq(".kts")
    ktsExtensions.exists(fileName.endsWith)
  }

  def configFiles(forDir: String): Seq[String] = {
    val sourceFileExtensions = Set(".xml", ".gradle", ".properties", ".kts")
    val sourceFileNames      = SourceFiles.determine(forDir, sourceFileExtensions)
    sourceFileNames
      .filter(isConfigFile)
      .filterNot { fileName =>
        val relativized = SourceFiles.toRelativePath(fileName, forDir)
        val willFilter  = SourceFilesPicker.shouldFilter(relativized)
        if (willFilter) {
          logger.debug(s"Filtered file at `$fileName`.")
        }
        willFilter
      }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy