1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 01:15:29 +02:00

Fix for 179671: [Editor] Avoid duplicate parsing when opening a file

Fixes also bug 185709: [Editor] Empty outline when editor is reused
This commit is contained in:
Anton Leherbauer 2007-05-09 08:31:16 +00:00
parent 0a32923da7
commit a678504f0b
8 changed files with 96 additions and 271 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
@ -51,34 +52,24 @@ public class ReconcileWorkingCopyOperation extends CModelOperation {
CElementDeltaBuilder deltaBuilder = null;
try {
// create the delta builder (this remembers the current content of the cu)
if (!wasConsistent){
if (!wasConsistent || forceProblemDetection || fComputeAST) {
// create the delta builder (this remembers the current content of the tu)
deltaBuilder = new CElementDeltaBuilder(workingCopy);
// update the element infos with the content of the working copy
if (fComputeAST) {
fAST= workingCopy.makeConsistent(fComputeAST, fMonitor);
} else {
workingCopy.makeConsistent(fMonitor);
}
fAST= workingCopy.makeConsistent(fComputeAST, fMonitor);
deltaBuilder.buildDeltas();
// register the deltas
if (deltaBuilder != null){
if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) {
addReconcileDelta(workingCopy, deltaBuilder.delta);
}
if (deltaBuilder.delta != null) {
addReconcileDelta(workingCopy, deltaBuilder.delta);
}
}
if (fMonitor != null) fMonitor.worked(2);
// force problem detection? - if structure was consistent
if (forceProblemDetection && wasConsistent){
if (fMonitor != null && fMonitor.isCanceled()) return;
}
} finally {
if (fMonitor != null) fMonitor.done();
}

View file

@ -490,11 +490,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
}
public void makeConsistent(IProgressMonitor monitor, boolean forced) throws CModelException {
makeConsistent(false, monitor);
makeConsistent(forced, monitor);
}
protected IASTTranslationUnit makeConsistent(boolean computeAST, IProgressMonitor monitor) throws CModelException {
if (isConsistent()) {
if (!computeAST && isConsistent()) {
return null;
}

View file

@ -16,6 +16,7 @@ package org.eclipse.cdt.internal.ui.editor;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchPart;
@ -298,6 +299,9 @@ public final class ASTProvider {
if (cElement == null)
return null;
Assert.isTrue(cElement instanceof ITranslationUnit);
if (waitFlag == WAIT_ACTIVE_ONLY && !isActive((ITranslationUnit)cElement)) {
return null;
}
return fCache.getAST((ITranslationUnit)cElement, index, waitFlag != WAIT_NO, progressMonitor);
}
@ -326,6 +330,9 @@ public final class ASTProvider {
public IStatus runOnAST(ICElement cElement, WAIT_FLAG waitFlag, IProgressMonitor monitor,
ASTCache.ASTRunnable astRunnable) {
Assert.isTrue(cElement instanceof ITranslationUnit);
if (waitFlag == WAIT_ACTIVE_ONLY && !isActive((ITranslationUnit)cElement)) {
return Status.CANCEL_STATUS;
}
return fCache.runOnAST((ITranslationUnit)cElement, waitFlag != WAIT_NO, monitor, astRunnable);
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2002, 2006 QNX Software Systems and others.
* Copyright (c) 2002, 2007 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.editor;
@ -14,6 +15,16 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.progress.PendingUpdateAdapter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ElementChangedEvent;
@ -22,27 +33,13 @@ import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.cdt.internal.core.model.CShiftData;
import org.eclipse.cdt.internal.core.model.SourceManipulation;
import org.eclipse.cdt.internal.ui.BaseCElementContentProvider;
import org.eclipse.cdt.internal.ui.util.StringMatcher;
import org.eclipse.cdt.ui.PreferenceConstants;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.progress.DeferredTreeContentManager;
import org.eclipse.ui.progress.IElementCollector;
import org.eclipse.ui.progress.PendingUpdateAdapter;
import org.eclipse.ui.progress.WorkbenchJob;
/**
* Manages contents of the outliner.
@ -64,19 +61,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider {
/** Filter for files to outline. */
private StringMatcher filter = new StringMatcher("*", true, false); //$NON-NLS-1$
/**
* Remote content manager to retrieve content in the background.
*/
private DeferredTreeContentManager fManager;
/**
* We only want to use the DeferredContentManager, the first time
* because the Outliner is initialize in the UI thread. So to not block
* the UI thread we deferred, after it is not necessary the reconciler is
* running in a separate thread not affecting the UI.
*/
private boolean fUseContentManager = false;
public CContentOutlinerProvider(TreeViewer viewer) {
this(viewer, null);
}
@ -91,68 +75,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider {
super(true, true);
treeViewer = viewer;
setIncludesGrouping(PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.OUTLINE_GROUP_INCLUDES));
fManager = createContentManager(viewer, site);
}
/**
* Subclass of DeferredTreeContentManager used to refresh
* the outline when the "group includes" setting is enabled.
*/
class DeferredTreeCContentManager extends DeferredTreeContentManager {
public DeferredTreeCContentManager(AbstractTreeViewer viewer, IWorkbenchPartSite site) {
super(CContentOutlinerProvider.this, viewer, site);
}
public DeferredTreeCContentManager(AbstractTreeViewer viewer) {
super(CContentOutlinerProvider.this, viewer);
}
protected IElementCollector createElementCollector(final Object parent,
final PendingUpdateAdapter placeholder) {
// Return a special element collector when the parent
// is the translation unit. In that case we need to
// refresh the outline when all the content has become
// available.
if (!(parent instanceof ITranslationUnit)) {
return super.createElementCollector(parent, placeholder);
}
return new IElementCollector() {
public void add(Object element, IProgressMonitor monitor) {
add(new Object[] { element }, monitor);
}
public void add(Object[] elements, IProgressMonitor monitor) {
addChildren(parent, elements, monitor);
}
public void done() {
runClearPlaceholderJob(placeholder);
// runClearPlaceholderJob uses a WorkbenchJob and contentUpdated
// executes via asyncExec(). There can be race conditions if we
// don't wrap contentUpdated in a job.
if (CContentOutlinerProvider.this.fIncludesGrouping) {
WorkbenchJob job = new WorkbenchJob("") { //$NON-NLS-1$
public IStatus runInUIThread(IProgressMonitor monitor) {
contentUpdated();
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
}
};
}
}
protected DeferredTreeContentManager createContentManager(TreeViewer viewer, IWorkbenchPartSite site) {
if (site == null) {
return new DeferredTreeCContentManager(viewer);
}
return new DeferredTreeCContentManager(viewer, site);
}
/**
@ -229,37 +151,30 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider {
PreferenceConstants.getPreferenceStore().removePropertyChangeListener(fPropertyListener);
fPropertyListener = null;
}
if (root != null) {
fManager.cancel(root);
}
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
/*
* @see org.eclipse.cdt.internal.ui.BaseCElementContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
boolean isTU = newInput instanceof ITranslationUnit;
if (isTU && fListener == null) {
fUseContentManager = true;
if (root != null) {
fManager.cancel(root);
}
if (isTU) {
root = (ITranslationUnit) newInput;
fListener = new ElementChangedListener();
CoreModel.getDefault().addElementChangedListener(fListener);
fPropertyListener = new PropertyListener();
PreferenceConstants.getPreferenceStore().addPropertyChangeListener(
fPropertyListener);
} else if (!isTU && fListener != null) {
fUseContentManager = false;
CoreModel.getDefault().removeElementChangedListener(fListener);
fListener = null;
root = null;
if (oldInput != null) {
fManager.cancel(oldInput);
if (fListener == null) {
fListener= new ElementChangedListener();
CoreModel.getDefault().addElementChangedListener(fListener);
fPropertyListener= new PropertyListener();
PreferenceConstants.getPreferenceStore().addPropertyChangeListener(fPropertyListener);
}
} else {
if (fListener != null) {
CoreModel.getDefault().removeElementChangedListener(fListener);
PreferenceConstants.getPreferenceStore().removePropertyChangeListener(fPropertyListener);
fListener= null;
fPropertyListener= null;
}
root= null;
}
}
@ -269,9 +184,11 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider {
public Object[] getChildren(Object element) {
Object[] children = null;
// Use the deferred manager for the first time (when parsing)
if (fUseContentManager && element instanceof ITranslationUnit) {
children = fManager.getChildren(element);
fUseContentManager = false;
if (element instanceof ITranslationUnit) {
ITranslationUnit unit= (ITranslationUnit)element;
if (!unit.isOpen()) {
children= new Object[] { new PendingUpdateAdapter() };
}
}
if (children == null) {
children = super.getChildren(element);
@ -292,9 +209,6 @@ public class CContentOutlinerProvider extends BaseCElementContentProvider {
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object element) {
if (fUseContentManager) {
return fManager.mayHaveChildren(element);
}
return super.hasChildren(element);
}

View file

@ -74,6 +74,7 @@ import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ICharacterPairMatcher;
import org.eclipse.jface.text.source.IOverviewRuler;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.ISourceViewerExtension2;
import org.eclipse.jface.text.source.IVerticalRuler;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
@ -138,7 +139,6 @@ import org.eclipse.cdt.core.IPositionConverter;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
@ -156,8 +156,6 @@ import org.eclipse.cdt.ui.actions.OpenViewActionGroup;
import org.eclipse.cdt.ui.text.ICPartitions;
import org.eclipse.cdt.ui.text.folding.ICFoldingStructureProvider;
import org.eclipse.cdt.internal.corext.util.SimplePositionTracker;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.IContextMenuConstants;
@ -186,9 +184,9 @@ import org.eclipse.cdt.internal.ui.util.CUIHelp;
/**
* C specific text editor.
* C/C++ source editor.
*/
public class CEditor extends TextEditor implements ISelectionChangedListener, IReconcilingParticipant, ICReconcilingListener {
public class CEditor extends TextEditor implements ISelectionChangedListener, ICReconcilingListener {
class AdaptedSourceViewer extends CSourceViewer {
@ -1159,7 +1157,22 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
* @see org.eclipse.ui.texteditor.AbstractTextEditor#doSetInput(org.eclipse.ui.IEditorInput)
*/
protected void doSetInput(IEditorInput input) throws CoreException {
boolean reuse= getEditorInput() != null;
super.doSetInput(input);
if (reuse) {
// in case language changed, need to reconfigure the viewer
ISourceViewer viewer= getSourceViewer();
if (viewer instanceof ISourceViewerExtension2) {
ISourceViewerExtension2 viewerExt2= (ISourceViewerExtension2)viewer;
viewerExt2.unconfigure();
CSourceViewerConfiguration cConfig= (CSourceViewerConfiguration)getSourceViewerConfiguration();
cConfig.resetScanners();
viewer.configure(cConfig);
}
}
setOutlinePageInput(fOutlinePage, input);
if (fProjectionModelUpdater != null) {
@ -1548,7 +1561,7 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
* @param element Element to select.
*/
public void setSelection(ICElement element) {
if (element instanceof ISourceReference) {
if (element instanceof ISourceReference && !(element instanceof ITranslationUnit)) {
ISourceReference reference = (ISourceReference) element;
// set hightlight range
setSelection(reference, true);
@ -2471,51 +2484,6 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IR
}
}
/*
* @see org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant#reconciled()
*/
public void reconciled(boolean somethingHasChanged) {
if (getSourceViewer() == null || getSourceViewer().getTextWidget() == null) {
return;
}
// this method must be called in a background thread
assert getSourceViewer().getTextWidget().getDisplay().getThread() != Thread.currentThread();
if (fReconcilingListeners.size() > 0) {
// create AST and notify ICReconcilingListeners
ICElement cElement= getInputCElement();
if (cElement == null) {
return;
}
aboutToBeReconciled();
// track changes to the document while parsing
IDocument doc= getDocumentProvider().getDocument(getEditorInput());
SimplePositionTracker positionTracker= new SimplePositionTracker();
positionTracker.startTracking(doc);
ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
IIndex index;
try {
index = CCorePlugin.getIndexManager().getIndex(cElement.getCProject());
index.acquireReadLock();
} catch (CoreException e) {
CUIPlugin.getDefault().log(e);
return;
} catch (InterruptedException e) {
return;
}
try {
IASTTranslationUnit ast= astProvider.createAST(cElement, index, null);
reconciled(ast, positionTracker, null);
} finally {
index.releaseReadLock();
positionTracker.stopTracking();
}
}
}
/*
* @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#collectContextMenuPreferencePages()
*/

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation and others.
* Copyright (c) 2004, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.ui.editor;
/**
* Interface of an object participating in reconciling.
* @deprecated in favour of {@link org.eclipse.cdt.internal.ui.text.ICReconcilingListener}
*/
public interface IReconcilingParticipant {

View file

@ -33,8 +33,6 @@ import org.eclipse.cdt.ui.IWorkingCopyManager;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.ui.editor.IReconcilingParticipant;
public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
@ -73,6 +71,7 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS
/*
* @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion, org.eclipse.jface.text.IRegion)
* Called for incremental reconciler only - currently not used (no shift deltas)
*/
public void reconcile(DirtyRegion dirtyRegion, IRegion region) {
// consistent data needs not further checks !
@ -114,13 +113,13 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS
}
private void reconcile(final boolean initialReconcile) {
boolean computeAST= fEditor instanceof ICReconcilingListener;
IASTTranslationUnit ast= null;
IWorkingCopy workingCopy= fManager.getWorkingCopy(fEditor.getEditorInput());
if (workingCopy == null) {
return;
}
try {
final boolean computeAST= initialReconcile || CUIPlugin.getDefault().getASTProvider().isActive(workingCopy);
// reconcile
synchronized (workingCopy) {
ast= workingCopy.reconcile(computeAST, true, fProgressMonitor);
@ -131,18 +130,10 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS
IStatus status= new Status(IStatus.ERROR, CUIPlugin.PLUGIN_ID, IStatus.OK, "Error in CDT UI during reconcile", e); //$NON-NLS-1$
CUIPlugin.getDefault().log(status);
} finally {
if (fEditor instanceof ICReconcilingListener) {
if (computeAST) {
IIndex index= null;
if (ast != null) {
index= ast.getIndex();
if (index != null) {
try {
index.acquireReadLock();
} catch (InterruptedException exc) {
ast= null;
index= null;
}
}
}
try {
((ICReconcilingListener)fEditor).reconciled(ast, null, fProgressMonitor);
@ -152,13 +143,6 @@ public class CReconcilingStrategy implements IReconcilingStrategy, IReconcilingS
}
}
}
if (fProgressMonitor != null && fProgressMonitor.isCanceled()) {
return;
}
if (ast == null && fEditor instanceof IReconcilingParticipant && workingCopy.exists()) {
IReconcilingParticipant p= (IReconcilingParticipant) fEditor;
p.reconciled(true);
}
}
}

View file

@ -58,9 +58,7 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
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.IElementChangedListener;
import org.eclipse.cdt.core.model.IMember;
import org.eclipse.cdt.core.model.IParent;
@ -104,13 +102,16 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
* @see org.eclipse.cdt.internal.ui.text.ICReconcilingListener#reconciled(org.eclipse.cdt.core.dom.ast.IASTTranslationUnit, org.eclipse.cdt.core.IPositionConverter, org.eclipse.core.runtime.IProgressMonitor)
*/
public void reconciled(IASTTranslationUnit ast, IPositionConverter positionTracker, IProgressMonitor progressMonitor) {
if (fInput == null || ast == null || fReconciling) {
if (fInput == null || fReconciling) {
return;
}
if (fPreprocessorBranchFoldingEnabled && ast == null) {
return;
}
fReconciling= true;
try {
FoldingStructureComputationContext ctx= createContext(fInitialASTReconcile);
fInitialASTReconcile= false;
FoldingStructureComputationContext ctx= createContext(fInitialReconcilePending);
fInitialReconcilePending= false;
if (fPreprocessorBranchFoldingEnabled) {
ctx.fAST= ast;
ctx.fASTPositionConverter= positionTracker;
@ -350,44 +351,6 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
}
private class ElementChangedListener implements IElementChangedListener {
/*
* @see org.eclipse.cdt.core.IElementChangedListener#elementChanged(org.eclipse.cdt.core.ElementChangedEvent)
*/
public void elementChanged(ElementChangedEvent e) {
ICElementDelta delta= findElement(fInput, e.getDelta());
if (delta != null)
update(createContext(false));
}
private ICElementDelta findElement(ICElement target, ICElementDelta delta) {
if (delta == null || target == null)
return null;
ICElement element= delta.getElement();
if (element.getElementType() > ICElement.C_UNIT)
return null;
if (target.equals(element))
return delta;
ICElementDelta[] children= delta.getAffectedChildren();
if (children == null || children.length == 0)
return null;
for (int i= 0; i < children.length; i++) {
ICElementDelta d= findElement(target, children[i]);
if (d != null)
return d;
}
return null;
}
}
/**
* Projection position that will return two foldable regions: one folding away
* the region from after the '/*' to the beginning of the content, the other
@ -705,7 +668,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
private boolean fCommentFoldingEnabled= true;
private ICReconcilingListener fReconilingListener;
boolean fInitialASTReconcile= true;
boolean fInitialReconcilePending= true;
/**
@ -781,15 +744,10 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
handleProjectionDisabled();
if (fEditor instanceof CEditor) {
fInitialASTReconcile= true;
fInitialReconcilePending= true;
initialize();
if (fPreprocessorBranchFoldingEnabled || fCommentFoldingEnabled) {
fReconilingListener= new PreprocessorBranchesReconciler();
((CEditor)fEditor).addReconcileListener(fReconilingListener);
} else {
fElementListener= new ElementChangedListener();
CoreModel.getDefault().addElementChangedListener(fElementListener);
}
fReconilingListener= new PreprocessorBranchesReconciler();
((CEditor)fEditor).addReconcileListener(fReconilingListener);
}
}
@ -1087,11 +1045,6 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
// ignore
}
}
IParent parent= (IParent) fInput;
try {
computeFoldingStructure(parent.getChildren(), ctx);
} catch (CModelException x) {
}
if (fPreprocessorBranchFoldingEnabled) {
IASTTranslationUnit ast= ctx.getAST();
if (ast == null) {
@ -1101,19 +1054,26 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
if (ast != null) {
ctx.fAST= ast;
ctx.fASTPositionConverter= null;
fInitialASTReconcile= false;
fInitialReconcilePending= false;
computeFoldingStructure(ast, ctx);
}
return Status.OK_STATUS;
}
});
if (!status.isOK()) {
if (status.matches(IStatus.ERROR)) {
CUIPlugin.getDefault().log(status);
}
} else {
computeFoldingStructure(ast, ctx);
}
}
if (!fInitialReconcilePending) {
IParent parent= (IParent) fInput;
try {
computeFoldingStructure(parent.getChildren(), ctx);
} catch (CModelException x) {
}
}
}
/**