1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-30 12:25:35 +02:00

- Merged changes from cdt_5_0 to HEAD. Too many to mention individually.

- Reworked IFileSystem utility so that now it is noimplement/noextend.  Clients should now extend from concrete class FileSystemUtility instead to better insulate them from future API changes.
- Reworked the resulting concurrency fixes - indexing and scanner discovery now synchronize on the project root as a scheduling rule.  Original HEAD behaviour was to synch on the project's .settings folder for indexing, but that deadlocked with scanner discovery.
- Fixed remote indexing.  Changes on HEAD that deprecated CodeReader broke the ability for remote translation units to provide the path to load the file content from.  Added API to ITranslationUnit for this purpose.
This commit is contained in:
Chris Recoskie 2010-05-11 22:50:20 +00:00
parent a9b247a3f2
commit 947eedd5bc
41 changed files with 4067 additions and 392 deletions

View file

@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.make.internal.core.scannerconfig;
@ -247,11 +248,7 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
fireUpdate(INFO_CHANGED, info);
if(updateContainer){
// 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().
@ -265,6 +262,44 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC
}
}
}
/**
* Allows one to update the discovered information for a particular scanner discovery profile ID.
* TODO: This should be made API in IDiscoveredPathManager, or in an interface derived there from.
*
* @param context
* @param info
* @param updateContainer
* @param changedResources
* @param profileId
* @throws CoreException
*/
public void updateDiscoveredInfo(InfoContext context, IDiscoveredPathInfo info, boolean updateContainer, List<IResource> changedResources, String profileId) throws CoreException {
DiscoveredInfoHolder holder = getHolder(info.getProject(), true);
IDiscoveredPathInfo oldInfo = holder.getInfo(context);
if (oldInfo != null) {
IDiscoveredScannerInfoSerializable serializable = info.getSerializable();
if (serializable != null) {
holder.setInfo(context, info);
IProject project = info.getProject();
DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(project, context, serializable);
fireUpdate(INFO_CHANGED, info);
if(updateContainer){
IScannerConfigBuilderInfo2 buildInfo = ScannerConfigProfileManager.createScannerConfigBuildInfo2(project);
ScannerConfigScope profileScope = ScannerConfigProfileManager.getInstance().
getSCProfileConfiguration(profileId).getProfileScope();
changeDiscoveredContainer(project, profileScope, changedResources);
}
}
else {
throw new CoreException(new Status(IStatus.ERROR, MakeCorePlugin.getUniqueIdentifier(), -1,
MakeMessages.getString("DiscoveredPathManager.Info_Not_Serializable"), null)); //$NON-NLS-1$
}
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager#changeDiscoveredContainer(org.eclipse.core.resources.IProject, java.lang.String)

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2008 IBM Corporation and others.
* Copyright (c) 2004, 2010 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
@ -34,25 +34,25 @@ import org.w3c.dom.NodeList;
* @author vhirsl
*/
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 QUOTE_INCLUDE_ATTR = "quote"; //$NON-NLS-1$
private final static String KIND_ATTR = "kind"; //$NON-NLS-1$
protected final static String SINGLE_SPACE = " "; //$NON-NLS-1$
protected final static String CMD_DESCRIPTION_ELEM = "commandDescription"; //$NON-NLS-1$
protected final static String CMD_SI_ELEM = "commandScannerInfo"; //$NON-NLS-1$
protected final static String OPTION_ELEM = "option"; //$NON-NLS-1$
protected final static String SI_ITEM_ELEM = "siItem"; //$NON-NLS-1$
protected final static String KEY_ATTR = "key"; //$NON-NLS-1$
protected final static String VALUE_ATTR = "value"; //$NON-NLS-1$
protected final static String QUOTE_INCLUDE_ATTR = "quote"; //$NON-NLS-1$
protected final static String KIND_ATTR = "kind"; //$NON-NLS-1$
private int commandId;
private List<KVStringPair> compilerCommand; // members are KVStringPair objects
private boolean discovered;
private boolean cppFileType; // C or C++ file type
private IProject project;
protected int commandId;
protected List<KVStringPair> compilerCommand; // members are KVStringPair objects
protected boolean discovered;
protected boolean cppFileType; // C or C++ file type
protected IProject project;
private List<String> symbols;
private List<String> includes;
private List<String> quoteIncludes;
protected List<String> symbols;
protected List<String> includes;
protected List<String> quoteIncludes;
public CCommandDSC(boolean cppFileType) {
this(cppFileType, null);
@ -394,7 +394,7 @@ public class CCommandDSC {
return path;
}
private static IResource findResource(IProject project, IPath path) {
protected static IResource findResource(IProject project, IPath path) {
IResource resource = project.findMember(path, false);
if (resource == null) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();

View file

@ -60,15 +60,15 @@ import org.w3c.dom.NodeList;
* @author vhirsl
*/
public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoCollectorCleaner {
private static final int INCLUDE_PATH = 1;
private static final int QUOTE_INCLUDE_PATH = 2;
private static final int INCLUDE_FILE = 3;
private static final int MACROS_FILE = 4;
protected static final int INCLUDE_PATH = 1;
protected static final int QUOTE_INCLUDE_PATH = 2;
protected static final int INCLUDE_FILE = 3;
protected static final int MACROS_FILE = 4;
private class ScannerInfoData implements IDiscoveredScannerInfoSerializable {
private final Map<Integer, Set<IFile>> commandIdToFilesMap; // command id and set of files it applies to
private final Map<IFile, Integer> fileToCommandIdMap; // maps each file to the corresponding command id
private final Map<Integer, CCommandDSC> commandIdCommandMap; // map of all commands
protected class ScannerInfoData implements IDiscoveredScannerInfoSerializable {
protected final Map<Integer, Set<IFile>> commandIdToFilesMap; // command id and set of files it applies to
protected final Map<IFile, Integer> fileToCommandIdMap; // maps each file to the corresponding command id
protected final Map<Integer, CCommandDSC> commandIdCommandMap; // map of all commands
public ScannerInfoData() {
commandIdCommandMap = new LinkedHashMap<Integer, CCommandDSC>(); // [commandId, command]
@ -150,7 +150,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
private static class ProjectScannerInfo {
protected static class ProjectScannerInfo {
IPath[] includePaths;
IPath[] quoteIncludePaths;
IPath[] includeFiles;
@ -166,28 +166,28 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
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$
private static final String APPLIES_TO_ATTR = "appliesToFiles"; //$NON-NLS-1$
private static final String FILE_ELEM = "file"; //$NON-NLS-1$
private static final String PATH_ATTR = "path"; //$NON-NLS-1$
protected static final String CC_ELEM = "compilerCommand"; //$NON-NLS-1$
protected static final String ID_ATTR = "id"; //$NON-NLS-1$
protected static final String FILE_TYPE_ATTR = "fileType"; //$NON-NLS-1$
protected static final String APPLIES_TO_ATTR = "appliesToFiles"; //$NON-NLS-1$
protected static final String FILE_ELEM = "file"; //$NON-NLS-1$
protected static final String PATH_ATTR = "path"; //$NON-NLS-1$
private IProject project;
private InfoContext context;
protected IProject project;
protected InfoContext context;
private ScannerInfoData sid; // scanner info data
private ProjectScannerInfo psi = null; // sum of all scanner info
protected ScannerInfoData sid; // scanner info data
protected ProjectScannerInfo psi = null; // sum of all scanner info
// private List siChangedForFileList; // list of files for which scanner info has changed
private final Map<IFile, Integer> siChangedForFileMap; // (file, comandId) map for deltas
private final List<Integer> siChangedForCommandIdList; // list of command ids for which scanner info has changed
// protected List siChangedForFileList; // list of files for which scanner info has changed
protected final Map<IFile, Integer> siChangedForFileMap; // (file, comandId) map for deltas
protected final List<Integer> siChangedForCommandIdList; // list of command ids for which scanner info has changed
private final SortedSet<Integer> freeCommandIdPool; // sorted set of free command ids
private int commandIdCounter = 0;
protected final SortedSet<Integer> freeCommandIdPool; // sorted set of free command ids
protected int commandIdCounter = 0;
/** monitor for data access */
private final Object fLock = new Object();
protected final Object fLock = new Object();
/**
*
@ -277,7 +277,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
}
private void addScannerInfo(Integer commandId, Map<ScannerInfoTypes, List<String>> scannerInfo) {
protected void addScannerInfo(Integer commandId, Map<ScannerInfoTypes, List<String>> scannerInfo) {
assert Thread.holdsLock(fLock);
CCommandDSC cmd = sid.commandIdCommandMap.get(commandId);
if (cmd != null) {
@ -296,7 +296,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
}
private void addCompilerCommand(IFile file, CCommandDSC cmd) {
protected void addCompilerCommand(IFile file, CCommandDSC cmd) {
assert Thread.holdsLock(fLock);
List<CCommandDSC> existingCommands = new ArrayList<CCommandDSC>(sid.commandIdCommandMap.values());
int index = existingCommands.indexOf(cmd);
@ -320,7 +320,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
generateFileDelta(file, cmd);
}
private void generateFileDelta(IFile file, CCommandDSC cmd) {
protected void generateFileDelta(IFile file, CCommandDSC cmd) {
assert Thread.holdsLock(fLock);
Integer commandId = cmd.getCommandIdAsInteger();
Integer oldCommandId = sid.fileToCommandIdMap.get(file);
@ -335,7 +335,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
}
private void applyFileDeltas() {
protected void applyFileDeltas() {
assert Thread.holdsLock(fLock);
Set<IFile> resources = siChangedForFileMap.keySet();
for (IFile file : resources) {
@ -381,7 +381,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
generateProjectScannerInfo();
}
private void generateProjectScannerInfo() {
protected void generateProjectScannerInfo() {
assert Thread.holdsLock(fLock);
psi = new ProjectScannerInfo();
psi.includePaths = getAllIncludePaths(INCLUDE_PATH);
@ -391,7 +391,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
psi.definedSymbols = getAllSymbols();
}
private void removeUnusedCommands() {
protected void removeUnusedCommands() {
assert Thread.holdsLock(fLock);
Set<Entry<Integer, Set<IFile>>> entrySet = sid.commandIdToFilesMap.entrySet();
for (Entry<Integer, Set<IFile>> entry : entrySet) {
@ -417,7 +417,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
}
private void addScannerInfo(ScannerInfoTypes type, List<CCommandDSC> delta) {
protected void addScannerInfo(ScannerInfoTypes type, List<CCommandDSC> delta) {
// TODO Auto-generated method stub
}
@ -467,7 +467,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
return new PerFileDiscoveredPathInfo();
}
private boolean scannerInfoChanged() {
protected boolean scannerInfoChanged() {
assert Thread.holdsLock(fLock);
// return !siChangedForFileList.isEmpty();
return !siChangedForFileMap.isEmpty();
@ -597,7 +597,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
*
* @author vhirsl
*/
private class PerFileDiscoveredPathInfo implements IPerFileDiscoveredPathInfo2 {
protected class PerFileDiscoveredPathInfo implements IPerFileDiscoveredPathInfo2 {
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getProject()
*/
@ -772,7 +772,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
private Map<IResource, PathInfo> calculatePathInfoMap(){
protected Map<IResource, PathInfo> calculatePathInfoMap(){
assert Thread.holdsLock(fLock);
Map<IResource, PathInfo> map = new HashMap<IResource, PathInfo>(sid.fileToCommandIdMap.size() + 1);
@ -800,7 +800,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
return map;
}
private static PathInfo createFilePathInfo(CCommandDSC cmd){
protected static PathInfo createFilePathInfo(CCommandDSC cmd){
IPath[] includes = stringListToPathArray(cmd.getIncludes());
IPath[] quotedIncludes = stringListToPathArray(cmd.getQuoteIncludes());
IPath[] incFiles = stringListToPathArray(cmd.getIncludeFile());
@ -816,7 +816,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
return new PathInfo(includes, quotedIncludes, definedSymbols, incFiles, macroFiles);
}
private CCommandDSC getCommand(IPath path) {
protected CCommandDSC getCommand(IPath path) {
try {
IFile file = project.getWorkspace().getRoot().getFile(path);
return getCommand(file);
@ -826,7 +826,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
}
}
private CCommandDSC getCommand(IFile file) {
protected CCommandDSC getCommand(IFile file) {
CCommandDSC cmd = null;
if (file != null) {
Integer cmdId = sid.fileToCommandIdMap.get(file);
@ -847,7 +847,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
*
* @return list of IPath(s).
*/
private IPath[] getAllIncludePaths(int type) {
protected IPath[] getAllIncludePaths(int type) {
List<String> allIncludes = new ArrayList<String>();
Set<Integer> cmdIds = sid.commandIdCommandMap.keySet();
for (Integer cmdId : cmdIds) {
@ -884,7 +884,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
return stringListToPathArray(allIncludes);
}
private static IPath[] stringListToPathArray(List<String> discovered) {
protected static IPath[] stringListToPathArray(List<String> discovered) {
List<Path> allIncludes = new ArrayList<Path>(discovered.size());
for (String include : discovered) {
if (!allIncludes.contains(include)) {
@ -894,7 +894,7 @@ public class PerFileSICollector implements IScannerInfoCollector3, IScannerInfoC
return allIncludes.toArray(new IPath[allIncludes.size()]);
}
private Map<String, String> getAllSymbols() {
protected Map<String, String> getAllSymbols() {
assert Thread.holdsLock(fLock);
Map<String, String> symbols = new HashMap<String, String>();
Set<Integer> cmdIds = sid.commandIdCommandMap.keySet();

View file

@ -12,6 +12,7 @@
*******************************************************************************/
package org.eclipse.cdt.make.internal.core.scannerconfig2;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -44,6 +45,10 @@ 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.SymbolEntry;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.utils.FileSystemUtilityManager;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileInfo;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
@ -280,8 +285,27 @@ public class PerProjectSICollector implements IScannerInfoCollector3, IScannerIn
newPersistedIncludes.put(include, persistedIncludes.get(include));
}
else {
newPersistedIncludes.put(include,
((new Path(include)).toFile().exists()) ? Boolean.FALSE : Boolean.TRUE);
// the paths may be on EFS resources, not local
Boolean includePathExists = true;
URI projectLocationURI = discPathInfo.getProject().getLocationURI();
// use the project's location... create a URI that uses the same provider but that points to the include path
URI includeURI = FileSystemUtilityManager.getDefault().replacePath(projectLocationURI, include);
// ask EFS if the path exists
try {
IFileStore fileStore = EFS.getStore(includeURI);
IFileInfo info = fileStore.fetchInfo();
if(!info.exists()) {
includePathExists = false;
}
} catch (CoreException e) {
MakeCorePlugin.log(e);
}
// if the include path doesn't exist, then we tell the scanner config system that the folder
// has been "removed", and thus it won't show up in the UI
newPersistedIncludes.put(include, !includePathExists);
}
}
}

View file

@ -199,7 +199,9 @@ public class ScannerConfigBuilder extends ACBuilder {
// update and persist scanner configuration
CfgSCJobsUtil.updateScannerConfiguration(project, context, instance, buildInfo2, new SubProgressMonitor(monitor, 30));
CfgDiscoveredPathManager.getInstance().removeDiscoveredInfo(project, context, false);
// this erroneously removes the infor right after it gets created... bad
//CfgDiscoveredPathManager.getInstance().removeDiscoveredInfo(project, context, false);
if((flags & PERFORM_CORE_UPDATE) != 0)
CfgDiscoveredPathManager.getInstance().updateCoreSettings(project, new IConfiguration[]{cfg});

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007 Intel Corporation and others.
* Copyright (c) 2007, 2010 Intel 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
@ -7,6 +7,7 @@
*
* Contributors:
* Intel Corporation - Initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.build.internal.core.scannerconfig;
@ -59,6 +60,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.jobs.ISchedulingRule;
public class CfgDiscoveredPathManager implements IResourceChangeListener {
@ -67,6 +69,39 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener {
private IDiscoveredPathManager fBaseMngr;
private class GetDiscoveredInfoRunnable implements IWorkspaceRunnable {
private PathInfo fPathInfo;
private ContextInfo fContextInfo;
private IProject fProject;
private CfgInfoContext fContext;
public GetDiscoveredInfoRunnable(ContextInfo cInfo, IProject project, CfgInfoContext context) {
fContextInfo = cInfo;
fProject = project;
fContext = context;
}
public void run(IProgressMonitor monitor) throws CoreException {
fPathInfo = getCachedPathInfo(fContextInfo);
if(fPathInfo == null){
IDiscoveredPathManager.IDiscoveredPathInfo baseInfo = loadPathInfo(fProject, fContext.getConfiguration(), fContextInfo);
fPathInfo = resolveCacheBaseDiscoveredInfo(fContextInfo, baseInfo);
}
}
public PathInfo getPathInfo() {
return fPathInfo;
}
};
private static class ContextInfo {
public ContextInfo() {
@ -161,21 +196,16 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener {
PathInfo info = getCachedPathInfo(cInfo);
if (info == null) {
synchronized (this) {
info = getCachedPathInfo(cInfo);
// Change synchronization to be a lock on the project, otherwise
// if the project description is queried from a project change listener, it will deadlock
GetDiscoveredInfoRunnable runnable = new GetDiscoveredInfoRunnable(cInfo, project, context);
ISchedulingRule rule = project;
if(info == null){
IDiscoveredPathManager.IDiscoveredPathInfo baseInfo = loadPathInfo(project, context.getConfiguration(), cInfo);
info = resolveCacheBaseDiscoveredInfo(cInfo, baseInfo);
}
}
ResourcesPlugin.getWorkspace().run(runnable, rule, IWorkspace.AVOID_UPDATE, null);
info = runnable.getPathInfo();
// setCachedPathInfo(context, info);
// if(info instanceof DiscoveredPathInfo && !((DiscoveredPathInfo)info).isLoadded()){
// info = createPathInfo(project, context);
// setCachedPathInfo(context, info);
// }
}
return info;
}

View file

@ -1,5 +1,5 @@
###############################################################################
# Copyright (c) 2002, 2007 Rational Software Corporation and others.
# Copyright (c) 2002, 2010 Rational Software 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

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<component id="org.eclipse.cdt.core" version="2">
<?xml version="1.0" encoding="UTF-8"?><component id="org.eclipse.cdt.core" version="2">
<resource path="parser/org/eclipse/cdt/core/dom/ast/IASTImplicitName.java" type="org.eclipse.cdt.core.dom.ast.IASTImplicitName">
<filter id="403853384">
<message_arguments>
@ -42,4 +41,12 @@
</message_arguments>
</filter>
</resource>
</component>
<resource path="src/org/eclipse/cdt/core/IFilesystemUtility.java" type="org.eclipse.cdt.core.IFilesystemUtility">
<filter id="1109393411">
<message_arguments>
<message_argument value="5.0.3"/>
<message_argument value="org.eclipse.cdt.core.IFilesystemUtility"/>
</message_arguments>
</filter>
</resource>
</component>

View file

@ -52,8 +52,12 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core.dom.rewrite.astwriter;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.dom.rewrite.changegenerator;x-internal:=true,
org.eclipse.cdt.internal.core.dom.rewrite.commenthandler;x-internal:=true,
org.eclipse.cdt.internal.core.dom.rewrite.util;x-internal:=true,
org.eclipse.cdt.internal.core.envvar;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.index;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.index.composite;x-internal:=true,
org.eclipse.cdt.internal.core.index.composite.c;x-internal:=true,
org.eclipse.cdt.internal.core.index.composite.cpp;x-internal:=true,
org.eclipse.cdt.internal.core.index.provider;x-internal:=true,
org.eclipse.cdt.internal.core.indexer;x-internal:=true,
org.eclipse.cdt.internal.core.language;x-friends:="org.eclipse.cdt.ui",
@ -72,6 +76,7 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.internal.core.pdom.export;x-internal:=true,
org.eclipse.cdt.internal.core.pdom.indexer;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.resources;x-friends:="org.eclipse.cdt.ui,org.eclipse.cdt.make.core",
org.eclipse.cdt.internal.core.settings.model;x-internal:=true,
org.eclipse.cdt.internal.core.util;x-internal:=true,
org.eclipse.cdt.internal.errorparsers;x-internal:=true,
org.eclipse.cdt.internal.formatter;x-internal:=true,

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2009 QNX Software Systems and others.
* Copyright (c) 2000, 2010 QNX Software Systems 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
@ -8,6 +8,7 @@
* Contributors:
* QNX Software Systems - Initial API and implementation
* Markus Schorn (Wind River Systems)
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.core.model;
@ -486,5 +487,15 @@ public interface ITranslationUnit extends ICElement, IParent, IOpenable, ISource
@Deprecated
org.eclipse.cdt.core.parser.CodeReader getCodeReader();
/**
* Returns the path to the file that should be used by the parser to access the file contents.
* For local translation units, this will return the equivalent to <code>getLocation().toOSString()</code>
*
* @since 5.2
* @return String representing the path that should be used to obtain the file content.
* @see FileContent
*/
String getPathForFileContent();
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2008 IBM Corporation and others.
* Copyright (c) 2002, 2010 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

View file

@ -1133,4 +1133,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
public IWorkingCopy getSharedWorkingCopy(IProgressMonitor monitor, IBufferFactory factory) throws CModelException {
return CModelManager.getDefault().getSharedWorkingCopy(factory, this, null, monitor);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ITranslationUnit#getPathForFileContent()
*/
public String getPathForFileContent() {
return getLocation().toOSString();
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2009 Intel Corporation and others.
* Copyright (c) 2007, 2010 Intel 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
@ -247,7 +247,7 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
path = projLocation.append(path);
}
if(path != null)
values[num++] = path.toOSString();
values[num++] = p;
}
if(num < pathEntries.length){

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2009 Wind River Systems, Inc. and others.
* Copyright (c) 2009, 2010 Wind River Systems, Inc. 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
@ -8,6 +8,7 @@
* Contributors:
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.core.parser;
@ -56,7 +57,7 @@ public abstract class FileContent {
public static FileContent create(ITranslationUnit tu) {
IPath location= tu.getLocation();
if (location == null)
return create(tu.getElementName(), tu.getContents());
return create(tu.getPathForFileContent(), tu.getContents());
if (tu.isWorkingCopy()) {
return create(location.toOSString(), tu.getContents());

View file

@ -53,6 +53,7 @@ import org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider;
import org.eclipse.cdt.internal.core.parser.scanner.InternalFileContentProvider;
import org.eclipse.cdt.internal.core.parser.scanner.StreamHasher;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.cdt.utils.FileSystemUtilityManager;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@ -854,7 +855,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
return path;
}
URI uri= ifl.getURI();
return new Path(uri.getPath());
return new Path(FileSystemUtilityManager.getDefault().getPathFromURI(uri));
}
private void swallowError(IPath file, Throwable e) throws CoreException {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2009 QNX Software Systems and others.
* Copyright (c) 2005, 2010 QNX Software Systems 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
@ -12,6 +12,7 @@
* Sergey Prigogin (Google)
* Tim Kelly (Nokia)
* Anna Dushistova (MontaVista)
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom;
@ -752,7 +753,12 @@ public class PDOMManager implements IWritableIndexManager, IListener {
// in case a team provider does not implement a rule-factory, the
// platform makes a pessimistic choice and locks the workspace. We
// have to check for that.
ISchedulingRule rule= project.getWorkspace().getRuleFactory().refreshRule(project.getFolder(SETTINGS_FOLDER_NAME));
// Unfortunately, updating the project description, which can be
// caused by accessing the scanner info if it's not already created,
// requires a project level lock.
//ISchedulingRule rule= project.getWorkspace().getRuleFactory().refreshRule(project.getFolder(SETTINGS_FOLDER_NAME));
ISchedulingRule rule= project;
if (project.contains(rule)) {
rule= MultiRule.combine(project, INIT_INDEXER_SCHEDULING_RULE);
}

View file

@ -628,6 +628,7 @@
<extension-point id="templateProcessTypes" name="%templateProcessTypes.name" schema="schema/templateProcessTypes.exsd"/>
<extension-point id="templateAssociations" name="%templateAssociations.name" schema="schema/templateAssociations.exsd"/>
<extension-point id="ScannerInfoProvider2" name="%scannerInfoProvider2.name" schema="schema/ScannerInfoProvider2.exsd"/>
<extension-point id="FileSystemUtility" name="File System Utility" schema="schema/FileSystemUtility.exsd"/>
<extension
point="org.eclipse.cdt.core.templateProcessTypes">

View file

@ -0,0 +1,114 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core" xmlns="http://www.w3.org/2001/XMLSchema">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core" id="FileSystemUtility" name="Filesystem Utility"/>
</appInfo>
<documentation>
This extension point allows one to contribute a so-called &quot;Filesystem Utility&quot; class that can manipulate resources in a given EFS filesystem, and extract meaningful information from the filesystem and its resources.
</documentation>
</annotation>
<element name="FileSystemUtility">
<annotation>
<documentation>
An instance of a File System Utility. File System Utilities are mapped to a URI scheme corresponding to an EFS filesystem for which they provide support. These extensions are consulted by CDT in order to extract path information from the filesystem and manipulate filesystem resources.
</documentation>
</annotation>
<complexType>
<attribute name="scheme" type="string" use="required">
<annotation>
<documentation>
The URI scheme of an EFS filesystem this utility provides support for.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
Java class which implements org.eclipse.cdt.core.IFilesystemUtility to provide support for the filesystem.
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn=":org.eclipse.cdt.core.IFilesystemUtility"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<element name="extension">
<annotation>
<appInfo>
<meta.element />
</appInfo>
</annotation>
<complexType>
<sequence>
<element ref="FileSystemUtility"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
<appInfo>
<meta.attribute translatable="true"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="since"/>
</appInfo>
<documentation>
5.0.3
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiinfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
None.
</documentation>
</annotation>
</schema>

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2005 QNX Software Systems and others.
* Copyright (c) 2000, 2010 QNX Software Systems 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
@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.core;
@ -75,9 +76,15 @@ public class CProjectNature implements IProjectNature {
newNatures[prevNatures.length] = natureId;
description.setNatureIds(newNatures);
project.setDescription(description, monitor);
} finally {
monitor.done();
}
}
catch (CoreException e) {
CCorePlugin.log(e);
}
finally {
monitor.done();
}
}
/**

View file

@ -17,7 +17,6 @@ package org.eclipse.cdt.core;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
@ -30,6 +29,7 @@ import org.eclipse.cdt.internal.core.IErrorMarkeredOutputStream;
import org.eclipse.cdt.internal.core.resources.ResourceLookup;
import org.eclipse.cdt.internal.errorparsers.ErrorParserExtensionManager;
import org.eclipse.cdt.utils.CygPath;
import org.eclipse.cdt.utils.FileSystemUtilityManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@ -456,8 +456,13 @@ outer:
*/
protected IFile findFileInWorkspace(IPath path) {
URI uri;
if (!path.isAbsolute())
uri = URIUtil.append(getWorkingDirectoryURI(), path.toString());
if (!path.isAbsolute()) {
URI workingDirectoryURI = getWorkingDirectoryURI();
String workingDirPath = FileSystemUtilityManager.getDefault().getPathFromURI(workingDirectoryURI);
IPath newPath = new Path(workingDirPath).append(path);
uri = FileSystemUtilityManager.getDefault().replacePath(workingDirectoryURI, newPath.toString());
//uri = URIUtil.append(getWorkingDirectoryURI(), path.toString());
}
else {
uri = toURI(path);
if (uri == null) // Shouldn't happen; error logged
@ -699,22 +704,15 @@ outer:
* @since 5.1
*/
private URI toURI(IPath path) {
try {
// try {
URI baseURI = getWorkingDirectoryURI();
String uriString = path.toString();
// On Windows "C:/folder/" -> "/C:/folder/"
if (path.isAbsolute() && uriString.charAt(0) != IPath.SEPARATOR)
uriString = IPath.SEPARATOR + uriString;
return new URI(baseURI.getScheme(), baseURI.getUserInfo(),
baseURI.getHost(), baseURI.getPort(),
uriString, null, null);
} catch (URISyntaxException e) {
String message = "Problem converting path to URI [" + path.toString() + "]"; //$NON-NLS-1$//$NON-NLS-2$
CCorePlugin.log(message, e);
}
return null;
return FileSystemUtilityManager.getDefault().replacePath(baseURI, uriString);
}
/**

View file

@ -0,0 +1,77 @@
/*******************************************************************************
* Copyright (c) 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Abstract class providing the basis for utility classes that can extract meaningful information from EFS filesystems.
* Provides a default implementation that assumes that URIs for the given filesystem map directly to resources
* in the physical filesystem, and that the path component of the URI is a direct representation of the absolute path to
* the file in the physical filesystem.
*
* Clients wishing to support a filesystem with different behaviour should extend this class and override its methods where
* appropriate.
*
* Clients should not typically call methods on this class or its descendants directly. Instead, they should call the approrpriate method
* in FileSystemUtilityManager so that said manager can properly route calls to the proper utility, depending on the filesystem.
*
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the CDT team.
*
* @noinstantiate This class is not intended to be instantiated by clients.
*
* @author crecoskie
* @since 5.2
*
*/
public class FileSystemUtility implements IFilesystemUtility {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.IFilesystemUtility#getPathFromURI(java.net.URI)
*/
public String getPathFromURI(URI locationURI) {
return locationURI.getPath();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.IFilesystemUtility#getBaseURI(java.net.URI)
*/
public URI getBaseURI(URI locationURI) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.IFilesystemUtility#replacePathInURI(java.net.URI, java.lang.String)
*/
public URI replacePathInURI(URI locationOnSameFilesystem, String path) {
URI uri = locationOnSameFilesystem;
try {
return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
path, // replaced!
uri.getQuery(),uri.getFragment());
} catch (URISyntaxException e) {
CCorePlugin.log(e);
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.IFilesystemUtility#getMappedPath(java.net.URI)
*/
public String getMappedPath(URI locationURI) {
return getPathFromURI(locationURI);
}
}

View file

@ -0,0 +1,66 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core;
import java.net.URI;
/**
* An interface for utility classes that can extract meaningful information from EFS filesystems.
*
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the CDT team.
*
* @author crecoskie
* @since 5.0.3
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*
*/
public interface IFilesystemUtility {
/**
* Gets the path corresponding to the underlying file as the operating system on the target machine would see it.
* In the future, it would be better if EFS had an API for this.
*
* @param locationURI
* @return String representing the path, or <code>null</code> if there is an error or if there is no such physical file.
*/
public String getPathFromURI(URI locationURI);
/**
* In the case of a managed (linked) filesystem, returns the URI that this URI ultimately will
* point to.
*
* @param locationURI
* @return A uri corresponding to the linked store, or <code>null</code> if no such link exists.
*/
public URI getBaseURI(URI locationURI);
/**
* Creates a new URI on the same filesystem as another URI, but with a different path.
*
* @param locationOnSameFilesystem A URI pointing to another resource on the same filesystem that this resource
* should be on.
* @param path The absolute path to the resource.
* @return URI
*/
public URI replacePathInURI(URI locationOnSameFilesystem, String path);
/**
* Gets the path for this file as it appears when it is mapped into the filesystem. For
* unmapped filesystems, this would return the same path as getPathFromURI(URI locationURI)
*
* @return String representing the path, or <code>null</code> on error.
*/
public String getMappedPath(URI locationURI);
}

View file

@ -0,0 +1,177 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.utils;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IFilesystemUtility;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
/**
* Manager class that consults contributors to the FileSystemUtility extension point to perform operations corresponding to those filesystems.
*
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the CDT team.
*
* @author crecoskie
* @noextend This class is not intended to be extended by clients.
* @since 5.2
*/
public class FileSystemUtilityManager {
private static FileSystemUtilityManager instance;
private Map<String, IFilesystemUtility> fSchemeToUtilityImplementerMap;
private static String EXTENSION_ID = "FileSystemUtility"; //$NON-NLS-1$
private FileSystemUtilityManager() {
fSchemeToUtilityImplementerMap = new HashMap<String, IFilesystemUtility>();
loadExtensions();
}
private void loadExtensions() {
IExtensionPoint extension = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID,
EXTENSION_ID);
if (extension != null) {
IExtension[] extensions = extension.getExtensions();
for (int i = 0; i < extensions.length; i++) {
IConfigurationElement[] configElements = extensions[i].getConfigurationElements();
for (int j = 0; j < configElements.length; j++) {
String scheme = configElements[j].getAttribute("scheme"); //$NON-NLS-1$
String utility = configElements[j].getAttribute("class"); //$NON-NLS-1$
if (utility != null) {
try {
Object execExt = configElements[j].createExecutableExtension("class"); //$NON-NLS-1$
if (execExt instanceof IFilesystemUtility) {
fSchemeToUtilityImplementerMap.put(scheme, (IFilesystemUtility) execExt);
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
}
}
}
}
public synchronized static FileSystemUtilityManager getDefault() {
if(instance == null) {
instance = new FileSystemUtilityManager();
}
return instance;
}
/**
* Gets the path out of a URI. Right now this is hardcoded to deal with a select few filesystems.
* In the future, it would be better if EFS had an API for this.
*
* @param locationURI
* @return String representing the path.
*/
public String getPathFromURI(URI locationURI) {
IFilesystemUtility utility = fSchemeToUtilityImplementerMap.get(locationURI.getScheme());
if(utility == null) {
return locationURI.getPath();
}
else {
return utility.getPathFromURI(locationURI);
}
}
/**
* In the case of a managed (linked) filesystem, returns the URI that this URI ultimately will
* point to. Otherwise, returns null.
*
* @param locationURI
* @return URI
*/
public URI getManagedURI(URI locationURI) {
IFilesystemUtility utility = fSchemeToUtilityImplementerMap.get(locationURI.getScheme());
if(utility == null) {
return null;
}
else {
return utility.getBaseURI(locationURI);
}
}
/**
* Creates a new URI which clones the contents of the original URI, but with the path
* replaced by the given path. Returns null on error.
*
* @param uri
* @param path
* @return URI
*/
public URI replacePath(URI uri, String path) {
IFilesystemUtility utility = fSchemeToUtilityImplementerMap.get(uri.getScheme());
if(utility == null) {
// if there is no corresponding utility, then assume we can just replace the path field
// Is it a local filesystem uri? Its URIs are a bit weird sometimes, so use URIUtil
if(uri.getScheme().equals("file")) { //$NON-NLS-1$
return URIUtil.toURI(path);
}
try {
return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
path, // replaced!
uri.getQuery(),uri.getFragment());
} catch (URISyntaxException e) {
String message = "Problem converting path to URI [" + path.toString() + "]"; //$NON-NLS-1$//$NON-NLS-2$
CCorePlugin.log(message, e);
}
return null;
}
else {
return utility.replacePathInURI(uri, path);
}
}
public String getMappedPath(URI uri) {
IFilesystemUtility utility = fSchemeToUtilityImplementerMap.get(uri.getScheme());
if(utility == null) {
// if there is no corresponding utility, then assume it's just the path field
return uri.getPath();
}
else {
return utility.getMappedPath(uri);
}
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* Copyright (c) 2000, 2010 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
@ -18,7 +18,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.ILock;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.ISelectionValidator;
import org.eclipse.jface.text.ITextSelection;
@ -55,15 +55,6 @@ public class SelectionListenerWithASTManager {
return fgDefault;
}
private static class SingletonRule implements ISchedulingRule {
public boolean contains(ISchedulingRule rule) {
return rule == this;
}
public boolean isConflicting(ISchedulingRule rule) {
return rule == this;
}
}
private final static class PartListenerGroup {
private ITextEditor fPart;
private ISelectionListener fPostSelectionListener;
@ -71,7 +62,7 @@ public class SelectionListenerWithASTManager {
private Job fCurrentJob;
private ListenerList fAstListeners;
/** Rule to make sure only one job is running at a time */
private final ISchedulingRule fJobRule= new SingletonRule();
private final ILock fJobLock= Job.getJobManager().newLock();
private ISelectionValidator fValidator;
public PartListenerGroup(ITextEditor editorPart) {
@ -144,15 +135,22 @@ public class SelectionListenerWithASTManager {
fCurrentJob= new Job(Messages.SelectionListenerWithASTManager_jobName) {
@Override
public IStatus run(IProgressMonitor monitor) {
if (!monitor.isCanceled() && isSelectionValid(selection)) {
return calculateASTandInform(workingCopy, selection, monitor);
try {
// Try to acquire the lock
while (!monitor.isCanceled() && !fJobLock.acquire(10)) {}
if (!monitor.isCanceled() && isSelectionValid(selection)) {
return calculateASTandInform(workingCopy, selection, monitor);
}
} catch (InterruptedException e) {
} finally {
if (fJobLock.getDepth() != 0)
fJobLock.release();
}
return Status.OK_STATUS;
}
};
fCurrentJob.setPriority(Job.DECORATE);
fCurrentJob.setSystem(true);
fCurrentJob.setRule(fJobRule);
fCurrentJob.schedule();
}

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: xlC Error Parser Tests Plug-in
Bundle-SymbolicName: org.eclipse.cdt.errorparsers.xlc.tests;singleton:=true
Bundle-Version: 1.0.0
Bundle-Version: 5.0.100.qualifier
Bundle-Activator: org.eclipse.cdt.errorparsers.xlc.tests.TestsPlugin
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,

View file

@ -1,248 +1,63 @@
#Thu Oct 04 14:01:28 BRT 2007
#Mon Nov 23 16:55:49 EST 2009
eclipse.preferences.version=1
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
org.eclipse.jdt.core.formatter.blank_lines_after_package=1
org.eclipse.jdt.core.formatter.blank_lines_before_field=1
org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
org.eclipse.jdt.core.formatter.blank_lines_before_method=1
org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
org.eclipse.jdt.core.formatter.blank_lines_before_package=0
org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
org.eclipse.jdt.core.compiler.problem.deprecation=warning
org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
org.eclipse.jdt.core.compiler.problem.nullReference=warning
org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
org.eclipse.jdt.core.formatter.comment.format_comments=true
org.eclipse.jdt.core.formatter.comment.format_header=false
org.eclipse.jdt.core.formatter.comment.format_html=true
org.eclipse.jdt.core.formatter.comment.format_source_code=true
org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
org.eclipse.jdt.core.formatter.comment.line_length=80
org.eclipse.jdt.core.formatter.compact_else_if=true
org.eclipse.jdt.core.formatter.continuation_indentation=2
org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_empty_lines=false
org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
org.eclipse.jdt.core.formatter.indentation.size=4
org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert
org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
org.eclipse.jdt.core.formatter.lineSplit=80
org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false

View file

@ -1,5 +1,4 @@
#Thu Oct 04 14:01:28 BRT 2007
#Tue Sep 29 13:43:38 EDT 2009
eclipse.preferences.version=1
formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
formatter_settings_version=10
formatter_settings_version=11
internal.default.compliance=default

View file

@ -10,5 +10,8 @@ Require-Bundle: org.eclipse.cdt.make.core,
org.eclipse.core.resources,
org.eclipse.core.runtime,
org.eclipse.cdt.managedbuilder.core
Export-Package: org.eclipse.cdt.make.xlc.core.scannerconfig
Export-Package: org.eclipse.cdt.make.xlc.core.activator,
org.eclipse.cdt.make.xlc.core.scannerconfig
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.eclipse.cdt.make.xlc.core.activator.Activator
Bundle-RequiredExecutionEnvironment: J2SE-1.5

View file

@ -0,0 +1,70 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.xlc.core.activator;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
/**
* @author crecoskie
*
*/
public class Activator extends Plugin {
public static final String PLUGIN_ID = "org.eclipse.cdt.make.xlc.core"; //$NON-NLS-1$
private static Activator fInstance;
/**
*
*/
public Activator() {
super();
if(fInstance == null) {
fInstance = this;
}
}
public static void log(String e) {
log(createStatus(e));
}
public static void log(Throwable e) {
log("Error", e); //$NON-NLS-1$
}
public static void log(String message, Throwable e) {
Throwable nestedException;
if (e instanceof CModelException
&& (nestedException = ((CModelException)e).getException()) != null) {
e = nestedException;
}
log(createStatus(message, e));
}
public static IStatus createStatus(String msg) {
return createStatus(msg, null);
}
public static IStatus createStatus(String msg, Throwable e) {
return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, msg, e);
}
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
private static Plugin getDefault() {
return fInstance;
}
}

View file

@ -0,0 +1,32 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.xlc.core.messages;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Messages {
private static final String BUNDLE_NAME = "org.eclipse.cdt.make.xlc.core.messages.Messages"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private Messages() {
}
public static String getString(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}

View file

@ -0,0 +1,4 @@
PerFileXLCScannerInfoCollector.0=Updating discovered includes and macros
PerFileXLCScannerInfoCollector.1=Error updating discovered info.
ScannerInfoCollector.Processing=Processing discovered scanner configuration ...
ScannerInfoCollector.Updating=Updating Scanner Configuration for project

View file

@ -0,0 +1,415 @@
/*******************************************************************************
* Copyright (c) 2004, 2010 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.xlc.core.scannerconfig;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance;
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager;
import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfile.BuildOutputProvider;
import org.eclipse.cdt.make.xlc.core.activator.Activator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
/**
* @author crecoskie
*
*/
public abstract class AbstractXLCBuildOutputParser implements IScannerInfoConsoleParser {
protected static final String[] COMPILER_INVOCATION = { "xlc", "xlC"//$NON-NLS-1$ //$NON-NLS-2$
};
protected static final String DASHIDASH = "-I-"; //$NON-NLS-1$
protected static final String DASHI = "-I"; //$NON-NLS-1$
protected static final String DASHD = "-D"; //$NON-NLS-1$
protected IProject fProject;
protected IScannerInfoCollector fCollector;
protected IPath fWorkingDir;
protected IMarkerGenerator fMarkerGenerator;
protected XLCBuildOutputParserUtility fUtility;
protected boolean fBMultiline = false;
protected String fSMultiline = ""; //$NON-NLS-1$
protected String[] fCompilerCommands = { "xlc", "xlC" }; //$NON-NLS-1$ //$NON-NLS-2$
/**
* @return Returns the fProject.
*/
protected IProject getProject() {
return fProject;
}
/**
* @return Returns the fCollector.
*/
protected IScannerInfoCollector getCollector() {
return fCollector;
}
public void startup(IProject project, IScannerInfoCollector collector) {
fProject = project;
fCollector = collector;
fCompilerCommands = computeCompilerCommands();
}
/**
* Returns array of additional compiler commands to look for
*
* @return String[]
*/
protected String[] computeCompilerCommands() {
if (fProject != null) {
SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().getSCProfileInstance(
fProject, ScannerConfigProfileManager.NULL_PROFILE_ID);
BuildOutputProvider boProvider = profileInstance.getProfile().getBuildOutputProviderElement();
if (boProvider != null) {
String compilerCommandsString = boProvider.getScannerInfoConsoleParser().getCompilerCommands();
if (compilerCommandsString != null && compilerCommandsString.length() > 0) {
String[] compilerCommands = compilerCommandsString.split(",\\s*"); //$NON-NLS-1$
if (compilerCommands.length > 0) {
String[] compilerInvocation = new String[COMPILER_INVOCATION.length + compilerCommands.length];
System.arraycopy(COMPILER_INVOCATION, 0, compilerInvocation, 0, COMPILER_INVOCATION.length);
System.arraycopy(compilerCommands, 0, compilerInvocation, COMPILER_INVOCATION.length,
compilerCommands.length);
return compilerInvocation;
}
}
}
}
return COMPILER_INVOCATION;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#processLine
* (java.lang.String)
*/
public boolean processLine(String line) {
boolean rc = false;
int lineBreakPos = line.length() - 1;
char[] lineChars = line.toCharArray();
while (lineBreakPos >= 0 && Character.isWhitespace(lineChars[lineBreakPos])) {
lineBreakPos--;
}
if (lineBreakPos >= 0) {
if (lineChars[lineBreakPos] != '\\' || (lineBreakPos > 0 && lineChars[lineBreakPos - 1] == '\\')) {
lineBreakPos = -1;
}
}
// check for multiline commands (ends with '\')
if (lineBreakPos >= 0) {
fSMultiline += line.substring(0, lineBreakPos);
fBMultiline = true;
return rc;
}
if (fBMultiline) {
line = fSMultiline + line;
fBMultiline = false;
fSMultiline = ""; //$NON-NLS-1$
}
line = line.trim();
TraceUtil.outputTrace("XLCBuildOutputParser parsing line: [", line, "]"); //$NON-NLS-1$ //$NON-NLS-2$
// make\[[0-9]*\]: error_desc
int firstColon = line.indexOf(':');
String make = line.substring(0, firstColon + 1);
if (firstColon != -1 && make.indexOf("make") != -1) { //$NON-NLS-1$
boolean enter = false;
String msg = line.substring(firstColon + 1).trim();
if ((enter = msg.startsWith("Entering directory")) || //$NON-NLS-1$
(msg.startsWith("Leaving directory"))) { //$NON-NLS-1$
int s = msg.indexOf('`');
int e = msg.indexOf('\'');
if (s != -1 && e != -1) {
String dir = msg.substring(s + 1, e);
if (getUtility() != null) {
getUtility().changeMakeDirectory(dir, getDirectoryLevel(line), enter);
}
return rc;
}
}
}
// call sublclass to process a single line
return processSingleLine(line.trim());
}
protected synchronized XLCBuildOutputParserUtility getUtility() {
if (fUtility == null)
fUtility = new XLCBuildOutputParserUtility(fProject, fWorkingDir, fMarkerGenerator);
return fUtility;
}
protected int getDirectoryLevel(String line) {
int s = line.indexOf('[');
int num = 0;
if (s != -1) {
int e = line.indexOf(']');
String number = line.substring(s + 1, e).trim();
try {
num = Integer.parseInt(number);
} catch (NumberFormatException exc) {
}
}
return num;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser#shutdown
* ()
*/
public void shutdown() {
if (getUtility() != null) {
getUtility().reportProblems();
}
if(fCollector != null && fCollector instanceof IScannerInfoCollector2) {
IScannerInfoCollector2 collector = (IScannerInfoCollector2) fCollector;
try {
collector.updateScannerConfiguration(null);
} catch (CoreException e) {
// TODO Auto-generated catch block
Activator.log(e);
}
}
}
/**
* Tokenizes a line into an array of commands. Commands are separated by
* ';', '&&' or '||'. Tokens are separated by whitespace unless found inside
* of quotes, back-quotes, or double quotes. Outside of single-, double- or
* back-quotes a backslash escapes white-spaces, all quotes, the backslash,
* '&' and '|'. A backslash used for escaping is removed. Quotes other than
* the back-quote plus '&&', '||', ';' are removed, also.
*
* @param line
* to tokenize
* @return array of commands
*/
protected String[][] tokenize(String line, boolean escapeInsideDoubleQuotes) {
ArrayList<String[]> commands = new ArrayList<String[]>();
ArrayList<String> tokens = new ArrayList<String>();
StringBuffer token = new StringBuffer();
final char[] input = line.toCharArray();
boolean nextEscaped = false;
char currentQuote = 0;
for (int i = 0; i < input.length; i++) {
final char c = input[i];
final boolean escaped = nextEscaped;
nextEscaped = false;
if (currentQuote != 0) {
if (c == currentQuote) {
if (escaped) {
token.append(c);
} else {
if (c == '`') {
token.append(c); // preserve back-quotes
}
currentQuote = 0;
}
} else {
if (escapeInsideDoubleQuotes && currentQuote == '"' && c == '\\') {
nextEscaped = !escaped;
if (escaped) {
token.append(c);
}
} else {
if (escaped) {
token.append('\\');
}
token.append(c);
}
}
} else {
switch (c) {
case '\\':
if (escaped) {
token.append(c);
} else {
nextEscaped = true;
}
break;
case '\'':
case '"':
case '`':
if (escaped) {
token.append(c);
} else {
if (c == '`') {
token.append(c);
}
currentQuote = c;
}
break;
case ';':
if (escaped) {
token.append(c);
} else {
endCommand(token, tokens, commands);
}
break;
case '&':
case '|':
if (escaped || i + 1 >= input.length || input[i + 1] != c) {
token.append(c);
} else {
i++;
endCommand(token, tokens, commands);
}
break;
default:
if (Character.isWhitespace(c)) {
if (escaped) {
token.append(c);
} else {
endToken(token, tokens);
}
} else {
if (escaped) {
token.append('\\'); // for windows put backslash
// back onto the token.
}
token.append(c);
}
}
}
}
endCommand(token, tokens, commands);
return commands.toArray(new String[commands.size()][]);
}
protected void endCommand(StringBuffer token, ArrayList<String> tokens, ArrayList<String[]> commands) {
endToken(token, tokens);
if (!tokens.isEmpty()) {
commands.add(tokens.toArray(new String[tokens.size()]));
tokens.clear();
}
}
protected void endToken(StringBuffer token, ArrayList<String> tokens) {
if (token.length() > 0) {
tokens.add(token.toString());
token.setLength(0);
}
}
protected boolean processSingleLine(String line) {
boolean rc = false;
String[][] tokens = tokenize(line, true);
for (int i = 0; i < tokens.length; i++) {
String[] command = tokens[i];
if (processCommand(command)) {
rc = true;
} else { // go inside quotes, if the compiler is called per wrapper
// or shell script
for (int j = 0; j < command.length; j++) {
String[][] subtokens = tokenize(command[j], true);
for (int k = 0; k < subtokens.length; k++) {
String[] subcommand = subtokens[k];
if (subcommand.length > 1) { // only proceed if there is
// any additional info
if (processCommand(subcommand)) {
rc = true;
}
}
}
}
}
}
return rc;
}
protected int findCompilerInvocation(String[] tokens) {
for (int i = 0; i < tokens.length; i++) {
final String token = tokens[i].toLowerCase();
final int searchFromOffset = Math.max(token.lastIndexOf('/'), token.lastIndexOf('\\')) + 1;
for (int j = 0; j < fCompilerCommands.length; j++) {
if (token.indexOf(fCompilerCommands[j], searchFromOffset) != -1) {
return i;
}
}
}
return -1;
}
public void startup(IProject project, IPath workingDirectory, IScannerInfoCollector collector,
IMarkerGenerator markerGenerator) {
fProject = project;
fWorkingDir = workingDirectory;
fCollector = collector;
fMarkerGenerator = markerGenerator;
}
abstract protected boolean processCommand(String[] tokens);
protected List<String> getFileExtensionsList() {
IContentTypeManager manager = Platform.getContentTypeManager();
List<String> extensions = new LinkedList<String>();
IContentType cSource = manager.getContentType(CCorePlugin.CONTENT_TYPE_CSOURCE);
IContentType cppSource = manager.getContentType(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
String[] cExtensions = cSource.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
String[] cppExtensions = cppSource.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
for (int k = 0; k < cExtensions.length; k++) {
extensions.add("." + cExtensions[k]); //$NON-NLS-1$
}
for (int k = 0; k < cppExtensions.length; k++) {
extensions.add("." + cppExtensions[k]); //$NON-NLS-1$
}
return extensions;
}
protected String[] getFileExtensions() {
IContentTypeManager manager = Platform.getContentTypeManager();
List<String> extensions = new LinkedList<String>();
IContentType cSource = manager.getContentType(CCorePlugin.CONTENT_TYPE_CSOURCE);
IContentType cppSource = manager.getContentType(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
String[] cExtensions = cSource.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
String[] cppExtensions = cppSource.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
for (int k = 0; k < cExtensions.length; k++) {
extensions.add("." + cExtensions[k]); //$NON-NLS-1$
}
for (int k = 0; k < cppExtensions.length; k++) {
extensions.add("." + cppExtensions[k]); //$NON-NLS-1$
}
return extensions.toArray(new String[0]);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2008 IBM Corporation and others.
* Copyright (c) 2007, 2010 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
@ -18,7 +18,6 @@ import org.eclipse.cdt.managedbuilder.scannerconfig.IManagedScannerInfoCollector
* @author laggarcia
*
*/
public class DefaultXlCScannerInfoCollector extends PerProjectSICollector
public class PerProjectXLCScannerInfoCollector extends PerProjectSICollector
implements IScannerInfoCollector3, IManagedScannerInfoCollector {
}

View file

@ -0,0 +1,712 @@
/*******************************************************************************
* Copyright (c) 2004, 2010 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.xlc.core.scannerconfig;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.ProblemMarkerInfo;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.internal.core.MakeMessages;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
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.cdt.make.xlc.core.scannerconfig.util.XLCCommandDSC;
import org.eclipse.cdt.utils.FileSystemUtilityManager;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* @author crecoskie
*
*/
public class XLCBuildOutputParserUtility {
protected class Problem {
protected String description;
protected IResource file;
protected int lineNumber;
protected int severity;
protected String variableName;
public Problem(IResource file, int lineNumber, String desciption, int severity, String variableName) {
this.file = file;
this.lineNumber = lineNumber;
this.description = desciption;
this.severity = severity;
this.variableName = variableName;
}
}
public static IPath convertCygpath(IPath path) {
if (path.segmentCount() > 1 && path.segment(0).equals("cygdrive")) { //$NON-NLS-1$
StringBuffer buf = new StringBuffer(2);
buf.append(Character.toUpperCase(path.segment(1).charAt(0)));
buf.append(':');
path = path.removeFirstSegments(2);
path = path.setDevice(buf.toString());
path = path.makeAbsolute();
}
return path;
}
private List commandsList2;
private int commandsN = 0;
private List compiledFileList;
private Map directoryCommandListMap;
private IPath fBaseDirectory;
private String fDefaultMacroDefinitionValue= "1"; //$NON-NLS-1$
private Vector<IPath> fDirectoryStack;
private ArrayList<Problem> fErrors;
private int filesN = 0;
private IMarkerGenerator fMarkerGenerator;
private IProject project;
private int workingDirsN = 0;
/*
* For tracking the location of files being compiled
*/
private Map<String, IFile> fFilesInProject;
private List<String> fCollectedFiles;
private List<String> fNameConflicts;
/**
*
*/
public XLCBuildOutputParserUtility(IProject project, IPath workingDirectory,
IMarkerGenerator markerGenerator) {
fDirectoryStack = new Vector<IPath>();
fErrors = new ArrayList<Problem>();
this.project = project;
fBaseDirectory = getPathForResource(project);
if (workingDirectory != null) {
pushDirectory(workingDirectory);
}
}
private IPath getPathForResource(IResource resource) {
// TODO: when the file system utility stuff is in, this will have to call it to get the path
// for now, get the path from the URI
URI locationURI = resource.getLocationURI();
IPath path = new Path(locationURI.getPath());
return path;
}
/**
* Adds a mapping filename, generic_command
* @param longFileName
* @param genericLine
*/
void addGenericCommandForFile(String longFileName, String genericCommand) {
// if a file name has already been added once, return
if (compiledFileList.contains(longFileName))
return;
compiledFileList.add(longFileName);
String workingDir = getWorkingDirectory().toString();
List directoryCommandList = (List) directoryCommandListMap.get(workingDir);
if (directoryCommandList == null) {
directoryCommandList = new ArrayList();
directoryCommandListMap.put(workingDir, directoryCommandList);
++workingDirsN;
}
Map command21FileListMap = null;
for (Iterator i = directoryCommandList.iterator(); i.hasNext(); ) {
command21FileListMap = (Map) i.next();
List fileList = (List) command21FileListMap.get(genericCommand);
if (fileList != null) {
if (!fileList.contains(longFileName)) {
fileList.add(longFileName);
++filesN;
}
return;
}
}
command21FileListMap = new HashMap(1);
directoryCommandList.add(command21FileListMap);
++commandsN;
List fileList = new ArrayList();
command21FileListMap.put(genericCommand, fileList);
fileList.add(longFileName);
++filesN;
}
/**
* Adds a mapping command line -> file, this time without a dir
* @param longFileName
* @param genericLine
*/
void addGenericCommandForFile2(String longFileName, String genericLine) {
// if a file name has already been added once, return
if (compiledFileList.contains(longFileName))
return;
compiledFileList.add(longFileName);
String[] tokens = genericLine.split("\\s+"); //$NON-NLS-1$
CCommandDSC command = getNewCCommandDSC(tokens, 0, false); // assume .c file type
int index = commandsList2.indexOf(command);
if (index == -1) {
commandsList2.add(command);
++commandsN;
}
else {
command = (CCommandDSC) commandsList2.get(index);
}
// // add a file
// command.addFile(longFileName);
// ++filesN;
}
public void changeMakeDirectory(String dir, int dirLevel, boolean enterDir) {
if (enterDir) {
/* Sometimes make screws up the output, so
* "leave" events can't be seen. Double-check level
* here.
*/
for (int parseLevel = getDirectoryLevel(); dirLevel < parseLevel; parseLevel = getDirectoryLevel()) {
popDirectory();
}
pushDirectory(new Path(dir));
} else {
popDirectory();
/* Could check to see if they match */
}
}
/**
* Called by the console line parsers to generate a problem marker.
*/
public void generateMarker(IResource file, int lineNumber, String desc, int severity, String varName) {
// No need to collect markers if marker generator is not present
if (fMarkerGenerator != null) {
Problem problem = new Problem(file, lineNumber, desc, severity, varName);
fErrors.add(problem);
}
}
/**
*
*/
void generateReport() {
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); //$NON-NLS-1$
}
/**
* @param filePath : String
* @return filePath : IPath - not <code>null</code>
*/
public IPath getAbsolutePath(String filePath) {
IPath pFilePath;
if (filePath.startsWith("/")) { //$NON-NLS-1$
return convertCygpath(new Path(filePath));
}
else if (filePath.startsWith("\\") || //$NON-NLS-1$
(!filePath.startsWith(".") && //$NON-NLS-1$
filePath.length() > 2 && filePath.charAt(1) == ':' &&
(filePath.charAt(2) == '\\' || filePath.charAt(2) == '/'))) {
// absolute path
pFilePath = new Path(filePath);
}
else {
// relative path
IPath cwd = getWorkingDirectory();
if (!cwd.isAbsolute()) {
cwd = getBaseDirectory().append(cwd);
}
if (filePath.startsWith("`pwd`")) { //$NON-NLS-1$
if (filePath.length() > 5 && (filePath.charAt(5) == '/' || filePath.charAt(5) == '\\')) {
filePath = filePath.substring(6);
}
else {
filePath = filePath.substring(5);
}
}
pFilePath = cwd.append(filePath);
}
return pFilePath;
}
/**
* @return Returns the fBaseDirectory.
*/
public IPath getBaseDirectory() {
return fBaseDirectory;
}
/**
* Returns all CCommandDSC collected so far.
* Currently this list is not filled, so it will always return an empty list.
* @return List of CCommandDSC
*/
public List getCCommandDSCList() {
return new ArrayList(commandsList2);
}
protected int getDirectoryLevel() {
return fDirectoryStack.size();
}
/**
* @return Returns the fDirectoryStack.
*/
protected Vector<IPath> getDirectoryStack() {
return fDirectoryStack;
}
/**
* @return Returns the fErrors.
*/
protected ArrayList<Problem> getErrors() {
return fErrors;
}
/**
* @return Returns the fMarkerGenerator.
*/
protected IMarkerGenerator getMarkerGenerator() {
return fMarkerGenerator;
}
/**
* @param genericLine
* @param cppFileType
* @return CCommandDSC compile command description
*/
public CCommandDSC getNewCCommandDSC(String[] tokens, final int idxOfCompilerCommand, boolean cppFileType) {
ArrayList dirafter = new ArrayList();
ArrayList includes = new ArrayList();
XLCCommandDSC command = new XLCCommandDSC(cppFileType, getProject());
command.addSCOption(new KVStringPair(SCDOptionsEnum.COMMAND.toString(), tokens[idxOfCompilerCommand]));
for (int i = idxOfCompilerCommand+1; i < tokens.length; ++i) {
String token = tokens[i];
//Target specific options: see GccScannerInfoConsoleParser
if (token.startsWith("-m") || //$NON-NLS-1$
token.equals("-ansi") || //$NON-NLS-1$
token.equals("-posix") || //$NON-NLS-1$
token.equals("-pthread") || //$NON-NLS-1$
token.startsWith("-O") || //$NON-NLS-1$
token.equals("-fno-inline") || //$NON-NLS-1$
token.startsWith("-finline") || //$NON-NLS-1$
token.equals("-fno-exceptions") || //$NON-NLS-1$
token.equals("-fexceptions") || //$NON-NLS-1$
token.equals("-fshort-wchar") || //$NON-NLS-1$
token.equals("-fshort-double") || //$NON-NLS-1$
token.equals("-fno-signed-char") || //$NON-NLS-1$
token.equals("-fsigned-char") || //$NON-NLS-1$
token.startsWith("-fabi-version=") //$NON-NLS-1$
) {
command.addSCOption(new KVStringPair(SCDOptionsEnum.COMMAND.toString(), token));
continue;
}
for (int j = SCDOptionsEnum.MIN; j <= SCDOptionsEnum.MAX; ++j) {
final SCDOptionsEnum optionKind = SCDOptionsEnum.getSCDOptionsEnum(j);
if (token.startsWith(optionKind.toString())) {
String option = token.substring(
optionKind.toString().length()).trim();
if (option.length() > 0) {
// ex. -I/dir
}
else if (optionKind.equals(SCDOptionsEnum.IDASH)) {
for (Iterator iter=includes.iterator(); iter.hasNext(); ) {
option = (String)iter.next();
KVStringPair pair = new KVStringPair(SCDOptionsEnum.IQUOTE.toString(), option);
command.addSCOption(pair);
}
includes = new ArrayList();
// -I- has no parameter
}
else {
// ex. -I /dir
// take a next token
if (i+1 < tokens.length && !tokens[i+1].startsWith("-")) { //$NON-NLS-1$
option = tokens[++i];
}
else break;
}
if (option.length() > 0 && (
optionKind.equals(SCDOptionsEnum.INCLUDE) ||
optionKind.equals(SCDOptionsEnum.INCLUDE_FILE) ||
optionKind.equals(SCDOptionsEnum.IMACROS_FILE) ||
optionKind.equals(SCDOptionsEnum.IDIRAFTER) ||
optionKind.equals(SCDOptionsEnum.ISYSTEM) ||
optionKind.equals(SCDOptionsEnum.IQUOTE) )) {
option = (getAbsolutePath(option)).toString();
}
if (optionKind.equals(SCDOptionsEnum.IDIRAFTER)) {
KVStringPair pair = new KVStringPair(SCDOptionsEnum.INCLUDE.toString(), option);
dirafter.add(pair);
}
else if (optionKind.equals(SCDOptionsEnum.INCLUDE)) {
includes.add(option);
}
else { // add the pair
if (optionKind.equals(SCDOptionsEnum.DEFINE)) {
if (option.indexOf('=') == -1) {
option += '='+ fDefaultMacroDefinitionValue;
}
}
KVStringPair pair = new KVStringPair(optionKind.toString(), option);
command.addSCOption(pair);
}
break;
}
}
}
String option;
for (Iterator iter=includes.iterator(); iter.hasNext(); ) {
option = (String)iter.next();
KVStringPair pair = new KVStringPair(SCDOptionsEnum.INCLUDE.toString(), option);
command.addSCOption(pair);
}
for (Iterator iter=dirafter.iterator(); iter.hasNext(); ) {
command.addSCOption((KVStringPair)iter.next());
}
return command;
}
/**
* @return Returns the project.
*/
protected IProject getProject() {
return project;
}
public IPath getWorkingDirectory() {
if (fDirectoryStack.size() != 0) {
return fDirectoryStack.lastElement();
}
// Fallback to the Project Location
// FIXME: if the build did not start in the Project ?
return fBaseDirectory;
}
protected IPath popDirectory() {
int i = getDirectoryLevel();
if (i != 0) {
IPath dir = fDirectoryStack.lastElement();
fDirectoryStack.removeElementAt(i - 1);
return dir;
}
return new Path(""); //$NON-NLS-1$
}
protected void pushDirectory(IPath dir) {
if (dir != null) {
IPath pwd = null;
if (fBaseDirectory != null && fBaseDirectory.isPrefixOf(dir)) {
pwd = dir.removeFirstSegments(fBaseDirectory.segmentCount());
} else {
// check if it is a cygpath
pwd= convertCygpath(dir);
}
fDirectoryStack.addElement(pwd);
}
}
public boolean reportProblems() {
boolean reset = false;
for (Iterator<Problem> iter = fErrors.iterator(); iter.hasNext(); ) {
Problem problem = iter.next();
if (problem.severity == IMarkerGenerator.SEVERITY_ERROR_BUILD) {
reset = true;
}
if (problem.file == null) {
fMarkerGenerator.addMarker(new ProblemMarkerInfo(
project,
problem.lineNumber,
problem.description,
problem.severity,
problem.variableName));
} else {
fMarkerGenerator.addMarker(new ProblemMarkerInfo(
problem.file,
problem.lineNumber,
problem.description,
problem.severity,
problem.variableName));
}
}
fErrors.clear();
return reset;
}
public void setDefaultMacroDefinitionValue(String val) {
if (val != null) {
fDefaultMacroDefinitionValue= val;
}
}
public String getDefaultMacroDefinitionValue() {
return fDefaultMacroDefinitionValue;
}
public String normalizePath(String path) {
int column = path.indexOf(':');
if (column > 0) {
char driveLetter = path.charAt(column - 1);
if (Character.isLowerCase(driveLetter)) {
StringBuffer sb = new StringBuffer();
if (column - 1 > 0) {
sb.append(path.substring(0, column-1));
}
sb.append(Character.toUpperCase(driveLetter));
sb.append(path.substring(column));
path = sb.toString();
}
}
if (path.indexOf('.') == -1 || path.equals(".")) { //$NON-NLS-1$
return (new Path(path)).toString(); // convert separators to '/'
}
// lose "./" segments since they confuse the Path normalization
StringBuffer buf = new StringBuffer(path);
int len = buf.length();
StringBuffer newBuf = new StringBuffer(buf.length());
int scp = 0; // starting copy point
int ssp = 0; // starting search point
int sdot;
boolean validPrefix;
while (ssp < len && (sdot = buf.indexOf(".", ssp)) != -1) { //$NON-NLS-1$
validPrefix = false;
int ddot = buf.indexOf("..", ssp);//$NON-NLS-1$
if (sdot < ddot || ddot == -1) {
newBuf.append(buf.substring(scp, sdot));
scp = sdot;
ssp = sdot + 1;
if (ssp < len) {
if (sdot == 0 || buf.charAt(sdot - 1) == '/' || buf.charAt(sdot - 1) == '\\') {
validPrefix = true;
}
char nextChar = buf.charAt(ssp);
if (validPrefix && nextChar == '/') {
++ssp;
scp = ssp;
}
else if (validPrefix && nextChar == '\\') {
++ssp;
if (ssp < len - 1 && buf.charAt(ssp) == '\\') {
++ssp;
}
scp = ssp;
}
else {
// no path delimiter, must be '.' inside the path
scp = ssp - 1;
}
}
}
else if (sdot == ddot) {
ssp = sdot + 2;
}
}
newBuf.append(buf.substring(scp, len));
IPath orgPath = new Path(newBuf.toString());
return orgPath.toString();
}
/**
* Called by the console line parsers to find a file with a given name.
* @param fileName
* @return IFile or null
*/
public IFile findFile(String fileName) {
IFile file = findFilePath(fileName);
if (file == null) {
// Try the project's map.
file = findFileName(fileName);
if (file != null) {
// If there is a conflict then try all files in the project.
if (isConflictingName(fileName)) {
file = null;
// Create a problem marker
final String error = MakeMessages.getString("ConsoleParser.Ambiguous_Filepath_Error_Message"); //$NON-NLS-1$
TraceUtil.outputError(error, fileName);
generateMarker(getProject(), -1, error+fileName, IMarkerGenerator.SEVERITY_WARNING, null);
}
}
}
return file;
}
/**
* @param filePath
* @return
*/
protected IFile findFilePath(String filePath) {
IPath path = null;
IPath fp = new Path(filePath);
if (fp.isAbsolute()) {
if (getBaseDirectory().isPrefixOf(fp)) {
int segments = getBaseDirectory().matchingFirstSegments(fp);
path = fp.removeFirstSegments(segments);
} else {
path = fp;
}
} else {
path = getWorkingDirectory().append(filePath);
}
IFile file = null;
// The workspace may throw an IllegalArgumentException
// Catch it and the parser should fallback to scan the entire project.
try {
file = findFileInWorkspace(path);
} catch (Exception e) {
}
// We have to do another try, on Windows for cases like "TEST.C" vs "test.c"
// We use the java.io.File canonical path.
if (file == null || !file.exists()) {
File f = path.toFile();
try {
String canon = f.getCanonicalPath();
path = new Path(canon);
file = findFileInWorkspace(path);
} catch (IOException e1) {
}
}
return (file != null && file.exists()) ? file : null;
}
/**
* @param fileName
* @return
*/
protected IFile findFileName(String fileName) {
IPath path = new Path(fileName);
return (IFile) fFilesInProject.get(path.lastSegment());
}
protected IFile findFileInWorkspace(IPath path) {
IFile file = null;
if (path.isAbsolute()) {
IWorkspaceRoot root = getProject().getWorkspace().getRoot();
// construct a URI, based on the project's locationURI, that points
// to the given path
URI projectURI = project.getLocationURI();
URI newURI = FileSystemUtilityManager.getDefault().replacePath(projectURI, path.toString());
IFile[] files = root.findFilesForLocationURI(newURI);
for (int i = 0; i < files.length; i++) {
if (files[i].getProject().equals(getProject())) {
file = files[i];
break;
}
}
} else {
file = getProject().getFile(path);
}
return file;
}
protected void collectFiles(IContainer parent, List result) {
try {
IResource[] resources = parent.members();
for (int i = 0; i < resources.length; i++) {
IResource resource = resources[i];
if (resource instanceof IFile) {
result.add(resource);
} else if (resource instanceof IContainer) {
collectFiles((IContainer) resource, result);
}
}
} catch (CoreException e) {
MakeCorePlugin.log(e.getStatus());
}
}
protected boolean isConflictingName(String fileName) {
IPath path = new Path(fileName);
return fNameConflicts.contains(path.lastSegment());
}
public List translateRelativePaths(IFile file, String fileName, List includes) {
List translatedIncludes = new ArrayList(includes.size());
for (Iterator i = includes.iterator(); i.hasNext(); ) {
String include = (String) i.next();
IPath includePath = new Path(include);
if (!includePath.isAbsolute() && !includePath.isUNC()) { // do not translate UNC paths
// First try the current working directory
IPath cwd = getWorkingDirectory();
if (!cwd.isAbsolute()) {
cwd = getBaseDirectory().append(cwd);
}
IPath filePath = new Path(fileName);
if (!filePath.isAbsolute()) {
// check if the cwd is the right one
// appending fileName to cwd should yield file path
filePath = cwd.append(fileName);
}
if (!filePath.toString().equalsIgnoreCase(file.getLocation().toString())) {
// must be the cwd is wrong
// check if file name starts with ".."
if (fileName.startsWith("..")) { //$NON-NLS-1$
// probably multiple choices for cwd, hopeless
final String error = MakeMessages.getString("ConsoleParser.Working_Directory_Error_Message"); //$NON-NLS-1$
TraceUtil.outputError(error, fileName);
generateMarker(file, -1, error, IMarkerGenerator.SEVERITY_WARNING, fileName);
break;
}
else {
// remove common segments at the end
IPath tPath = new Path(fileName);
if (fileName.startsWith(".")) { //$NON-NLS-1$
tPath = tPath.removeFirstSegments(1);
}
// get the file path from the file
filePath = file.getLocation();
IPath lastFileSegment = filePath.removeFirstSegments(filePath.segmentCount() - tPath.segmentCount());
if (lastFileSegment.matchingFirstSegments(tPath) == tPath.segmentCount()) {
cwd = filePath.removeLastSegments(tPath.segmentCount());
}
}
}
IPath candidatePath = cwd.append(includePath);
File dir = candidatePath.toFile();
include = candidatePath.toString();
if (!dir.exists()) {
final String error = MakeMessages.getString("ConsoleParser.Nonexistent_Include_Path_Error_Message"); //$NON-NLS-1$
TraceUtil.outputError(error, include);
// generateMarker(file, -1, error+include, IMarkerGenerator.SEVERITY_WARNING, fileName);
}
}
// TODO VMIR for now add unresolved paths as well
translatedIncludes.add(include);
}
return translatedIncludes;
}
}

View file

@ -0,0 +1,136 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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.xlc.core.scannerconfig;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.make.xlc.core.activator.Activator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
/**
* @author crecoskie
*
*/
public class XLCPerFileBuildOutputParser extends AbstractXLCBuildOutputParser {
/* (non-Javadoc)
* @see org.eclipse.cdt.make.xlc.core.scannerconfig.AbstractXLCBuildOutputParser#processCommand(java.lang.String[])
*/
@Override
protected boolean processCommand(String[] tokens) {
try {
// GCC C/C++ compiler invocation
int compilerInvocationIndex = findCompilerInvocation(tokens);
if (compilerInvocationIndex < 0) {
return false;
}
// find a file name
int extensionsIndex = -1;
boolean found = false;
String filePath = null;
for (int i = compilerInvocationIndex + 1; i < tokens.length; i++) {
String token = tokens[i];
int k = token.lastIndexOf('.');
if (k != -1 && (token.length() - k < 5)) {
String fileExtension = token.substring(k);
extensionsIndex = getFileExtensionsList().indexOf(fileExtension);
if (extensionsIndex != -1) {
filePath = token;
found = true;
break;
}
}
}
if (!found) {
TraceUtil.outputTrace("Error identifying file name :1", tokens, TraceUtil.EOL); //$NON-NLS-1$
return false;
}
// sanity check
if (filePath.indexOf(getFileExtensions()[extensionsIndex]) == -1) {
TraceUtil.outputTrace("Error identifying file name :2", tokens, TraceUtil.EOL); //$NON-NLS-1$
return false;
}
if (getUtility() != null) {
IPath pFilePath = fUtility.getAbsolutePath(filePath);
String shortFileName = pFilePath.removeFileExtension().lastSegment();
// generalize occurrences of the file name
for (int i = compilerInvocationIndex + 1; i < tokens.length; i++) {
String token = tokens[i];
if (token.equals("-include")) { //$NON-NLS-1$
++i;
} else if (token.equals("-imacros")) { //$NON-NLS-1$
++i;
} else if (token.equals(filePath)) {
tokens[i] = "LONG_NAME"; //$NON-NLS-1$
} else if (token.startsWith(shortFileName)) {
tokens[i] = token.replaceFirst(shortFileName, "SHORT_NAME"); //$NON-NLS-1$
}
}
IFile file = null;
IPath baseDirectory = fUtility.getBaseDirectory();
if (baseDirectory.isPrefixOf(pFilePath)) {
IPath relPath = pFilePath.removeFirstSegments(baseDirectory.segmentCount());
// Note: We add the scanner-config even if the resource doesn't
// actually
// exist below this project (which may happen when reading
// existing
// build logs, because resources can be created as part of the
// build
// and may not exist at the time of analyzing the config but
// re-built
// later on.
// if (getProject().exists(relPath)) {
file = getProject().getFile(relPath);
} else {
file = getUtility().findFileInWorkspace(pFilePath);
}
if (file != null) {
CCommandDSC cmd = getUtility().getNewCCommandDSC(tokens, compilerInvocationIndex, extensionsIndex > 0);
List<CCommandDSC> cmdList = new ArrayList<CCommandDSC>();
cmdList.add(cmd);
Map<ScannerInfoTypes, List<CCommandDSC>> sc = new HashMap<ScannerInfoTypes, List<CCommandDSC>>(1);
sc.put(ScannerInfoTypes.COMPILER_COMMAND, cmdList);
getCollector().contributeToScannerConfig(file, sc);
if (fCollector != null && fCollector instanceof IScannerInfoCollector2) {
IScannerInfoCollector2 collector = (IScannerInfoCollector2) fCollector;
try {
collector.updateScannerConfiguration(null);
} catch (CoreException e) {
// TODO Auto-generated catch block
Activator.log(e);
}
}
} else
TraceUtil.outputError("Build command for file outside project: " + pFilePath.toString(), tokens); //$NON-NLS-1$
}
return true;
}
catch(Throwable e) {
e.printStackTrace();
return false;
}
}
}

View file

@ -0,0 +1,179 @@
/*******************************************************************************
* Copyright (c) 2009, 2010 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.xlc.core.scannerconfig;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.internal.core.MakeMessages;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.make.xlc.core.activator.Activator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
/**
* @author crecoskie
*
*/
public class XLCPerProjectBuildOutputParser extends
AbstractXLCBuildOutputParser {
/* (non-Javadoc)
* @see org.eclipse.cdt.make.xlc.core.scannerconfig.AbstractXLCBuildOutputParser#processCommand(java.lang.String[])
*/
@Override
protected boolean processCommand(String[] tokens) {
int compilerInvocationIdx= findCompilerInvocation(tokens);
if (compilerInvocationIdx<0) {
return false;
}
if (compilerInvocationIdx+1 >= tokens.length) {
return false;
}
// Recognized gcc or g++ compiler invocation
List<String> includes = new ArrayList<String>();
List<String> symbols = new ArrayList<String>();
List<String> targetSpecificOptions = new ArrayList<String>();
String fileName = null;
for (int j= compilerInvocationIdx+1; j < tokens.length; j++) {
String token = tokens[j];
if (token.equals(DASHIDASH)) {
}
else if (token.startsWith(DASHI)) {
String candidate= null;
if (token.length() > 2) {
candidate= token.substring(2).trim();
}
else if (j+1 < tokens.length) {
candidate= tokens[j+1];
if (candidate.startsWith("-")) { //$NON-NLS-1$
candidate= null;
}
else {
j++;
}
}
if (candidate != null && candidate.length() > 0) {
if (getUtility() != null) {
candidate= getUtility().normalizePath(candidate);
}
if (!includes.contains(candidate)) {
includes.add(candidate);
}
}
}
else if (token.startsWith(DASHD)) {
String candidate= null;
if (token.length() > 2) {
candidate= token.substring(2).trim();
}
else if (j+1 < tokens.length) {
candidate= tokens[j+1];
if (candidate.startsWith("-")) { //$NON-NLS-1$
candidate= null;
}
else {
j++;
}
}
if (candidate != null && candidate.length() > 0) {
if (candidate.indexOf('=') == -1) {
candidate+= '='+ getUtility().getDefaultMacroDefinitionValue();
}
if (!symbols.contains(candidate)) {
symbols.add(candidate);
}
}
}
else if (fileName == null) {
int extIndex = token.lastIndexOf('.');
String extension=null;
if(extIndex != -1)
extension = token.substring(extIndex);
List<String> extensions = getFileExtensionsList();
if(extension != null && extensions.contains(extension))
fileName = token;
}
}
if (fileName == null) {
return false; // return when no file was given (analogous to GCCPerFileBOPConsoleParser)
}
IProject project = getProject();
IFile file = null;
List<String> translatedIncludes = includes;
if (includes.size() > 0) {
if (fileName != null) {
if (getUtility() != null) {
file = getUtility().findFile(fileName);
if (file != null) {
project = file.getProject();
translatedIncludes = getUtility().translateRelativePaths(file, fileName, includes);
}
}
}
else {
StringBuffer line= new StringBuffer();
for (int j = 0; j < tokens.length; j++) {
line.append(tokens[j]);
line.append(' ');
}
final String error = MakeMessages.getString("ConsoleParser.Filename_Missing_Error_Message"); //$NON-NLS-1$
TraceUtil.outputError(error, line.toString());
if (getUtility() != null) {
getUtility().generateMarker(getProject(), -1, error + line.toString(), IMarkerGenerator.SEVERITY_WARNING, null);
}
}
if (file == null && getUtility() != null) { // real world case
// remove include paths since there was no chance to translate them
translatedIncludes.clear();
}
}
// Contribute discovered includes and symbols to the ScannerInfoCollector
if (translatedIncludes.size() > 0 || symbols.size() > 0) {
Map<ScannerInfoTypes, List<String>> scannerInfo = new HashMap<ScannerInfoTypes, List<String>>();
scannerInfo.put(ScannerInfoTypes.INCLUDE_PATHS, translatedIncludes);
scannerInfo.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, symbols);
scannerInfo.put(ScannerInfoTypes.TARGET_SPECIFIC_OPTION, targetSpecificOptions);
getCollector().contributeToScannerConfig(project, scannerInfo);
if(fCollector != null && fCollector instanceof IScannerInfoCollector2) {
IScannerInfoCollector2 collector = (IScannerInfoCollector2) fCollector;
try {
collector.updateScannerConfiguration(null);
} catch (CoreException e) {
// TODO Auto-generated catch block
Activator.log(e);
}
}
TraceUtil.outputTrace("Discovered scanner info for file \'" + fileName + '\'', //$NON-NLS-1$
"Include paths", includes, translatedIncludes, "Defined symbols", symbols); //$NON-NLS-1$ //$NON-NLS-2$
}
return true;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others.
* Copyright (c) 2006, 2010 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
@ -17,11 +17,14 @@ import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.make.xlc.core.activator.Activator;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.cdt.core.IMarkerGenerator;
@ -43,14 +46,22 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
// pattern for the includes arguments
final Pattern includePattern = Pattern
.compile("-(?:qgcc_c_stdinc|qc_stdinc|qgcc_cpp_stdinc|qcpp_stdinc)=(.*)"); //$NON-NLS-1$
// xlC compiler constants
final static String [] compilerConstants = {
"__IBMCPP__", //$NON-NLS-1$
"__xlC__", //$NON-NLS-1$
"__IBMC__", //$NON-NLS-1$
"__xlc__" //$NON-NLS-1$
};
private IProject fProject = null;
private IScannerInfoCollector fCollector = null;
private List symbols = new ArrayList();
private List<String> symbols = new ArrayList<String>();
private List includes = new ArrayList();
private List<String> includes = new ArrayList<String>();
/*
* (non-Javadoc)
@ -126,14 +137,31 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
* @since 1.0
*/
public void shutdown() {
Map scannerInfo = new HashMap();
Map<ScannerInfoTypes, List<String>> scannerInfo = new HashMap<ScannerInfoTypes, List<String>>();
// insert compiler constants, work around buggy xlC option for dumping symbols (it misses a few)
for (String constant : compilerConstants) {
if (!symbols.contains(constant))
symbols.add(constant);
}
// add the scanner info
scannerInfo.put(ScannerInfoTypes.INCLUDE_PATHS, includes);
scannerInfo.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, symbols);
fCollector.contributeToScannerConfig(fProject, scannerInfo);
TraceUtil
.outputTrace(
if(fCollector != null && fCollector instanceof IScannerInfoCollector2) {
IScannerInfoCollector2 collector = (IScannerInfoCollector2) fCollector;
try {
collector.updateScannerConfiguration(null);
} catch (CoreException e) {
// TODO Auto-generated catch block
Activator.log(e);
}
}
TraceUtil.outputTrace(
"Scanner info from \'specs\' file", //$NON-NLS-1$
"Include paths", includes, new ArrayList(), "Defined symbols", symbols); //$NON-NLS-1$ //$NON-NLS-2$
"Include paths", includes, new ArrayList<String>(), "Defined symbols", symbols); //$NON-NLS-1$ //$NON-NLS-2$
}
}

View file

@ -0,0 +1,52 @@
/*******************************************************************************
* Copyright (c) 2010 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.make.xlc.core.scannerconfig.util;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.KVStringPair;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SCDOptionsEnum;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
/**
* Class that represents a XL C/C++ compiler command and related scanner configuration
*/
public class XLCCommandDSC extends CCommandDSC {
public XLCCommandDSC(boolean cppFileType) {
super(cppFileType);
}
public XLCCommandDSC(boolean cppFileType, IProject project) {
super(cppFileType, project);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.internal.core.scannerconfig.util.CCommandDSC#addSCOption(org.eclipse.cdt.make.internal.core.scannerconfig.util.KVStringPair)
*/
@Override
public void addSCOption(KVStringPair option) {
if (project != null &&
(option.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString()) ||
option.getKey().equals(SCDOptionsEnum.INCLUDE.toString()) ||
option.getKey().equals(SCDOptionsEnum.ISYSTEM.toString()) ||
option.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString()) ||
option.getKey().equals(SCDOptionsEnum.IQUOTE.toString())))
{
String value = option.getValue();
value = makeRelative(project, new Path(value)).toOSString();
option = new KVStringPair(option.getKey(), value);
}
compilerCommand.add(option);
}
}

View file

@ -1,6 +1,5 @@
#Thu Oct 04 14:01:35 BRT 2007
#Tue Sep 29 13:43:50 EDT 2009
eclipse.preferences.version=1
formatter_profile=org.eclipse.jdt.ui.default.eclipse_profile
formatter_settings_version=10
formatter_settings_version=11
internal.default.compliance=default
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>

View file

@ -18,7 +18,7 @@
<!-- The ScannerInfoCollector manages the information generated by the Profile so that it can be easily accessed afterwards -->
<scannerInfoCollector
class="org.eclipse.cdt.make.xlc.core.scannerconfig.DefaultXlCScannerInfoCollector"
class="org.eclipse.cdt.make.xlc.core.scannerconfig.PerFileXLCScannerInfoCollector"
scope="project">
</scannerInfoCollector>
@ -55,7 +55,7 @@
<!-- The ScannerInfoCollector manages the information generated by the Profile so that it can be easily accessed afterwards -->
<scannerInfoCollector
class="org.eclipse.cdt.make.xlc.core.scannerconfig.DefaultXlCScannerInfoCollector"
class="org.eclipse.cdt.make.xlc.core.scannerconfig.PerFileXLCScannerInfoCollector"
scope="project">
</scannerInfoCollector>