diff --git a/detekt-api/api/detekt-api.api b/detekt-api/api/detekt-api.api index 73846988911..c4f300d0164 100644 --- a/detekt-api/api/detekt-api.api +++ b/detekt-api/api/detekt-api.api @@ -190,10 +190,10 @@ public abstract interface class io/gitlab/arturbosch/detekt/api/Issue$RuleInfo { public final class io/gitlab/arturbosch/detekt/api/Location : io/gitlab/arturbosch/detekt/api/Compactable { public static final field Companion Lio/gitlab/arturbosch/detekt/api/Location$Companion; - public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Lio/github/detekt/psi/FilePath;)V + public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/nio/file/Path;)V public fun compact ()Ljava/lang/String; public final fun getEndSource ()Lio/gitlab/arturbosch/detekt/api/SourceLocation; - public final fun getFilePath ()Lio/github/detekt/psi/FilePath; + public final fun getPath ()Ljava/nio/file/Path; public final fun getSource ()Lio/gitlab/arturbosch/detekt/api/SourceLocation; public final fun getText ()Lio/gitlab/arturbosch/detekt/api/TextLocation; public fun toString ()Ljava/lang/String; diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Location.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Location.kt index ac841926132..9b988cf16e7 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Location.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/Location.kt @@ -1,15 +1,15 @@ package io.gitlab.arturbosch.detekt.api import dev.drewhamilton.poko.Poko -import io.github.detekt.psi.FilePath +import io.github.detekt.psi.absolutePath import io.github.detekt.psi.getLineAndColumnInPsiFile -import io.github.detekt.psi.toFilePath import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset +import java.nio.file.Path /** * Specifies a position within a source code fragment. @@ -18,13 +18,13 @@ class Location( val source: SourceLocation, val endSource: SourceLocation, val text: TextLocation, - val filePath: FilePath, + val path: Path, ) : Compactable { - override fun compact(): String = "${filePath.absolutePath}:$source" + override fun compact(): String = "$path:$source" override fun toString(): String = - "Location(source=$source, endSource=$endSource, text=$text, filePath=$filePath)" + "Location(source=$source, endSource=$endSource, text=$text, path=$path)" companion object { /** @@ -37,7 +37,7 @@ class Location( val end = endLineAndColumn(element, offset) val endSourceLocation = SourceLocation(end.line, end.column) val textLocation = TextLocation(element.startOffset + offset, element.endOffset + offset) - return Location(sourceLocation, endSourceLocation, textLocation, element.containingFile.toFilePath()) + return Location(sourceLocation, endSourceLocation, textLocation, element.containingFile.absolutePath()) } /** diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CodeSmellSpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CodeSmellSpec.kt index ff64dab296c..79922be7c82 100644 --- a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CodeSmellSpec.kt +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CodeSmellSpec.kt @@ -1,6 +1,5 @@ package io.gitlab.arturbosch.detekt.api -import io.gitlab.arturbosch.detekt.test.fromRelative import io.gitlab.arturbosch.detekt.test.location import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test @@ -19,10 +18,7 @@ class CodeSmellSpec { source = SourceLocation(1, 1), endSource = SourceLocation(1, 1), text = TextLocation(0, 0), - filePath = fromRelative( - Path("/").absolute().resolve("Users/tester/detekt/"), - Path("TestFile.kt"), - ), + path = Path("/").absolute().resolve("Users/tester/detekt/TestFile.kt"), ), ktElement = null ), @@ -32,7 +28,7 @@ class CodeSmellSpec { assertThat(codeSmell.toString()).isEqualTo( "CodeSmell(entity=Entity(name=TestEntity, signature=TestEntitySignature, " + "location=Location(source=1:1, endSource=1:1, text=0:0, " + - "filePath=${codeSmell.location.filePath}), ktElement=null), message=TestMessage, " + + "path=${codeSmell.location.path}), ktElement=null), message=TestMessage, " + "references=[])" ) } diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CorrectableCodeSmellSpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CorrectableCodeSmellSpec.kt index 65ab3b1eb62..263f2971b48 100644 --- a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CorrectableCodeSmellSpec.kt +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/CorrectableCodeSmellSpec.kt @@ -18,8 +18,9 @@ class CorrectableCodeSmellSpec { assertThat(codeSmell.toString()).isEqualTo( "CorrectableCodeSmell(autoCorrectEnabled=true, " + "entity=Entity(name=TestEntity, signature=TestEntitySignature, " + - "location=Location(source=1:1, endSource=1:1, text=0:0, filePath=${codeSmell.location.filePath}), " + - "ktElement=null), message=TestMessage, references=[])" + "location=Location(source=1:1, endSource=1:1, text=0:0, " + + "path=${codeSmell.location.path}), ktElement=null), " + + "message=TestMessage, references=[])" ) } } diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/EntitySpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/EntitySpec.kt index 6b41cb3fcb9..72aab35deaf 100644 --- a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/EntitySpec.kt +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/EntitySpec.kt @@ -10,14 +10,10 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import kotlin.io.path.Path import kotlin.io.path.absolute -import kotlin.io.path.relativeToOrSelf -import kotlin.io.path.toPath class EntitySpec { private val path = Path("src/test/resources/EntitySpecFixture.kt").absolute() - private val basePath = EntitySpec::class.java.getResource("/")!!.toURI().toPath() - private val relativePath = path.relativeToOrSelf(basePath) private val code = compileForTest(path) @Nested @@ -57,7 +53,7 @@ class EntitySpec { .isEqualTo( "Entity(name=memberFun, signature=EntitySpecFixture.kt\$C\$private fun memberFun(): Int, " + "location=Location(source=5:17, endSource=5:26, text=49:58, " + - "filePath=FilePath(absolutePath=$path, basePath=$basePath, relativePath=$relativePath)), " + + "path=$path), " + "ktElement=FUN)" ) } @@ -84,7 +80,7 @@ class EntitySpec { .isEqualTo( "Entity(name=C, signature=EntitySpecFixture.kt\$C : Any, " + "location=Location(source=3:7, endSource=3:8, text=20:21, " + - "filePath=FilePath(absolutePath=$path, basePath=$basePath, relativePath=$relativePath)), " + + "path=$path), " + "ktElement=CLASS)" ) } @@ -115,7 +111,7 @@ class EntitySpec { .isEqualTo( "Entity(name=EntitySpecFixture.kt, signature=EntitySpecFixture.kt\$test.EntitySpecFixture.kt, " + "location=Location(source=1:1, endSource=9:1, text=0:109, " + - "filePath=FilePath(absolutePath=$path, basePath=$basePath, relativePath=$relativePath)), " + + "path=$path), " + "ktElement=KtFile: EntitySpecFixture.kt)" ) } diff --git a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/LocationSpec.kt b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/LocationSpec.kt index c31675ecbc4..e9f31eae7dc 100644 --- a/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/LocationSpec.kt +++ b/detekt-api/src/test/kotlin/io/gitlab/arturbosch/detekt/api/LocationSpec.kt @@ -47,8 +47,7 @@ class LocationSpec { assertThat(location.toString()).isEqualTo( "Location(source=2:5, endSource=2:11, text=22:28, " + - "filePath=FilePath(absolutePath=${location.filePath.absolutePath}, " + - "basePath=${location.filePath.basePath}, relativePath=${location.filePath.relativePath}))" + "path=${location.path})" ) } } diff --git a/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestFactory.kt b/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestFactory.kt index 85ef42bda27..c0c7164691e 100644 --- a/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestFactory.kt +++ b/detekt-api/src/testFixtures/kotlin/io/gitlab/arturbosch/detekt/test/TestFactory.kt @@ -1,6 +1,5 @@ package io.gitlab.arturbosch.detekt.test -import io.github.detekt.psi.FilePath import io.gitlab.arturbosch.detekt.api.Entity import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Location @@ -10,7 +9,6 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.SourceLocation import io.gitlab.arturbosch.detekt.api.TextLocation import org.jetbrains.kotlin.psi.KtElement -import java.nio.file.Path import kotlin.io.path.Path import kotlin.io.path.absolute @@ -80,7 +78,7 @@ fun createIssueForRelativePath( source = SourceLocation(1, 1), endSource = SourceLocation(1, 1), text = TextLocation(0, 0), - filePath = fromRelative(Path("/").absolute().resolve(basePath), Path(relativePath)) + path = Path("/").absolute().resolve(basePath).resolve(relativePath) ), ktElement = null ), @@ -111,8 +109,7 @@ fun createLocation( source = SourceLocation(position.first, position.second), endSource = SourceLocation(endPosition.first, endPosition.second), text = TextLocation(text.first, text.last), - filePath = basePath?.let { fromRelative(Path("/").absolute().resolve(it), Path(path)) } - ?: fromAbsolute(Path("/").absolute().resolve(path)), + path = basePath?.let { Path(it).absolute().resolve(path) } ?: Path(path).absolute(), ) } @@ -130,10 +127,3 @@ private data class IssueImpl( override val description: String, ) : Issue.RuleInfo } - -fun fromAbsolute(path: Path) = FilePath(absolutePath = path.normalize()) -fun fromRelative(basePath: Path, relativePath: Path) = FilePath( - absolutePath = basePath.resolve(relativePath).normalize(), - basePath = basePath.normalize(), - relativePath = relativePath -) diff --git a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReport.kt b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReport.kt index 48503deeb4b..24d2805a122 100644 --- a/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReport.kt +++ b/detekt-core/src/main/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReport.kt @@ -2,6 +2,7 @@ package io.gitlab.arturbosch.detekt.core.reporting.console import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.core.reporting.printIssues +import kotlin.io.path.absolutePathString /** * Contains all rule violations grouped by file location. @@ -12,7 +13,7 @@ class FileBasedIssuesReport : AbstractIssuesReport() { override val id: String = "FileBasedIssuesReport" override fun render(issues: List): String { - val issuesPerFile = issues.groupBy { it.entity.location.filePath.absolutePath.toString() } + val issuesPerFile = issues.groupBy { it.entity.location.path.absolutePathString() } return printIssues(issuesPerFile) } } diff --git a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReportSpec.kt b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReportSpec.kt index 379151959cf..6718fb09e7d 100644 --- a/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReportSpec.kt +++ b/detekt-core/src/test/kotlin/io/gitlab/arturbosch/detekt/core/reporting/console/FileBasedIssuesReportSpec.kt @@ -28,10 +28,10 @@ class FileBasedIssuesReportSpec { assertThat(output).isEqualTo( """ - ${location1.filePath.absolutePath} + ${location1.path} TestSmell - [TestMessage] at ${location1.compact()} TestSmell - [TestMessage] at ${location1.compact()} - ${location2.filePath.absolutePath} + ${location2.path} TestSmell - [TestMessage] at ${location2.compact()} """.trimIndent() diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt index f53cf4b2001..f2e773daaad 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt @@ -4,8 +4,7 @@ import com.pinterest.ktlint.rule.engine.core.api.editorconfig.CODE_STYLE_PROPERT import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfig import com.pinterest.ktlint.rule.engine.core.api.editorconfig.EditorConfigProperty import com.pinterest.ktlint.rule.engine.core.api.editorconfig.INDENT_STYLE_PROPERTY -import io.github.detekt.psi.FilePath -import io.github.detekt.psi.toFilePath +import io.github.detekt.psi.absolutePath import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.CorrectableCodeSmell @@ -21,6 +20,7 @@ import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyElement import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyHolder import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory +import java.nio.file.Path /** * Rule to detect formatting violations. @@ -38,13 +38,13 @@ abstract class FormattingRule(config: Config, description: String) : Rule(config private lateinit var positionByOffset: (offset: Int) -> Pair private lateinit var root: KtFile - private lateinit var originalFilePath: FilePath + private lateinit var originalFilePath: Path override fun visit(root: KtFile) { val fileCopy = KtPsiFactory(root.project).createPhysicalFile(root.name, root.modifiedText ?: root.text) this.root = fileCopy - originalFilePath = root.toFilePath() + originalFilePath = root.absolutePath() positionByOffset = KtLintLineColCalculator.calculateLineColByOffset(fileCopy.text) wrapping.beforeFirstNode(computeEditorConfigProperties()) @@ -95,7 +95,7 @@ abstract class FormattingRule(config: Config, description: String) : Rule(config endSource = SourceLocation(line, column), // Use offset + 1 since ktlint always reports a single location. text = TextLocation(offset, offset + 1), - filePath = originalFilePath + path = originalFilePath ) val entity = Entity.from(node.psi, location) diff --git a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRuleSpec.kt b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRuleSpec.kt index 6de4d046209..8c7b0b17686 100644 --- a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRuleSpec.kt +++ b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRuleSpec.kt @@ -75,7 +75,7 @@ class FormattingRuleSpec { val rule = ChainWrapping(Config.empty) val findings = rule.visitFile(compileForTest(expectedPath)) assertThat(findings).anySatisfy { finding -> - assertThat(finding.location.filePath.absolutePath.toString()).isEqualTo(expectedPath.toString()) + assertThat(finding.location.path).isEqualTo(expectedPath) } } } diff --git a/detekt-psi-utils/api/detekt-psi-utils.api b/detekt-psi-utils/api/detekt-psi-utils.api index 73a463298b3..ff6bd3af7c5 100644 --- a/detekt-psi-utils/api/detekt-psi-utils.api +++ b/detekt-psi-utils/api/detekt-psi-utils.api @@ -3,15 +3,6 @@ public final class io/github/detekt/psi/AnnotationExcluder { public final fun shouldExclude (Ljava/util/List;)Z } -public final class io/github/detekt/psi/FilePath { - public fun (Ljava/nio/file/Path;Ljava/nio/file/Path;Ljava/nio/file/Path;)V - public synthetic fun (Ljava/nio/file/Path;Ljava/nio/file/Path;Ljava/nio/file/Path;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getAbsolutePath ()Ljava/nio/file/Path; - public final fun getBasePath ()Ljava/nio/file/Path; - public final fun getRelativePath ()Ljava/nio/file/Path; - public fun toString ()Ljava/lang/String; -} - public abstract class io/github/detekt/psi/FunctionMatcher { public static final field Companion Lio/github/detekt/psi/FunctionMatcher$Companion; public abstract fun match (Lorg/jetbrains/kotlin/descriptors/CallableDescriptor;)Z @@ -38,7 +29,6 @@ public final class io/github/detekt/psi/KtFilesKt { public static final fun getAbsolutePath (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;)Ljava/nio/file/Path; public static final fun getLineAndColumnInPsiFile (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;Lorg/jetbrains/kotlin/com/intellij/openapi/util/TextRange;)Lorg/jetbrains/kotlin/diagnostics/PsiDiagnosticUtils$LineAndColumn; public static final fun setAbsolutePath (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;Ljava/nio/file/Path;)V - public static final fun toFilePath (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;)Lio/github/detekt/psi/FilePath; } public final class io/gitlab/arturbosch/detekt/rules/AllowedExceptionNamePatternKt { diff --git a/detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/KtFiles.kt b/detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/KtFiles.kt index 1fdf75d4725..2daff00243f 100644 --- a/detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/KtFiles.kt +++ b/detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/KtFiles.kt @@ -34,45 +34,6 @@ instead. */ fun PsiFile.absolutePath(): Path = absolutePath ?: Path(virtualFile.path) -/** - * Represents both absolute path and relative path if available. - */ -class FilePath( - val absolutePath: Path, - val basePath: Path? = null, - val relativePath: Path? = null -) { - - init { - require( - basePath == null || - relativePath == null || - absolutePath == basePath.resolve(relativePath).normalize() - ) { - "Absolute path = $absolutePath much match base path = $basePath and relative path = $relativePath" - } - require(absolutePath.isAbsolute) { "absolutePath should be absolute" } - require(basePath?.isAbsolute != false) { "basePath should be absolute" } - require(relativePath?.isAbsolute != true) { "relativePath should not be absolute" } - } - - override fun toString(): String = - "FilePath(absolutePath=$absolutePath, basePath=$basePath, relativePath=$relativePath)" -} - -fun PsiFile.toFilePath(): FilePath { - return when { - basePath != null && relativePath != null -> FilePath( - absolutePath = absolutePath(), - basePath = basePath, - relativePath = relativePath - ) - - basePath == null && relativePath == null -> FilePath(absolutePath = absolutePath()) - else -> error("Cannot build a FilePath from base path = $basePath and relative path = $relativePath") - } -} - // #3317 If any rule mutates the PsiElement, searching the original PsiElement may throw an exception. fun getLineAndColumnInPsiFile(file: PsiFile, range: TextRange): PsiDiagnosticUtils.LineAndColumn? { return if (file.textLength == 0) { diff --git a/detekt-psi-utils/src/test/kotlin/io/github/detekt/psi/KtFilesSpec.kt b/detekt-psi-utils/src/test/kotlin/io/github/detekt/psi/KtFilesSpec.kt index c0bfd48c019..8a26386acc8 100644 --- a/detekt-psi-utils/src/test/kotlin/io/github/detekt/psi/KtFilesSpec.kt +++ b/detekt-psi-utils/src/test/kotlin/io/github/detekt/psi/KtFilesSpec.kt @@ -5,8 +5,6 @@ import org.assertj.core.api.Assertions.assertThat import org.jetbrains.kotlin.com.intellij.psi.PsiFile import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test -import kotlin.io.path.Path -import kotlin.io.path.absolute class KtFilesSpec { @@ -45,15 +43,4 @@ class KtFilesSpec { } private fun makeFile(filename: String): PsiFile = FakePsiFile(name = filename) - - @Test - fun `FilePath toString`() { - val basePath = Path("/").absolute().resolve("a/b") - val relativePath = Path("c/d") - val absolutePath = Path("/").absolute().resolve("a/b/c/d") - val filePath = FilePath(absolutePath, basePath, relativePath) - - assertThat(filePath.toString()) - .isEqualTo("FilePath(absolutePath=$absolutePath, basePath=$basePath, relativePath=$relativePath)") - } } diff --git a/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt b/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt index 91c82f955e9..7973bbabd03 100644 --- a/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt +++ b/detekt-report-html/src/main/kotlin/io/github/detekt/report/html/HtmlOutputReport.kt @@ -142,7 +142,7 @@ class HtmlOutputReport : BuiltInOutputReport, OutputReport() { issues .sortedWith( compareBy( - { it.location.filePath.absolutePath.toString() }, + { it.location.path }, { it.location.source.line }, { it.location.source.column }, ) @@ -157,8 +157,7 @@ class HtmlOutputReport : BuiltInOutputReport, OutputReport() { } private fun FlowContent.renderIssue(issue: Issue) { - val filePath = basePath?.let { issue.location.filePath.absolutePath.relativeTo(it) } - ?: issue.location.filePath.absolutePath + val filePath = basePath?.let { issue.location.path.relativeTo(it) } ?: issue.location.path val pathString = filePath.invariantSeparatorsPathString span("location") { text( diff --git a/detekt-report-html/src/test/kotlin/io/github/detekt/report/html/HtmlOutputReportSpec.kt b/detekt-report-html/src/test/kotlin/io/github/detekt/report/html/HtmlOutputReportSpec.kt index 3189e08c88a..f63ace630cc 100644 --- a/detekt-report-html/src/test/kotlin/io/github/detekt/report/html/HtmlOutputReportSpec.kt +++ b/detekt-report-html/src/test/kotlin/io/github/detekt/report/html/HtmlOutputReportSpec.kt @@ -73,11 +73,11 @@ class HtmlOutputReportSpec { @Test fun `renders the right file locations`() { val result = htmlReport.render(createTestDetektionWithMultipleSmells()) - val root = Path("/").absolute().invariantSeparatorsPathString + val root = Path("Users/tester/detekt/").absolute().invariantSeparatorsPathString - assertThat(result).contains("${root}src/main/com/sample/Sample1.kt:11:1") - assertThat(result).contains("${root}src/main/com/sample/Sample2.kt:22:2") - assertThat(result).contains("${root}src/main/com/sample/Sample3.kt:33:3") + assertThat(result).contains("$root/src/main/com/sample/Sample1.kt:11:1") + assertThat(result).contains("$root/src/main/com/sample/Sample2.kt:22:2") + assertThat(result).contains("$root/src/main/com/sample/Sample3.kt:33:3") } @Test @@ -165,7 +165,10 @@ class HtmlOutputReportSpec { @Test fun `asserts that the generated HTML is the same as expected`() { val expectedString = readResourceContent("HtmlOutputFormatTest.html") - .replace("", Path("/").absolute().invariantSeparatorsPathString) + .replace( + "", + Path("Users/tester/detekt/").absolute().invariantSeparatorsPathString + ) val expected = createTempFileForTest("expected-report", ".html").apply { writeText(expectedString) } val result = htmlReport.render(createTestDetektionWithMultipleSmells()) @@ -196,12 +199,17 @@ private fun fakeKtElement(): KtElement { } private fun createTestDetektionWithMultipleSmells(): Detektion { + val basePath = "Users/tester/detekt/" val entity1 = createEntity( - location = createLocation("src/main/com/sample/Sample1.kt", position = 11 to 1, text = 10..14), + location = createLocation("src/main/com/sample/Sample1.kt", basePath, position = 11 to 1, text = 10..14), ktElement = fakeKtElement() ) - val entity2 = createEntity(location = createLocation("src/main/com/sample/Sample2.kt", position = 22 to 2)) - val entity3 = createEntity(location = createLocation("src/main/com/sample/Sample3.kt", position = 33 to 3)) + val entity2 = createEntity( + location = createLocation("src/main/com/sample/Sample2.kt", basePath, position = 22 to 2) + ) + val entity3 = createEntity( + location = createLocation("src/main/com/sample/Sample3.kt", basePath, position = 33 to 3) + ) return TestDetektion( createIssue(createRuleInfo("id_a", "RuleSet1"), entity1, "Issue message 1"), @@ -211,7 +219,7 @@ private fun createTestDetektionWithMultipleSmells(): Detektion { } private fun createTestDetektionFromRelativePath(): Detektion { - val basePath = "${System.getProperty("user.dir")}/Users/tester/detekt/" + val basePath = "Users/tester/detekt/" val entity1 = createEntity( location = createLocation( path = "src/main/com/sample/Sample1.kt", diff --git a/detekt-report-html/src/test/resources/HtmlOutputFormatTest.html b/detekt-report-html/src/test/resources/HtmlOutputFormatTest.html index fad267100fb..b8a89b8989c 100644 --- a/detekt-report-html/src/test/resources/HtmlOutputFormatTest.html +++ b/detekt-report-html/src/test/resources/HtmlOutputFormatTest.html @@ -174,7 +174,7 @@

RuleSet1: 2

id_a: 2 Description id_a Documentation
    -
  • src/main/com/sample/Sample1.kt:11:1Issue message 1 +
  • /src/main/com/sample/Sample1.kt:11:1Issue message 1
       8 
        9 
       10 
    @@ -183,7 +183,7 @@ 

    RuleSet1: 2

    13
  • -
  • src/main/com/sample/Sample2.kt:22:2Issue message 2
  • +
  • /src/main/com/sample/Sample2.kt:22:2Issue message 2

RuleSet2: 1

@@ -191,7 +191,7 @@

RuleSet2: 1

id_b: 1 Description id_b Documentation
    -
  • src/main/com/sample/Sample3.kt:33:3Issue message 3
  • +
  • /src/main/com/sample/Sample3.kt:33:3Issue message 3
diff --git a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt index 028036b1536..07196ee3625 100644 --- a/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt +++ b/detekt-report-md/src/main/kotlin/io/github/detekt/report/md/MdOutputReport.kt @@ -119,7 +119,7 @@ private fun MarkdownContent.renderRule(ruleInfo: Issue.RuleInfo, issues: List, basePath: Path?) { } private fun MarkdownContent.renderIssue(issue: Issue, basePath: Path?): String { - val filePath = basePath?.let { issue.location.filePath.absolutePath.relativeTo(it) } - ?: issue.location.filePath.absolutePath + val filePath = basePath?.let { issue.location.path.relativeTo(it) } ?: issue.location.path val location = "${filePath.invariantSeparatorsPathString}:${issue.location.source.line}:${issue.location.source.column}" diff --git a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt index faa98fe6501..1e8697b9c06 100644 --- a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt +++ b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/Results.kt @@ -9,10 +9,12 @@ import io.gitlab.arturbosch.detekt.api.Detektion import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Location import io.gitlab.arturbosch.detekt.api.Severity +import kotlin.io.path.Path import kotlin.io.path.invariantSeparatorsPathString +import kotlin.io.path.relativeTo -internal fun toResults(detektion: Detektion): List = - detektion.issues.map { it.toResult() } +internal fun toResults(detektion: Detektion, basePath: String?): List = + detektion.issues.map { it.toResult(basePath) } internal fun Severity.toResultLevel() = when (this) { Severity.Error -> Level.Error @@ -20,16 +22,16 @@ internal fun Severity.toResultLevel() = when (this) { Severity.Info -> Level.Note } -private fun Issue.toResult(): io.github.detekt.sarif4k.Result { +private fun Issue.toResult(basePath: String?): io.github.detekt.sarif4k.Result { return io.github.detekt.sarif4k.Result( ruleID = "detekt.${ruleInfo.ruleSetId}.${ruleInfo.id}", level = severity.toResultLevel(), - locations = (listOf(location) + references.map { it.location }).map { it.toLocation() }.distinct(), + locations = (listOf(location) + references.map { it.location }).map { it.toLocation(basePath) }.distinct(), message = Message(text = message) ) } -private fun Location.toLocation(): io.github.detekt.sarif4k.Location { +private fun Location.toLocation(basePath: String?): io.github.detekt.sarif4k.Location { return io.github.detekt.sarif4k.Location( physicalLocation = PhysicalLocation( region = Region( @@ -38,13 +40,13 @@ private fun Location.toLocation(): io.github.detekt.sarif4k.Location { endLine = endSource.line.toLong(), endColumn = endSource.column.toLong(), ), - artifactLocation = if (filePath.relativePath != null) { + artifactLocation = if (basePath != null) { ArtifactLocation( - uri = filePath.relativePath?.invariantSeparatorsPathString, + uri = path.relativeTo(Path(basePath)).invariantSeparatorsPathString, uriBaseID = SRCROOT ) } else { - ArtifactLocation(uri = filePath.absolutePath.toUri().toString()) + ArtifactLocation(uri = path.toUri().toString()) } ) ) diff --git a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/SarifOutputReport.kt b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/SarifOutputReport.kt index 1ed9d48d84c..d4f254d4cac 100644 --- a/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/SarifOutputReport.kt +++ b/detekt-report-sarif/src/main/kotlin/io/github/detekt/report/sarif/SarifOutputReport.kt @@ -64,7 +64,7 @@ class SarifOutputReport : BuiltInOutputReport, OutputReport() { originalURIBaseIDS = basePath?.let { mapOf(SRCROOT to ArtifactLocation(uri = Path(it).toUri().toString())) }, - results = toResults(detektion) + results = toResults(detektion, basePath) ) ) ) diff --git a/detekt-report-sarif/src/test/kotlin/io/github/detekt/report/sarif/SarifOutputReportSpec.kt b/detekt-report-sarif/src/test/kotlin/io/github/detekt/report/sarif/SarifOutputReportSpec.kt index 26878db82c2..3f8bd44d133 100644 --- a/detekt-report-sarif/src/test/kotlin/io/github/detekt/report/sarif/SarifOutputReportSpec.kt +++ b/detekt-report-sarif/src/test/kotlin/io/github/detekt/report/sarif/SarifOutputReportSpec.kt @@ -52,7 +52,7 @@ class SarifOutputReportSpec { .render(result) val expectedReport = readResourceContent("vanilla.sarif.json") - .replace("", Path("/").absolute().toUri().toString()) + .replace("", Path("").toUri().toString()) assertThat(report).isEqualToIgnoringWhitespace(expectedReport) } @@ -83,7 +83,7 @@ class SarifOutputReportSpec { .render(result) val expectedReport = readResourceContent("rule_warning.sarif.json") - .replace("", Path("/").absolute().toUri().toString()) + .replace("", Path("").toUri().toString()) assertThat(report).isEqualToIgnoringWhitespace(expectedReport) } diff --git a/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt b/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt index 831b939f99e..844a52aee24 100644 --- a/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt +++ b/detekt-report-xml/src/main/kotlin/io/github/detekt/report/xml/XmlOutputReport.kt @@ -36,10 +36,7 @@ class XmlOutputReport : BuiltInOutputReport, OutputReport() { lines += "" detektion.issues - .groupBy { - basePath?.let { path -> it.location.filePath.absolutePath.relativeTo(path) } - ?: it.location.filePath.absolutePath - } + .groupBy { basePath?.let { path -> it.location.path.relativeTo(path) } ?: it.location.path } .forEach { (filePath, issues) -> lines += "" issues.forEach { diff --git a/detekt-report-xml/src/test/kotlin/io/github/detekt/report/xml/XmlOutputFormatSpec.kt b/detekt-report-xml/src/test/kotlin/io/github/detekt/report/xml/XmlOutputFormatSpec.kt index 64037bba763..e554912bdd6 100644 --- a/detekt-report-xml/src/test/kotlin/io/github/detekt/report/xml/XmlOutputFormatSpec.kt +++ b/detekt-report-xml/src/test/kotlin/io/github/detekt/report/xml/XmlOutputFormatSpec.kt @@ -62,7 +62,7 @@ class XmlOutputFormatSpec { """ - + $TAB @@ -81,7 +81,7 @@ class XmlOutputFormatSpec { """ - + $TAB $TAB @@ -101,10 +101,10 @@ class XmlOutputFormatSpec { """ - + $TAB - + $TAB @@ -165,11 +165,11 @@ class XmlOutputFormatSpec { """ - + $TAB $TAB - + $TAB $TAB @@ -195,7 +195,7 @@ class XmlOutputFormatSpec { val expected = """ - + $TAB diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CascadingCallWrapping.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CascadingCallWrapping.kt index 98bf24e6b78..cda9603a490 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CascadingCallWrapping.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CascadingCallWrapping.kt @@ -1,6 +1,6 @@ package io.gitlab.arturbosch.detekt.rules.style -import io.github.detekt.psi.toFilePath +import io.github.detekt.psi.absolutePath import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Configuration @@ -115,7 +115,7 @@ class CascadingCallWrapping(config: Config) : Rule( val textLocation = TextLocation(operationReference.startOffset, rhs.endOffset) Entity.from( this, - Location(operationSourceLocation, rhsSourceLocation, textLocation, containingFile.toFilePath()) + Location(operationSourceLocation, rhsSourceLocation, textLocation, containingFile.absolutePath()) ) } else -> Entity.from(this) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenAnnotation.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenAnnotation.kt index 08e9547b27a..2fb368051f3 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenAnnotation.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenAnnotation.kt @@ -90,7 +90,7 @@ class ForbiddenAnnotation(config: Config) : Rule( location.source, location.endSource, TextLocation(location.text.start, element.children.firstOrNull()?.endOffset ?: location.text.end), - location.filePath + location.path ) } report(CodeSmell(Entity.from(element, location), message)) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxLineLength.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxLineLength.kt index def10153bfc..afd5be03d29 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxLineLength.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxLineLength.kt @@ -60,7 +60,7 @@ class MaxLineLength(config: Config) : Rule( source = location.source, endSource = SourceLocation(location.source.line, line.length + 1), text = TextLocation(offset - line.length, offset), - filePath = location.filePath, + path = location.path, ) } report(CodeSmell(Entity.from(ktElement, location), description)) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineRawStringIndentation.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineRawStringIndentation.kt index 7c4cfbbdfe1..812526db6a3 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineRawStringIndentation.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineRawStringIndentation.kt @@ -1,7 +1,7 @@ package io.gitlab.arturbosch.detekt.rules.style +import io.github.detekt.psi.absolutePath import io.github.detekt.psi.getLineAndColumnInPsiFile -import io.github.detekt.psi.toFilePath import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Configuration @@ -199,6 +199,6 @@ private fun PsiFile.getLocation(start: SourceLocation, end: SourceLocation): Loc start, end, TextLocation(startOffset + start.column - 1, endOffset + end.column - 1), - toFilePath() + absolutePath() ) } diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NewLineAtEndOfFile.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NewLineAtEndOfFile.kt index 018e24e2007..13eb64eff12 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NewLineAtEndOfFile.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NewLineAtEndOfFile.kt @@ -1,7 +1,7 @@ package io.gitlab.arturbosch.detekt.rules.style +import io.github.detekt.psi.absolutePath import io.github.detekt.psi.getLineAndColumnInPsiFile -import io.github.detekt.psi.toFilePath import io.gitlab.arturbosch.detekt.api.ActiveByDefault import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config @@ -36,7 +36,7 @@ class NewLineAtEndOfFile(config: Config) : Rule( source = sourceLocation, endSource = sourceLocation, text = textLocation, - filePath = file.containingFile.toFilePath() + path = file.containingFile.absolutePath() ) report( CodeSmell( diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrailingWhitespace.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrailingWhitespace.kt index 40eda95e4eb..33a22aa94d4 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrailingWhitespace.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrailingWhitespace.kt @@ -41,7 +41,7 @@ class TrailingWhitespace(config: Config) : Rule( entity.location.source, entity.location.endSource, TextLocation(entity.location.text.start, offset), - entity.location.filePath + entity.location.path ) ) } diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAnnotationUseSiteTarget.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAnnotationUseSiteTarget.kt index d1f458fb5d7..13d8f9b4b2a 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAnnotationUseSiteTarget.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAnnotationUseSiteTarget.kt @@ -58,7 +58,7 @@ class UnnecessaryAnnotationUseSiteTarget(config: Config) : Rule( location.source, location.endSource, TextLocation(location.text.start, location.text.end + 1), - location.filePath + location.path ) } report(CodeSmell(Entity.from(useSite, location), message))