1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Patch for Devin Steffler.

FIXED 87179- [Selection] selecting #ifdef IASTName\r\n does not provide a proper IASTNode
FIXED 95573- [DOM AST] Code buffers not refreshed after file is saved
This commit is contained in:
John Camelon 2005-05-18 00:40:10 +00:00
parent ef268895cc
commit fbee283243
4 changed files with 73 additions and 17 deletions

View file

@ -1509,4 +1509,21 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest {
assertNotNull(name.resolveBinding());
assertTrue(name.resolveBinding() instanceof IVariable);
}
public void testBug87179() throws Exception
{
StringBuffer buffer = new StringBuffer();
buffer.append("#define ONE 1\r\n"); //$NON-NLS-1$
buffer.append("#ifdef ONE\r\n"); //$NON-NLS-1$
buffer.append("int x=0;\r\n"); //$NON-NLS-1$
buffer.append("#else\r\n"); //$NON-NLS-1$
buffer.append("char c='c';\r\n"); //$NON-NLS-1$
buffer.append("#endif\r\n"); //$NON-NLS-1$
String code = buffer.toString();
int offset1 = code.indexOf( "#ifdef ONE" ); //$NON-NLS-1$
int length = "#ifdef ONE".length(); //$NON-NLS-1$
IASTNode node = parse( code, ParserLanguage.C, offset1, length );
assertNotNull(node);
}
}

View file

@ -133,6 +133,44 @@ public class CodeReaderCacheTest extends CDOMBaseTest {
job.cancel();
}
public void testResourceChangedNestedPathUpdate() {
boolean hasPassed = false;
StringBuffer code = new StringBuffer();
code.append("int x;"); //$NON-NLS-1$
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();
IFile file = null;
try {
importFolder("test");
file = importFile("test/test.c", code.toString()); //$NON-NLS-1$
} catch (Exception e) {
e.printStackTrace();
}
// start a new job that repeatedly updates the file...
UpdateFileJob job = new UpdateFileJob("updater", file, "test/test.c", code.toString()); //$NON-NLS-1$ //$NON-NLS-2$
job.schedule();
while(!hasPassed) {
if (file != null) {
parse(file);
}
try {
Thread.sleep(1000); // give the updater thread some time to update the resource
file = job.getFile();
} catch (InterruptedException e) {
e.printStackTrace();
}
if (cache.getCurrentSpace() == 0) // item was properly removed by the updater thread
hasPassed = true;
}
job.cancel();
}
// THIS MUST BE RUN LAST IN THIS TEST
public void testClearCache() {
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();

View file

@ -3852,7 +3852,8 @@ abstract class BaseScanner implements IScanner {
int limit = bufferLimit[bufferStackPos];
int pos = ++bufferPos[bufferStackPos];
if (pos < limit && buffer[pos] == '\n')
if ((pos < limit && buffer[pos] == '\n') ||
(pos+1 < limit && buffer[pos] == '\r' && buffer[pos+1] == '\n'))
return;
boolean escaped = false;

View file

@ -79,28 +79,28 @@ public class CodeReaderCache implements ICodeReaderCache {
}
protected IStatus run(IProgressMonitor monitor) {
String key = null;
if (event.getSource() instanceof IWorkspace && event.getDelta() != null) {
IResourceDelta[] projects = event.getDelta().getAffectedChildren();
for(int i=0; i<projects.length; i++) {
if (projects[i].getResource().getType() == IResource.PROJECT) {
IResourceDelta[] files = projects[i].getAffectedChildren();
for(int j=0; j<files.length; j++) {
if (files[j].getResource() instanceof IFile && ((IFile)files[j].getResource()).getLocation() != null) {
key = ((IFile)files[j].getResource()).getLocation().toOSString();
}
}
}
}
removeKeys(event.getDelta().getAffectedChildren());
}
if (key != null && cache1 != null)
cache1.remove(key);
return Status.OK_STATUS;
}
private void removeKeys(IResourceDelta[] deltas) {
for(int j=0; j<deltas.length; j++) {
if (deltas[j].getResource().getType() == IResource.PROJECT || deltas[j].getResource().getType() == IResource.FOLDER) {
removeKeys(deltas[j].getAffectedChildren());
} else if (deltas[j].getResource() instanceof IFile && ((IFile)deltas[j].getResource()).getLocation() != null) {
removeKey(((IFile)deltas[j].getResource()).getLocation().toOSString());
}
}
}
private void removeKey(String key) {
if (key != null && cache1 != null)
cache1.remove(key);
}
}
/**