mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
2004-05-21 Alain Magloire
Remove TranslationUnitProblemFinder, we can not use the same approach as the JDT i.e. to reparse. Parsing is way to costly for C/C++ because of the Preprocessor, instead we set the problem requestor in the translationUnit.
This commit is contained in:
parent
4ee5d85a60
commit
ecdcf0a446
6 changed files with 65 additions and 125 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2004-05-21 Alain Magloire
|
||||||
|
Remove TranslationUnitProblemFinder, we can not use the same
|
||||||
|
approach as the JDT i.e. to reparse. Parsing is way to costly
|
||||||
|
for C/C++ because of the Preprocessor, instead we set the problem
|
||||||
|
requestor in the translationUnit.
|
||||||
|
|
||||||
2004-05-20 Bogdan Gheorghe
|
2004-05-20 Bogdan Gheorghe
|
||||||
Modified updateCurrentDeltaAndIndex inDeltaProcessor.java to return whether
|
Modified updateCurrentDeltaAndIndex inDeltaProcessor.java to return whether
|
||||||
we need to traverse a delta's children.
|
we need to traverse a delta's children.
|
||||||
|
|
|
@ -21,9 +21,10 @@ import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.CoreModel;
|
import org.eclipse.cdt.core.model.CoreModel;
|
||||||
import org.eclipse.cdt.core.model.ICElement;
|
import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.IParent;
|
import org.eclipse.cdt.core.model.IParent;
|
||||||
|
import org.eclipse.cdt.core.model.IProblemRequestor;
|
||||||
import org.eclipse.cdt.core.model.ITemplate;
|
import org.eclipse.cdt.core.model.ITemplate;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.parser.IParser;
|
import org.eclipse.cdt.core.parser.IParser;
|
||||||
|
import org.eclipse.cdt.core.parser.IProblem;
|
||||||
import org.eclipse.cdt.core.parser.IQuickParseCallback;
|
import org.eclipse.cdt.core.parser.IQuickParseCallback;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||||
|
@ -60,6 +61,8 @@ import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifierOwner;
|
||||||
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
|
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
|
||||||
import org.eclipse.cdt.core.parser.ast.IASTVariable;
|
import org.eclipse.cdt.core.parser.ast.IASTVariable;
|
||||||
import org.eclipse.cdt.internal.core.parser.ParserException;
|
import org.eclipse.cdt.internal.core.parser.ParserException;
|
||||||
|
import org.eclipse.cdt.internal.core.parser.QuickParseCallback;
|
||||||
|
import org.eclipse.cdt.internal.core.parser.StructuralParseCallback;
|
||||||
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
|
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
|
||||||
|
@ -78,7 +81,7 @@ public class CModelBuilder {
|
||||||
this.newElements = new HashMap();
|
this.newElements = new HashMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
private IASTCompilationUnit parse( ITranslationUnit translationUnit, boolean quickParseMode, boolean throwExceptionOnError ) throws ParserException
|
private IASTCompilationUnit parse(boolean quickParseMode, boolean throwExceptionOnError) throws ParserException
|
||||||
{
|
{
|
||||||
IProject currentProject = null;
|
IProject currentProject = null;
|
||||||
boolean hasCppNature = true;
|
boolean hasCppNature = true;
|
||||||
|
@ -99,12 +102,36 @@ public class CModelBuilder {
|
||||||
} catch (CModelException e) {
|
} catch (CModelException e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final IProblemRequestor problemRequestor = translationUnit.getProblemRequestor();
|
||||||
// use quick or structural parse mode
|
// use quick or structural parse mode
|
||||||
ParserMode mode = quickParseMode ? ParserMode.QUICK_PARSE : ParserMode.STRUCTURAL_PARSE;
|
ParserMode mode = quickParseMode ? ParserMode.QUICK_PARSE : ParserMode.STRUCTURAL_PARSE;
|
||||||
if(quickParseMode)
|
if (problemRequestor == null) {
|
||||||
quickParseCallback = ParserFactory.createQuickParseCallback();
|
quickParseCallback = (quickParseMode) ? ParserFactory.createQuickParseCallback() :
|
||||||
else
|
ParserFactory.createStructuralParseCallback();
|
||||||
quickParseCallback = ParserFactory.createStructuralParseCallback();
|
} else {
|
||||||
|
if (quickParseMode) {
|
||||||
|
quickParseCallback = new QuickParseCallback() {
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.internal.core.parser.QuickParseCallback#acceptProblem(org.eclipse.cdt.core.parser.IProblem)
|
||||||
|
*/
|
||||||
|
public boolean acceptProblem(IProblem problem) {
|
||||||
|
problemRequestor.acceptProblem(problem);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
quickParseCallback = new StructuralParseCallback() {
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see org.eclipse.cdt.internal.core.parser.QuickParseCallback#acceptProblem(org.eclipse.cdt.core.parser.IProblem)
|
||||||
|
*/
|
||||||
|
public boolean acceptProblem(IProblem problem) {
|
||||||
|
problemRequestor.acceptProblem(problem);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// pick the language
|
// pick the language
|
||||||
ParserLanguage language = hasCppNature ? ParserLanguage.CPP : ParserLanguage.C;
|
ParserLanguage language = hasCppNature ? ParserLanguage.CPP : ParserLanguage.C;
|
||||||
|
@ -144,7 +171,13 @@ public class CModelBuilder {
|
||||||
throw new ParserException( CCorePlugin.getResourceString("CModelBuilder.Parser_Construction_Failure")); //$NON-NLS-1$
|
throw new ParserException( CCorePlugin.getResourceString("CModelBuilder.Parser_Construction_Failure")); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
// call parse
|
// call parse
|
||||||
|
if (problemRequestor != null) {
|
||||||
|
problemRequestor.beginReporting();
|
||||||
|
}
|
||||||
hasNoErrors = parser.parse();
|
hasNoErrors = parser.parse();
|
||||||
|
if (problemRequestor != null) {
|
||||||
|
problemRequestor.endReporting();
|
||||||
|
}
|
||||||
if( (!hasNoErrors) && throwExceptionOnError )
|
if( (!hasNoErrors) && throwExceptionOnError )
|
||||||
throw new ParserException(CCorePlugin.getResourceString("CModelBuilder.Parse_Failure")); //$NON-NLS-1$
|
throw new ParserException(CCorePlugin.getResourceString("CModelBuilder.Parse_Failure")); //$NON-NLS-1$
|
||||||
return quickParseCallback.getCompilationUnit();
|
return quickParseCallback.getCompilationUnit();
|
||||||
|
@ -155,7 +188,7 @@ public class CModelBuilder {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
compilationUnit = parse( translationUnit, quickParseMode, true);
|
compilationUnit = parse(quickParseMode, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
catch( ParserException e )
|
catch( ParserException e )
|
||||||
|
|
|
@ -14,7 +14,6 @@ import org.eclipse.cdt.core.model.ICElement;
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
import org.eclipse.cdt.core.model.CModelException;
|
||||||
import org.eclipse.cdt.core.model.ICModelStatus;
|
import org.eclipse.cdt.core.model.ICModelStatus;
|
||||||
import org.eclipse.cdt.core.model.ICModelStatusConstants;
|
import org.eclipse.cdt.core.model.ICModelStatusConstants;
|
||||||
import org.eclipse.cdt.core.model.IProblemRequestor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reconcile a working copy and signal the changes through a delta.
|
* Reconcile a working copy and signal the changes through a delta.
|
||||||
|
@ -56,14 +55,7 @@ public class ReconcileWorkingCopyOperation extends CModelOperation {
|
||||||
|
|
||||||
// force problem detection? - if structure was consistent
|
// force problem detection? - if structure was consistent
|
||||||
if (forceProblemDetection && wasConsistent){
|
if (forceProblemDetection && wasConsistent){
|
||||||
if (fMonitor != null && fMonitor.isCanceled()) return;
|
if (fMonitor != null && fMonitor.isCanceled()) return;
|
||||||
|
|
||||||
IProblemRequestor problemRequestor = workingCopy.problemRequestor;
|
|
||||||
if (problemRequestor != null && problemRequestor.isActive()){
|
|
||||||
problemRequestor.beginReporting();
|
|
||||||
TranslationUnitProblemFinder.process(workingCopy, problemRequestor, fMonitor);
|
|
||||||
problemRequestor.endReporting();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// register the deltas
|
// register the deltas
|
||||||
|
|
|
@ -39,6 +39,13 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
|
|
||||||
IPath location = null;
|
IPath location = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If set, this is the problem requestor which will be used to notify problems
|
||||||
|
* detected during reconciling.
|
||||||
|
*/
|
||||||
|
protected IProblemRequestor problemRequestor;
|
||||||
|
|
||||||
|
|
||||||
SourceManipulationInfo sourceManipulationInfo = null;
|
SourceManipulationInfo sourceManipulationInfo = null;
|
||||||
|
|
||||||
public TranslationUnit(ICElement parent, IFile file) {
|
public TranslationUnit(ICElement parent, IFile file) {
|
||||||
|
@ -517,6 +524,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IProblemRequestor getProblemRequestor() {
|
||||||
|
return problemRequestor;
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.model.ITranslationUnit#isHeaderUnit()
|
* @see org.eclipse.cdt.core.model.ITranslationUnit#isHeaderUnit()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
/**********************************************************************
|
|
||||||
* Copyright (c) 2002,2003,2004 QNX Software Systems and others.
|
|
||||||
* All rights reserved. This program and the accompanying materials
|
|
||||||
* are made available under the terms of the Common Public License v1.0
|
|
||||||
* which accompanies this distribution, and is available at
|
|
||||||
* http://www.eclipse.org/legal/cpl-v10.html
|
|
||||||
*
|
|
||||||
* Contributors:
|
|
||||||
* QNX Software Systems - Initial API and implementation
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
package org.eclipse.cdt.internal.core.model;
|
|
||||||
|
|
||||||
import java.io.StringReader;
|
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
|
||||||
import org.eclipse.cdt.core.model.CModelException;
|
|
||||||
import org.eclipse.cdt.core.model.IProblemRequestor;
|
|
||||||
import org.eclipse.cdt.core.parser.IParser;
|
|
||||||
import org.eclipse.cdt.core.parser.IProblem;
|
|
||||||
import org.eclipse.cdt.core.parser.IScanner;
|
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
|
||||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
|
||||||
import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
|
|
||||||
import org.eclipse.cdt.core.parser.ParserFactory;
|
|
||||||
import org.eclipse.cdt.core.parser.ParserFactoryError;
|
|
||||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
|
||||||
import org.eclipse.cdt.core.parser.ParserMode;
|
|
||||||
import org.eclipse.cdt.core.parser.ScannerInfo;
|
|
||||||
import org.eclipse.core.resources.IProject;
|
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TranslationUnitProblemFinder
|
|
||||||
*/
|
|
||||||
public class TranslationUnitProblemFinder extends NullSourceElementRequestor {
|
|
||||||
|
|
||||||
IProblemRequestor requestor;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public TranslationUnitProblemFinder(IProblemRequestor requestor) {
|
|
||||||
super();
|
|
||||||
this.requestor = requestor;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptProblem(org.eclipse.cdt.core.parser.IProblem)
|
|
||||||
*/
|
|
||||||
public boolean acceptProblem(IProblem problem) {
|
|
||||||
requestor.acceptProblem(problem);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param copy
|
|
||||||
* @param requestor
|
|
||||||
* @param monitor
|
|
||||||
*/
|
|
||||||
public static void process(WorkingCopy copy, IProblemRequestor requestor, IProgressMonitor monitor) {
|
|
||||||
|
|
||||||
TranslationUnitProblemFinder problemFinder = new TranslationUnitProblemFinder(requestor);
|
|
||||||
IProject project = copy.getCProject().getProject();
|
|
||||||
String code = new String();
|
|
||||||
try{
|
|
||||||
code = copy.getBuffer().getContents();
|
|
||||||
} catch (CModelException e) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
// pick the language
|
|
||||||
ParserLanguage language = copy.isCXXLanguage()? ParserLanguage.CPP : ParserLanguage.C;
|
|
||||||
|
|
||||||
IParser parser = null;
|
|
||||||
try {
|
|
||||||
IScannerInfo scanInfo = new ScannerInfo();
|
|
||||||
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
|
|
||||||
if (provider != null){
|
|
||||||
IScannerInfo buildScanInfo = provider.getScannerInformation(project);
|
|
||||||
if (buildScanInfo != null){
|
|
||||||
scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean quickParseMode = ! (CCorePlugin.getDefault().useStructuralParseMode());
|
|
||||||
ParserMode mode = quickParseMode ? ParserMode.QUICK_PARSE : ParserMode.STRUCTURAL_PARSE;
|
|
||||||
IScanner scanner = ParserFactory.createScanner(new StringReader(code), copy.getPath().toOSString(),
|
|
||||||
scanInfo, mode, language, problemFinder, null, null);
|
|
||||||
parser = ParserFactory.createParser(scanner, problemFinder, mode, language, null);
|
|
||||||
parser.parse();
|
|
||||||
} catch(ParserFactoryError pfe) {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -47,12 +47,6 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
*/
|
*/
|
||||||
protected int useCount = 1;
|
protected int useCount = 1;
|
||||||
|
|
||||||
/**
|
|
||||||
* If set, this is the problem requestor which will be used to notify problems
|
|
||||||
* detected during reconciling.
|
|
||||||
*/
|
|
||||||
protected IProblemRequestor problemRequestor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a working copy of this element
|
* Creates a working copy of this element
|
||||||
*/
|
*/
|
||||||
|
@ -65,7 +59,7 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
bufferFactory == null ?
|
bufferFactory == null ?
|
||||||
getBufferManager() :
|
getBufferManager() :
|
||||||
bufferFactory;
|
bufferFactory;
|
||||||
this.problemRequestor = requestor;
|
problemRequestor = requestor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorkingCopy(ICElement parent, IPath path, IBufferFactory bufferFactory) {
|
public WorkingCopy(ICElement parent, IPath path, IBufferFactory bufferFactory) {
|
||||||
|
@ -222,12 +216,12 @@ public class WorkingCopy extends TranslationUnit implements IWorkingCopy {
|
||||||
throw newNotPresentException();
|
throw newNotPresentException();
|
||||||
} else {
|
} else {
|
||||||
super.open(monitor);
|
super.open(monitor);
|
||||||
if (monitor != null && monitor.isCanceled()) return;
|
//if (monitor != null && monitor.isCanceled()) return;
|
||||||
if (this.problemRequestor != null && this.problemRequestor.isActive()){
|
//if (this.problemRequestor != null && this.problemRequestor.isActive()){
|
||||||
this.problemRequestor.beginReporting();
|
// this.problemRequestor.beginReporting();
|
||||||
TranslationUnitProblemFinder.process(this, this.problemRequestor, monitor);
|
// TranslationUnitProblemFinder.process(this, this.problemRequestor, monitor);
|
||||||
this.problemRequestor.endReporting();
|
// this.problemRequestor.endReporting();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue