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:
parent
ef268895cc
commit
fbee283243
4 changed files with 73 additions and 17 deletions
|
@ -1509,4 +1509,21 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest {
|
||||||
assertNotNull(name.resolveBinding());
|
assertNotNull(name.resolveBinding());
|
||||||
assertTrue(name.resolveBinding() instanceof IVariable);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,6 +133,44 @@ public class CodeReaderCacheTest extends CDOMBaseTest {
|
||||||
job.cancel();
|
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
|
// THIS MUST BE RUN LAST IN THIS TEST
|
||||||
public void testClearCache() {
|
public void testClearCache() {
|
||||||
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();
|
ICodeReaderCache cache = CDOM.getInstance().getCodeReaderFactory(CDOM.PARSE_SAVED_RESOURCES).getCodeReaderCache();
|
||||||
|
|
|
@ -3852,7 +3852,8 @@ abstract class BaseScanner implements IScanner {
|
||||||
int limit = bufferLimit[bufferStackPos];
|
int limit = bufferLimit[bufferStackPos];
|
||||||
int pos = ++bufferPos[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;
|
return;
|
||||||
|
|
||||||
boolean escaped = false;
|
boolean escaped = false;
|
||||||
|
|
|
@ -79,28 +79,28 @@ public class CodeReaderCache implements ICodeReaderCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
String key = null;
|
|
||||||
|
|
||||||
if (event.getSource() instanceof IWorkspace && event.getDelta() != null) {
|
if (event.getSource() instanceof IWorkspace && event.getDelta() != null) {
|
||||||
IResourceDelta[] projects = event.getDelta().getAffectedChildren();
|
removeKeys(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();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key != null && cache1 != null)
|
|
||||||
cache1.remove(key);
|
|
||||||
|
|
||||||
return Status.OK_STATUS;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue