changes to performance measurement
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalCollector.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalCollector.java
index d0d8242..e3c94da 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalCollector.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalCollector.java
@@ -27,6 +27,7 @@
 import org.eclipse.dltk.core.CompletionProposal;
 import org.eclipse.dltk.core.CompletionRequestor;
 import org.eclipse.dltk.core.DLTKCore;
+import org.eclipse.dltk.core.ICompletionRequestorExtension;
 import org.eclipse.dltk.core.IModelElement;
 import org.eclipse.dltk.core.IScriptProject;
 import org.eclipse.dltk.core.ISourceModule;
@@ -69,7 +70,7 @@
  * 
  */
 public abstract class ScriptCompletionProposalCollector extends
-		CompletionRequestor {
+		CompletionRequestor implements ICompletionRequestorExtension {
 	/** Tells whether this class is in debug mode. */
 	private static final boolean DEBUG = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.dltk.ui/debug/ResultCollector")); //$NON-NLS-1$//$NON-NLS-2$
 
@@ -101,8 +102,6 @@
 	/* performance measurement */
 	private long fStartTime;
 
-	private long fUITime;
-
 	/**
 	 * The UI invocation context or <code>null</code>.
 	 * 
@@ -203,7 +202,6 @@
 	 */
 	@Override
 	public void accept(CompletionProposal proposal) {
-		long start = DEBUG ? System.currentTimeMillis() : 0;
 		try {
 			if (isFiltered(proposal))
 				return;
@@ -219,8 +217,6 @@
 							IStatus.OK,
 							"Exception when processing proposal for: " + String.valueOf(proposal.getCompletion()), e)); //$NON-NLS-1$
 		}
-		if (DEBUG)
-			fUITime += System.currentTimeMillis() - start;
 	}
 
 	protected void doAccept(CompletionProposal proposal) {
@@ -261,42 +257,11 @@
 	 * Subclasses may extend, but must call the super implementation.
 	 */
 	@Override
-	public void beginReporting() {
-		if (DEBUG) {
-			fStartTime = System.currentTimeMillis();
-			fUITime = 0;
-		}
-		fLastProblem = null;
-		fScriptProposals.clear();
-		fKeywords.clear();
-		fSuggestedMethodNames.clear();
-	}
-
-	/**
-	 * {@inheritDoc}
-	 * 
-	 * Subclasses may extend, but must call the super implementation.
-	 */
-	@Override
 	public void completionFailure(IProblem problem) {
 		fLastProblem = problem;
 	}
 
 	/**
-	 * {@inheritDoc}
-	 * 
-	 * Subclasses may extend, but must call the super implementation.
-	 */
-	@Override
-	public void endReporting() {
-		if (DEBUG) {
-			long total = System.currentTimeMillis() - fStartTime;
-			System.err.println("Core Collector (core):\t" + (total - fUITime)); //$NON-NLS-1$
-			System.err.println("Core Collector (ui):\t" + fUITime); //$NON-NLS-1$
-		}
-	}
-
-	/**
 	 * Returns an error message about any error that may have occurred during
 	 * code completion, or the empty string if none.
 	 * <p>
@@ -323,6 +288,7 @@
 	}
 
 	private void processUnprocessedProposals() {
+		final long start = DEBUG ? System.currentTimeMillis() : 0;
 		final CompletionProposal[] copy;
 		synchronized (fUnprocessedCompletionProposals) {
 			final int size = fUnprocessedCompletionProposals.size();
@@ -335,6 +301,10 @@
 		for (CompletionProposal proposal : copy) {
 			processUnprocessedProposal(proposal);
 		}
+		if (DEBUG) {
+			final long UITime = System.currentTimeMillis() - start;
+			System.err.println("Core Collector (ui):\t" + UITime); //$NON-NLS-1$
+		}
 	}
 
 	protected void processUnprocessedProposal(CompletionProposal proposal) {
@@ -512,7 +482,7 @@
 	 * @return the compilation unit that the receiver operates on, or
 	 *         <code>null</code>
 	 */
-	protected final ISourceModule getSourceModule() {
+	public final ISourceModule getSourceModule() {
 		return fSourceModule;
 	}
 
@@ -832,8 +802,10 @@
 				&& fInvocationContext.isContextInformationMode();
 	}
 
-	@Override
-	public void clear() {
+	/*
+	 * Implements {@link ICompletionRequestorExtension#reset}
+	 */
+	public void reset() {
 		synchronized (fUnprocessedCompletionProposals) {
 			fUnprocessedCompletionProposals.clear();
 		}
@@ -868,4 +840,17 @@
 		}
 	}
 
+	void startCompletion() {
+		if (DEBUG) {
+			fStartTime = System.currentTimeMillis();
+		}
+	}
+
+	void endCompletion() {
+		if (DEBUG) {
+			long total = System.currentTimeMillis() - fStartTime;
+			System.err.println("Core Collector (core):\t" + total); //$NON-NLS-1$
+		}
+	}
+
 }
diff --git a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalComputer.java b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalComputer.java
index 7a65215..121d9e7 100644
--- a/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalComputer.java
+++ b/core/plugins/org.eclipse.dltk.ui/src/org/eclipse/dltk/ui/text/completion/ScriptCompletionProposalComputer.java
@@ -208,7 +208,9 @@
 			}
 			int timeout = DLTKUIPlugin.getDefault().getPreferenceStore()
 					.getInt(PreferenceConstants.CODEASSIST_TIMEOUT);
+			collector.startCompletion();
 			sourceModule.codeComplete(offset, collector, timeout);
+			collector.endCompletion();
 		} catch (ModelException e) {
 			handleCodeCompletionException(e, context);
 		}