[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Element Delta Builder Patch with JUnit Test
|
This patch adds the functionality of the "CElementDeltaBuilder" class for figuring out the
added/deleted C Model elements with each "elementChanged"
event.
It also includes a JUnit test.
Regards,
Hoda
|
Index: model/org/eclipse/cdt/internal/core/model/CElement.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java,v
retrieving revision 1.4
diff -u -r1.4 CElement.java
--- model/org/eclipse/cdt/internal/core/model/CElement.java 19 Mar 2003 20:19:36 -0000 1.4
+++ model/org/eclipse/cdt/internal/core/model/CElement.java 20 Mar 2003 15:46:50 -0000
@@ -394,4 +394,12 @@
return Util.combineHashCodes(fName.hashCode(), fParent.hashCode());
}
+ /*
+ * Test to see if two objects are identical
+ * Subclasses should override accordingly
+ */
+ public boolean isIdentical( CElement otherElement){
+ return this.equals(otherElement);
+ }
+
}
Index: model/org/eclipse/cdt/internal/core/model/CElementDeltaBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElementDeltaBuilder.java,v
retrieving revision 1.1
diff -u -r1.1 CElementDeltaBuilder.java
--- model/org/eclipse/cdt/internal/core/model/CElementDeltaBuilder.java 19 Mar 2003 20:19:36 -0000 1.1
+++ model/org/eclipse/cdt/internal/core/model/CElementDeltaBuilder.java 20 Mar 2003 15:46:50 -0000
@@ -23,15 +23,392 @@
*
* This class is similar to the JDT CElementDeltaBuilder class.
*/
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICElementDelta;
+import org.eclipse.cdt.core.model.IParent;
+
+/**
+ * A C element delta biulder creates a C element delta on a C element between
+ * the version of the C element at the time the comparator was created and the
+ * current version of the C element.
+ *
+ * It performs this operation by locally caching the contents of
+ * the C element when it is created. When the method buildDeltas() is called, it
+ * creates a delta over the cached contents and the new contents.
+ *
+ * This class is similar to the JDT CElementDeltaBuilder class.
+ */
public class CElementDeltaBuilder {
+ /**
+ * The c element handle
+ */
+ ICElement cElement;
+
+ /**
+ * The maximum depth in the C element children we should look into
+ */
+ int maxDepth = Integer.MAX_VALUE;
+
+ /**
+ * The old handle to info relationships
+ */
+ Map infos;
+
+ /**
+ * The old position info
+ */
+ Map oldPositions;
+
+ /**
+ * The new position info
+ */
+ Map newPositions;
+
+ /**
+ * Change delta
+ */
CElementDelta delta;
+
+ /**
+ * List of added elements
+ */
+ ArrayList added;
+
+ /**
+ * List of removed elements
+ */
+ ArrayList removed;
- public CElementDeltaBuilder(ICElement cElement) {
+ /**
+ * Doubly linked list item
+ */
+ class ListItem {
+ public ICElement previous;
+ public ICElement next;
+ public ListItem(ICElement previous, ICElement next) {
+ this.previous = previous;
+ this.next = next;
+ }
}
+/**
+ * Creates a C element comparator on a C element
+ * looking as deep as necessary.
+ */
+public CElementDeltaBuilder(ICElement CElement) {
+ this.cElement = CElement;
+ this.initialize();
+ this.recordElementInfo(CElement,0);
+}
+/**
+ * Creates a C element comparator on a C element
+ * looking only 'maxDepth' levels deep.
+ */
+public CElementDeltaBuilder(ICElement cElement, int maxDepth) {
+ this.cElement = cElement;
+ this.maxDepth = maxDepth;
+ this.initialize();
+ this.recordElementInfo(cElement,0);
+}
+/**
+ * Repairs the positioning information
+ * after an element has been added
+ */
+private void added(ICElement element) {
+ this.added.add(element);
+ ListItem current = this.getNewPosition(element);
+ ListItem previous = null, next = null;
+ if (current.previous != null)
+ previous = this.getNewPosition(current.previous);
+ if (current.next != null)
+ next = this.getNewPosition(current.next);
+ if (previous != null)
+ previous.next = current.next;
+ if (next != null)
+ next.previous = current.previous;
+}
+/**
+ * Builds the C element deltas between the old content of the translation unit
+ * and its new content.
+ */
+public void buildDeltas() {
+ this.recordNewPositions(this.cElement, 0);
+ this.findAdditions(this.cElement, 0);
+ this.findDeletions();
+ this.findChangesInPositioning(this.cElement, 0);
+ this.trimDelta(this.delta);
+}
+/**
+ * Finds elements which have been added or changed.
+ */
+private void findAdditions(ICElement newElement, int depth) {
+ CElementInfo oldInfo = this.getElementInfo(newElement);
+ if (oldInfo == null && depth < this.maxDepth) {
+ this.delta.added(newElement);
+ added(newElement);
+ } else {
+ this.removeElementInfo(newElement);
+ }
+
+ if (depth >= this.maxDepth) {
+ // mark element as changed
+ this.delta.changed(newElement, ICElementDelta.F_CONTENT);
+ return;
+ }
+
+ CElementInfo newInfo = null;
+ newInfo = ((CElement)newElement).getElementInfo();
+
+ this.findContentChange(oldInfo, newInfo, newElement);
+
+ if (oldInfo != null && newElement instanceof IParent) {
+
+ ICElement[] children = newInfo.getChildren();
+ if (children != null) {
+ int length = children.length;
+ for(int i = 0; i < length; i++) {
+ this.findAdditions(children[i], depth + 1);
+ }
+ }
+ }
+}
+/**
+ * Looks for changed positioning of elements.
+ */
+private void findChangesInPositioning(ICElement element, int depth) {
+ if (depth >= this.maxDepth || this.added.contains(element) || this.removed.contains(element))
+ return;
+
+ if (!isPositionedCorrectly(element)) {
+ this.delta.removed(element);
+ this.delta.added(element);
+ }
+
+ if (element instanceof IParent) {
+ CElementInfo info = null;
+ info = ((CElement)element).getElementInfo();
- public void buildDeltas() {
+ ICElement[] children = info.getChildren();
+ if (children != null) {
+ int length = children.length;
+ for(int i = 0; i < length; i++) {
+ this.findChangesInPositioning(children[i], depth + 1);
+ }
+ }
}
+}
+/**
+ * The elements are equivalent, but might have content changes.
+ */
+private void findContentChange(CElementInfo oldInfo, CElementInfo newInfo, ICElement newElement) {
+ if (oldInfo instanceof SourceManipulationInfo && newInfo instanceof SourceManipulationInfo) {
+ SourceManipulationInfo oldSourceInfo = (SourceManipulationInfo) oldInfo;
+ SourceManipulationInfo newSourceInfo = (SourceManipulationInfo) newInfo;
+
+ if ((oldSourceInfo).getModifiers() != (newSourceInfo).getModifiers()) {
+ this.delta.changed(newElement, ICElementDelta.F_MODIFIERS);
+ }
+
+ // The element info should be able to tell if the contents are the same.
+ if(!oldSourceInfo.hasSameContentsAs(newSourceInfo)){
+ this.delta.changed(newElement, ICElementDelta.F_CONTENT);
+ }
+ }
+}
+/**
+ * Adds removed deltas for any handles left in the table
+ */
+private void findDeletions() {
+ Iterator iter = this.infos.keySet().iterator();
+ while(iter.hasNext()) {
+ ICElement element = (ICElement)iter.next();
+ this.delta.removed(element);
+ this.removed(element);
+ }
+}
+private CElementInfo getElementInfo(ICElement element) {
+ return (CElementInfo)this.infos.get(element);
+}
+private ListItem getNewPosition(ICElement element) {
+ return (ListItem)this.newPositions.get(element);
+}
+private ListItem getOldPosition(ICElement element) {
+ return (ListItem)this.oldPositions.get(element);
+}
+private void initialize() {
+ this.infos = new HashMap(20);
+ this.oldPositions = new HashMap(20);
+ this.newPositions = new HashMap(20);
+ this.putOldPosition(this.cElement, new ListItem(null, null));
+ this.putNewPosition(this.cElement, new ListItem(null, null));
+ this.delta = new CElementDelta(cElement);
+
+ // if building a delta on a translation unit or below,
+ // it's a fine grained delta
+ if (cElement.getElementType() >= ICElement.C_FILE) {
+ this.delta.fineGrained();
+ }
+
+ this.added = new ArrayList(5);
+ this.removed = new ArrayList(5);
+}
+/**
+ * Inserts position information for the elements into the new or old positions table
+ */
+private void insertPositions(ICElement[] elements, boolean isNew) {
+ int length = elements.length;
+ ICElement previous = null, current = null, next = (length > 0) ? elements[0] : null;
+ for(int i = 0; i < length; i++) {
+ previous = current;
+ current = next;
+ next = (i + 1 < length) ? elements[i + 1] : null;
+ if (isNew) {
+ this.putNewPosition(current, new ListItem(previous, next));
+ } else {
+ this.putOldPosition(current, new ListItem(previous, next));
+ }
+ }
+}
+/**
+ * Returns true if the given elements represent the an equivalent declaration.
+ *
+ * <p>NOTE: Since this comparison can be done with handle info only,
+ * none of the internal calls need to use the locally cached contents
+ * of the old translation unit.
+ */
+private boolean isIdentical(CElement e1, CElement e2) {
+ if (e1 == null ^ e2 == null)
+ return false;
+
+ if (e1 == null)
+ return true;
+
+ return e1.isIdentical(e2);
+}
+/**
+ * Answers true if the elements position has not changed.
+ * Takes into account additions so that elements following
+ * new elements will not appear out of place.
+ */
+private boolean isPositionedCorrectly(ICElement element) {
+ ListItem oldListItem = this.getOldPosition(element);
+ if (oldListItem == null)
+ return false;
+ ICElement oldPrevious = oldListItem.previous;
+ ListItem newListItem = this.getNewPosition(element);
+ if (newListItem == null)
+ return false;
+ ICElement newPrevious = newListItem.previous;
+ if (oldPrevious == newPrevious)
+ return true;
+ ICElement lastNewPrevious = null;
+ while(lastNewPrevious != newPrevious) {
+ if (isIdentical((CElement)oldPrevious, (CElement)newPrevious))
+ return true;
+ lastNewPrevious = newPrevious;
+ // if newPrevious is null at this time we should exit the loop.
+ if (newPrevious == null) break;
+ newPrevious = (this.getNewPosition(newPrevious)).previous;
+ }
+ return false;
+}
+private void putElementInfo(ICElement element, CElementInfo info) {
+ this.infos.put(element, info);
+}
+private void putNewPosition(ICElement element, ListItem position) {
+ this.newPositions.put(element, position);
+}
+private void putOldPosition(ICElement element, ListItem position) {
+ this.oldPositions.put(element, position);
+}
+/**
+ * Records this elements info, and attempts
+ * to record the info for the children.
+ */
+private void recordElementInfo(ICElement element, int depth) {
+ if (depth >= this.maxDepth) {
+ return;
+ }
+ CElementInfo info = (CElementInfo)CModelManager.getDefault().getInfo(element);
+ if (info == null) // no longer in the C model.
+ return;
+ this.putElementInfo(element, info);
+
+ if (element instanceof IParent) {
+ ICElement[] children = info.getChildren();
+ if (children != null) {
+ insertPositions(children, false);
+ for(int i = 0, length = children.length; i < length; i++)
+ recordElementInfo(children[i], depth + 1);
+ }
+ }
+}
+/**
+ * Fills the newPositions hashtable with the new position information
+ */
+private void recordNewPositions(ICElement newElement, int depth) {
+ if (depth < this.maxDepth && newElement instanceof IParent) {
+ CElementInfo info = null;
+ info = ((CElement)newElement).getElementInfo();
+
+ ICElement[] children = info.getChildren();
+ if (children != null) {
+ insertPositions(children, true);
+ for(int i = 0, length = children.length; i < length; i++) {
+ recordNewPositions(children[i], depth + 1);
+ }
+ }
+ }
+}
+/**
+ * Repairs the positioning information
+ * after an element has been removed
+ */
+private void removed(ICElement element) {
+ this.removed.add(element);
+ ListItem current = this.getOldPosition(element);
+ ListItem previous = null, next = null;
+ if (current.previous != null)
+ previous = this.getOldPosition(current.previous);
+ if (current.next != null)
+ next = this.getOldPosition(current.next);
+ if (previous != null)
+ previous.next = current.next;
+ if (next != null)
+ next.previous = current.previous;
+
+}
+private void removeElementInfo(ICElement element) {
+ this.infos.remove(element);
+}
+public String toString() {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Built delta:\n"); //$NON-NLS-1$
+ buffer.append(this.delta.toString());
+ return buffer.toString();
+}
+/**
+ * Trims deletion deltas to only report the highest level of deletion
+ */
+private void trimDelta(CElementDelta delta) {
+ if (delta.getKind() == ICElementDelta.REMOVED) {
+ ICElementDelta[] children = delta.getAffectedChildren();
+ for(int i = 0, length = children.length; i < length; i++) {
+ delta.removeAffectedChild((CElementDelta)children[i]);
+ }
+ } else {
+ ICElementDelta[] children = delta.getAffectedChildren();
+ for(int i = 0, length = children.length; i < length; i++) {
+ trimDelta((CElementDelta)children[i]);
+ }
+ }
+}
+
}
Index: model/org/eclipse/cdt/internal/core/model/SourceManipulationInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceManipulationInfo.java,v
retrieving revision 1.1
diff -u -r1.1 SourceManipulationInfo.java
--- model/org/eclipse/cdt/internal/core/model/SourceManipulationInfo.java 26 Jun 2002 20:37:14 -0000 1.1
+++ model/org/eclipse/cdt/internal/core/model/SourceManipulationInfo.java 20 Mar 2003 15:46:51 -0000
@@ -22,9 +22,12 @@
/* package */
class SourceManipulationInfo extends CElementInfo {
+ int modifiers;
+
protected SourceManipulationInfo(CElement element) {
super(element);
setIsStructureKnown(true);
+ modifiers = 0;
}
protected ISourceRange getSourceRange() {
@@ -128,4 +131,20 @@
String[] renamings= new String[] {name};
getElement().getCRoot().rename(elements, dests, renamings, force, monitor);
}
+
+ /**
+ * return the element modifiers
+ * @return int
+ */
+ public int getModifiers(){
+ return modifiers;
+ }
+
+ /**
+ * subclasses should override
+ */
+ public boolean hasSameContentsAs( SourceManipulationInfo otherInfo){
+ return true;
+ }
+
}
Index: model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
===================================================================
RCS file: model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
diff -N model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java 20 Mar 2003 15:46:07 -0000
@@ -0,0 +1,245 @@
+package org.eclipse.cdt.core.model.tests;
+
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * Rational Software - Initial API and implementation
+***********************************************************************/
+
+import java.io.FileInputStream;
+import java.util.Iterator;
+import java.util.Vector;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.ElementChangedEvent;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICElementDelta;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IElementChangedListener;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.internal.core.model.CModelManager;
+import org.eclipse.cdt.internal.core.model.IBuffer;
+import org.eclipse.cdt.internal.core.model.IWorkingCopy;
+import org.eclipse.cdt.internal.core.model.TranslationUnit;
+import org.eclipse.cdt.testplugin.CProjectHelper;
+import org.eclipse.cdt.testplugin.TestPluginLauncher;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * Class for testing the C Element Delta Builder.
+ */
+public class ElementDeltaTests extends TestCase implements IElementChangedListener {
+ private ICProject fCProject;
+ private IFile headerFile;
+ private NullProgressMonitor monitor;
+ private Vector addedElements;
+ private Vector removedElements;
+ private Vector changedElements;
+
+ public static void main(String[] args) {
+ TestPluginLauncher.run(TestPluginLauncher.getLocationFromProperties(), WorkingCopyTests.class, args);
+ }
+
+ public static Test suite() {
+ TestSuite suite= new TestSuite();
+ suite.addTest(new ElementDeltaTests("testElementDeltas"));
+ return suite;
+ }
+
+ public ElementDeltaTests(String name) {
+ super(name);
+ }
+
+ protected void setUp() throws Exception {
+ monitor = new NullProgressMonitor();
+ String pluginRoot=org.eclipse.core.runtime.Platform.getPlugin("org.eclipse.cdt.ui.tests").find(new Path("/")).getFile();
+
+ fCProject= CProjectHelper.createCProject("TestProject1", "bin");
+ //Path filePath = new Path(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()+ fCProject.getPath().toString()+ "/WorkingCopyTest.h");
+ headerFile = fCProject.getProject().getFile("WorkingCopyTest.h");
+ if (!headerFile.exists()) {
+ try{
+ FileInputStream fileIn = new FileInputStream(pluginRoot+ "model/org/eclipse/cdt/core/model/tests/resources/cfiles/WorkingCopyTestStart.h");
+ headerFile.create(fileIn,false, monitor);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // register with the model manager to listen to delta changes
+ CModelManager.getDefault().addElementChangedListener(this);
+ addedElements = new Vector(10);
+ removedElements = new Vector(10);
+ changedElements = new Vector(100);
+ CCorePlugin.getDefault().setUseNewParser(true);
+ }
+
+ protected void tearDown() throws Exception {
+ CProjectHelper.delete(fCProject);
+ }
+
+
+ public void testElementDeltas() throws Exception {
+ ITranslationUnit tu = new TranslationUnit(fCProject, headerFile);
+ assertNotNull (tu);
+ IWorkingCopy wc = tu.getWorkingCopy();
+ assertNotNull (wc);
+ assertNotNull (wc.getBuffer());
+ assertTrue (wc.exists());
+
+ // add the class Hello
+ IBuffer wcBuf = wc.getBuffer();
+ wcBuf.setContents ("\n class Hello{ \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertAddedElement(ICElement.C_CLASS, "Hello");
+
+ // add the field x
+ wcBuf.setContents ("\n class Hello{\n int x; \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertAddedElement(ICElement.C_FIELD, "x");
+
+ // add the method setValue
+ wcBuf.setContents ("\n class Hello{\n int x; \n void setValue(int val); \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertAddedElement(ICElement.C_METHOD, "setValue");
+
+ // rename x to y
+ // this is not a change, this is add and remove
+ wcBuf.setContents ("\n class Hello{\n int y; \n void setValue(int val); \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertAddedElement(ICElement.C_FIELD, "y");
+ assertRemovedElement(ICElement.C_FIELD, "x");
+
+ // remove the method
+ wcBuf.setContents ("\n class Hello{\n String y; \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertRemovedElement(ICElement.C_METHOD, "setValue");
+
+ // remove the field
+ wcBuf.setContents ("\n class Hello{ \n};");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertRemovedElement(ICElement.C_FIELD, "y");
+
+ // remove the class
+ wcBuf.setContents ("");
+ wc.reconcile();
+ wc.commit(true, monitor);
+ assertRemovedElement(ICElement.C_CLASS, "Hello");
+
+ wc.destroy();
+ assertFalse(wc.exists());
+ }
+
+ public void assertAddedElement(int elementType, String elementName){
+ System.out.println("Printing Added List: ");
+ if(!isElementInList(elementType, elementName, addedElements))
+ fail("Element NOT found in Added list");
+ }
+ public void assertRemovedElement(int elementType, String elementName){
+ System.out.println("Printing Removed List: ");
+ if(!isElementInList(elementType, elementName, removedElements))
+ fail("Element NOT found in Removed list");
+ }
+ public void assertChangedElement(int elementType, String elementName){
+ System.out.println("Printing Changed List: ");
+ if(!isElementInList(elementType, elementName, changedElements))
+ fail("Element NOT found in Changed list");
+ }
+ public boolean isElementInList(int elementType, String elementName, Vector elementList) {
+ boolean found = false;
+ Iterator i = elementList.iterator();
+ while( i.hasNext()){
+ ICElement element = (ICElement)i.next();
+
+ System.out.print("ElementName " + element.getElementName());
+ System.out.println(" ElementType " + element.getElementType());
+
+ if ((element.getElementName().equals(elementName)) &&
+ (element.getElementType() == elementType)){
+ // return true;
+ // just to print the whole list
+ found = true;
+ }
+ }
+ //return false;
+ return found;
+ }
+
+ public void elementChanged(ElementChangedEvent event){
+ try {
+ addedElements.clear();
+ removedElements.clear();
+ changedElements.clear();
+
+ processDelta(event.getDelta());
+ } catch(CModelException e) {
+ }
+ }
+
+ protected void processDelta(ICElementDelta delta) throws CModelException {
+ // check the delta elements
+ int kind= delta.getKind();
+ int flags= delta.getFlags();
+ ICElement element= delta.getElement();
+
+ System.out.print("Processing " + element);
+ // handle open and closing of a solution or project
+ if ((flags & ICElementDelta.F_CLOSED) != 0) {
+ System.out.println(" Element Closed");
+ }
+ if ((flags & ICElementDelta.F_OPENED) != 0) {
+ System.out.println(" Element Opened");
+ }
+
+ if (kind == ICElementDelta.REMOVED) {
+ System.out.println(" Element Removed");
+ removedElements.add(element);
+ }
+
+ if (kind == ICElementDelta.ADDED) {
+ System.out.println(" Element Added");
+ addedElements.add(element);
+ }
+
+ if (kind == ICElementDelta.CHANGED) {
+ System.out.println(" Element Changed");
+ changedElements.add(element);
+
+ if (flags == ICElementDelta.F_MODIFIERS) {
+ System.out.println(" Modifiers changed");
+ }
+ if (flags == ICElementDelta.F_CONTENT) {
+ System.out.println(" Contents changed");
+ }
+ if (flags == ICElementDelta.F_CHILDREN) {
+ System.out.println(" Children changed");
+ }
+ }
+
+ ICElementDelta[] affectedChildren= delta.getAffectedChildren();
+ for (int i= 0; i < affectedChildren.length; i++) {
+ processDelta(affectedChildren[i]);
+ }
+ }
+
+}
Index: model/org/eclipse/cdt/core/model/tests/resources/cfiles/WorkingCopyTestStart.h
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/WorkingCopyTestStart.h,v
retrieving revision 1.1
diff -u -r1.1 WorkingCopyTestStart.h
--- model/org/eclipse/cdt/core/model/tests/resources/cfiles/WorkingCopyTestStart.h 19 Mar 2003 20:37:10 -0000 1.1
+++ model/org/eclipse/cdt/core/model/tests/resources/cfiles/WorkingCopyTestStart.h 20 Mar 2003 15:46:08 -0000
@@ -1 +1 @@
-#include <stdio.h
+#include <stdio.h>