Skip to content

Commit

Permalink
Remove getLineAndColumnInPsiFile function
Browse files Browse the repository at this point in the history
This was introduced to work around issues with mutated PSI. This is no
longer an issue since #7206. Because the formatting rule set operates on a
copy of the PsiFile and not the original PsiFile the original PsiFile will
never be modified, so the protection offered by this function is not
needed.
  • Loading branch information
3flex committed May 8, 2024
1 parent eef6467 commit 7781d65
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package io.gitlab.arturbosch.detekt.api

import dev.drewhamilton.poko.Poko
import io.github.detekt.psi.absolutePath
import io.github.detekt.psi.getLineAndColumnInPsiFile
import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.endOffset
Expand Down Expand Up @@ -58,10 +58,12 @@ class Location(
TextRange(element.textRange.endOffset + offset, element.textRange.endOffset + offset)
)

private fun lineAndColumn(element: PsiElement, range: TextRange): PsiDiagnosticUtils.LineAndColumn {
return getLineAndColumnInPsiFile(element.containingFile, range)
?: PsiDiagnosticUtils.LineAndColumn(1, 1, null)
}
private fun lineAndColumn(element: PsiElement, range: TextRange): PsiDiagnosticUtils.LineAndColumn =
if (element.containingFile.text.isNotEmpty()) {
getLineAndColumnInPsiFile(element.containingFile, range)

Check failure

Code scanning / detekt

Mark forbidden methods. A forbidden method could be an invocation of an unstable / experimental method and hence you might want to mark it as forbidden in order to get warned about the usage. Error

The method org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile has been forbidden in the detekt config.
} else {
PsiDiagnosticUtils.LineAndColumn(1, 1, null)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package io.github.detekt.metrics

import io.github.detekt.psi.getLineAndColumnInPsiFile
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.psi.PsiComment
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafElement
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiCommentImpl
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
import org.jetbrains.kotlin.kdoc.psi.api.KDocElement
import org.jetbrains.kotlin.kdoc.psi.impl.KDocElementImpl
Expand Down Expand Up @@ -41,7 +41,7 @@ fun KtElement.linesOfCode(inFile: KtFile = this.containingKtFile): Int =
.distinct()
.count()

fun ASTNode.line(inFile: KtFile): Int = getLineAndColumnInPsiFile(inFile, this.textRange)?.line ?: -1
fun ASTNode.line(inFile: KtFile): Int = DiagnosticUtils.getLineAndColumnInPsiFile(inFile, this.textRange).line

Check failure

Code scanning / detekt

Mark forbidden methods. A forbidden method could be an invocation of an unstable / experimental method and hence you might want to mark it as forbidden in order to get warned about the usage. Error

The method org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile has been forbidden in the detekt config.

private val comments: Set<Class<out PsiElement>> = setOf(
PsiWhiteSpace::class.java,
Expand Down
1 change: 0 additions & 1 deletion detekt-psi-utils/api/detekt-psi-utils.api
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ public final class io/github/detekt/psi/KtFilesKt {
public static final fun absolutePath (Lorg/jetbrains/kotlin/psi/KtFile;)Ljava/nio/file/Path;
public static final fun fileNameWithoutSuffix (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;Ljava/util/List;)Ljava/lang/String;
public static synthetic fun fileNameWithoutSuffix$default (Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile;Ljava/util/List;ILjava/lang/Object;)Ljava/lang/String;
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 final class io/gitlab/arturbosch/detekt/rules/AllowedExceptionNamePatternKt {
Expand Down
15 changes: 0 additions & 15 deletions detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/KtFiles.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.github.detekt.psi

import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils
import org.jetbrains.kotlin.psi.KtFile
import java.nio.file.Path
import kotlin.io.path.Path
Expand All @@ -30,17 +27,5 @@ fun PsiFile.absolutePath(): Path = Path(virtualFile.path)
// KtFile.virtualFilePath is cached so should be a tiny bit more performant when called repeatedly for the same file.
fun KtFile.absolutePath(): Path = Path(virtualFilePath)

// #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) {
null
} else {
runCatching {
@Suppress("ForbiddenMethodCall")
DiagnosticUtils.getLineAndColumnInPsiFile(file, range)
}.getOrNull()
}
}

private fun buildPlatformSpecificSuffixes(platforms: List<String>): List<String> =
platforms.map { platform -> ".$platform.kt" }
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.gitlab.arturbosch.detekt.rules.style

import io.github.detekt.psi.absolutePath
import io.github.detekt.psi.getLineAndColumnInPsiFile
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Configuration
Expand All @@ -12,6 +11,7 @@ import io.gitlab.arturbosch.detekt.api.SourceLocation
import io.gitlab.arturbosch.detekt.api.TextLocation
import io.gitlab.arturbosch.detekt.api.config
import org.jetbrains.kotlin.com.intellij.psi.PsiFile
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry
import org.jetbrains.kotlin.psi.KtStringTemplateEntry
Expand Down Expand Up @@ -75,7 +75,7 @@ class MultilineRawStringIndentation(config: Config) : Rule(
return
}

val lineAndColumn = getLineAndColumnInPsiFile(expression.containingFile, expression.textRange) ?: return
val lineAndColumn = DiagnosticUtils.getLineAndColumnInPsiFile(expression.containingFile, expression.textRange)

Check failure

Code scanning / detekt

Mark forbidden methods. A forbidden method could be an invocation of an unstable / experimental method and hence you might want to mark it as forbidden in order to get warned about the usage. Error

The method org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile has been forbidden in the detekt config.
val lineCount = expression.text.lines().count()

expression.checkIndentation(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.gitlab.arturbosch.detekt.rules.style

import io.github.detekt.psi.absolutePath
import io.github.detekt.psi.getLineAndColumnInPsiFile
import io.gitlab.arturbosch.detekt.api.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
Expand All @@ -11,6 +10,7 @@ import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.SourceLocation
import io.gitlab.arturbosch.detekt.api.TextLocation
import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.endOffset

Expand All @@ -26,11 +26,11 @@ class NewLineAtEndOfFile(config: Config) : Rule(
override fun visitKtFile(file: KtFile) {
val text = file.text
if (text.isNotEmpty() && !text.endsWith('\n')) {
val coords = getLineAndColumnInPsiFile(
val coords = DiagnosticUtils.getLineAndColumnInPsiFile(
file,
TextRange(file.endOffset, file.endOffset)
)

Check failure

Code scanning / detekt

Mark forbidden methods. A forbidden method could be an invocation of an unstable / experimental method and hence you might want to mark it as forbidden in order to get warned about the usage. Error

The method org.jetbrains.kotlin.diagnostics.DiagnosticUtils.getLineAndColumnInPsiFile has been forbidden in the detekt config.
val sourceLocation = SourceLocation(coords?.line ?: 0, coords?.column ?: 0)
val sourceLocation = SourceLocation(coords.line, coords.column)
val textLocation = TextLocation(file.endOffset, file.endOffset)
val location = Location(
source = sourceLocation,
Expand Down

0 comments on commit 7781d65

Please sign in to comment.