Parcourir la source

267245: don't give up on incremental build if >30 files affected

tags/V1_6_4
aclement il y a 15 ans
Parent
révision
f53ca7ccce

+ 31
- 50
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjState.java Voir le fichier

@@ -8,6 +8,7 @@
*
* Contributors:
* PARC initial implementation
* Andy Clement overhauled
* ******************************************************************/

package org.aspectj.ajdt.internal.core.builder;
@@ -309,8 +310,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
return false;
}

if (listenerDefined())
if (listenerDefined()) {
getListener().recordDecision("Preparing for build: planning to be an incremental build");
}
return true;
}

@@ -403,13 +405,15 @@ public class AjState implements CompilerConfigurationChangeFlags {

private static int CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD = 2;

private static int MAX_AFFECTED_FILES_BEFORE_FULL_BUILD = 30;

public static final FileFilter classFileFilter = new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(".class");
}
};
private void recordDecision(String decision) {
getListener().recordDecision(decision);
}

/**
* Analyse .class files in the directory specified, if they have changed since the last successful build then see if we can
@@ -420,6 +424,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
private int classFileChangedInDirSinceLastBuildRequiringFullBuild(File dir, int pathid) {

if (!dir.isDirectory()) {
if (listenerDefined()) {
recordDecision("ClassFileChangeChecking: not a directory so forcing full build: '"+dir.getPath()+"'");
}
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
}

@@ -427,9 +434,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
AjState state = IncrementalStateManager.findStateManagingOutputLocation(dir);
if (listenerDefined()) {
if (state != null) {
getListener().recordDecision("Found state instance managing output location : " + dir);
recordDecision("ClassFileChangeChecking: found state instance managing output location : " + dir);
} else {
getListener().recordDecision("Failed to find a state instance managing output location : " + dir);
recordDecision("ClassFileChangeChecking: failed to find a state instance managing output location : " + dir);
}
}
@@ -440,7 +447,7 @@ public class AjState implements CompilerConfigurationChangeFlags {
// we are paying a heavy price to check it
if (state != null && !state.hasAnyStructuralChangesSince(lastSuccessfulBuildTime)) {
if (listenerDefined()) {
getListener().recordDecision("No reported changes in that state");
getListener().recordDecision("ClassFileChangeChecking: no reported changes in that state");
}
return CLASS_FILE_NO_CHANGES;
}
@@ -456,7 +463,7 @@ public class AjState implements CompilerConfigurationChangeFlags {
// further numbers can determine more granular changes
if (i==1) {
if (listenerDefined()) {
getListener().recordDecision("'"+dir+"' is apparently unchanged so not performing timestamp check");
getListener().recordDecision("ClassFileChangeChecking: queried JDT and '"+dir+"' is apparently unchanged so not performing timestamp check");
}
return CLASS_FILE_NO_CHANGES;
}
@@ -476,7 +483,7 @@ public class AjState implements CompilerConfigurationChangeFlags {
isTypeWeReferTo(classFile)) {
// further improvements possible
if (listenerDefined()) {
getListener().recordDecision("Aspect found that has structurally changed or that this project depends upon : " + classFile);
getListener().recordDecision("ClassFileChangeChecking: aspect found that has structurally changed or that this project depends upon : " + classFile);
}
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
} else {
@@ -487,11 +494,11 @@ public class AjState implements CompilerConfigurationChangeFlags {
// and must rebuild
if (pathid==PATHID_CLASSPATH) {
if (listenerDefined()) {
getListener().recordDecision("Found aspect on classpath but this project doesn't reference it, continuing to try for incremental build : " + classFile);
getListener().recordDecision("ClassFileChangeChecking: found aspect on classpath but this project doesn't reference it, continuing to try for incremental build : " + classFile);
}
} else {
if (listenerDefined()) {
getListener().recordDecision("Found aspect on aspectpath/inpath - can't determine if this project is affected, must full build: " + classFile);
getListener().recordDecision("ClassFileChangeChecking: found aspect on aspectpath/inpath - can't determine if this project is affected, must full build: " + classFile);
}
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
}
@@ -500,16 +507,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
}
if (state.hasStructuralChangedSince(classFile, lastSuccessfulBuildTime)) {
if (listenerDefined()) {
getListener().recordDecision("Structural change detected in : " + classFile);
}

if (isTypeWeReferTo(classFile)) {
if (affectedFiles.size() > MAX_AFFECTED_FILES_BEFORE_FULL_BUILD)
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
getListener().recordDecision("ClassFileChangeChecking: structural change detected in : " + classFile);
}
// } else {
// if (listenerDefined())
// getListener().recordDecision("Change detected in " + classFile + " but it is not structural");
isTypeWeReferTo(classFile);
}
} else {
long modTime = classFile.lastModified();
@@ -528,7 +528,7 @@ public class AjState implements CompilerConfigurationChangeFlags {
isTypeWeReferTo(classFile)) {
// further improvements possible
if (listenerDefined()) {
getListener().recordDecision("Aspect found that has structurally changed or that this project depends upon : " + classFile);
getListener().recordDecision("ClassFileChangeChecking: aspect found that has structurally changed or that this project depends upon : " + classFile);
}
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
} else {
@@ -539,11 +539,11 @@ public class AjState implements CompilerConfigurationChangeFlags {
// and must rebuild
if (pathid==PATHID_CLASSPATH) {
if (listenerDefined()) {
getListener().recordDecision("Found aspect on classpath but this project doesn't reference it, continuing to try for incremental build : " + classFile);
getListener().recordDecision("ClassFileChangeChecking: found aspect on classpath but this project doesn't reference it, continuing to try for incremental build : " + classFile);
}
} else {
if (listenerDefined()) {
getListener().recordDecision("Found aspect on aspectpath/inpath - can't determine if this project is affected, must full build: " + classFile);
getListener().recordDecision("ClassFileChangeChecking: found aspect on aspectpath/inpath - can't determine if this project is affected, must full build: " + classFile);
}
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
}
@@ -551,22 +551,16 @@ public class AjState implements CompilerConfigurationChangeFlags {
}
if (state.hasStructuralChangedSince(classFile, lastSuccessfulBuildTime)) {
if (listenerDefined()) {
getListener().recordDecision("Structural change detected in : " + classFile);
}

if (isTypeWeReferTo(classFile)) {
if (affectedFiles.size() > MAX_AFFECTED_FILES_BEFORE_FULL_BUILD)
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
getListener().recordDecision("ClassFileChangeChecking: structural change detected in : " + classFile);
}
isTypeWeReferTo(classFile);
} else {
if (listenerDefined())
getListener().recordDecision("Change detected in " + classFile + " but it is not structural");
getListener().recordDecision("ClassFileChangeChecking: change detected in " + classFile + " but it is not structural");
}
} else {
// No state object to ask, so it only matters if we know which type depends on this file
if (isTypeWeReferTo(classFile)) {
if (affectedFiles.size() > MAX_AFFECTED_FILES_BEFORE_FULL_BUILD)
return CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD;
return CLASS_FILE_CHANGED_THAT_NEEDS_INCREMENTAL_BUILD;
} else {
return CLASS_FILE_NO_CHANGES;
@@ -722,17 +716,14 @@ public class AjState implements CompilerConfigurationChangeFlags {
// possibly the beginnings of addressing the second point in 270033 comment 3
// List/*ClassFile*/ cfs = (List)this.fullyQualifiedTypeNamesResultingFromCompilationUnit.get(entry.getKey());
affectedFiles.add(entry.getKey());
if (affectedFiles.size() > MAX_AFFECTED_FILES_BEFORE_FULL_BUILD)
return true;
// return true;
}
}
if (newlyAffectedFiles>0) {
return true;
}
if (listenerDefined())
if (listenerDefined()) {
getListener().recordDecision(toString() + ": type " + new String(className) + " is not depended upon by this state");
}
return false;
}

@@ -929,12 +920,6 @@ public class AjState implements CompilerConfigurationChangeFlags {
*/
private boolean changedAndNeedsFullBuild(List oldPath, List newPath, boolean checkClassFiles, List outputLocs,
Set alreadyAnalysedPaths, int pathid) {
// if (oldPath == null) {
// oldPath = new ArrayList();
// }
// if (newPath == null) {
// newPath = new ArrayList();
// }
if (oldPath.size() != newPath.size()) {
return true;
}
@@ -970,8 +955,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
if (!alreadyAnalysedPaths.contains(f.getAbsolutePath())) { // Do not check paths more than once
alreadyAnalysedPaths.add(f.getAbsolutePath());
int classFileChanges = classFileChangedInDirSinceLastBuildRequiringFullBuild(f,pathid);
if (classFileChanges == CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD)
if (classFileChanges == CLASS_FILE_CHANGED_THAT_NEEDS_FULL_BUILD) {
return true;
}
}
}
}
@@ -992,12 +978,6 @@ public class AjState implements CompilerConfigurationChangeFlags {
*/
private boolean classpathChangedAndNeedsFullBuild(List oldPath, List newPath, boolean checkClassFiles, List outputLocs,
Set alreadyAnalysedPaths) {
// if (oldPath == null) {
// oldPath = new ArrayList();
// }
// if (newPath == null) {
// newPath = new ArrayList();
// }
if (oldPath.size() != newPath.size()) {
return true;
}
@@ -1756,8 +1736,9 @@ public class AjState implements CompilerConfigurationChangeFlags {
// add in the things we compiled previously - I know that seems crap but otherwise we may pull woven
// stuff off disk (since we no longer have UnwovenClassFile objects) in order to satisfy references
// in the new files we are about to compile (see pr133532)
if (addTo.size() > 0)
if (addTo.size() > 0) {
addTo.addAll(lastTimeSources);
}
// // XXX Promote addTo to a Set - then we don't need this rubbish? but does it need to be ordered?
// if (addTo.size()>0) {
// for (Iterator iter = lastTimeSources.iterator(); iter.hasNext();) {

Chargement…
Annuler
Enregistrer