diff --git a/codacy-plugins-api/src/main/scala/com/codacy/plugins/api/languages/Language.scala b/codacy-plugins-api/src/main/scala/com/codacy/plugins/api/languages/Language.scala index 75c29b9..97b380c 100644 --- a/codacy-plugins-api/src/main/scala/com/codacy/plugins/api/languages/Language.scala +++ b/codacy-plugins-api/src/main/scala/com/codacy/plugins/api/languages/Language.scala @@ -256,33 +256,37 @@ object Languages { case object Haskell extends Language(extensions = Set(".hs", ".lhs")) - case object Erlang extends Language(extensions = Set(".erl")) + case object Erlang + extends Language(extensions = Set(".erl", ".hrl", ".es", ".escript"), files = Set("rebar.config", "rebar.lock")) - case object Elm extends Language(extensions = Set(".elm")) + case object Elm extends Language(extensions = Set(".elm"), files = Set("elm.json", "elm-package.json")) - case object HTML extends Language(extensions = Set(".html")) + case object HTML extends Language(extensions = Set(".html", ".htm", ".xhtml")) // Others - case object Perl extends Language(extensions = Set(".pl")) + case object Perl + extends Language(extensions = Set(".pl", ".pm", ".pod", ".perl", ".t"), + files = Set("cpanfile", "cpanfile.snapshot")) - case object FSharp extends Language(extensions = Set(".fs")) + case object FSharp extends Language(extensions = Set(".fs", ".fsi", ".fsx"), files = Set("paket.lock")) - case object Fortran extends Language(extensions = Set(".f90", ".f95", ".f03")) + case object Fortran extends Language(extensions = Set(".f90", ".f95", ".f03", ".f", ".for", ".f77", ".f08")) - case object R extends Language(extensions = Set(".r")) + case object R extends Language(extensions = Set(".r", ".rd", ".rsx"), files = Set("renv.lock", ".Rprofile")) - case object Scratch extends Language(extensions = Set(".scratch", ".sb", ".sprite", ".sb2", ".sprite2")) + case object Scratch + extends Language(extensions = Set(".scratch", ".sb", ".sprite", ".sb2", ".sprite2", ".sb3", ".sprite3")) - case object Lua extends Language(extensions = Set(".lua")) + case object Lua extends Language(extensions = Set(".lua", ".luau")) - case object Lisp extends Language(extensions = Set(".asd", ".el", ".lsp", ".lisp")) + case object Lisp extends Language(extensions = Set(".asd", ".el", ".lsp", ".lisp", ".cl")) - case object Prolog extends Language(extensions = Set(".P", ".swipl")) + case object Prolog extends Language(extensions = Set(".P", ".swipl", ".pro", ".prolog")) - case object Julia extends Language(extensions = Set(".jl"), files = Set("Manifest.toml")) + case object Julia extends Language(extensions = Set(".jl"), files = Set("Manifest.toml", "Project.toml")) - case object OCaml extends Language(extensions = Set(".ml", ".mli", ".mly", ".mll")) + case object OCaml extends Language(extensions = Set(".ml", ".mli", ".mly", ".mll"), files = Set("dune-project")) case object Solidity extends Language(extensions = Set(".sol")) diff --git a/codacy-plugins-api/src/test/scala/com.codacy.plugins.api.languages/LanguageSpec.scala b/codacy-plugins-api/src/test/scala/com.codacy.plugins.api.languages/LanguageSpec.scala index e16a779..32c4efb 100644 --- a/codacy-plugins-api/src/test/scala/com.codacy.plugins.api.languages/LanguageSpec.scala +++ b/codacy-plugins-api/src/test/scala/com.codacy.plugins.api.languages/LanguageSpec.scala @@ -32,5 +32,58 @@ class LanguageSpec extends AnyWordSpec with Matchers with OptionValues { .value shouldBe Languages.Scala Languages.forPath("src/File3.mjs").value shouldBe Languages.Javascript } + + "forPath resolves extensions case-insensitively" in { + // extensions are stored lowercase; lookup lowercases the file's extension too + Languages.forPath("src/analysis.R").value shouldBe Languages.R + Languages.forPath("man/topic.Rd").value shouldBe Languages.R + Languages.forPath("src/Main.FS").value shouldBe Languages.FSharp + } + + "forPath resolves newly added extensions" in { + val cases = Seq("mod.hrl" -> Languages.Erlang, + "script.es" -> Languages.Erlang, + "cli.escript" -> Languages.Erlang, + "legacy.f" -> Languages.Fortran, + "legacy.for" -> Languages.Fortran, + "legacy.f77" -> Languages.Fortran, + "modern.f08" -> Languages.Fortran, + "sig.fsi" -> Languages.FSharp, + "script.fsx" -> Languages.FSharp, + "lib.pm" -> Languages.Perl, + "docs.pod" -> Languages.Perl, + "script.perl" -> Languages.Perl, + "some.t" -> Languages.Perl, + "man.rd" -> Languages.R, + "sweave.rsx" -> Languages.R, + "page.htm" -> Languages.HTML, + "page.xhtml" -> Languages.HTML, + "rules.pro" -> Languages.Prolog, + "rules.prolog" -> Languages.Prolog, + "core.cl" -> Languages.Lisp, + "project.sb3" -> Languages.Scratch, + "sprite.sprite3" -> Languages.Scratch, + "config.luau" -> Languages.Lua) + cases.foreach { + case (path, language) => Languages.forPath(path).value shouldBe language + } + } + + "forPath resolves newly added manifest and lock files" in { + val cases = Seq("rebar.config" -> Languages.Erlang, + "rebar.lock" -> Languages.Erlang, + "elm.json" -> Languages.Elm, + "elm-package.json" -> Languages.Elm, + "paket.lock" -> Languages.FSharp, + "cpanfile" -> Languages.Perl, + "cpanfile.snapshot" -> Languages.Perl, + "renv.lock" -> Languages.R, + ".Rprofile" -> Languages.R, + "Project.toml" -> Languages.Julia, + "dune-project" -> Languages.OCaml) + cases.foreach { + case (path, language) => Languages.forPath(path).value shouldBe language + } + } } }