1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

2004-08-24 Alain Magloire

Fix for PR 72078
	* model/org/eclipse/cdt/internal/core/model/CModelStatus.java
	* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java
This commit is contained in:
Alain Magloire 2004-08-24 18:29:51 +00:00
parent 76f927a165
commit e0f8a9bbeb
3 changed files with 142 additions and 32 deletions

View file

@ -1,3 +1,9 @@
2004-08-24 Alain Magloire
Fix for PR 72078
* model/org/eclipse/cdt/internal/core/model/CModelStatus.java
* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java
2004-08-23 Chris Wiebe
fix for 68210 - add missing cpp header names

View file

@ -169,6 +169,16 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
*/
public String getMessage() {
Throwable exception = getException();
if (isMultiStatus()) {
StringBuffer sb = new StringBuffer();
IStatus[] children = getChildren();
if (children != null && children.length > 0) {
for (int i = 0; i < children.length; ++i) {
sb.append(children[i].getMessage()).append(',');
}
}
return sb.toString();
}
if (exception == null) {
switch (getCode()) {
case CORE_EXCEPTION :
@ -212,9 +222,8 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
case INVALID_PATH:
if (fString != null) {
return fString;
} else {
return CoreModelMessages.getFormattedString("status.invalidPath", getPath() == null ? "null" : getPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$
}
return CoreModelMessages.getFormattedString("status.invalidPath", getPath() == null ? "null" : getPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$
case INVALID_PROJECT:
return CoreModelMessages.getFormattedString("status.invalidProject", getString()); //$NON-NLS-1$
@ -228,9 +237,8 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
case INVALID_SIBLING:
if (fString != null) {
return CoreModelMessages.getFormattedString("status.invalidSibling", getString()); //$NON-NLS-1$
} else {
return CoreModelMessages.getFormattedString("status.invalidSibling", getFirstElementName()); //$NON-NLS-1$
}
return CoreModelMessages.getFormattedString("status.invalidSibling", getFirstElementName()); //$NON-NLS-1$
case IO_EXCEPTION:
return CoreModelMessages.getFormattedString("status.IOException"); //$NON-NLS-1$
@ -243,9 +251,8 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
}
if (fString != null) {
return fString;
} else {
return CoreModelMessages.getFormattedString("status.nameCollision", sb.toString()); //$NON-NLS-1$ //$NON-NLS-2$
}
return CoreModelMessages.getFormattedString("status.nameCollision", sb.toString()); //$NON-NLS-1$ //$NON-NLS-2$
case NO_ELEMENTS_TO_PROCESS:
return CoreModelMessages.getFormattedString("operation.needElements"); //$NON-NLS-1$
@ -289,14 +296,12 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
}
return getString();
} else {
String message = exception.getMessage();
if (message != null) {
return message;
} else {
return exception.toString();
}
}
String message = exception.getMessage();
if (message != null) {
return message;
}
return exception.toString();
}
/**
@ -368,13 +373,12 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
public boolean matches(int mask) {
if (! isMultiStatus()) {
return matches(this, mask);
} else {
for (int i = 0, max = fChildren.length; i < max; i++) {
if (matches((CModelStatus) fChildren[i], mask))
return true;
}
return false;
}
for (int i = 0, max = fChildren.length; i < max; i++) {
if (matches((CModelStatus) fChildren[i], mask))
return true;
}
return false;
}
/**
@ -399,6 +403,18 @@ public class CModelStatus extends Status implements ICModelStatus, ICModelStatus
return jms;
}
/**
* Creates and returns a new <code>ICModelStatus</code> that is a
* a multi-status status.
*
* @see IStatus#.isMultiStatus()
*/
public static ICModelStatus newMultiStatus(int code, ICModelStatus[] children) {
CModelStatus jms = new CModelStatus(code);
jms.fChildren = children;
return jms;
}
/**
* Returns a printable representation of this exception for debugging
* purposes.

View file

@ -12,8 +12,10 @@ package org.eclipse.cdt.internal.core.model;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
@ -176,7 +178,25 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
}
}
listEntries.trimToSize();
resolvedEntries = (IPathEntry[])listEntries.toArray(NO_PATHENTRIES);
// Check for duplication in the sources
List dups = checkForSourceDuplication(resolvedEntries);
if (dups.size() > 0) {
List newList = new ArrayList(Arrays.asList(resolvedEntries));
newList.removeAll(dups);
resolvedEntries = (IPathEntry[]) newList.toArray(new IPathEntry[newList.size()]);
}
// Check for duplication in the outputs
dups = checkForOutputDuplication(resolvedEntries);
if (dups.size() > 0) {
List newList = new ArrayList(Arrays.asList(resolvedEntries));
newList.removeAll(dups);
resolvedEntries = (IPathEntry[]) newList.toArray(new IPathEntry[newList.size()]);
}
if (generateMarkers) {
final ICProject finalCProject = cproject;
final IPathEntry[] finalEntries = (IPathEntry[])listEntries.toArray(NO_PATHENTRIES);
@ -197,7 +217,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
createPathEntryProblemMarker(project, status);
}
}
return CModelStatus.OK_STATUS;
return Status.OK_STATUS;
}
};
markerTask.schedule();
@ -1161,6 +1181,30 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
}
}
// check duplication of sources
List dups = checkForSourceDuplication(entries);
if (dups.size() > 0) {
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
for (int i = 0; i < dups.size(); ++i) {
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
errMesg.append(':').append(dups.get(i).toString());
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
}
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
}
// check duplication of Outputs
dups = checkForOutputDuplication(entries);
if (dups.size() > 0) {
ICModelStatus[] cmodelStatus = new ICModelStatus[dups.size()];
for (int i = 0; i < dups.size(); ++i) {
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.DuplicateEntry")); //$NON-NLS-1$
errMesg.append(':').append(dups.get(i).toString());
cmodelStatus[i] = new CModelStatus(ICModelStatusConstants.NAME_COLLISION, errMesg.toString());
}
return CModelStatus.newMultiStatus(ICModelStatusConstants.INVALID_PATHENTRY, cmodelStatus);
}
// allow nesting source entries in each other as long as the outer entry excludes the inner one
for (int i = 0; i < entries.length; i++) {
IPathEntry entry = entries[i];
@ -1187,17 +1231,15 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
errMesg.append(':').append(entry.toString());
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
} else if (otherKind == IPathEntry.CDT_SOURCE) {
exclusionPattern += '/';
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
errMesg.append(':').append(entry.toString());
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
} else {
if (otherKind == IPathEntry.CDT_SOURCE) {
exclusionPattern += '/';
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
errMesg.append(':').append(entry.toString());
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString());
} else {
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
errMesg.append(':').append(entry.toString());
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString()); //$NON-NLS-1$
}
StringBuffer errMesg = new StringBuffer(CCorePlugin.getResourceString("CoreModel.PathEntry.NestedEntry")); //$NON-NLS-1$
errMesg.append(':').append(entry.toString());
return new CModelStatus(ICModelStatusConstants.INVALID_PATHENTRY, errMesg.toString()); //$NON-NLS-1$
}
}
}
@ -1336,6 +1378,52 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
return false;
}
private List checkForSourceDuplication(IPathEntry[] pathEntries) {
List duplicate = new ArrayList(pathEntries.length);
for (int i = 0; i < pathEntries.length; ++i) {
if (pathEntries[i].getEntryKind() == IPathEntry.CDT_SOURCE) {
ISourceEntry sourceEntry = (ISourceEntry)pathEntries[i];
for (int j = 0; j < pathEntries.length; ++j) {
if (pathEntries[j].getEntryKind() == IPathEntry.CDT_SOURCE) {
ISourceEntry otherSource = (ISourceEntry)pathEntries[j];
if (!sourceEntry.equals(otherSource)) {
if (!duplicate.contains(sourceEntry)) {
if (sourceEntry.getPath().equals(otherSource.getPath())) {
// duplication of sources
duplicate.add(otherSource);
}
}
}
}
}
}
}
return duplicate;
}
private List checkForOutputDuplication(IPathEntry[] pathEntries) {
List duplicate = new ArrayList(pathEntries.length);
for (int i = 0; i < pathEntries.length; ++i) {
if (pathEntries[i].getEntryKind() == IPathEntry.CDT_OUTPUT) {
IOutputEntry outputEntry = (IOutputEntry)pathEntries[i];
for (int j = 0; j < pathEntries.length; ++j) {
if (pathEntries[j].getEntryKind() == IPathEntry.CDT_OUTPUT) {
IOutputEntry otherOutput = (IOutputEntry)pathEntries[j];
if (!outputEntry.equals(otherOutput)) {
if (!duplicate.contains(outputEntry)) {
if (outputEntry.getPath().equals(otherOutput.getPath())) {
// duplication of outputs
duplicate.add(otherOutput);
}
}
}
}
}
}
}
return duplicate;
}
/**
* Record a new marker denoting a classpath problem
*/
@ -1351,7 +1439,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
case ICModelStatusConstants.INVALID_PATH:
severity = IMarker.SEVERITY_WARNING;
break;
default:
severity = IMarker.SEVERITY_ERROR;
break;
@ -1367,7 +1455,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
ICModelMarker.PATHENTRY_FILE_FORMAT,
},
new Object[] {
status.getString(),
status.getMessage(),
new Integer(severity),
"pathentry",//$NON-NLS-1$
"false",//$NON-NLS-1$