One of the fix is that the gen folder is no longer deleted on clean (or full build)
which should reduce errors where eclipse complain the gen folder is missing
even though it's present.
Also move ProjectState into SDK as it's really only managed
by the SDK and it allows us to move its constructor to package private.
Change-Id: I321ac23f756652e7082297d2ef560a654e97cf67
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.build.PostCompilerHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
import com.android.sdklib.SdkConstants;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.xml.sax.SAXException;
}
/**
- * Recursively delete all the derived resources.
+ * Recursively delete all the derived resources from a root resource. The root resource is not
+ * deleted.
+ * @param rootResource the root resource
+ * @param monitor a progress monitor.
+ * @throws CoreException
+ *
*/
- protected void removeDerivedResources(IResource resource, IProgressMonitor monitor)
+ protected void removeDerivedResources(IResource rootResource, IProgressMonitor monitor)
throws CoreException {
- if (resource.exists()) {
- if (resource.isDerived()) {
- resource.delete(true, new SubProgressMonitor(monitor, 10));
- } else if (resource.getType() == IResource.FOLDER) {
- IFolder folder = (IFolder)resource;
+ removeDerivedResources(rootResource, false, monitor);
+ }
+
+ private void removeDerivedResources(IResource rootResource, boolean deleteRoot,
+ IProgressMonitor monitor)
+ throws CoreException {
+ if (rootResource.exists()) {
+ if (rootResource.getType() == IResource.FOLDER) {
+ IFolder folder = (IFolder)rootResource;
IResource[] members = folder.members();
for (IResource member : members) {
- removeDerivedResources(member, monitor);
+ removeDerivedResources(member, true /*deleteRoot*/, monitor);
}
+ } else if (rootResource.isDerived()) {
+ rootResource.getLocation().toFile().delete();
+ }
+
+ if (deleteRoot) {
+ rootResource.getLocation().toFile().delete();
}
}
}
import com.android.ide.eclipse.adt.internal.project.ApkInstallManager;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.xml.AndroidManifest;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.project.FixLaunchConfig;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
import com.android.ide.eclipse.adt.internal.project.XmlErrorHandler.BasicXmlErrorListener;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.io.IFileWrapper;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
if (kind == FULL_BUILD) {
AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
Messages.Start_Full_Pre_Compiler);
+
+ // do some clean up.
+ doClean(project, monitor);
+
mMustCompileResources = true;
buildAidlCompilationList(project, sourceFolderPathList);
} else {
flc.start();
}
- // now we delete the generated classes from their previous location
- deleteObsoleteGeneratedClass(AndroidConstants.FN_RESOURCE_CLASS,
- mManifestPackage);
- deleteObsoleteGeneratedClass(AndroidConstants.FN_MANIFEST_CLASS,
- mManifestPackage);
-
// record the new manifest package, and save it.
mManifestPackage = javaPackage;
saveProjectStringProperty(PROPERTY_PACKAGE, mManifestPackage);
+
+ // force a clean
+ doClean(project, monitor);
+ mMustCompileResources = true;
+ buildAidlCompilationList(project, sourceFolderPathList);
+
+ saveProjectBooleanProperty(PROPERTY_COMPILE_RESOURCES , mMustCompileResources);
}
if (mMustCompileResources) {
protected void clean(IProgressMonitor monitor) throws CoreException {
super.clean(monitor);
- // Get the project.
- IProject project = getProject();
+ doClean(getProject(), monitor);
+ if (mGenFolder != null) {
+ mGenFolder.refreshLocal(IResource.DEPTH_INFINITE, monitor);
+ }
+ }
+ private void doClean(IProject project, IProgressMonitor monitor) throws CoreException {
AdtPlugin.printBuildToConsole(BuildVerbosity.VERBOSE, project,
Messages.Removing_Generated_Classes);
// remove all the derived resources from the 'gen' source folder.
- removeDerivedResources(mGenFolder, monitor);
+ if (mGenFolder != null) {
+ removeDerivedResources(mGenFolder, monitor);
+ }
// Clear the project of the generic markers
removeMarkersFromProject(project, AndroidConstants.MARKER_AAPT_COMPILE);
removeMarkersFromProject(project, AndroidConstants.MARKER_XML);
removeMarkersFromProject(project, AndroidConstants.MARKER_AIDL);
+
}
@Override
// we actually need to delete the manifest.java as it may become empty and
// in this case aapt doesn't generate an empty one, but instead doesn't
// touch it.
- manifestJavaFile.delete(true, null);
+ manifestJavaFile.getLocation().toFile().delete();
// launch aapt: create the command line
ArrayList<String> array = new ArrayList<String>();
}
/**
- * Delete the a generated java class associated with the specified java package.
- * @param filename Name of the generated file to remove.
- * @param javaPackage the old java package
- */
- private void deleteObsoleteGeneratedClass(String filename, String javaPackage) {
- if (javaPackage == null) {
- return;
- }
-
- IPath packagePath = getJavaPackagePath(javaPackage);
- IPath iPath = packagePath.append(filename);
-
- // Find a matching resource object.
- IResource javaFile = mGenFolder.findMember(iPath);
- if (javaFile != null && javaFile.exists() && javaFile.getType() == IResource.FILE) {
- try {
- // delete
- javaFile.delete(true, null);
-
- // refresh parent
- javaFile.getParent().refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor());
-
- } catch (CoreException e) {
- // failed to delete it, the user will have to delete it manually.
- String message = String.format(Messages.Delete_Obsolete_Error,
- javaFile.getFullPath());
- IProject project = getProject();
- AdtPlugin.printErrorToConsole(project, message);
- AdtPlugin.printErrorToConsole(project, e.getMessage());
- }
- }
- }
-
- /**
* Creates a relative {@link IPath} from a java package.
* @param javaPackageName the java package.
*/
if (javaFile.exists()) {
// This confirms the java file was generated by the builder,
// we can delete the aidlFile.
- javaFile.delete(true, null);
-
- // Refresh parent.
- javaFile.getParent().refreshLocal(IResource.DEPTH_ONE, monitor);
+ javaFile.getLocation().toFile().delete();
}
}
javaProject.setRawClasspath(entries, new SubProgressMonitor(monitor, 10));
}
- // refresh sepcifcally the gen folder first, as it may break the build
+ // refresh specifically the gen folder first, as it may break the build
// if it doesn't arrive in time then refresh the whole project as usual.
genFolder.refreshLocal(IResource.DEPTH_ZERO, new SubProgressMonitor(monitor, 10));
project.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 10));
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AndroidConstants;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
import com.android.ide.eclipse.adt.internal.resources.ResourceType;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IResourceEventListener;
import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager.IResourceListener;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import org.eclipse.core.resources.IFile;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestEditor;
import com.android.ide.eclipse.adt.internal.editors.ui.SectionHelper.ManifestSectionPart;
import com.android.ide.eclipse.adt.internal.project.ExportHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import org.eclipse.core.resources.IFile;
package com.android.ide.eclipse.adt.internal.launch;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import org.eclipse.core.resources.IProject;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AndroidConstants;
import com.android.ide.eclipse.adt.internal.sdk.LoadStatus;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
package com.android.ide.eclipse.adt.internal.project;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper.IProjectFilter;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import org.eclipse.core.resources.IProject;
package com.android.ide.eclipse.adt.internal.properties;
import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper.IProjectChooserFilter;
-import com.android.ide.eclipse.adt.internal.project.ProjectState.LibraryState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
import com.android.sdklib.internal.project.ProjectProperties;
import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
package com.android.ide.eclipse.adt.internal.resources.manager;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
import com.android.ide.eclipse.adt.internal.resources.IResourceRepository;
import com.android.ide.eclipse.adt.internal.resources.ResourceItem;
import com.android.ide.eclipse.adt.internal.resources.ResourceType;
import com.android.ide.eclipse.adt.internal.resources.configurations.LanguageQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.RegionQualifier;
import com.android.ide.eclipse.adt.internal.resources.configurations.ResourceQualifier;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
import com.android.layoutlib.api.IResourceValue;
* limitations under the License.
*/
-package com.android.ide.eclipse.adt.internal.project;
+package com.android.ide.eclipse.adt.internal.sdk;
import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.internal.project.ApkSettings;
import com.android.sdklib.internal.project.ProjectProperties;
*/
private final ArrayList<ProjectState> mParentProjects = new ArrayList<ProjectState>();
- public ProjectState(IProject project, ProjectProperties properties) {
+ ProjectState(IProject project, ProjectProperties properties) {
if (project == null || properties == null) {
throw new NullPointerException();
}
import com.android.ide.eclipse.adt.internal.project.AndroidClasspathContainerInitializer;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
-import com.android.ide.eclipse.adt.internal.project.ProjectState.LibraryDifference;
-import com.android.ide.eclipse.adt.internal.project.ProjectState.LibraryState;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IFileListener;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IProjectListener;
import com.android.ide.eclipse.adt.internal.resources.manager.GlobalProjectMonitor.IResourceEventListener;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.LayoutBridge;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryDifference;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
import com.android.prefs.AndroidLocation.AndroidLocationException;
import com.android.sdklib.AndroidVersion;
import com.android.sdklib.IAndroidTarget;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
private interface ActionBundle {
enum BundleType { LINK_LIBRARY, UNLINK_LIBRARY };
BundleType getType();
+ IProject getProject();
};
/**
return BundleType.LINK_LIBRARY;
}
+ public IProject getProject() {
+ return mProject;
+ }
+
@Override
public String toString() {
return String.format("LinkLibraryBundle: %1$s (%2$s) > %3$s", //$NON-NLS-1$
public BundleType getType() {
return BundleType.UNLINK_LIBRARY;
}
+
+ public IProject getProject() {
+ return mProject.getProject();
+ }
}
private final ArrayList<ActionBundle> mActionBundleQueue = new ArrayList<ActionBundle>();
unlinkLibrary((UnlinkLibraryBundle) bundle, monitor);
break;
}
+
+ // force a recompile
+ bundle.getProject().build(
+ IncrementalProjectBuilder.FULL_BUILD, monitor);
+
} catch (Exception e) {
AdtPlugin.log(e, "Failed to process bundle: %1$s", //$NON-NLS-1$
bundle.toString());
package com.android.ide.eclipse.adt.internal.wizards.actions;
import com.android.ide.eclipse.adt.internal.project.ExportHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import org.eclipse.core.resources.IProject;
package com.android.ide.eclipse.adt.internal.wizards.actions;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard;
package com.android.ide.eclipse.adt.internal.wizards.export;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
-import com.android.ide.eclipse.adt.internal.project.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage;
import com.android.sdklib.internal.project.ApkSettings;