New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix AnnotationExcluder
#4518
Merged
Merged
Fix AnnotationExcluder
#4518
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
f72028b
Implement FullQualifiedNameGuesser
BraisGabin 95e44e2
Remove bad test
BraisGabin 3d9a804
Refactor tests
BraisGabin 1e36938
Fix AnnotationExcluder
BraisGabin 7d35ecf
More exhaustive list of default import classes
BraisGabin fab3a88
Handle PR comments
BraisGabin File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
55 changes: 55 additions & 0 deletions
55
detekt-psi-utils/src/main/kotlin/io/github/detekt/psi/internal/FullQualifiedNameGuesser.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
package io.github.detekt.psi.internal | ||
|
||
import org.jetbrains.kotlin.psi.KtFile | ||
import org.jetbrains.kotlin.psi.KtImportDirective | ||
import org.jetbrains.kotlin.utils.addIfNotNull | ||
import kotlin.LazyThreadSafetyMode.NONE | ||
|
||
class FullQualifiedNameGuesser internal constructor( | ||
private val packageName: String?, | ||
imports: List<KtImportDirective>, | ||
) { | ||
|
||
constructor(root: KtFile) : this( | ||
packageName = root.packageDirective?.qualifiedName?.ifBlank { null }, | ||
imports = root.importList?.imports.orEmpty(), | ||
) | ||
|
||
@Suppress("ClassOrdering") | ||
private val resolvedNames: Map<String, String> by lazy(NONE) { | ||
imports | ||
.asSequence() | ||
.filterNot { it.isAllUnder } | ||
.mapNotNull { import -> | ||
import.importedFqName?.toString()?.let { fqImport -> | ||
(import.alias?.name ?: fqImport.substringAfterLast('.')) to fqImport | ||
} | ||
} | ||
.toMap() | ||
} | ||
|
||
fun getFullQualifiedName(name: String): Set<String> { | ||
val resolvedName = findName(name) | ||
return if (resolvedName != null) { | ||
setOf(resolvedName) | ||
} else { | ||
mutableSetOf<String>() | ||
.apply { | ||
addIfNotNull(defaultImportClasses[name]) | ||
if (packageName != null) { | ||
add("$packageName.$name") | ||
} | ||
} | ||
} | ||
} | ||
|
||
private fun findName(name: String): String? { | ||
val searchName = name.substringBefore('.') | ||
val resolvedName = resolvedNames[searchName] | ||
return if (name == searchName) { | ||
resolvedName | ||
} else { | ||
"$resolvedName.${name.substringAfter('.')}" | ||
} | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Non blocking comment: I hate parameterized tests like this. That is why I split it into 2 tests. But I know there are more schools of thought here ;) But that is something for our style guide. How many parameters may a test have before it is considered unreadable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't like this kind of tests either. I would prefer to have way less. But they were needed. There were really random cases that were not covered. And while I was implementing this I broke some of them while fixing others.
And I think that it's better to have all the cases together because they are in blocks of 5. Maybe I could add a new line between each "block of tests" to make it easier to read. But I can reverse the change and split them in two if you think it's better.