diff --git a/server/src/main/kotlin/org/javacs/kt/codeaction/quickfix/QuickFix.kt b/server/src/main/kotlin/org/javacs/kt/codeaction/quickfix/QuickFix.kt index a7048ddf4..89526bb0a 100644 --- a/server/src/main/kotlin/org/javacs/kt/codeaction/quickfix/QuickFix.kt +++ b/server/src/main/kotlin/org/javacs/kt/codeaction/quickfix/QuickFix.kt @@ -7,6 +7,7 @@ import org.eclipse.lsp4j.Range import org.eclipse.lsp4j.jsonrpc.messages.Either import org.javacs.kt.CompiledFile import org.javacs.kt.index.SymbolIndex +import org.javacs.kt.util.isSubrangeOf import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.diagnostics.Diagnostic as KotlinDiagnostic @@ -16,10 +17,10 @@ interface QuickFix { } fun diagnosticMatch(diagnostic: Diagnostic, range: Range, diagnosticTypes: Set): Boolean = - diagnostic.range.equals(range) && diagnosticTypes.contains(diagnostic.code.left) + range.isSubrangeOf(diagnostic.range) && diagnosticTypes.contains(diagnostic.code.left) fun diagnosticMatch(diagnostic: KotlinDiagnostic, startCursor: Int, endCursor: Int, diagnosticTypes: Set): Boolean = - diagnostic.textRanges.any { it.startOffset == startCursor && it.endOffset == endCursor } && diagnosticTypes.contains(diagnostic.factory.name) + diagnostic.textRanges.any { it.startOffset <= startCursor && it.endOffset >= endCursor } && diagnosticTypes.contains(diagnostic.factory.name) fun findDiagnosticMatch(diagnostics: List, range: Range, diagnosticTypes: Set) = diagnostics.find { diagnosticMatch(it, range, diagnosticTypes) } diff --git a/server/src/main/kotlin/org/javacs/kt/util/RangeUtils.kt b/server/src/main/kotlin/org/javacs/kt/util/RangeUtils.kt new file mode 100644 index 000000000..01820c80d --- /dev/null +++ b/server/src/main/kotlin/org/javacs/kt/util/RangeUtils.kt @@ -0,0 +1,8 @@ +package org.javacs.kt.util + +import org.eclipse.lsp4j.Range + +// checks if the current range is within the other range (same lines, within the character bounds) +fun Range.isSubrangeOf(otherRange: Range): Boolean = + otherRange.start.line == this.start.line && otherRange.end.line == this.end.line && + otherRange.start.character <= this.start.character && otherRange.end.character >= this.end.character