@@ -39,10 +39,17 @@ import org.jetbrains.kotlin.ui.editors.annotations.AnnotationManager
3939import org.jetbrains.kotlin.ui.editors.annotations.DiagnosticAnnotation
4040import org.jetbrains.kotlin.ui.editors.annotations.DiagnosticAnnotationUtil
4141import com.google.common.collect.Sets
42+ import org.jetbrains.kotlin.core.resolve.KotlinAnalyzer
43+ import org.eclipse.core.resources.IMarker
44+ import org.eclipse.core.runtime.jobs.Job
45+ import org.eclipse.core.runtime.IStatus
46+ import org.eclipse.core.runtime.Status
47+ import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
48+ import org.jetbrains.kotlin.progress.CompilationCanceledStatus
49+ import org.jetbrains.kotlin.progress.CompilationCanceledException
4250
4351class KotlinBuilder : IncrementalProjectBuilder () {
4452 override fun build (kind : Int , args : Map <String , String >? , monitor : IProgressMonitor ? ): Array <IProject >? {
45- val project = getProject()
4653 val javaProject = JavaCore .create(project)
4754 if (isBuildingForLaunch()) {
4855 compileKotlinFiles(javaProject)
@@ -56,24 +63,25 @@ class KotlinBuilder : IncrementalProjectBuilder() {
5663 if (delta != null ) getAffectedFiles(delta, javaProject) else emptySet()
5764 }
5865
59- commitFiles(affectedFiles)
66+ val existingAffectedFiles = affectedFiles.filter { it.exists() }
67+
68+ commitFiles(existingAffectedFiles)
6069
6170 if (affectedFiles.isNotEmpty()) {
6271 KotlinLightClassGeneration .updateLightClasses(javaProject, affectedFiles)
6372 }
6473
65- val analysisResult = KotlinAnalysisProjectCache .getAnalysisResult(javaProject)
66- updateLineMarkers(analysisResult.bindingContext.diagnostics)
74+ val ktFiles = existingAffectedFiles.map { KotlinPsiManager .INSTANCE .getParsedFile(it) }
75+ val analysisResult = KotlinAnalyzer .analyzeFiles(javaProject, ktFiles).analysisResult
76+ updateLineMarkers(analysisResult.bindingContext.diagnostics, existingAffectedFiles)
77+
78+ runCancellableAnalysisFor(javaProject, existingAffectedFiles)
6779
6880 return null
6981 }
7082
7183 private fun commitFiles (files : Collection <IFile >) {
72- for (file in files) {
73- if (file.exists()) {
74- KotlinPsiManager .getKotlinFileIfExist(file, EditorUtil .getDocument(file).get())
75- }
76- }
84+ files.forEach { KotlinPsiManager .getKotlinFileIfExist(it, EditorUtil .getDocument(it).get()) }
7785 }
7886
7987 private fun getAffectedFiles (resourceDelta : IResourceDelta , javaProject : IJavaProject ): Set <IFile > {
@@ -100,27 +108,27 @@ class KotlinBuilder : IncrementalProjectBuilder() {
100108 return Thread .currentThread().getStackTrace().find { it.className == launchDelegateFQName } != null
101109 }
102110
103- private fun compileKotlinFiles (javaProject : IJavaProject ) {
111+ private fun compileKotlinFiles (javaProject : IJavaProject ) {
104112 val compilerResult = KotlinCompilerUtils .compileWholeProject(javaProject)
105113 if (! compilerResult.compiledCorrectly()) {
106114 KotlinCompilerUtils .handleCompilerOutput(compilerResult.getCompilerOutput())
107115 }
108116 }
117+ }
118+
119+ fun updateLineMarkers (diagnostics : Diagnostics , affectedFiles : List <IFile >) {
120+ clearMarkersFromFiles(affectedFiles)
121+ addMarkersToProject(DiagnosticAnnotationUtil .INSTANCE .handleDiagnostics(diagnostics), affectedFiles)
122+ }
123+
124+ private fun clearMarkersFromFiles (files : List <IFile >) {
125+ files.forEach { it.deleteMarkers(IMarker .PROBLEM , true , IResource .DEPTH_INFINITE ) }
126+ }
127+
128+ private fun addMarkersToProject (annotations : Map <IFile , List <DiagnosticAnnotation >>, affectedFiles : List <IFile >) {
129+ affectedFiles.forEach { DiagnosticAnnotationUtil .INSTANCE .addParsingDiagnosticAnnotations(it, annotations) }
109130
110- private fun updateLineMarkers (diagnostics : Diagnostics ) {
111- addMarkersToProject(DiagnosticAnnotationUtil .INSTANCE .handleDiagnostics(diagnostics), getProject())
112- }
113-
114- private fun addMarkersToProject (annotations : Map <IFile , List <DiagnosticAnnotation >>, project : IProject ) {
115- AnnotationManager .clearAllMarkersFromProject(project)
116- for (file in KotlinPsiManager .INSTANCE .getFilesByProject(getProject())) {
117- DiagnosticAnnotationUtil .INSTANCE .addParsingDiagnosticAnnotations(file, annotations)
118- }
119-
120- for ((file, diagnosticAnnotations) in annotations) {
121- for (annotation in diagnosticAnnotations) {
122- AnnotationManager .addProblemMarker(annotation, file)
123- }
124- }
131+ for (file in affectedFiles) {
132+ annotations[file]?.forEach { AnnotationManager .addProblemMarker(it, file) }
125133 }
126134}
0 commit comments