mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
SCD profiles: integration with CPathEntry framework.
New PerFileDiscoveredPathContainer. Updating CPathEntries on profile change.
This commit is contained in:
parent
877ceeab4e
commit
0944b253a3
31 changed files with 1260 additions and 493 deletions
|
@ -129,7 +129,9 @@
|
|||
id="GCCStandardMakePerProjectProfile"
|
||||
name="%extensionGCCPerProjectProfile.name"
|
||||
point="org.eclipse.cdt.make.core.ScannerConfigurationDiscoveryProfile">
|
||||
<scannerInfoCollector class="org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector"/>
|
||||
<scannerInfoCollector
|
||||
class="org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector"
|
||||
scope="project"/>
|
||||
<buildOutputProvider>
|
||||
<open/>
|
||||
<scannerInfoConsoleParser class="org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCScannerInfoConsoleParser"/>
|
||||
|
@ -146,7 +148,9 @@
|
|||
id="GCCStandardMakePerFileProfile"
|
||||
name="%extensionGCCPerFileProfile.name"
|
||||
point="org.eclipse.cdt.make.core.ScannerConfigurationDiscoveryProfile">
|
||||
<scannerInfoCollector class="org.eclipse.cdt.make.internal.core.scannerconfig2.PerFileSICollector"/>
|
||||
<scannerInfoCollector
|
||||
class="org.eclipse.cdt.make.internal.core.scannerconfig2.PerFileSICollector"
|
||||
scope="file"/>
|
||||
<buildOutputProvider>
|
||||
<open/>
|
||||
<scannerInfoConsoleParser class="org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCPerFileBOPConsoleParser"/>
|
||||
|
|
|
@ -65,6 +65,21 @@
|
|||
</appInfo>
|
||||
</annotation>
|
||||
</attribute>
|
||||
<attribute name="scope" use="required">
|
||||
<annotation>
|
||||
<documentation>
|
||||
|
||||
</documentation>
|
||||
</annotation>
|
||||
<simpleType>
|
||||
<restriction base="string">
|
||||
<enumeration value="project">
|
||||
</enumeration>
|
||||
<enumeration value="file">
|
||||
</enumeration>
|
||||
</restriction>
|
||||
</simpleType>
|
||||
</attribute>
|
||||
</complexType>
|
||||
</element>
|
||||
|
||||
|
|
|
@ -11,9 +11,11 @@ package org.eclipse.cdt.make.core.scannerconfig;
|
|||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
public interface IDiscoveredPathManager {
|
||||
|
||||
|
@ -21,25 +23,75 @@ public interface IDiscoveredPathManager {
|
|||
|
||||
IProject getProject();
|
||||
|
||||
IPath[] getIncludePaths();
|
||||
/**
|
||||
* Get include paths for the whole project
|
||||
* @return
|
||||
*/
|
||||
IPath[] getIncludePaths();
|
||||
/**
|
||||
* Get defined symbols for the whole project
|
||||
* @return
|
||||
*/
|
||||
Map getSymbols();
|
||||
|
||||
void setIncludeMap(LinkedHashMap map);
|
||||
/**
|
||||
* Get include paths for the specific path (file)
|
||||
* @return
|
||||
*/
|
||||
IPath[] getIncludePaths(IPath path);
|
||||
/**
|
||||
* Get defined symbols for the specific path (file)
|
||||
* @return
|
||||
*/
|
||||
Map getSymbols(IPath path);
|
||||
|
||||
IDiscoveredScannerInfoSerializable getSerializable();
|
||||
ScannerConfigScope getScope();
|
||||
|
||||
void setIncludeMap(LinkedHashMap map);
|
||||
void setSymbolMap(LinkedHashMap map);
|
||||
|
||||
LinkedHashMap getIncludeMap();
|
||||
LinkedHashMap getSymbolMap();
|
||||
}
|
||||
|
||||
interface IDiscoveredInfoListener {
|
||||
interface IDiscoveredScannerInfoSerializable {
|
||||
/**
|
||||
* Serialize discovered scanner info to an XML element
|
||||
*
|
||||
* @param root
|
||||
*/
|
||||
public void serialize(Element root);
|
||||
|
||||
/**
|
||||
* Deserialize discovered scanner info from an XML element
|
||||
*
|
||||
* @param root
|
||||
*/
|
||||
public void deserialize(Element root);
|
||||
|
||||
/**
|
||||
* @return an id of the collector
|
||||
*/
|
||||
public String getCollectorId();
|
||||
}
|
||||
|
||||
interface IDiscoveredInfoListener {
|
||||
|
||||
void infoChanged(IDiscoveredPathInfo info);
|
||||
void infoRemoved(IProject project);
|
||||
void infoRemoved(IDiscoveredPathInfo info);
|
||||
}
|
||||
|
||||
IDiscoveredPathInfo getDiscoveredInfo(IProject project) throws CoreException;
|
||||
void removeDiscoveredInfo(IProject project);
|
||||
void updateDiscoveredInfo(IDiscoveredPathInfo info) throws CoreException;
|
||||
/**
|
||||
* @param project
|
||||
* @param profileScope
|
||||
* @throws CModelException
|
||||
* @throws CoreException
|
||||
*/
|
||||
void changeDiscoveredContainer(IProject project, ScannerConfigScope profileScope);
|
||||
|
||||
void addDiscoveredInfoListener(IDiscoveredInfoListener listener);
|
||||
void removeDiscoveredInfoListener(IDiscoveredInfoListener listener);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.make.core.scannerconfig;
|
||||
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
|
@ -31,6 +32,15 @@ public interface IScannerInfoCollector2 extends IScannerInfoCollector {
|
|||
* @throws CoreException
|
||||
*/
|
||||
public void updateScannerConfiguration(IProgressMonitor monitor) throws CoreException;
|
||||
|
||||
/**
|
||||
* Create and return new IDiscoveredPathInfo that can hopefully serialize
|
||||
* discovered scanner config to a file
|
||||
*
|
||||
* @return pathInfo
|
||||
* @throws CoreException
|
||||
*/
|
||||
public IDiscoveredPathInfo createPathInfoObject();
|
||||
|
||||
// /**
|
||||
// * Answers a map of collected defines that the the compiler uses by default.
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
package org.eclipse.cdt.make.core.scannerconfig;
|
||||
|
||||
/**
|
||||
* Profile scope enum
|
||||
*
|
||||
* @author vhirsl
|
||||
*/
|
||||
public class ScannerConfigScope {
|
||||
public static final ScannerConfigScope PROJECT_SCOPE = new ScannerConfigScope("project"); //$NON-NLS-1$
|
||||
public static final ScannerConfigScope FILE_SCOPE = new ScannerConfigScope("file"); //$NON-NLS-1$
|
||||
|
||||
public String toString() {
|
||||
return scope;
|
||||
}
|
||||
|
||||
private String scope;
|
||||
private ScannerConfigScope(String scope) {
|
||||
this.scope = scope;
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#equals(java.lang.Object)
|
||||
*/
|
||||
public boolean equals(Object arg0) {
|
||||
if (arg0 == null) return false;
|
||||
if (arg0 == this) return true;
|
||||
if (arg0 instanceof ScannerConfigScope) return scope.equals(((ScannerConfigScope)arg0).scope);
|
||||
return false;
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see java.lang.Object#hashCode()
|
||||
*/
|
||||
public int hashCode() {
|
||||
return scope.hashCode();
|
||||
}
|
||||
}
|
|
@ -49,4 +49,5 @@ ConsoleParser.Ambiguous_Filepath_Error_Message=CDT Path Discovery is unable to r
|
|||
ConsoleParser.Working_Directory_Error_Message=CDT Path Discovery is unable to determine working directory of the build command
|
||||
ConsoleParser.Nonexistent_Include_Path_Error_Message=CDT Path Discovery has discovered and will ignore a non-existent include path:
|
||||
|
||||
DiscoveredContainer.description=Discovered Paths
|
||||
DiscoveredContainer.description=Discovered Paths
|
||||
DiscoveredContainer.ScopeErrorMessage=Invalid scanner configuration discovery profile scope
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
/***********************************************************************
|
||||
* Copyright (c) 2004 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
***********************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.IPathEntry;
|
||||
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
public abstract class AbstractDiscoveredPathContainer implements IPathEntryContainer {
|
||||
public static final IPath CONTAINER_ID = new Path("org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"); //$NON-NLS-1$
|
||||
|
||||
protected final IProject fProject;
|
||||
|
||||
public AbstractDiscoveredPathContainer(IProject project) {
|
||||
fProject = project;
|
||||
}
|
||||
|
||||
public IPathEntry[] getPathEntries() {
|
||||
IPathEntry[] fPathEntries;
|
||||
try {
|
||||
fPathEntries = getPathEntries(getPathEntryMap(), fProject);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
return new IPathEntry[0];
|
||||
}
|
||||
return fPathEntries;
|
||||
}
|
||||
|
||||
abstract protected Map getPathEntryMap();
|
||||
|
||||
public String getDescription() {
|
||||
return MakeMessages.getString("DiscoveredContainer.description"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
public IPath getPath() {
|
||||
return CONTAINER_ID;
|
||||
}
|
||||
|
||||
public static IPathEntry[] getPathEntries(Map pathEntryMap, IProject project) throws CoreException {
|
||||
IPathEntry[] entries = (IPathEntry[])pathEntryMap.get(project);
|
||||
if (entries == null) {
|
||||
entries = computeNewPathEntries(project);
|
||||
pathEntryMap.put(project, entries);
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
private static IPathEntry[] computeNewPathEntries(IProject project) throws CoreException {
|
||||
IDiscoveredPathInfo info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
|
||||
IPath[] includes = info.getIncludePaths();
|
||||
Map syms = info.getSymbols();
|
||||
List entries = new ArrayList(includes.length + syms.size());
|
||||
for (int i = 0; i < includes.length; i++) {
|
||||
entries.add(CoreModel.newIncludeEntry(Path.EMPTY, Path.EMPTY, includes[i])); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
Iterator iter = syms.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Entry entry = (Entry)iter.next();
|
||||
entries.add(CoreModel.newMacroEntry(Path.EMPTY, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$
|
||||
}
|
||||
return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]);
|
||||
}
|
||||
|
||||
}
|
|
@ -8,92 +8,53 @@
|
|||
******************************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.IPathEntry;
|
||||
import org.eclipse.cdt.core.model.IPathEntryContainer;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredInfoListener;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
public class DiscoveredPathContainer implements IPathEntryContainer {
|
||||
|
||||
public static IPath CONTAINER_ID = new Path("org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"); //$NON-NLS-1$
|
||||
|
||||
private final IProject fProject;
|
||||
public class DiscoveredPathContainer extends AbstractDiscoveredPathContainer {
|
||||
static Map fgPathEntries;
|
||||
|
||||
public DiscoveredPathContainer(IProject project) {
|
||||
fProject = project;
|
||||
}
|
||||
super(project);
|
||||
initialize();
|
||||
}
|
||||
|
||||
public static IPathEntry[] getPathEntries(IProject project) throws CoreException {
|
||||
if (fgPathEntries == null) {
|
||||
fgPathEntries = new HashMap(10);
|
||||
IDiscoveredInfoListener listener = new IDiscoveredInfoListener() {
|
||||
private static void initialize() {
|
||||
if (fgPathEntries == null) {
|
||||
fgPathEntries = new HashMap(10);
|
||||
|
||||
public void infoRemoved(IProject project) {
|
||||
fgPathEntries.remove(project);
|
||||
}
|
||||
IDiscoveredInfoListener listener = new IDiscoveredInfoListener() {
|
||||
|
||||
public void infoChanged(IDiscoveredPathInfo info) {
|
||||
fgPathEntries.remove(info.getProject());
|
||||
}
|
||||
};
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().addDiscoveredInfoListener(listener);
|
||||
}
|
||||
IPathEntry[] entries = (IPathEntry[])fgPathEntries.get(project);
|
||||
if (entries == null) {
|
||||
entries = computeNewPathEntries(project);
|
||||
fgPathEntries.put(project, entries);
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
public void infoRemoved(IDiscoveredPathInfo info) {
|
||||
if (info != null &&
|
||||
ScannerConfigScope.PROJECT_SCOPE.equals(info.getScope())) {
|
||||
fgPathEntries.remove(info.getProject());
|
||||
}
|
||||
}
|
||||
|
||||
private static IPathEntry[] computeNewPathEntries(IProject project) throws CoreException {
|
||||
IDiscoveredPathInfo info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
|
||||
IPath[] includes = info.getIncludePaths();
|
||||
Map syms = info.getSymbols();
|
||||
List entries = new ArrayList(includes.length + syms.size());
|
||||
for (int i = 0; i < includes.length; i++) {
|
||||
entries.add(CoreModel.newIncludeEntry(Path.EMPTY, Path.EMPTY, includes[i])); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
Iterator iter = syms.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Entry entry = (Entry)iter.next();
|
||||
entries.add(CoreModel.newMacroEntry(Path.EMPTY, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$
|
||||
}
|
||||
return (IPathEntry[])entries.toArray(new IPathEntry[entries.size()]);
|
||||
}
|
||||
public void infoChanged(IDiscoveredPathInfo info) {
|
||||
if (info != null &&
|
||||
ScannerConfigScope.PROJECT_SCOPE.equals(info.getScope())) {
|
||||
fgPathEntries.remove(info.getProject());
|
||||
}
|
||||
}
|
||||
|
||||
public IPathEntry[] getPathEntries() {
|
||||
IPathEntry[] fPathEntries;
|
||||
try {
|
||||
fPathEntries = getPathEntries(fProject);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
return new IPathEntry[0];
|
||||
}
|
||||
return fPathEntries;
|
||||
}
|
||||
};
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().addDiscoveredInfoListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return MakeMessages.getString("DiscoveredContainer.description"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
public IPath getPath() {
|
||||
return CONTAINER_ID;
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.AbstractDiscoveredPathContainer#getPathEntryMap()
|
||||
*/
|
||||
protected Map getPathEntryMap() {
|
||||
return fgPathEntries;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -15,8 +15,9 @@ import java.util.LinkedHashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
@ -196,5 +197,39 @@ public class DiscoveredPathInfo implements IDiscoveredPathInfo, IDiscoveredScann
|
|||
public String getCollectorId() {
|
||||
return PerProjectSICollector.COLLECTOR_ID;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludePaths(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public IPath[] getIncludePaths(IPath path) {
|
||||
if (project.getFile(path) != null) {
|
||||
return getIncludePaths();
|
||||
}
|
||||
return new IPath[0];
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbols(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public Map getSymbols(IPath path) {
|
||||
if (project.getFile(path) != null) {
|
||||
return getSymbols();
|
||||
}
|
||||
return new HashMap(0);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable()
|
||||
*/
|
||||
public IDiscoveredScannerInfoSerializable getSerializable() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getScope()
|
||||
*/
|
||||
public ScannerConfigScope getScope() {
|
||||
return ScannerConfigScope.PROJECT_SCOPE;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,14 +11,35 @@ package org.eclipse.cdt.make.internal.core.scannerconfig;
|
|||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.PathEntryContainerInitializer;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
|
||||
public class DiscoveredPathInitializer extends PathEntryContainerInitializer {
|
||||
|
||||
public void initialize(IPath containerPath, ICProject project) throws CoreException {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{project}, new DiscoveredPathContainer(project.getProject()), null);
|
||||
public void initialize(IPath containerPath, ICProject cProject) throws CoreException {
|
||||
IProject project = cProject.getProject();
|
||||
IScannerConfigBuilderInfo2 buildInfo = ScannerConfigProfileManager.createScannerConfigBuildInfo2(project);
|
||||
ScannerConfigScope profileScope = ScannerConfigProfileManager.getInstance().
|
||||
getSCProfileConfiguration(buildInfo.getSelectedProfileId()).getProfileScope();
|
||||
if (ScannerConfigScope.PROJECT_SCOPE.equals(profileScope)) {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{cProject}, new DiscoveredPathContainer(project), null);
|
||||
}
|
||||
else if (ScannerConfigScope.FILE_SCOPE.equals(profileScope)) {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{cProject}, new PerFileDiscoveredPathContainer(project), null);
|
||||
}
|
||||
else {
|
||||
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), 1,
|
||||
MakeMessages.getString("DiscoveredContainer.ScopeErrorMessage"), null)); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -15,12 +15,18 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||
|
@ -33,6 +39,7 @@ import org.eclipse.core.runtime.IStatus;
|
|||
import org.eclipse.core.runtime.Platform;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
|
||||
public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceChangeListener {
|
||||
|
||||
private Map fDiscoveredMap = new HashMap();
|
||||
|
@ -62,7 +69,7 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
|
||||
switch (event.getType()) {
|
||||
case IResourceChangeEvent.POST_CHANGE :
|
||||
ScannerConfigUtil.updateScannerConfigStore(event.getDelta());
|
||||
DiscoveredScannerInfoStore.getInstance().updateScannerConfigStore(event.getDelta());
|
||||
break;
|
||||
case IResourceChangeEvent.PRE_DELETE :
|
||||
case IResourceChangeEvent.PRE_CLOSE :
|
||||
|
@ -75,7 +82,7 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
}
|
||||
|
||||
public IDiscoveredPathInfo getDiscoveredInfo(IProject project) throws CoreException {
|
||||
DiscoveredPathInfo info = (DiscoveredPathInfo)fDiscoveredMap.get(project);
|
||||
IDiscoveredPathInfo info = (IDiscoveredPathInfo)fDiscoveredMap.get(project);
|
||||
if (info == null) {
|
||||
info = loadPathInfo(project);
|
||||
fDiscoveredMap.put(project, info);
|
||||
|
@ -83,15 +90,27 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
return info;
|
||||
}
|
||||
|
||||
private DiscoveredPathInfo loadPathInfo(IProject project) throws CoreException {
|
||||
DiscoveredPathInfo info = new DiscoveredPathInfo(project);
|
||||
DiscoveredScannerInfoStore.getInstance().loadDiscoveredScannerInfoFromState(project, info);
|
||||
return info;
|
||||
private IDiscoveredPathInfo loadPathInfo(IProject project) throws CoreException {
|
||||
IDiscoveredPathInfo pathInfo = null;
|
||||
|
||||
IScannerConfigBuilderInfo2 buildInfo = ScannerConfigProfileManager.createScannerConfigBuildInfo2(project);
|
||||
String profileId = buildInfo.getSelectedProfileId();
|
||||
SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
|
||||
getSCProfileInstance(project, profileId);
|
||||
IScannerInfoCollector collector = profileInstance.getScannerInfoCollector();
|
||||
|
||||
if (collector instanceof IScannerInfoCollector2) {
|
||||
IScannerInfoCollector2 collector2 = (IScannerInfoCollector2) collector;
|
||||
pathInfo = collector2.createPathInfoObject();
|
||||
}
|
||||
else {
|
||||
pathInfo = new DiscoveredPathInfo(project);
|
||||
}
|
||||
return pathInfo;
|
||||
}
|
||||
|
||||
public void removeDiscoveredInfo(IProject project) {
|
||||
ScannerConfigUtil.getDiscoveredScannerConfigStore(project, true);
|
||||
DiscoveredPathInfo info = (DiscoveredPathInfo)fDiscoveredMap.remove(project);
|
||||
IDiscoveredPathInfo info = (IDiscoveredPathInfo)fDiscoveredMap.remove(project);
|
||||
if (info != null) {
|
||||
fireUpdate(INFO_REMOVED, info);
|
||||
}
|
||||
|
@ -99,15 +118,22 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
|
||||
public void updateDiscoveredInfo(IDiscoveredPathInfo info) throws CoreException {
|
||||
if (fDiscoveredMap.get(info.getProject()) != null) {
|
||||
if (info instanceof IDiscoveredScannerInfoSerializable) {
|
||||
IDiscoveredScannerInfoSerializable serializable = (IDiscoveredScannerInfoSerializable) info;
|
||||
DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(info.getProject(), serializable);
|
||||
IDiscoveredScannerInfoSerializable serializable = info.getSerializable();
|
||||
if (serializable != null) {
|
||||
IProject project = info.getProject();
|
||||
DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(project, serializable);
|
||||
fireUpdate(INFO_CHANGED, info);
|
||||
ICProject cProject = CoreModel.getDefault().create(info.getProject());
|
||||
if (cProject != null) {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{cProject},
|
||||
new DiscoveredPathContainer(info.getProject()), null);
|
||||
}
|
||||
|
||||
// ICProject cProject = CoreModel.getDefault().create(info.getProject());
|
||||
// if (cProject != null) {
|
||||
// CoreModel.setPathEntryContainer(new ICProject[]{cProject},
|
||||
// new DiscoveredPathContainer(info.getProject()), null);
|
||||
// }
|
||||
IScannerConfigBuilderInfo2 buildInfo = ScannerConfigProfileManager.createScannerConfigBuildInfo2(project);
|
||||
String profileId = buildInfo.getSelectedProfileId();
|
||||
ScannerConfigScope profileScope = ScannerConfigProfileManager.getInstance().
|
||||
getSCProfileConfiguration(profileId).getProfileScope();
|
||||
changeDiscoveredContainer(project, profileScope);
|
||||
}
|
||||
else {
|
||||
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
|
||||
|
@ -116,6 +142,40 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager#changeDiscoveredContainer(org.eclipse.core.resources.IProject, java.lang.String)
|
||||
*/
|
||||
public void changeDiscoveredContainer(IProject project, ScannerConfigScope profileScope) {
|
||||
// order here is of essence
|
||||
// 1. clear DiscoveredPathManager's path info cache
|
||||
IDiscoveredPathInfo oldInfo = (IDiscoveredPathInfo) fDiscoveredMap.remove(project);
|
||||
|
||||
// 2. switch the containers
|
||||
ICProject cProject = CoreModel.getDefault().create(project);
|
||||
try {
|
||||
if (ScannerConfigScope.PROJECT_SCOPE.equals(profileScope)) {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{cProject},
|
||||
new DiscoveredPathContainer(project), null);
|
||||
}
|
||||
else if (ScannerConfigScope.FILE_SCOPE.equals(profileScope)) {
|
||||
CoreModel.setPathEntryContainer(new ICProject[]{cProject},
|
||||
new PerFileDiscoveredPathContainer(project), null);
|
||||
}
|
||||
else {
|
||||
MakeCorePlugin.log(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), 1,
|
||||
MakeMessages.getString("DiscoveredContainer.ScopeErrorMessage"), null)); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
catch (CModelException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
|
||||
// 3. clear the container's path entry cache
|
||||
if (oldInfo != null) {
|
||||
fireUpdate(INFO_REMOVED, oldInfo);
|
||||
}
|
||||
}
|
||||
|
||||
private void fireUpdate(final int type, final IDiscoveredPathInfo info) {
|
||||
Object[] list = listeners.toArray();
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
|
@ -135,7 +195,7 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
listener.infoChanged(info);
|
||||
break;
|
||||
case INFO_REMOVED :
|
||||
listener.infoRemoved(info.getProject());
|
||||
listener.infoRemoved(info);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -152,5 +212,4 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
|
|||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -11,6 +11,7 @@
|
|||
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
@ -28,12 +29,17 @@ import javax.xml.transform.dom.DOMSource;
|
|||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IResourceDelta;
|
||||
import org.eclipse.core.resources.IResourceDeltaVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.QualifiedName;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
@ -48,28 +54,8 @@ import org.xml.sax.SAXException;
|
|||
* @author vhirsl
|
||||
*/
|
||||
public class DiscoveredScannerInfoStore {
|
||||
public interface IDiscoveredScannerInfoSerializable {
|
||||
/**
|
||||
* Serialize discovered scanner info to an XML element
|
||||
*
|
||||
* @param root
|
||||
*/
|
||||
public void serialize(Element root);
|
||||
|
||||
/**
|
||||
* Deserialize discovered scanner info from an XML element
|
||||
*
|
||||
* @param root
|
||||
*/
|
||||
public void deserialize(Element root);
|
||||
|
||||
/**
|
||||
* @return an id of the collector
|
||||
*/
|
||||
public String getCollectorId();
|
||||
}
|
||||
|
||||
|
||||
private static final QualifiedName dscFileNameProperty = new
|
||||
QualifiedName(MakeCorePlugin.getUniqueIdentifier(), "discoveredScannerConfigFileName"); //$NON-NLS-1$
|
||||
private static final String CDESCRIPTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".discoveredScannerInfo"; //$NON-NLS-1$
|
||||
public static final String SCD_STORE_VERSION = "scdStore"; //$NON-NLS-1$
|
||||
public static final String SI_ELEM = "scannerInfo"; //$NON-NLS-1$
|
||||
|
@ -124,7 +110,7 @@ public class DiscoveredScannerInfoStore {
|
|||
if (document == null) {
|
||||
try {
|
||||
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
|
||||
IPath path = ScannerConfigUtil.getDiscoveredScannerConfigStore(project, false);
|
||||
IPath path = getDiscoveredScannerConfigStore(project);
|
||||
if (path.toFile().exists()) {
|
||||
// read form file
|
||||
FileInputStream file = new FileInputStream(path.toFile());
|
||||
|
@ -241,7 +227,7 @@ public class DiscoveredScannerInfoStore {
|
|||
|
||||
// Save the document
|
||||
try {
|
||||
IPath path = ScannerConfigUtil.getDiscoveredScannerConfigStore(project, false);
|
||||
IPath path = getDiscoveredScannerConfigStore(project);
|
||||
FileOutputStream file = new FileOutputStream(path.toFile());
|
||||
file.write(stream.toByteArray());
|
||||
file.close();
|
||||
|
@ -263,4 +249,105 @@ public class DiscoveredScannerInfoStore {
|
|||
}
|
||||
}
|
||||
|
||||
public IPath getDiscoveredScannerConfigStore(IProject project) {
|
||||
String fileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
String storedFileName = null;
|
||||
try {
|
||||
storedFileName = project.getPersistentProperty(dscFileNameProperty);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e.getStatus());
|
||||
}
|
||||
if (storedFileName != null && !storedFileName.equals(fileName)) {
|
||||
// try to move 2.x file name format to 3.x file name format
|
||||
movePluginStateFile(storedFileName, fileName);
|
||||
}
|
||||
try {
|
||||
project.setPersistentProperty(dscFileNameProperty, fileName);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e.getStatus());
|
||||
}
|
||||
|
||||
return MakeCorePlugin.getWorkingDirectory().append(fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param delta
|
||||
*/
|
||||
public void updateScannerConfigStore(IResourceDelta delta) {
|
||||
try {
|
||||
delta.accept(new IResourceDeltaVisitor() {
|
||||
|
||||
public boolean visit(IResourceDelta delta) throws CoreException {
|
||||
IResource resource = delta.getResource();
|
||||
if (resource instanceof IProject) {
|
||||
IProject project = (IProject) resource;
|
||||
int kind = delta.getKind();
|
||||
switch (kind) {
|
||||
case IResourceDelta.REMOVED:
|
||||
if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
|
||||
// project renamed
|
||||
IPath newPath = delta.getMovedToPath();
|
||||
IProject newProject = delta.getResource().getWorkspace().
|
||||
getRoot().getProject(newPath.toString());
|
||||
scProjectRenamed(project, newProject);
|
||||
}
|
||||
else {
|
||||
// project deleted
|
||||
scProjectDeleted(project);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
private void scProjectDeleted(IProject project) {
|
||||
String scFileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
deletePluginStateFile(scFileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scFileName
|
||||
*/
|
||||
private void deletePluginStateFile(String scFileName) {
|
||||
IPath path = MakeCorePlugin.getWorkingDirectory().append(scFileName);
|
||||
File file = path.toFile();
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private void scProjectRenamed(IProject project, IProject newProject) {
|
||||
String scOldFileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
String scNewFileName = newProject.getName() + ".sc"; //$NON-NLS-1$
|
||||
movePluginStateFile(scOldFileName, scNewFileName);
|
||||
try {
|
||||
newProject.setPersistentProperty(dscFileNameProperty, scNewFileName);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param oldFileName
|
||||
* @param newFileName
|
||||
*/
|
||||
private void movePluginStateFile(String oldFileName, String newFileName) {
|
||||
IPath oldPath = MakeCorePlugin.getWorkingDirectory().append(oldFileName);
|
||||
IPath newPath = MakeCorePlugin.getWorkingDirectory().append(newFileName);
|
||||
File oldFile = oldPath.toFile();
|
||||
File newFile = newPath.toFile();
|
||||
if (oldFile.exists()) {
|
||||
oldFile.renameTo(newFile);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
/***********************************************************************
|
||||
* Copyright (c) 2004 IBM Corporation and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
***********************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.IIncludeEntry;
|
||||
import org.eclipse.cdt.core.model.IMacroEntry;
|
||||
import org.eclipse.cdt.core.model.IPathEntryContainerExtension;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredInfoListener;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
public class PerFileDiscoveredPathContainer extends AbstractDiscoveredPathContainer
|
||||
implements IPathEntryContainerExtension {
|
||||
private static final IIncludeEntry[] NO_INCLUDENTRIES = new IIncludeEntry[0];
|
||||
private static final IMacroEntry[] NO_SYMBOLENTRIES = new IMacroEntry[0];
|
||||
|
||||
static Map fgPathEntries;
|
||||
|
||||
public PerFileDiscoveredPathContainer(IProject project) {
|
||||
super(project);
|
||||
initialize();
|
||||
}
|
||||
|
||||
private static void initialize() {
|
||||
if (fgPathEntries == null) {
|
||||
fgPathEntries = new HashMap(10);
|
||||
|
||||
IDiscoveredInfoListener listener = new IDiscoveredInfoListener() {
|
||||
|
||||
public void infoRemoved(IDiscoveredPathInfo info) {
|
||||
if (info != null &&
|
||||
ScannerConfigScope.FILE_SCOPE.equals(info.getScope())) {
|
||||
fgPathEntries.remove(info.getProject());
|
||||
}
|
||||
}
|
||||
|
||||
public void infoChanged(IDiscoveredPathInfo info) {
|
||||
if (info != null &&
|
||||
ScannerConfigScope.FILE_SCOPE.equals(info.getScope())) {
|
||||
fgPathEntries.remove(info.getProject());
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().addDiscoveredInfoListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.model.IPathEntryContainerExtension#getIncludeEntries(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public IIncludeEntry[] getIncludeEntries(IPath path) {
|
||||
IDiscoveredPathInfo info;
|
||||
try {
|
||||
info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
|
||||
IPath[] includes = info.getIncludePaths(path);
|
||||
List entries = new ArrayList(includes.length);
|
||||
for (int i = 0; i < includes.length; i++) {
|
||||
entries.add(CoreModel.newIncludeEntry(path, Path.EMPTY, includes[i])); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
}
|
||||
return (IIncludeEntry[])entries.toArray(new IIncludeEntry[entries.size()]);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
return NO_INCLUDENTRIES;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.model.IPathEntryContainerExtension#getMacroEntries(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public IMacroEntry[] getMacroEntries(IPath path) {
|
||||
IDiscoveredPathInfo info;
|
||||
try {
|
||||
info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
|
||||
Map syms = info.getSymbols(path);
|
||||
List entries = new ArrayList(syms.size());
|
||||
for (Iterator iter = syms.entrySet().iterator(); iter.hasNext(); ) {
|
||||
Entry entry = (Entry)iter.next();
|
||||
entries.add(CoreModel.newMacroEntry(path, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$
|
||||
}
|
||||
return (IMacroEntry[])entries.toArray(new IMacroEntry[entries.size()]);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
return NO_SYMBOLENTRIES;
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.AbstractDiscoveredPathContainer#getPathEntryMap()
|
||||
*/
|
||||
protected Map getPathEntryMap() {
|
||||
return fgPathEntries;
|
||||
}
|
||||
|
||||
}
|
|
@ -10,7 +10,6 @@
|
|||
**********************************************************************/
|
||||
package org.eclipse.cdt.make.internal.core.scannerconfig;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
|
@ -19,15 +18,8 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IResourceDelta;
|
||||
import org.eclipse.core.resources.IResourceDeltaVisitor;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.QualifiedName;
|
||||
|
||||
/**
|
||||
* Utility class that handles some Scanner Config specifig collection conversions
|
||||
|
@ -35,9 +27,6 @@ import org.eclipse.core.runtime.QualifiedName;
|
|||
* @author vhirsl
|
||||
*/
|
||||
public final class ScannerConfigUtil {
|
||||
private static final QualifiedName dscFileNameProperty = new
|
||||
QualifiedName(MakeCorePlugin.getUniqueIdentifier(), "discoveredScannerConfigFileName"); //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Adds all new discovered symbols/values to the existing ones.
|
||||
*
|
||||
|
@ -298,108 +287,4 @@ public final class ScannerConfigUtil {
|
|||
return rv;
|
||||
}
|
||||
|
||||
public static IPath getDiscoveredScannerConfigStore(IProject project, boolean delete) {
|
||||
String fileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
String storedFileName = null;
|
||||
try {
|
||||
storedFileName = project.getPersistentProperty(dscFileNameProperty);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e.getStatus());
|
||||
}
|
||||
if (storedFileName != null && !storedFileName.equals(fileName)) {
|
||||
// try to move 2.x file name format to 3.x file name format
|
||||
movePluginStateFile(storedFileName, fileName);
|
||||
}
|
||||
try {
|
||||
project.setPersistentProperty(dscFileNameProperty, fileName);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e.getStatus());
|
||||
}
|
||||
|
||||
if (delete) {
|
||||
deletePluginStateFile(fileName);
|
||||
}
|
||||
return MakeCorePlugin.getWorkingDirectory().append(fileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param delta
|
||||
*/
|
||||
public static void updateScannerConfigStore(IResourceDelta delta) {
|
||||
try {
|
||||
delta.accept(new IResourceDeltaVisitor() {
|
||||
|
||||
public boolean visit(IResourceDelta delta) throws CoreException {
|
||||
IResource resource = delta.getResource();
|
||||
if (resource instanceof IProject) {
|
||||
IProject project = (IProject) resource;
|
||||
int kind = delta.getKind();
|
||||
switch (kind) {
|
||||
case IResourceDelta.REMOVED:
|
||||
if ((delta.getFlags() & IResourceDelta.MOVED_TO) != 0) {
|
||||
// project renamed
|
||||
IPath newPath = delta.getMovedToPath();
|
||||
IProject newProject = delta.getResource().getWorkspace().
|
||||
getRoot().getProject(newPath.toString());
|
||||
scProjectRenamed(project, newProject);
|
||||
}
|
||||
else {
|
||||
// project deleted
|
||||
scProjectDeleted(project);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void scProjectDeleted(IProject project) {
|
||||
String scFileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
deletePluginStateFile(scFileName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scFileName
|
||||
*/
|
||||
private static void deletePluginStateFile(String scFileName) {
|
||||
IPath path = MakeCorePlugin.getWorkingDirectory().append(scFileName);
|
||||
File file = path.toFile();
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
||||
private static void scProjectRenamed(IProject project, IProject newProject) {
|
||||
String scOldFileName = project.getName() + ".sc"; //$NON-NLS-1$
|
||||
String scNewFileName = newProject.getName() + ".sc"; //$NON-NLS-1$
|
||||
movePluginStateFile(scOldFileName, scNewFileName);
|
||||
try {
|
||||
newProject.setPersistentProperty(dscFileNameProperty, scNewFileName);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param oldFileName
|
||||
* @param newFileName
|
||||
*/
|
||||
private static void movePluginStateFile(String oldFileName, String newFileName) {
|
||||
IPath oldPath = MakeCorePlugin.getWorkingDirectory().append(oldFileName);
|
||||
IPath newPath = MakeCorePlugin.getWorkingDirectory().append(newFileName);
|
||||
File oldFile = oldPath.toFile();
|
||||
File newFile = newPath.toFile();
|
||||
if (oldFile.exists()) {
|
||||
oldFile.renameTo(newFile);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ import java.util.Map;
|
|||
|
||||
import org.eclipse.cdt.core.IMarkerGenerator;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.KVPair;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.KVStringPair;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SCDOptionsEnum;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
@ -93,10 +93,10 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
|
|||
*
|
||||
*/
|
||||
void generateReport() {
|
||||
TraceUtil.metricsTrace("Stats for directory ",
|
||||
"Generic command: '", "' applicable for:",
|
||||
TraceUtil.metricsTrace("Stats for directory ", //$NON-NLS-1$
|
||||
"Generic command: '", "' applicable for:", //$NON-NLS-1$ //$NON-NLS-2$
|
||||
directoryCommandListMap);
|
||||
TraceUtil.summaryTrace("Discovery summary", workingDirsN, commandsN, filesN);
|
||||
TraceUtil.summaryTrace("Discovery summary", workingDirsN, commandsN, filesN); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -130,8 +130,8 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
|
|||
*/
|
||||
public CCommandDSC getNewCCommandDSC(String genericLine, boolean cppFileType) {
|
||||
CCommandDSC command = new CCommandDSC(cppFileType);
|
||||
String[] tokens = genericLine.split("\\s+");
|
||||
command.addSCOption(new KVPair(SCDOptionsEnum.COMMAND, tokens[0]));
|
||||
String[] tokens = genericLine.split("\\s+"); //$NON-NLS-1$
|
||||
command.addSCOption(new KVStringPair(SCDOptionsEnum.COMMAND.toString(), tokens[0]));
|
||||
for (int i = 1; i < tokens.length; ++i) {
|
||||
for (int j = SCDOptionsEnum.MIN; j <= SCDOptionsEnum.MAX; ++j) {
|
||||
if (tokens[i].startsWith(SCDOptionsEnum.getSCDOptionsEnum(j).toString())) {
|
||||
|
@ -144,7 +144,7 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
|
|||
// ex. -I /dir
|
||||
// take a next token
|
||||
++i;
|
||||
if (i < tokens.length && !tokens[i].startsWith("-")) {
|
||||
if (i < tokens.length && !tokens[i].startsWith("-")) { //$NON-NLS-1$
|
||||
option = tokens[i];
|
||||
}
|
||||
else break;
|
||||
|
@ -157,7 +157,7 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
|
|||
option = (getAbsolutePath(option)).toString();
|
||||
}
|
||||
// add the pair
|
||||
command.addSCOption(new KVPair(SCDOptionsEnum.getSCDOptionsEnum(j), option));
|
||||
command.addSCOption(new KVStringPair(SCDOptionsEnum.getSCDOptionsEnum(j).toString(), option));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -171,8 +171,8 @@ public class GCCPerFileBOPConsoleParserUtility extends AbstractGCCBOPConsolePars
|
|||
*/
|
||||
IPath getAbsolutePath(String filePath) {
|
||||
IPath pFilePath;
|
||||
if (filePath.startsWith("/") || filePath.startsWith("\\") ||
|
||||
(!filePath.startsWith(".") &&
|
||||
if (filePath.startsWith("/") || filePath.startsWith("\\") || //$NON-NLS-1$ //$NON-NLS-2$
|
||||
(!filePath.startsWith(".") && //$NON-NLS-1$
|
||||
filePath.length() > 2 && filePath.charAt(1) == ':' &&
|
||||
(filePath.charAt(2) == '\\' || filePath.charAt(2) == '/'))) {
|
||||
// absolute path
|
||||
|
|
|
@ -25,9 +25,16 @@ import org.w3c.dom.NodeList;
|
|||
*/
|
||||
public class CCommandDSC {
|
||||
private final static String SINGLE_SPACE = " "; //$NON-NLS-1$
|
||||
private final static String CMD_DESCRIPTION_ELEM = "commandDescription"; //$NON-NLS-1$
|
||||
private final static String CMD_SI_ELEM = "commandScannerInfo"; //$NON-NLS-1$
|
||||
private final static String OPTION_ELEM = "option"; //$NON-NLS-1$
|
||||
private final static String SI_ITEM_ELEM = "siItem"; //$NON-NLS-1$
|
||||
private final static String KEY_ATTR = "key"; //$NON-NLS-1$
|
||||
private final static String VALUE_ATTR = "value"; //$NON-NLS-1$
|
||||
private final static String KIND_ATTR = "kind"; //$NON-NLS-1$
|
||||
|
||||
private int commandId;
|
||||
private List compilerCommand; // members are KVPair objects
|
||||
private List compilerCommand; // members are KVStringPair objects
|
||||
private boolean discovered;
|
||||
private boolean cppFileType; // C or C++ file type
|
||||
|
||||
|
@ -40,7 +47,6 @@ public class CCommandDSC {
|
|||
public CCommandDSC(boolean cppFileType) {
|
||||
compilerCommand = new ArrayList();
|
||||
discovered = false;
|
||||
// files = null;
|
||||
this.cppFileType = cppFileType;
|
||||
|
||||
symbols = new ArrayList();
|
||||
|
@ -51,7 +57,7 @@ public class CCommandDSC {
|
|||
return cppFileType;
|
||||
}
|
||||
|
||||
public void addSCOption(KVPair option) {
|
||||
public void addSCOption(KVStringPair option) {
|
||||
compilerCommand.add(option);
|
||||
}
|
||||
|
||||
|
@ -74,28 +80,11 @@ public class CCommandDSC {
|
|||
this.commandId = commandId;
|
||||
}
|
||||
|
||||
// public void addFile(String fileName) {
|
||||
// if (files == null) {
|
||||
// files = new ArrayList();
|
||||
// }
|
||||
// if (!files.contains(fileName)) {
|
||||
// files.add(fileName);
|
||||
// if (!cppFileType && !fileName.endsWith(".c")) { //$NON-NLS-1$
|
||||
// cppFileType = true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// public int getNumberOfFiles() {
|
||||
// if (files == null) return 0;
|
||||
// return files.size();
|
||||
// }
|
||||
|
||||
public String toString() {
|
||||
String commandAsString = new String();
|
||||
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
|
||||
KVPair optionPair = (KVPair)i.next();
|
||||
commandAsString += optionPair.getKey().toString() + SINGLE_SPACE +
|
||||
KVStringPair optionPair = (KVStringPair)i.next();
|
||||
commandAsString += optionPair.getKey() + SINGLE_SPACE +
|
||||
optionPair.getValue() + SINGLE_SPACE;
|
||||
}
|
||||
return commandAsString.trim();
|
||||
|
@ -112,15 +101,15 @@ public class CCommandDSC {
|
|||
public String getSCDRunnableCommand() {
|
||||
String commandAsString = new String();
|
||||
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
|
||||
KVPair optionPair = (KVPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.COMMAND)) {
|
||||
KVStringPair optionPair = (KVStringPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.COMMAND.toString())) {
|
||||
commandAsString += optionPair.getValue() + SINGLE_SPACE;
|
||||
}
|
||||
else {
|
||||
// if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE) ||
|
||||
// optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE))
|
||||
// if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString()) ||
|
||||
// optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString()))
|
||||
// continue;
|
||||
commandAsString += optionPair.getKey().toString() + SINGLE_SPACE +
|
||||
commandAsString += optionPair.getKey() + SINGLE_SPACE +
|
||||
optionPair.getValue() + SINGLE_SPACE;
|
||||
}
|
||||
}
|
||||
|
@ -130,8 +119,8 @@ public class CCommandDSC {
|
|||
public String[] getImacrosFile() {
|
||||
List imacrosFiles = new ArrayList();
|
||||
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
|
||||
KVPair optionPair = (KVPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE)) {
|
||||
KVStringPair optionPair = (KVStringPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString())) {
|
||||
imacrosFiles.add(optionPair.getValue());
|
||||
}
|
||||
}
|
||||
|
@ -141,8 +130,8 @@ public class CCommandDSC {
|
|||
public String[] getIncludeFile() {
|
||||
List includeFiles = new ArrayList();
|
||||
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
|
||||
KVPair optionPair = (KVPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE)) {
|
||||
KVStringPair optionPair = (KVStringPair)i.next();
|
||||
if (optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString())) {
|
||||
includeFiles.add(optionPair.getValue());
|
||||
}
|
||||
}
|
||||
|
@ -214,27 +203,27 @@ public class CCommandDSC {
|
|||
public void serialize(Element cmdElem) {
|
||||
Document doc = cmdElem.getOwnerDocument();
|
||||
// serialize the command
|
||||
Element cmdDescElem = doc.createElement("commandDescription"); //$NON-NLS-1$
|
||||
Element cmdDescElem = doc.createElement(CMD_DESCRIPTION_ELEM);
|
||||
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
|
||||
Element optionElem = doc.createElement("option"); //$NON-NLS-1$
|
||||
KVPair option = (KVPair) i.next();
|
||||
optionElem.setAttribute("key", option.getKey().toString()); //$NON-NLS-1$
|
||||
optionElem.setAttribute("value", option.getValue()); //$NON-NLS-1$
|
||||
Element optionElem = doc.createElement(OPTION_ELEM);
|
||||
KVStringPair option = (KVStringPair) i.next();
|
||||
optionElem.setAttribute(KEY_ATTR, option.getKey());
|
||||
optionElem.setAttribute(VALUE_ATTR, option.getValue());
|
||||
cmdDescElem.appendChild(optionElem);
|
||||
}
|
||||
cmdElem.appendChild(cmdDescElem);
|
||||
// serialize includes and symbols
|
||||
Element siElem = doc.createElement("commandScannerInfo"); //$NON-NLS-1$
|
||||
Element siElem = doc.createElement(CMD_SI_ELEM);
|
||||
for (Iterator j = includes.iterator(); j.hasNext(); ) {
|
||||
Element siItem = doc.createElement("siItem"); //$NON-NLS-1$
|
||||
siItem.setAttribute("kind", "INCLUDE_PATH"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
siItem.setAttribute("value", (String) j.next()); //$NON-NLS-1$
|
||||
Element siItem = doc.createElement(SI_ITEM_ELEM);
|
||||
siItem.setAttribute(KIND_ATTR, "INCLUDE_PATH"); //$NON-NLS-1$
|
||||
siItem.setAttribute(VALUE_ATTR, (String) j.next());
|
||||
siElem.appendChild(siItem);
|
||||
}
|
||||
for (Iterator j = symbols.iterator(); j.hasNext(); ) {
|
||||
Element siItem = doc.createElement("siItem"); //$NON-NLS-1$
|
||||
siItem.setAttribute("kind", "SYMBOL_DEFINITION"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
siItem.setAttribute("value", (String) j.next()); //$NON-NLS-1$
|
||||
Element siItem = doc.createElement(SI_ITEM_ELEM);
|
||||
siItem.setAttribute(KIND_ATTR, "SYMBOL_DEFINITION"); //$NON-NLS-1$
|
||||
siItem.setAttribute(VALUE_ATTR, (String) j.next());
|
||||
siElem.appendChild(siItem);
|
||||
}
|
||||
cmdElem.appendChild(siElem);
|
||||
|
@ -245,32 +234,31 @@ public class CCommandDSC {
|
|||
*/
|
||||
public void deserialize(Element cmdElem) {
|
||||
// read command options
|
||||
NodeList descList = cmdElem.getElementsByTagName("commandDescription");
|
||||
NodeList descList = cmdElem.getElementsByTagName(CMD_DESCRIPTION_ELEM);
|
||||
if (descList.getLength() > 0) {
|
||||
Element descElem = (Element) descList.item(0);
|
||||
NodeList optionList = descElem.getElementsByTagName("option");
|
||||
NodeList optionList = descElem.getElementsByTagName(OPTION_ELEM);
|
||||
for (int i = 0; i < optionList.getLength(); ++i) {
|
||||
Element optionElem = (Element) optionList.item(i);
|
||||
String key = optionElem.getAttribute("key");
|
||||
SCDOptionsEnum eKey = SCDOptionsEnum.getSCDOptionsEnum(key);
|
||||
String value = optionElem.getAttribute("value");
|
||||
KVPair option = new KVPair(eKey, value);
|
||||
String key = optionElem.getAttribute(KEY_ATTR);
|
||||
String value = optionElem.getAttribute(VALUE_ATTR);
|
||||
KVStringPair option = new KVStringPair(key, value);
|
||||
addSCOption(option);
|
||||
}
|
||||
}
|
||||
// read associated scanner info
|
||||
NodeList siList = cmdElem.getElementsByTagName("commandScannerInfo");
|
||||
NodeList siList = cmdElem.getElementsByTagName(CMD_SI_ELEM);
|
||||
if (siList.getLength() > 0) {
|
||||
Element siElem = (Element) siList.item(0);
|
||||
NodeList siItemList = siElem.getElementsByTagName("siItem");
|
||||
NodeList siItemList = siElem.getElementsByTagName(SI_ITEM_ELEM);
|
||||
for (int i = 0; i < siItemList.getLength(); ++i) {
|
||||
Element siItemElem = (Element) siItemList.item(i);
|
||||
String kind = siItemElem.getAttribute("kind");
|
||||
String value = siItemElem.getAttribute("value");
|
||||
if (kind.equals("INCLUDE_PATH")) {
|
||||
String kind = siItemElem.getAttribute(KIND_ATTR);
|
||||
String value = siItemElem.getAttribute(VALUE_ATTR);
|
||||
if (kind.equals("INCLUDE_PATH")) { //$NON-NLS-1$
|
||||
includes.add(value);
|
||||
}
|
||||
else if (kind.equals("SYMBOL_DEFINITION")) {
|
||||
else if (kind.equals("SYMBOL_DEFINITION")) { //$NON-NLS-1$
|
||||
symbols.add(value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,11 +15,12 @@ import java.io.IOException;
|
|||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.eclipse.cdt.core.CommandLauncher;
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.ISafeRunnable;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
@ -31,15 +32,29 @@ import org.eclipse.core.runtime.Platform;
|
|||
* @author vhirsl
|
||||
*/
|
||||
public class CygpathTranslator {
|
||||
IProject project;
|
||||
String orgPath;
|
||||
String transPath;
|
||||
private IPath cwd;
|
||||
private String orgPath;
|
||||
private String transPath;
|
||||
private boolean status;
|
||||
|
||||
|
||||
public CygpathTranslator(IProject project, String path) {
|
||||
this.project = project;
|
||||
public CygpathTranslator(String path) {
|
||||
this(MakeCorePlugin.getDefault().getStateLocation(), path);
|
||||
}
|
||||
|
||||
public CygpathTranslator(IPath cwd, String path) {
|
||||
this.cwd = cwd;
|
||||
orgPath = path;
|
||||
status = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the status.
|
||||
*/
|
||||
public boolean isStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public String run() {
|
||||
ISafeRunnable runnable = new ISafeRunnable() {
|
||||
public void run() throws Exception {
|
||||
|
@ -71,7 +86,7 @@ public class CygpathTranslator {
|
|||
new Path("cygpath"), //$NON-NLS-1$
|
||||
new String[] {"-m", orgPath}, //$NON-NLS-1$
|
||||
new String[0],//setEnvironment(launcher, "c:/"),//$NON-NLS-1$
|
||||
project.getLocation()); //$NON-NLS-1$
|
||||
cwd); //$NON-NLS-1$
|
||||
if (p != null) {
|
||||
try {
|
||||
// Close the input of the Process explicitely.
|
||||
|
@ -82,8 +97,10 @@ public class CygpathTranslator {
|
|||
}
|
||||
if (launcher.waitAndRead(output, output) != CommandLauncher.OK) {
|
||||
//String errMsg = launcher.getErrorMessage();
|
||||
status = false;
|
||||
}
|
||||
else
|
||||
status = true;
|
||||
return output.toString().trim();
|
||||
}
|
||||
return orgPath;
|
||||
|
@ -111,4 +128,52 @@ public class CygpathTranslator {
|
|||
}
|
||||
return env;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sumIncludes
|
||||
* @return
|
||||
*/
|
||||
public static List translateIncludePaths(List sumIncludes) {
|
||||
CygpathTranslator test = new CygpathTranslator("/"); //$NON-NLS-1$
|
||||
test.run();
|
||||
if (!test.isStatus()) return sumIncludes;
|
||||
|
||||
List translatedIncludePaths = new ArrayList();
|
||||
for (Iterator i = sumIncludes.iterator(); i.hasNext(); ) {
|
||||
String includePath = (String) i.next();
|
||||
IPath realPath = new Path(includePath);
|
||||
if (!realPath.toFile().exists()) {
|
||||
String translatedPath = includePath;
|
||||
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
translatedPath = (new CygpathTranslator(includePath)).run();
|
||||
}
|
||||
if (translatedPath != null) {
|
||||
if (!translatedPath.equals(includePath)) {
|
||||
// Check if the translated path exists
|
||||
IPath transPath = new Path(translatedPath);
|
||||
if (transPath.toFile().exists()) {
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
else {
|
||||
// TODO VMIR for now add even if it does not exist
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// TODO VMIR for now add even if it does not exist
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
TraceUtil.outputError("CygpathTranslator unable to translate path: ",//$NON-NLS-1$
|
||||
includePath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
translatedIncludePaths.add(includePath);
|
||||
}
|
||||
}
|
||||
return translatedIncludePaths;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,23 +11,23 @@
|
|||
package org.eclipse.cdt.make.internal.core.scannerconfig.util;
|
||||
|
||||
/**
|
||||
* Key - Value Pair
|
||||
* Key - Value String Pair
|
||||
*
|
||||
* @author vhirsl
|
||||
*/
|
||||
public class KVPair {
|
||||
private SCDOptionsEnum key;
|
||||
public class KVStringPair {
|
||||
private String key;
|
||||
private String value;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public KVPair(SCDOptionsEnum key, String value) {
|
||||
public KVStringPair(String key, String value) {
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public SCDOptionsEnum getKey() {
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ public class KVPair {
|
|||
*/
|
||||
public boolean equals(Object arg0) {
|
||||
if (arg0 != null && arg0.getClass().equals(this.getClass())) {
|
||||
KVPair arg = (KVPair) arg0;
|
||||
KVStringPair arg = (KVStringPair) arg0;
|
||||
return (key.equals(arg.getKey()) && value.equals(arg.getValue()));
|
||||
}
|
||||
return false;
|
||||
|
@ -54,6 +54,6 @@ public class KVPair {
|
|||
* @see java.lang.Object#toString()
|
||||
*/
|
||||
public String toString() {
|
||||
return key + " -> " + value;
|
||||
return key + " -> " + value; //$NON-NLS-1$
|
||||
}
|
||||
}
|
|
@ -21,16 +21,20 @@ import java.util.Map;
|
|||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollectorCleaner;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
@ -39,6 +43,7 @@ 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.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
|
@ -49,9 +54,90 @@ import org.w3c.dom.NodeList;
|
|||
*
|
||||
* @author vhirsl
|
||||
*/
|
||||
public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoCollectorCleaner,
|
||||
IDiscoveredScannerInfoSerializable {
|
||||
public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerFileSICollector"; //$NON-NLS-1$
|
||||
public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoCollectorCleaner {
|
||||
public class ScannerInfoData implements IDiscoveredScannerInfoSerializable {
|
||||
private Map commandIdToFilesMap; // command id and set of files it applies to
|
||||
private Map fileToCommandIdMap; // maps each file to the corresponding command id
|
||||
private Map commandIdCommandMap; // map of all commands
|
||||
|
||||
public ScannerInfoData() {
|
||||
commandIdCommandMap = new LinkedHashMap(); // [commandId, command]
|
||||
fileToCommandIdMap = new HashMap(); // [file, commandId]
|
||||
commandIdToFilesMap = new HashMap(); // [commandId, set of files]
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#serialize(org.w3c.dom.Element)
|
||||
*/
|
||||
public void serialize(Element collectorElem) {
|
||||
Document doc = collectorElem.getOwnerDocument();
|
||||
|
||||
List commandIds = new ArrayList(commandIdCommandMap.keySet());
|
||||
Collections.sort(commandIds);
|
||||
for (Iterator i = commandIds.iterator(); i.hasNext(); ) {
|
||||
Integer commandId = (Integer) i.next();
|
||||
CCommandDSC command = (CCommandDSC) commandIdCommandMap.get(commandId);
|
||||
|
||||
Element cmdElem = doc.createElement(CC_ELEM); //$NON-NLS-1$
|
||||
collectorElem.appendChild(cmdElem);
|
||||
cmdElem.setAttribute(ID_ATTR, commandId.toString()); //$NON-NLS-1$
|
||||
cmdElem.setAttribute(FILE_TYPE_ATTR, command.appliesToCPPFileType() ? "c++" : "c"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||
// write command and scanner info
|
||||
command.serialize(cmdElem);
|
||||
// write files command applies to
|
||||
Element filesElem = doc.createElement(APPLIES_TO_ATTR); //$NON-NLS-1$
|
||||
cmdElem.appendChild(filesElem);
|
||||
Set files = (Set) commandIdToFilesMap.get(commandId);
|
||||
if (files != null) {
|
||||
for (Iterator j = files.iterator(); j.hasNext(); ) {
|
||||
Element fileElem = doc.createElement(FILE_ELEM); //$NON-NLS-1$
|
||||
IFile file = (IFile) j.next();
|
||||
IPath path = file.getProjectRelativePath();
|
||||
fileElem.setAttribute(PATH_ATTR, path.toString()); //$NON-NLS-1$
|
||||
filesElem.appendChild(fileElem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#deserialize(org.w3c.dom.Element)
|
||||
*/
|
||||
public void deserialize(Element collectorElem) {
|
||||
for (Node child = collectorElem.getFirstChild(); child != null; child = child.getNextSibling()) {
|
||||
if (child.getNodeName().equals(CC_ELEM)) { //$NON-NLS-1$
|
||||
Element cmdElem = (Element) child;
|
||||
boolean cppFileType = cmdElem.getAttribute(FILE_TYPE_ATTR).equals("c++"); //$NON-NLS-1$
|
||||
CCommandDSC command = new CCommandDSC(cppFileType);
|
||||
command.setCommandId(Integer.parseInt(cmdElem.getAttribute(ID_ATTR)));
|
||||
// deserialize command
|
||||
command.deserialize(cmdElem);
|
||||
// get set of files the command applies to
|
||||
NodeList appliesList = cmdElem.getElementsByTagName(APPLIES_TO_ATTR);
|
||||
if (appliesList.getLength() > 0) {
|
||||
Element appliesElem = (Element) appliesList.item(0);
|
||||
NodeList fileList = appliesElem.getElementsByTagName(FILE_ELEM);
|
||||
for (int i = 0; i < fileList.getLength(); ++i) {
|
||||
Element fileElem = (Element) fileList.item(i);
|
||||
String fileName = fileElem.getAttribute(PATH_ATTR);
|
||||
IFile file = project.getFile(fileName);
|
||||
addCompilerCommand(file, command);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#getCollectorId()
|
||||
*/
|
||||
public String getCollectorId() {
|
||||
return COLLECTOR_ID;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerFileSICollector"; //$NON-NLS-1$
|
||||
private static final String CC_ELEM = "compilerCommand"; //$NON-NLS-1$
|
||||
private static final String ID_ATTR = "id"; //$NON-NLS-1$
|
||||
private static final String FILE_TYPE_ATTR = "fileType"; //$NON-NLS-1$
|
||||
|
@ -59,23 +145,29 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
private static final String FILE_ELEM = "file"; //$NON-NLS-1$
|
||||
private static final String PATH_ATTR = "path"; //$NON-NLS-1$
|
||||
|
||||
private IProject project;
|
||||
|
||||
private Map commandIdToFilesMap; // command id and set of files it applies to
|
||||
private Map fileToCommandIdMap; // maps each file to the corresponding command id
|
||||
private Map commandIdCommandMap; // map of all commands
|
||||
private static final LinkedHashMap EMPTY_LHM = new LinkedHashMap(0);
|
||||
|
||||
private IProject project;
|
||||
|
||||
private ScannerInfoData sid; // scanner info data
|
||||
|
||||
private List siChangedForFileList; // list of files for which scanner info has changed
|
||||
|
||||
private SortedSet freeCommandIdPool; // sorted set of free command ids
|
||||
private int commandIdCounter = 0;
|
||||
|
||||
private boolean siAvailable; // is there any scanner info discovered
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public PerFileSICollector() {
|
||||
commandIdCommandMap = new LinkedHashMap(); // [commandId, command]
|
||||
fileToCommandIdMap = new HashMap(); // [file, commandId]
|
||||
commandIdToFilesMap = new HashMap(); // [commandId, set of files]
|
||||
|
||||
sid = new ScannerInfoData();
|
||||
|
||||
siChangedForFileList = new ArrayList();
|
||||
|
||||
freeCommandIdPool = new TreeSet();
|
||||
siAvailable = false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
@ -85,10 +177,12 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
this.project = project;
|
||||
|
||||
try {
|
||||
IDiscoveredPathInfo pathInfo = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
|
||||
// deserialize from SI store
|
||||
DiscoveredScannerInfoStore.getInstance().loadDiscoveredScannerInfoFromState(project, sid);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
siAvailable = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,12 +233,12 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
* @param scannerInfo
|
||||
*/
|
||||
private void addScannerInfo(Integer commandId, Map scannerInfo) {
|
||||
CCommandDSC cmd = (CCommandDSC) commandIdCommandMap.get(commandId);
|
||||
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(commandId);
|
||||
if (cmd != null) {
|
||||
List symbols = (List) scannerInfo.get(ScannerInfoTypes.SYMBOL_DEFINITIONS);
|
||||
List includes = (List) scannerInfo.get(ScannerInfoTypes.INCLUDE_PATHS);
|
||||
cmd.setSymbols(symbols);
|
||||
cmd.setIncludes(includes);
|
||||
cmd.setIncludes(CygpathTranslator.translateIncludePaths(includes));
|
||||
cmd.setDiscovered(true);
|
||||
}
|
||||
}
|
||||
|
@ -154,7 +248,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
* @param object
|
||||
*/
|
||||
private void addCompilerCommand(IFile file, CCommandDSC cmd) {
|
||||
List existingCommands = new ArrayList(commandIdCommandMap.values());
|
||||
List existingCommands = new ArrayList(sid.commandIdCommandMap.values());
|
||||
int index = existingCommands.indexOf(cmd);
|
||||
if (index != -1) {
|
||||
cmd = (CCommandDSC) existingCommands.get(index);
|
||||
|
@ -170,35 +264,64 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
commandId = ++commandIdCounter;
|
||||
}
|
||||
cmd.setCommandId(commandId);
|
||||
commandIdCommandMap.put(cmd.getCommandIdAsInteger(), cmd);
|
||||
sid.commandIdCommandMap.put(cmd.getCommandIdAsInteger(), cmd);
|
||||
}
|
||||
Integer commandId = cmd.getCommandIdAsInteger();
|
||||
// update commandIdToFilesMap
|
||||
Set fileSet = (Set) commandIdToFilesMap.get(commandId);
|
||||
// update sid.commandIdToFilesMap
|
||||
Set fileSet = (Set) sid.commandIdToFilesMap.get(commandId);
|
||||
if (fileSet == null) {
|
||||
fileSet = new HashSet();
|
||||
commandIdToFilesMap.put(commandId, fileSet);
|
||||
sid.commandIdToFilesMap.put(commandId, fileSet);
|
||||
}
|
||||
fileSet.add(file);
|
||||
// update fileToCommandIdsMap
|
||||
boolean change = true;
|
||||
Integer oldCommandId = (Integer) fileToCommandIdMap.get(file);
|
||||
if (oldCommandId != null) {
|
||||
if (oldCommandId.equals(commandId)) {
|
||||
change = false;
|
||||
if (fileSet.add(file)) {
|
||||
// update fileToCommandIdsMap
|
||||
boolean change = true;
|
||||
Integer oldCommandId = (Integer) sid.fileToCommandIdMap.get(file);
|
||||
if (oldCommandId != null) {
|
||||
if (oldCommandId.equals(commandId)) {
|
||||
change = false;
|
||||
}
|
||||
else {
|
||||
Set oldFileSet = (Set) sid.commandIdToFilesMap.get(oldCommandId);
|
||||
oldFileSet.remove(file);
|
||||
}
|
||||
}
|
||||
else {
|
||||
commandIdToFilesMap.remove(file);
|
||||
if (((Set)(commandIdToFilesMap.get(oldCommandId))).isEmpty()) {
|
||||
// old command does not apply to any files any more; remove
|
||||
commandIdCommandMap.remove(oldCommandId);
|
||||
freeCommandIdPool.add(oldCommandId);
|
||||
if (change) {
|
||||
sid.fileToCommandIdMap.put(file, commandId);
|
||||
// TODO generate change event for this resource
|
||||
if (!siChangedForFileList.contains(file)) {
|
||||
siChangedForFileList.add(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
fileToCommandIdMap.put(file, commandId);
|
||||
}
|
||||
|
||||
private void removeUnusedCommands() {
|
||||
for (Iterator i = sid.commandIdToFilesMap.entrySet().iterator(); i.hasNext(); ) {
|
||||
Entry entry = (Entry) i.next();
|
||||
Integer cmdId = (Integer) entry.getKey();
|
||||
Set fileSet = (Set) entry.getValue();
|
||||
if (fileSet.isEmpty()) {
|
||||
// return cmdId to the free command id pool
|
||||
freeCommandIdPool.add(cmdId);
|
||||
}
|
||||
}
|
||||
for (Iterator i = freeCommandIdPool.iterator(); i.hasNext(); ) {
|
||||
Integer cmdId = (Integer) i.next();
|
||||
// the command does not have any files associated; remove
|
||||
sid.commandIdCommandMap.remove(cmdId);
|
||||
sid.commandIdToFilesMap.remove(cmdId);
|
||||
}
|
||||
while (!freeCommandIdPool.isEmpty()) {
|
||||
Integer last = (Integer) freeCommandIdPool.last();
|
||||
if (last.intValue() == commandIdCounter) {
|
||||
freeCommandIdPool.remove(last);
|
||||
--commandIdCounter;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type
|
||||
* @param object
|
||||
|
@ -216,13 +339,16 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
monitor = new NullProgressMonitor();
|
||||
}
|
||||
monitor.beginTask(MakeMessages.getString("ScannerInfoCollector.Processing"), 100); //$NON-NLS-1$
|
||||
removeUnusedCommands();
|
||||
monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Processing")); //$NON-NLS-1$
|
||||
DiscoveredScannerInfoStore.getInstance().loadDiscoveredScannerInfoFromState(project, this);
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(project);
|
||||
// DiscoveredScannerInfoStore.getInstance().loadDiscoveredScannerInfoFromState(project, this);
|
||||
monitor.worked(50);
|
||||
monitor.subTask(MakeMessages.getString("ScannerInfoCollector.Updating") + project.getName()); //$NON-NLS-1$
|
||||
try {
|
||||
// update scanner configuration
|
||||
DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(project, this);
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().updateDiscoveredInfo(createPathInfoObject());
|
||||
// DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(project, this);
|
||||
monitor.worked(50);
|
||||
} catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
|
@ -230,6 +356,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
monitor.done();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2#createPathInfoObject()
|
||||
*/
|
||||
public IDiscoveredPathInfo createPathInfoObject() {
|
||||
return new PerFileDiscoveredPathInfo();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#getCollectedScannerInfo(java.lang.Object, org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes)
|
||||
*/
|
||||
|
@ -255,81 +388,19 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
}
|
||||
else if (project.equals(((IResource)resource).getProject())) {
|
||||
if (type.equals(ScannerInfoTypes.COMPILER_COMMAND)) {
|
||||
rv = new ArrayList(commandIdCommandMap.values());
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#serialize(org.w3c.dom.Element)
|
||||
*/
|
||||
public void serialize(Element collectorElem) {
|
||||
Document doc = collectorElem.getOwnerDocument();
|
||||
|
||||
List commandIds = new ArrayList(commandIdCommandMap.keySet());
|
||||
Collections.sort(commandIds);
|
||||
for (Iterator i = commandIds.iterator(); i.hasNext(); ) {
|
||||
Integer commandId = (Integer) i.next();
|
||||
CCommandDSC command = (CCommandDSC) commandIdCommandMap.get(commandId);
|
||||
|
||||
Element cmdElem = doc.createElement(CC_ELEM); //$NON-NLS-1$
|
||||
collectorElem.appendChild(cmdElem);
|
||||
cmdElem.setAttribute(ID_ATTR, commandId.toString()); //$NON-NLS-1$
|
||||
cmdElem.setAttribute(FILE_TYPE_ATTR, command.appliesToCPPFileType() ? "c++" : "c");
|
||||
// write command and scanner info
|
||||
command.serialize(cmdElem);
|
||||
// write files command applies to
|
||||
Element filesElem = doc.createElement(APPLIES_TO_ATTR); //$NON-NLS-1$
|
||||
cmdElem.appendChild(filesElem);
|
||||
Set files = (Set) commandIdToFilesMap.get(commandId);
|
||||
if (files != null) {
|
||||
for (Iterator j = files.iterator(); j.hasNext(); ) {
|
||||
Element fileElem = doc.createElement(FILE_ELEM); //$NON-NLS-1$
|
||||
IFile file = (IFile) j.next();
|
||||
IPath path = file.getProjectRelativePath();
|
||||
fileElem.setAttribute(PATH_ATTR, path.toString()); //$NON-NLS-1$
|
||||
filesElem.appendChild(fileElem);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#deserialize(org.w3c.dom.Element)
|
||||
*/
|
||||
public void deserialize(Element collectorElem) {
|
||||
for (Node child = collectorElem.getFirstChild(); child != null; child = child.getNextSibling()) {
|
||||
if (child.getNodeName().equals(CC_ELEM)) { //$NON-NLS-1$
|
||||
Element cmdElem = (Element) child;
|
||||
boolean cppFileType = cmdElem.getAttribute(FILE_TYPE_ATTR).equals("c++");
|
||||
CCommandDSC command = new CCommandDSC(cppFileType);
|
||||
command.setCommandId(Integer.parseInt(cmdElem.getAttribute(ID_ATTR)));
|
||||
// deserialize command
|
||||
command.deserialize(cmdElem);
|
||||
// get set of files the command applies to
|
||||
NodeList appliesList = cmdElem.getElementsByTagName(APPLIES_TO_ATTR);
|
||||
if (appliesList.getLength() > 0) {
|
||||
Element appliesElem = (Element) appliesList.item(0);
|
||||
NodeList fileList = appliesElem.getElementsByTagName(FILE_ELEM);
|
||||
for (int i = 0; i < fileList.getLength(); ++i) {
|
||||
Element fileElem = (Element) fileList.item(i);
|
||||
String fileName = fileElem.getAttribute(PATH_ATTR);
|
||||
IFile file = project.getFile(fileName);
|
||||
addCompilerCommand(file, command);
|
||||
rv = new ArrayList();
|
||||
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
|
||||
Integer cmdId = (Integer) i.next();
|
||||
Set fileSet = (Set) sid.commandIdToFilesMap.get(cmdId);
|
||||
if (!fileSet.isEmpty()) {
|
||||
rv.add(sid.commandIdCommandMap.get(cmdId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore.IDiscoveredScannerInfoSerializable#getCollectorId()
|
||||
*/
|
||||
public String getCollectorId() {
|
||||
return COLLECTOR_ID;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollectorUtil#deleteAllPaths(org.eclipse.core.resources.IResource)
|
||||
*/
|
||||
|
@ -362,4 +433,176 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Per file DPI object
|
||||
*
|
||||
* @author vhirsl
|
||||
*/
|
||||
public class PerFileDiscoveredPathInfo implements IDiscoveredPathInfo {
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getProject()
|
||||
*/
|
||||
public IProject getProject() {
|
||||
return project;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludePaths()
|
||||
*/
|
||||
public IPath[] getIncludePaths() {
|
||||
// return new IPath[0];
|
||||
List includes = getAllIncludePaths();
|
||||
List finalIncludePaths = new ArrayList(includes.size());
|
||||
for (Iterator i = includes.iterator(); i.hasNext(); ) {
|
||||
finalIncludePaths.add(new Path((String) i.next()));
|
||||
}
|
||||
return (IPath[])finalIncludePaths.toArray(new IPath[finalIncludePaths.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return list of IPath(s).
|
||||
*/
|
||||
private List getAllIncludePaths() {
|
||||
List allIncludes = new ArrayList();
|
||||
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
|
||||
Integer cmdId = (Integer) i.next();
|
||||
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
|
||||
if (cmd.isDiscovered()) {
|
||||
List discovered = cmd.getIncludes();
|
||||
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
|
||||
String include = (String) j.next();
|
||||
if (!allIncludes.contains(include)) {
|
||||
allIncludes.add(include);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return allIncludes;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbols()
|
||||
*/
|
||||
public Map getSymbols() {
|
||||
// return new HashMap();
|
||||
return getAllSymbols();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
private Map getAllSymbols() {
|
||||
Map symbols = new HashMap();
|
||||
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
|
||||
Integer cmdId = (Integer) i.next();
|
||||
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
|
||||
if (cmd.isDiscovered()) {
|
||||
List discovered = cmd.getSymbols();
|
||||
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
|
||||
String symbol = (String) j.next();
|
||||
String key = ScannerConfigUtil.getSymbolKey(symbol);
|
||||
String value = ScannerConfigUtil.getSymbolValue(symbol);
|
||||
symbols.put(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return symbols;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#setIncludeMap(java.util.LinkedHashMap)
|
||||
*/
|
||||
public void setIncludeMap(LinkedHashMap map) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#setSymbolMap(java.util.LinkedHashMap)
|
||||
*/
|
||||
public void setSymbolMap(LinkedHashMap map) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludeMap()
|
||||
*/
|
||||
public LinkedHashMap getIncludeMap() {
|
||||
return EMPTY_LHM;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbolMap()
|
||||
*/
|
||||
public LinkedHashMap getSymbolMap() {
|
||||
return EMPTY_LHM;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludePaths(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public IPath[] getIncludePaths(IPath path) {
|
||||
IFile file = project.getWorkspace().getRoot().getFile(path);
|
||||
if (file != null) {
|
||||
Integer cmdId = (Integer) sid.fileToCommandIdMap.get(file);
|
||||
if (cmdId != null) {
|
||||
// get the command
|
||||
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
|
||||
if (cmd != null && cmd.isDiscovered()) {
|
||||
List includes = cmd.getIncludes();
|
||||
List includePaths = new ArrayList(includes.size());
|
||||
for (Iterator i = includes.iterator(); i.hasNext(); ) {
|
||||
includePaths.add(new Path((String) i.next()));
|
||||
}
|
||||
return (IPath[])includePaths.toArray(new IPath[includePaths.size()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return new IPath[0];
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbols(org.eclipse.core.runtime.IPath)
|
||||
*/
|
||||
public Map getSymbols(IPath path) {
|
||||
IFile file = project.getFile(path);
|
||||
if (file != null) {
|
||||
Integer cmdId = (Integer) sid.fileToCommandIdMap.get(file);
|
||||
if (cmdId != null) {
|
||||
// get the command
|
||||
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
|
||||
if (cmd != null && cmd.isDiscovered()) {
|
||||
List symbols = cmd.getSymbols();
|
||||
Map definedSymbols = new HashMap(symbols.size());
|
||||
for (Iterator i = symbols.iterator(); i.hasNext(); ) {
|
||||
String symbol = (String) i.next();
|
||||
String key = ScannerConfigUtil.getSymbolKey(symbol);
|
||||
String value = ScannerConfigUtil.getSymbolValue(symbol);
|
||||
definedSymbols.put(key, value);
|
||||
}
|
||||
return definedSymbols;
|
||||
}
|
||||
}
|
||||
}
|
||||
return new HashMap(0);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable()
|
||||
*/
|
||||
public IDiscoveredScannerInfoSerializable getSerializable() {
|
||||
return sid;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getScope()
|
||||
*/
|
||||
public ScannerConfigScope getScope() {
|
||||
return ScannerConfigScope.FILE_SCOPE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,17 +26,17 @@ import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollectorCleaner;
|
|||
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.internal.core.MakeMessages;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathInfo;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CygpathTranslator;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
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.Platform;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
/**
|
||||
|
@ -233,7 +233,7 @@ public class PerProjectSICollector implements IScannerInfoCollector2, IScannerIn
|
|||
addedIncludes = addItemsWithOrder(sumDiscoveredIncludes, discoveredIncludes, true);
|
||||
|
||||
// try to translate cygpaths to absolute paths
|
||||
List finalSumIncludes = translateIncludePaths(sumDiscoveredIncludes);
|
||||
List finalSumIncludes = CygpathTranslator.translateIncludePaths(sumDiscoveredIncludes);
|
||||
|
||||
// Step 2. Get project's scanner config
|
||||
LinkedHashMap persistedIncludes = discPathInfo.getIncludeMap();
|
||||
|
@ -298,49 +298,6 @@ public class PerProjectSICollector implements IScannerInfoCollector2, IScannerIn
|
|||
return addedSymbols;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sumIncludes
|
||||
* @return
|
||||
*/
|
||||
private List translateIncludePaths(List sumIncludes) {
|
||||
List translatedIncludePaths = new ArrayList();
|
||||
for (Iterator i = sumIncludes.iterator(); i.hasNext(); ) {
|
||||
String includePath = (String) i.next();
|
||||
IPath realPath = new Path(includePath);
|
||||
if (!realPath.toFile().exists()) {
|
||||
String translatedPath = includePath;
|
||||
if (Platform.getOS().equals(Platform.OS_WIN32)) {
|
||||
translatedPath = new CygpathTranslator(project, includePath).run();
|
||||
}
|
||||
if (translatedPath != null) {
|
||||
if (!translatedPath.equals(includePath)) {
|
||||
// Check if the translated path exists
|
||||
IPath transPath = new Path(translatedPath);
|
||||
if (transPath.toFile().exists()) {
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
else {
|
||||
// TODO VMIR for now add even if it does not exist
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// TODO VMIR for now add even if it does not exist
|
||||
translatedIncludePaths.add(translatedPath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
TraceUtil.outputError("CygpathTranslator unable to translate path: ",//$NON-NLS-1$
|
||||
includePath);
|
||||
}
|
||||
}
|
||||
else {
|
||||
translatedIncludePaths.add(includePath);
|
||||
}
|
||||
}
|
||||
return translatedIncludePaths;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector#getCollectedScannerInfo(java.lang.Object, org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes)
|
||||
*/
|
||||
|
@ -440,4 +397,18 @@ public class PerProjectSICollector implements IScannerInfoCollector2, IScannerIn
|
|||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2#createPathInfoObject()
|
||||
*/
|
||||
public IDiscoveredPathInfo createPathInfoObject() {
|
||||
DiscoveredPathInfo pathInfo = new DiscoveredPathInfo(project);
|
||||
try {
|
||||
DiscoveredScannerInfoStore.getInstance().loadDiscoveredScannerInfoFromState(project, pathInfo);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
MakeCorePlugin.log(e);
|
||||
}
|
||||
return pathInfo;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -454,10 +454,10 @@ public class ScannerConfigInfoFactory2 {
|
|||
((Element)sc).getAttribute(PROBLEM_REPORTING_ENABLED)).booleanValue();
|
||||
}
|
||||
else if (sc.getNodeName().equals(PROFILE)) {
|
||||
//if (selectedProfile.equals(((Element)sc).getAttribute(ID))) {
|
||||
if (profileIds.contains(((Element)sc).getAttribute(ID))) {
|
||||
load(sc);
|
||||
loadedProfiles.add(((Element)sc).getAttribute(ID));
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (loadedProfiles.size() < 1) {
|
||||
|
|
|
@ -16,6 +16,7 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
import org.eclipse.core.runtime.IExtension;
|
||||
|
@ -29,7 +30,7 @@ import org.eclipse.core.runtime.Platform;
|
|||
* @author vhirsl
|
||||
*/
|
||||
public class ScannerConfigProfile {
|
||||
/**
|
||||
/**
|
||||
* scannerInfoCollector element
|
||||
*
|
||||
* @author vhirsl
|
||||
|
@ -48,6 +49,9 @@ public class ScannerConfigProfile {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
public String getScope() {
|
||||
return configElem.getAttribute("scope"); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
/**
|
||||
* scannerInfoConsoleParser element
|
||||
|
@ -296,6 +300,20 @@ public class ScannerConfigProfile {
|
|||
public ScannerInfoCollector getScannerInfoCollectorElement() {
|
||||
return scannerInfoCollector;
|
||||
}
|
||||
|
||||
public ScannerConfigScope getProfileScope() {
|
||||
ScannerConfigScope scope = null;
|
||||
if (scannerInfoCollector != null) {
|
||||
if (scannerInfoCollector.getScope().equals(ScannerConfigScope.PROJECT_SCOPE.toString())) {
|
||||
scope = ScannerConfigScope.PROJECT_SCOPE;
|
||||
}
|
||||
else if (scannerInfoCollector.getScope().equals(ScannerConfigScope.FILE_SCOPE.toString())) {
|
||||
scope = ScannerConfigScope.FILE_SCOPE;
|
||||
}
|
||||
}
|
||||
return scope;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the scannerInfoProviders.
|
||||
*/
|
||||
|
|
|
@ -234,6 +234,14 @@ ScannerConfigOptionsDialog.siProvider.browse.runCommandDialog='gcc' command:
|
|||
ScannerConfigOptionsDialog.siProvider.command.errorMessage=Must enter compiler invocation command
|
||||
ScannerConfigOptionsDialog.apply.progressMessage=Setting scanner configuration discovery options...
|
||||
|
||||
ScannerConfigOptionsDialog.unsavedchanges.title=Setting C/C++ Make Project Discovery Options
|
||||
ScannerConfigOptionsDialog.unsavedchanges.message=The C/C++ Make Project Discovery Options property page contains unsaved modifications. Do you want to save changes so that other discovery related settings can be updated?
|
||||
ScannerConfigOptionsDialog.unsavedchanges.button.save=Apply
|
||||
ScannerConfigOptionsDialog.unsavedchanges.button.cancel=Cancel
|
||||
|
||||
ScannerConfigOptionsDialog.error.title=Error Setting Project Discovery options
|
||||
ScannerConfigOptionsDialog.error.message=An error occurred while setting the project discovery options
|
||||
|
||||
# --- DiscoveredScannerConfigurationContainerPage ---
|
||||
DiscoveredScannerConfigurationContainerPage.title=Edit container
|
||||
DiscoveredScannerConfigurationContainerPage.description=Manage discovered scanner configuration
|
||||
|
|
|
@ -10,12 +10,15 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.make.ui.dialogs;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.dialogs.cpaths.CPathEntryMessages;
|
||||
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
|
||||
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
|
||||
|
@ -26,8 +29,12 @@ import org.eclipse.core.resources.IProject;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.IConfigurationElement;
|
||||
import org.eclipse.core.runtime.IExtensionPoint;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.core.runtime.Platform;
|
||||
import org.eclipse.core.runtime.Preferences;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
|
||||
import org.eclipse.jface.operation.IRunnableWithProgress;
|
||||
import org.eclipse.jface.resource.ImageDescriptor;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
|
||||
|
@ -37,10 +44,21 @@ import org.eclipse.swt.widgets.Composite;
|
|||
* @author vhirsl
|
||||
*/
|
||||
public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage {
|
||||
protected static final String PREFIX = "ScannerConfigOptionsDialog"; //$NON-NLS-1$
|
||||
private static final String UNSAVEDCHANGES_TITLE = PREFIX + ".unsavedchanges.title"; //$NON-NLS-1$
|
||||
private static final String UNSAVEDCHANGES_MESSAGE = PREFIX + ".unsavedchanges.message"; //$NON-NLS-1$
|
||||
private static final String UNSAVEDCHANGES_BSAVE = PREFIX + ".unsavedchanges.button.save"; //$NON-NLS-1$
|
||||
private static final String UNSAVEDCHANGES_BCANCEL = PREFIX + ".unsavedchanges.button.cancel"; //$NON-NLS-1$
|
||||
private static final String ERROR_TITLE = PREFIX + ".error.title"; //$NON-NLS-1$
|
||||
private static final String ERROR_MESSAGE = PREFIX + ".error.message"; //$NON-NLS-1$
|
||||
private static final String PROFILE_PAGE = "profilePage"; //$NON-NLS-1$
|
||||
private static final String PROFILE_ID = "profileId"; //$NON-NLS-1$
|
||||
|
||||
private Preferences fPrefs;
|
||||
private IScannerConfigBuilderInfo2 fBuildInfo;
|
||||
private boolean fInitialized = false;
|
||||
|
||||
private String fPersistedProfileId = null;
|
||||
|
||||
private Map fProfilePageMap = null;
|
||||
|
||||
// Composite parent provided by the block.
|
||||
|
@ -77,6 +95,41 @@ public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage
|
|||
protected void setInitialized(boolean initialized) {
|
||||
fInitialized = initialized;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true - OK to continue
|
||||
*/
|
||||
public boolean checkDialogForChanges() {
|
||||
boolean rc = true;
|
||||
if (isProfileDifferentThenPersisted()) {
|
||||
String title = MakeUIPlugin.getResourceString(UNSAVEDCHANGES_TITLE);
|
||||
String message = MakeUIPlugin.getResourceString(UNSAVEDCHANGES_MESSAGE);
|
||||
String[] buttonLabels = new String[]{
|
||||
MakeUIPlugin.getResourceString(UNSAVEDCHANGES_BSAVE),
|
||||
MakeUIPlugin.getResourceString(UNSAVEDCHANGES_BCANCEL),
|
||||
};
|
||||
MessageDialog dialog = new MessageDialog(getShell(), title, null, message, MessageDialog.QUESTION,
|
||||
buttonLabels, 0);
|
||||
int res = dialog.open();
|
||||
if (res == 0) { // OK
|
||||
callPerformApply();
|
||||
rc = true;
|
||||
} else if (res == 1) { // CANCEL
|
||||
rc = false;
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public boolean isProfileDifferentThenPersisted() {
|
||||
return (fPersistedProfileId != null &&
|
||||
!fPersistedProfileId.equals(getBuildInfo().getSelectedProfileId()));
|
||||
}
|
||||
|
||||
public void updatePersistedProfile() {
|
||||
fPersistedProfileId = getBuildInfo().getSelectedProfileId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a profile page only on request
|
||||
*
|
||||
|
@ -128,8 +181,8 @@ public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage
|
|||
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(MakeUIPlugin.getPluginId(), "DiscoveryProfilePage"); //$NON-NLS-1$
|
||||
IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
|
||||
for (int i = 0; i < infos.length; i++) {
|
||||
if (infos[i].getName().equals("profilePage")) { //$NON-NLS-1$
|
||||
String id = infos[i].getAttribute("profileId"); //$NON-NLS-1$
|
||||
if (infos[i].getName().equals(PROFILE_PAGE)) { //$NON-NLS-1$
|
||||
String id = infos[i].getAttribute(PROFILE_ID); //$NON-NLS-1$
|
||||
fProfilePageMap.put(id, new DiscoveryProfilePageConfiguration(infos[i]));
|
||||
}
|
||||
}
|
||||
|
@ -156,6 +209,9 @@ public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage
|
|||
} else {
|
||||
fBuildInfo = ScannerConfigProfileManager.createScannerConfigBuildInfo2(fPrefs, false);
|
||||
}
|
||||
if (fBuildInfo != null) {
|
||||
fPersistedProfileId = fBuildInfo.getSelectedProfileId();
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateContainer() {
|
||||
|
@ -215,7 +271,7 @@ public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage
|
|||
}
|
||||
|
||||
/**
|
||||
* Notification that the user changed the selection of the Binary Parser.
|
||||
* Notification that the user changed the selection of the SCD profile.
|
||||
*/
|
||||
protected void handleDiscoveryProfileChanged() {
|
||||
if (getCompositeParent() == null) {
|
||||
|
@ -297,5 +353,31 @@ public abstract class AbstractDiscoveryOptionsBlock extends AbstractCOptionPage
|
|||
}
|
||||
|
||||
protected abstract String getCurrentProfileId();
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public void callPerformApply() {
|
||||
try {
|
||||
new ProgressMonitorDialog(getShell()).run(false, false, new IRunnableWithProgress() {
|
||||
|
||||
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
|
||||
try {
|
||||
performApply(monitor);
|
||||
}
|
||||
catch (CoreException e) {
|
||||
throw new InvocationTargetException(e);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
} catch (InvocationTargetException e) {
|
||||
String title = CPathEntryMessages.getString(ERROR_TITLE); //$NON-NLS-1$
|
||||
String message = CPathEntryMessages.getString(ERROR_MESSAGE); //$NON-NLS-1$
|
||||
ExceptionHandler.handle(e, getShell(), title, message);
|
||||
} catch (InterruptedException e) {
|
||||
// cancelled
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -15,15 +15,15 @@ import org.eclipse.jface.dialogs.DialogPage;
|
|||
import org.eclipse.jface.resource.ImageDescriptor;
|
||||
|
||||
/**
|
||||
* TODO Provide description
|
||||
* Abstract SCD profile page
|
||||
*
|
||||
* @author vhirsl
|
||||
*/
|
||||
public abstract class AbstractDiscoveryPage extends DialogPage {
|
||||
protected static final String PREFIX = "ScannerConfigOptionsDialog"; //$NON-NLS-1$
|
||||
protected static final String PROFILE_GROUP_LABEL = PREFIX + ".profile.group.label"; //$NON-NLS-1$
|
||||
|
||||
protected AbstractDiscoveryOptionsBlock fContainer;
|
||||
|
||||
protected AbstractDiscoveryOptionsBlock fContainer; // parent
|
||||
|
||||
/**
|
||||
* @return Returns the fContainer.
|
||||
|
|
|
@ -22,8 +22,10 @@ import org.eclipse.cdt.core.model.IPathEntry;
|
|||
import org.eclipse.cdt.make.core.MakeCorePlugin;
|
||||
import org.eclipse.cdt.make.core.MakeProjectNature;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope;
|
||||
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
|
||||
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
|
||||
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
|
||||
import org.eclipse.cdt.make.internal.ui.preferences.TabFolderLayout;
|
||||
import org.eclipse.cdt.make.ui.IMakeHelpContextIds;
|
||||
|
@ -55,7 +57,6 @@ import org.eclipse.ui.help.WorkbenchHelp;
|
|||
public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
||||
private static final String MISSING_BUILDER_MSG = "ScannerConfigOptionsDialog.label.missingBuilderInformation"; //$NON-NLS-1$
|
||||
|
||||
private static final String PREFIX = "ScannerConfigOptionsDialog"; //$NON-NLS-1$
|
||||
private static final String DIALOG_TITLE = PREFIX + ".title"; //$NON-NLS-1$
|
||||
private static final String DIALOG_DESCRIPTION = PREFIX + ".description"; //$NON-NLS-1$
|
||||
private static final String SC_GROUP_LABEL = PREFIX + ".scGroup.label"; //$NON-NLS-1$
|
||||
|
@ -73,6 +74,7 @@ public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
|||
private boolean needsSCNature = false;
|
||||
private boolean fCreatePathContainer = false;
|
||||
private boolean isValid = true;
|
||||
private boolean persistedProfileChanged = false; // new persisted selected profile different than the old one
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -227,6 +229,16 @@ public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
|||
* @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
|
||||
*/
|
||||
public void setVisible(boolean visible) {
|
||||
if (!visible) {
|
||||
if (!checkDialogForChanges()) {
|
||||
createBuildInfo();
|
||||
restoreFromBuildinfo(getBuildInfo());
|
||||
enableAllControls();
|
||||
handleDiscoveryProfileChanged();
|
||||
|
||||
getCurrentPage().performDefaults();
|
||||
}
|
||||
}
|
||||
super.setVisible(visible);
|
||||
enableAllControls();
|
||||
}
|
||||
|
@ -267,6 +279,10 @@ public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
|||
configureProject(project, monitor);
|
||||
}
|
||||
getBuildInfo().save();
|
||||
if (isProfileDifferentThenPersisted()) {
|
||||
changeDiscoveryContainer(project);
|
||||
updatePersistedProfile();
|
||||
}
|
||||
}
|
||||
monitor.done();
|
||||
}
|
||||
|
@ -308,17 +324,21 @@ public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
|||
MakeCorePlugin.getDefault().getDiscoveryManager().removeDiscoveredInfo(project);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param project
|
||||
*/
|
||||
private void changeDiscoveryContainer(IProject project) {
|
||||
String profileId = getBuildInfo().getSelectedProfileId();
|
||||
ScannerConfigScope profileScope = ScannerConfigProfileManager.getInstance().
|
||||
getSCProfileConfiguration(profileId).getProfileScope();
|
||||
MakeCorePlugin.getDefault().getDiscoveryManager().changeDiscoveredContainer(project, profileScope);
|
||||
}
|
||||
|
||||
private void populateBuildInfo(IScannerConfigBuilderInfo2 buildInfo) {
|
||||
if (buildInfo != null) {
|
||||
buildInfo.setAutoDiscoveryEnabled(scEnabledButton.getSelection());
|
||||
String profileName = profileComboBox.getItem(profileComboBox.getSelectionIndex());
|
||||
String oldProfileId = buildInfo.getSelectedProfileId();
|
||||
buildInfo.setSelectedProfileId(getDiscoveryProfileId(profileName));
|
||||
String newProfileId = buildInfo.getSelectedProfileId();
|
||||
if (!oldProfileId.equals(newProfileId) && getProject() != null) {
|
||||
// invalidate scanner config store and reload
|
||||
// MakeCorePlugin.getDefault().getDiscoveryManager().removeDiscoveredInfo(getProject());
|
||||
}
|
||||
buildInfo.setProblemReportingEnabled(scProblemReportingEnabledButton.getSelection());
|
||||
}
|
||||
}
|
||||
|
@ -345,7 +365,7 @@ public class DiscoveryOptionsBlock extends AbstractDiscoveryOptionsBlock {
|
|||
private void restoreFromBuildinfo(IScannerConfigBuilderInfo2 buildInfo) {
|
||||
if (buildInfo != null) {
|
||||
scEnabledButton.setSelection(buildInfo.isAutoDiscoveryEnabled());
|
||||
String profileId = buildInfo.getSelectedProfileId();
|
||||
String profileId = buildInfo.getSelectedProfileId();
|
||||
profileComboBox.setText(getDiscoveryProfileName(profileId));
|
||||
scProblemReportingEnabledButton.setSelection(buildInfo.isProblemReportingEnabled());
|
||||
}
|
||||
|
|
|
@ -216,6 +216,7 @@ public class GCCPerFileSCDProfilePage extends AbstractDiscoveryPage {
|
|||
}
|
||||
|
||||
private void handleBOPLoadFileButtonSelected() {
|
||||
if (!getContainer().checkDialogForChanges()) return;
|
||||
loadButtonInitialEnabled = false;
|
||||
bopLoadButton.setEnabled(false);
|
||||
|
||||
|
|
|
@ -294,6 +294,7 @@ public class GCCPerProjectSCDProfilePage extends AbstractDiscoveryPage {
|
|||
}
|
||||
|
||||
private void handleBOPLoadFileButtonSelected() {
|
||||
if (!getContainer().checkDialogForChanges()) return;
|
||||
loadButtonInitialEnabled = false;
|
||||
bopLoadButton.setEnabled(false);
|
||||
|
||||
|
|
|
@ -88,7 +88,9 @@
|
|||
id="GCCManagedMakePerProjectProfile"
|
||||
name="GNU C/C++ managed make per project SCD profile"
|
||||
point="org.eclipse.cdt.make.core.ScannerConfigurationDiscoveryProfile">
|
||||
<scannerInfoCollector class="org.eclipse.cdt.managedbuilder.internal.scannerconfig.DefaultGCCScannerInfoCollector"/>
|
||||
<scannerInfoCollector
|
||||
class="org.eclipse.cdt.managedbuilder.internal.scannerconfig.DefaultGCCScannerInfoCollector"
|
||||
scope="project"/>
|
||||
<scannerInfoProvider providerId="specsFile">
|
||||
<run
|
||||
arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}"
|
||||
|
@ -101,7 +103,9 @@
|
|||
id="GCCWinManagedMakePerProjectProfile"
|
||||
name="GNU C/C++ managed make per project SCD profile (Windows)"
|
||||
point="org.eclipse.cdt.make.core.ScannerConfigurationDiscoveryProfile">
|
||||
<scannerInfoCollector class="org.eclipse.cdt.managedbuilder.internal.scannerconfig.DefaultGnuWinScannerInfoCollector"/>
|
||||
<scannerInfoCollector
|
||||
class="org.eclipse.cdt.managedbuilder.internal.scannerconfig.DefaultGnuWinScannerInfoCollector"
|
||||
scope="project"/>
|
||||
<scannerInfoProvider providerId="specsFile">
|
||||
<run
|
||||
arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}"
|
||||
|
|
|
@ -70,7 +70,7 @@ public class DefaultGnuWinScannerInfoCollector extends DefaultGCCScannerInfoColl
|
|||
*/
|
||||
private String convertPath(String includePath) {
|
||||
// Convert a POSIX-style path to Win32
|
||||
String translatedPath = new CygpathTranslator(project, includePath).run();
|
||||
String translatedPath = new CygpathTranslator(includePath).run();
|
||||
return translatedPath;
|
||||
}
|
||||
|
||||
|
|
|
@ -337,7 +337,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
|||
return null;
|
||||
}
|
||||
|
||||
protected IPathEntry[] removeCachedResovedPathEntries(ICProject cproject) {
|
||||
protected IPathEntry[] removeCachedResolvedPathEntries(ICProject cproject) {
|
||||
ArrayList resolvedListEntries = (ArrayList)resolvedMap.remove(cproject);
|
||||
if (resolvedListEntries != null) {
|
||||
try {
|
||||
|
@ -742,7 +742,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
|||
continue;
|
||||
}
|
||||
remaining++;
|
||||
oldResolvedEntries[i] = removeCachedResovedPathEntries(affectedProject);
|
||||
oldResolvedEntries[i] = removeCachedResolvedPathEntries(affectedProject);
|
||||
// ArrayList listEntries = (ArrayList)resolvedMap.remove(affectedProject);
|
||||
// if (listEntries != null) {
|
||||
// oldResolvedEntries[i] = (IPathEntry[])listEntries.toArray(NO_PATHENTRIES);
|
||||
|
@ -1460,7 +1460,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
|
|||
if (project.isAccessible()) {
|
||||
try {
|
||||
// Clear the old cache entries.
|
||||
IPathEntry[] oldResolvedEntries = removeCachedResovedPathEntries(cproject);
|
||||
IPathEntry[] oldResolvedEntries = removeCachedResolvedPathEntries(cproject);
|
||||
IPathEntry[] newResolvedEntries = getResolvedPathEntries(cproject);
|
||||
ICElementDelta[] deltas = generatePathEntryDeltas(cproject, oldResolvedEntries, newResolvedEntries);
|
||||
if (deltas.length > 0) {
|
||||
|
|
Loading…
Add table
Reference in a new issue