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());
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,6 +132,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() {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -79,27 +79,27 @@ 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue