Changes on code review

This commit is contained in:
Valentin Kipyatkov
2015-07-22 16:47:45 +03:00
parent 851057a9ef
commit 153316c313
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.inspections
import com.intellij.codeInsight.CodeInsightSettings import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.actions.OptimizeImportsProcessor import com.intellij.codeInsight.actions.OptimizeImportsProcessor
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.daemon.QuickFixBundle
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx
import com.intellij.codeInsight.daemon.impl.DaemonListeners import com.intellij.codeInsight.daemon.impl.DaemonListeners
@@ -47,12 +46,12 @@ import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer
import org.jetbrains.kotlin.idea.imports.importableFqNameSafe import org.jetbrains.kotlin.idea.imports.importableFqNameSafe
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetImportDirective
import org.jetbrains.kotlin.psi.JetSimpleNameExpression import org.jetbrains.kotlin.psi.JetSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
import org.jetbrains.kotlin.resolve.ImportPath import org.jetbrains.kotlin.resolve.ImportPath
import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets import org.jetbrains.kotlin.resolve.bindingContextUtil.getReferenceTargets
import java.util.* import java.util.ArrayList
import java.util.HashSet
class UnusedImportInspection : AbstractKotlinInspection() { class UnusedImportInspection : AbstractKotlinInspection() {
override fun runForWholeFile() = true override fun runForWholeFile() = true
@@ -79,7 +78,7 @@ class UnusedImportInspection : AbstractKotlinInspection() {
val fqName = descriptor.importableFqNameSafe val fqName = descriptor.importableFqNameSafe
fqNames.add(fqName) fqNames.add(fqName)
if (fqName !in explicitlyImportedFqNames) { // we don't add parents of explicitly imported fq-names because such imports are not neeeded if (fqName !in explicitlyImportedFqNames) { // we don't add parents of explicitly imported fq-names because such imports are not needed
val parentFqName = fqName.parent() val parentFqName = fqName.parent()
if (!parentFqName.isRoot) { if (!parentFqName.isRoot) {
parentFqNames.add(parentFqName) parentFqNames.add(parentFqName)
@@ -129,36 +128,42 @@ class UnusedImportInspection : AbstractKotlinInspection() {
} }
private fun scheduleOptimizeImportsOnTheFly(file: JetFile, descriptorsToImport: Set<DeclarationDescriptor>) { private fun scheduleOptimizeImportsOnTheFly(file: JetFile, descriptorsToImport: Set<DeclarationDescriptor>) {
if (CodeInsightSettings.getInstance().OPTIMIZE_IMPORTS_ON_THE_FLY) { if (!CodeInsightSettings.getInstance().OPTIMIZE_IMPORTS_ON_THE_FLY) return
val optimizedImports = KotlinImportOptimizer.prepareOptimizedImports(file, descriptorsToImport) ?: return // return if already optimized val optimizedImports = KotlinImportOptimizer.prepareOptimizedImports(file, descriptorsToImport) ?: return // return if already optimized
// unwrap progress indicator // unwrap progress indicator
val progress = sequence(ProgressManager.getInstance().progressIndicator) { val progress = sequence(ProgressManager.getInstance().progressIndicator) {
(it as? ProgressWrapper)?.originalProgressIndicator (it as? ProgressWrapper)?.originalProgressIndicator
}.last() }.last()
val highlightingSession = HighlightingSessionImpl.getHighlightingSession(file, progress) val highlightingSession = HighlightingSessionImpl.getHighlightingSession(file, progress)
val project = highlightingSession.project val project = highlightingSession.project
val editor = highlightingSession.editor val editor = highlightingSession.editor
if (editor != null) { if (editor != null) {
Disposer.register(highlightingSession, object : Disposable { val modificationStamp = editor.document.modificationStamp
override fun dispose() { val invokeFixLater = object : Disposable {
// later because should invoke when highlighting is finished override fun dispose() {
ApplicationManager.getApplication().invokeLater { // later because should invoke when highlighting is finished
if (timeToOptimizeImportsOnTheFly(file, editor, project)) { ApplicationManager.getApplication().invokeLater {
optimizeImportsOnTheFly(file, optimizedImports, editor, project) if (timeToOptimizeImportsOnTheFly(file, editor, project) && editor.document.modificationStamp == modificationStamp) {
} optimizeImportsOnTheFly(file, optimizedImports, editor, project)
} }
} }
}) }
}
Disposer.register(highlightingSession, invokeFixLater)
if (progress.isCanceled) {
Disposer.dispose(invokeFixLater)
Disposer.dispose(highlightingSession)
progress.checkCanceled()
} }
} }
} }
private fun timeToOptimizeImportsOnTheFly(file: JetFile, editor: Editor, project: Project): Boolean { private fun timeToOptimizeImportsOnTheFly(file: JetFile, editor: Editor, project: Project): Boolean {
if (project.isDisposed || !file.isValid || editor.isDisposed) return false if (project.isDisposed || !file.isValid || editor.isDisposed || !file.isWritable) return false
if (!file.isWritable) return false
// do not optimize imports on the fly during undo/redo // do not optimize imports on the fly during undo/redo
val undoManager = UndoManager.getInstance(editor.project) val undoManager = UndoManager.getInstance(editor.project)