Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] FIXED 87179, 95573


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

Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada


Index: parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java,v
retrieving revision 1.3
diff -u -r1.3 AST2SelectionParseTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java	17 May 2005 18:40:38 -0000	1.3
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java	17 May 2005 20:25:00 -0000
@@ -1509,4 +1509,21 @@
 		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);
+	}
 }
Index: parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java,v
retrieving revision 1.1
diff -u -r1.1 CodeReaderCacheTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java	22 Mar 2005 17:00:43 -0000	1.1
+++ parser/org/eclipse/cdt/core/parser/tests/ast2/CodeReaderCacheTest.java	17 May 2005 20:25:00 -0000
@@ -132,6 +132,44 @@
 		
 		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() {
Index: parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java,v
retrieving revision 1.37
diff -u -r1.37 BaseScanner.java
--- parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java	16 May 2005 20:16:33 -0000	1.37
+++ parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java	17 May 2005 20:24:43 -0000
@@ -3852,7 +3852,8 @@
         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;
Index: src/org/eclipse/cdt/core/parser/CodeReaderCache.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/parser/CodeReaderCache.java,v
retrieving revision 1.2
diff -u -r1.2 CodeReaderCache.java
--- src/org/eclipse/cdt/core/parser/CodeReaderCache.java	22 Apr 2005 17:49:54 -0000	1.2
+++ src/org/eclipse/cdt/core/parser/CodeReaderCache.java	17 May 2005 20:24:43 -0000
@@ -79,27 +79,27 @@
 			}
 			
 			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);
+            }
 			
 		}
 		

Back to the top