diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java index 063fad473b0..040b0702884 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java @@ -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); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java index c0d32dc1a03..b5762af9a3d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java @@ -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() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index be41c531fb0..e6e1005f2ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -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; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java index 82f90b8e222..8030d75f3b8 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java @@ -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