@@ -98,7 +98,6 @@ private[inc] abstract class IncrementalCommon(
98
98
invalidatedSources,
99
99
classfileManager,
100
100
pruned,
101
- previous,
102
101
classesToRecompile,
103
102
profiler.registerCycle(
104
103
invalidatedClasses,
@@ -149,11 +148,11 @@ private[inc] abstract class IncrementalCommon(
149
148
invalidatedSources : Set [VirtualFile ],
150
149
classFileManager : XClassFileManager ,
151
150
pruned : Analysis ,
152
- override val previousAnalysis : Analysis ,
153
151
classesToRecompile : Set [String ],
154
152
registerCycle : (Set [String ], APIChanges , Set [String ], Boolean ) => Unit
155
153
) extends IncrementalCallback (classFileManager) {
156
154
override val isFullCompilation : Boolean = allSources.subsetOf(invalidatedSources)
155
+ override val previousAnalysis : Analysis = previous
157
156
override val previousAnalysisPruned : Analysis = pruned
158
157
159
158
override def mergeAndInvalidate (
@@ -165,10 +164,12 @@ private[inc] abstract class IncrementalCommon(
165
164
partialAnalysis.copy(compilations = pruned.compilations ++ partialAnalysis.compilations)
166
165
else pruned ++ partialAnalysis
167
166
168
- // Represents classes detected as changed externally and internally (by a previous cycle)
167
+ // Represents all classes that were compiled as a result of external and internal invalidation (by a previous cycle)
169
168
// Maps the changed sources by the user to class names we can count as invalidated
170
169
val getClasses = (a : Analysis ) => initialChangedSources.flatMap(a.relations.classNames)
171
- val recompiledClasses = classesToRecompile ++ getClasses(previous) ++ getClasses(analysis)
170
+ val recompiledClasses = classesToRecompile ++
171
+ getClasses(previous) ++ getClasses(analysis) ++
172
+ invalidatedSources.flatMap(previous.relations.classNames)
172
173
173
174
val newApiChanges =
174
175
detectAPIChanges(recompiledClasses, previous.apis.internalAPI, analysis.apis.internalAPI)
@@ -499,11 +500,11 @@ private[inc] abstract class IncrementalCommon(
499
500
Set .empty
500
501
} else {
501
502
if (invalidateTransitively) {
502
- val firstClassTransitiveInvalidation = includeTransitiveInitialInvalidations(
503
- initial,
504
- IncrementalCommon .transitiveDeps(initial, log)(dependsOnClass),
505
- dependsOnClass
506
- )
503
+ // NOTE: As member reference relations do not include local relations, this invalidation will fully propagate
504
+ // thus we can't rely solely on `firstClassTransitiveInvalidation`. Better bet is to try to find transitive
505
+ // dependencies from result of `firstClassInvalidation`
506
+ val firstClassTransitiveInvalidation =
507
+ IncrementalCommon .transitiveDeps(firstClassInvalidation, log)(dependsOnClass )
507
508
log.debug(" Invalidate by brute force:\n\t " + firstClassTransitiveInvalidation)
508
509
firstClassTransitiveInvalidation ++ secondClassInvalidation ++ thirdClassInvalidation ++ recompiledClasses
509
510
} else {
0 commit comments