diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java index f9c10a38838..40c1c74aea1 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java @@ -121,6 +121,7 @@ public class TypeParser implements ISourceElementRequestor { private ITypeInfo fSuperTypeToFind; private Set fProcessedTypes = new HashSet(); private boolean fFoundType; + IParser fParser = null; public TypeParser(ITypeCache typeCache, IWorkingCopyProvider provider) { fTypeCache = typeCache; @@ -501,8 +502,8 @@ public class TypeParser implements ISourceElementRequestor { fProgressMonitor = progressMonitor; IScanner scanner = ParserFactory.createScanner(reader, scanInfo, ParserMode.STRUCTURAL_PARSE, language, this, ParserUtil.getScannerLogService(), null); - IParser parser = ParserFactory.createParser(scanner, this, ParserMode.STRUCTURAL_PARSE, language, ParserUtil.getParserLogService()); - parser.parse(); + fParser = ParserFactory.createParser(scanner, this, ParserMode.STRUCTURAL_PARSE, language, ParserUtil.getParserLogService()); + fParser.parse(); } catch (ParserFactoryError e) { CCorePlugin.log(e); } catch (ParseError e) { @@ -514,6 +515,7 @@ public class TypeParser implements ISourceElementRequestor { CCorePlugin.log(e); } finally { fProgressMonitor = null; + fParser = null; } } @@ -770,14 +772,16 @@ public class TypeParser implements ISourceElementRequestor { if ((fTypeToFind.getCElementType() == nodeInfo.type || fTypeToFind.isUndefinedType()) && nodeInfo.name.equals(fTypeToFind.getName())) { QualifiedTypeName qualifiedName = new QualifiedTypeName(nodeInfo.name, nodeInfo.enclosingNames); if (qualifiedName.equals(fTypeToFind.getQualifiedTypeName())) { - fFoundType = true; - // add types to cache ITypeInfo newType = addType(nodeInfo.type, qualifiedName, originalLocation, resolvedLocation); if (newType != null && node instanceof IASTClassSpecifier) { addSuperClasses(newType, (IASTClassSpecifier)node, originalLocation, fProcessedTypes); } fProgressMonitor.worked(1); + + fFoundType = true; + // terminate the parser + fParser.cancel(); } } } else { @@ -897,16 +901,4 @@ public class TypeParser implements ISourceElementRequestor { public CodeReader createReader(String finalPath, Iterator workingCopies) { return ParserUtil.createReader(finalPath, workingCopies); } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#parserTimeout() - */ - public boolean parserTimeout() { - //TODO - Chris Wiebe - Need to resturcture how you cancel the parser now that - //IParser.cancel() is available, this method is no longer being called. - if (fFoundType || fProgressMonitor.isCanceled()) - return true; - - return false; - } }