diff --git a/detekt-api/api/detekt-api.api b/detekt-api/api/detekt-api.api index 8405d7309808..c5f0d19bd2d3 100644 --- a/detekt-api/api/detekt-api.api +++ b/detekt-api/api/detekt-api.api @@ -353,10 +353,12 @@ public final class io/gitlab/arturbosch/detekt/api/LazyRegex : kotlin/properties 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/TextLocation;Lio/github/detekt/psi/FilePath;)V + public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;)V + public synthetic fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;)V public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;)V - public synthetic fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;)V + public synthetic fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Ljava/lang/String;)V public fun compact ()Ljava/lang/String; public fun compactWithSignature ()Ljava/lang/String; @@ -364,9 +366,11 @@ public final class io/gitlab/arturbosch/detekt/api/Location : io/gitlab/arturbos public final fun component2 ()Lio/gitlab/arturbosch/detekt/api/TextLocation; public final fun component3 ()Ljava/lang/String; public final fun component4 ()Lio/github/detekt/psi/FilePath; - public final fun copy (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;)Lio/gitlab/arturbosch/detekt/api/Location; - public static synthetic fun copy$default (Lio/gitlab/arturbosch/detekt/api/Location;Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;ILjava/lang/Object;)Lio/gitlab/arturbosch/detekt/api/Location; + public final fun component5 ()Lio/gitlab/arturbosch/detekt/api/SourceLocation; + public final fun copy (Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;)Lio/gitlab/arturbosch/detekt/api/Location; + public static synthetic fun copy$default (Lio/gitlab/arturbosch/detekt/api/Location;Lio/gitlab/arturbosch/detekt/api/SourceLocation;Lio/gitlab/arturbosch/detekt/api/TextLocation;Ljava/lang/String;Lio/github/detekt/psi/FilePath;Lio/gitlab/arturbosch/detekt/api/SourceLocation;ILjava/lang/Object;)Lio/gitlab/arturbosch/detekt/api/Location; public fun equals (Ljava/lang/Object;)Z + public final fun getEndSource ()Lio/gitlab/arturbosch/detekt/api/SourceLocation; public final fun getFile ()Ljava/lang/String; public final fun getFilePath ()Lio/github/detekt/psi/FilePath; public final fun getSource ()Lio/gitlab/arturbosch/detekt/api/SourceLocation; 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 5f7fccd61866..56b6a441afd1 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 @@ -24,15 +24,17 @@ data class Location @Deprecated("Consider relative path by passing a [FilePath]" ) ) val file: String, - val filePath: FilePath = FilePath.fromAbsolute(Paths.get(file)) + val filePath: FilePath = FilePath.fromAbsolute(Paths.get(file)), + val endSource: SourceLocation = SourceLocation(-1, -1) ) : Compactable { @Suppress("DEPRECATION") constructor( source: SourceLocation, text: TextLocation, - filePath: FilePath - ) : this(source, text, filePath.absolutePath.toString(), filePath) + filePath: FilePath, + endSource: SourceLocation = SourceLocation(-1, -1) + ) : this(source, text, filePath.absolutePath.toString(), filePath, endSource) @Suppress("DEPRECATION") @Deprecated( @@ -62,20 +64,33 @@ data class Location @Deprecated("Consider relative path by passing a [FilePath]" fun from(element: PsiElement, offset: Int = 0): Location { val start = startLineAndColumn(element, offset) val sourceLocation = SourceLocation(start.line, start.column) + val end = endLineAndColumn(element, offset) + val endSourceLocation = SourceLocation(end.line, end.column) val textLocation = TextLocation(element.startOffset + offset, element.endOffset + offset) - return Location(sourceLocation, textLocation, element.containingFile.toFilePath()) + return Location(sourceLocation, textLocation, element.containingFile.toFilePath(), endSourceLocation) } /** - * Determines the line and column of a [PsiElement] in the source file. + * Determines the start line and column of a [PsiElement] in the source file. */ - fun startLineAndColumn(element: PsiElement, offset: Int = 0): PsiDiagnosticUtils.LineAndColumn { + fun startLineAndColumn(element: PsiElement, offset: Int = 0) = + lineAndColumn( + element, + TextRange(element.textRange.startOffset + offset, element.textRange.endOffset + offset) + ) + + /** + * Determines the end line and column of a [PsiElement] in the source file. + */ + private fun endLineAndColumn(element: PsiElement, offset: Int = 0) = + lineAndColumn( + element, + TextRange(element.textRange.endOffset + offset, element.textRange.endOffset + offset) + ) + + private fun lineAndColumn(element: PsiElement, range: TextRange): PsiDiagnosticUtils.LineAndColumn { return try { - val range = element.textRange - DiagnosticUtils.getLineAndColumnInPsiFile( - element.containingFile, - TextRange(range.startOffset + offset, range.endOffset + offset) - ) + DiagnosticUtils.getLineAndColumnInPsiFile(element.containingFile, range) } catch (@Suppress("SwallowedException", "TooGenericExceptionCaught") e: IndexOutOfBoundsException) { // #3317 If any rule mutates the PsiElement, searching the original PsiElement may throw exception. PsiDiagnosticUtils.LineAndColumn(-1, -1, null)