mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +02:00
Fix for [Bug 47234] new ParserMode required for a better CModel
This commit is contained in:
parent
1148b378c8
commit
a8950694c7
20 changed files with 519 additions and 136 deletions
|
@ -15,12 +15,17 @@ import java.util.HashMap;
|
|||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.IParent;
|
||||
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.IQuickParseCallback;
|
||||
import org.eclipse.cdt.core.parser.IScannerInfo;
|
||||
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
|
||||
import org.eclipse.cdt.core.parser.ParserFactory;
|
||||
import org.eclipse.cdt.core.parser.ParserFactoryException;
|
||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||
|
@ -67,53 +72,80 @@ public class CModelBuilder {
|
|||
this.newElements = new HashMap();
|
||||
}
|
||||
|
||||
private IASTCompilationUnit parse( String code, boolean hasCppNature, boolean quick, boolean throwExceptionOnError ) throws ParserException
|
||||
private IASTCompilationUnit parse( ITranslationUnit translationUnit, boolean quickParseMode, boolean throwExceptionOnError ) throws ParserException
|
||||
{
|
||||
ParserMode mode = quick ? ParserMode.QUICK_PARSE : ParserMode.COMPLETE_PARSE;
|
||||
quickParseCallback = ParserFactory.createQuickParseCallback();
|
||||
IProject currentProject = null;
|
||||
boolean hasCppNature = true;
|
||||
String code = "";
|
||||
|
||||
// get the current project
|
||||
if (translationUnit != null && translationUnit.getCProject() != null) {
|
||||
currentProject = translationUnit.getCProject().getProject();
|
||||
}
|
||||
// check the project's nature
|
||||
if( currentProject != null )
|
||||
{
|
||||
hasCppNature = CoreModel.getDefault().hasCCNature(currentProject);
|
||||
}
|
||||
// get the code to parse
|
||||
try{
|
||||
code = translationUnit.getBuffer().getContents();
|
||||
} catch (CModelException e) {
|
||||
|
||||
}
|
||||
// use quick or structural parse mode
|
||||
ParserMode mode = quickParseMode ? ParserMode.QUICK_PARSE : ParserMode.STRUCTURAL_PARSE;
|
||||
if(quickParseMode)
|
||||
quickParseCallback = ParserFactory.createQuickParseCallback();
|
||||
else
|
||||
quickParseCallback = ParserFactory.createStructuralParseCallback();
|
||||
|
||||
// pick the language
|
||||
ParserLanguage language = hasCppNature ? ParserLanguage.CPP : ParserLanguage.C;
|
||||
|
||||
// create the parser
|
||||
IParser parser = null;
|
||||
try
|
||||
{
|
||||
|
||||
IScannerInfo scanInfo = new ScannerInfo();
|
||||
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(currentProject);
|
||||
if (provider != null){
|
||||
IScannerInfo buildScanInfo = provider.getScannerInformation(currentProject);
|
||||
if (buildScanInfo != null){
|
||||
scanInfo = new ScannerInfo(buildScanInfo.getDefinedSymbols(), buildScanInfo.getIncludePaths());
|
||||
}
|
||||
}
|
||||
|
||||
parser = ParserFactory.createParser(
|
||||
ParserFactory.createScanner( new StringReader( code ), "code",
|
||||
new ScannerInfo(), mode, language, quickParseCallback, ParserUtil.getParserLogService()), quickParseCallback, mode, language, ParserUtil.getParserLogService() );
|
||||
ParserFactory.createScanner(
|
||||
new StringReader( code ),
|
||||
translationUnit.getUnderlyingResource().getLocation().toOSString(),
|
||||
scanInfo,
|
||||
mode,
|
||||
language,
|
||||
quickParseCallback,
|
||||
ParserUtil.getParserLogService())
|
||||
,quickParseCallback,
|
||||
mode,
|
||||
language,
|
||||
ParserUtil.getParserLogService() );
|
||||
}
|
||||
catch( ParserFactoryException pfe )
|
||||
{
|
||||
throw new ParserException( "Parser/Scanner construction failure.");
|
||||
}
|
||||
|
||||
// call parse
|
||||
if( ! parser.parse() && throwExceptionOnError )
|
||||
throw new ParserException("Parse failure");
|
||||
return quickParseCallback.getCompilationUnit();
|
||||
}
|
||||
|
||||
private IASTCompilationUnit parse( String code, boolean hasCppNature )throws ParserException
|
||||
{
|
||||
return parse( code, hasCppNature, true, true );
|
||||
}
|
||||
|
||||
public Map parse() throws Exception {
|
||||
|
||||
Map options = null;
|
||||
IProject currentProject = null;
|
||||
boolean hasCppNature = true;
|
||||
|
||||
if (translationUnit != null && translationUnit.getCProject() != null) {
|
||||
options = translationUnit.getCProject().getOptions(true);
|
||||
currentProject = translationUnit.getCProject().getProject();
|
||||
}
|
||||
if( currentProject != null )
|
||||
{
|
||||
hasCppNature = CoreModel.getDefault().hasCCNature(currentProject);
|
||||
}
|
||||
|
||||
public Map parse(boolean quickParseMode) throws Exception {
|
||||
try
|
||||
{
|
||||
compilationUnit = parse( translationUnit.getBuffer().getContents(), hasCppNature);
|
||||
compilationUnit = parse( translationUnit, quickParseMode, true);
|
||||
}
|
||||
|
||||
catch( ParserException e )
|
||||
|
|
|
@ -0,0 +1,246 @@
|
|||
/**********************************************************************
|
||||
* 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:
|
||||
* IBM Rational Software - Initial API and implementation
|
||||
***********************************************************************/package org.eclipse.cdt.internal.core.model;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTField;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTFunction;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTInclusion;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTMacro;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTMethod;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTScope;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTVariable;
|
||||
import org.eclipse.cdt.internal.core.parser.QuickParseCallback;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTScope;
|
||||
|
||||
/**
|
||||
* @author hamer
|
||||
*
|
||||
* To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Generation - Code and Comments
|
||||
*/
|
||||
public class StructuralParseCallback extends QuickParseCallback{
|
||||
|
||||
protected LinkedList scopeStack = new LinkedList();
|
||||
protected IASTScope currentScope = null;
|
||||
protected int inclusionLevel = 0;
|
||||
|
||||
|
||||
private void addElement (IASTDeclaration element){
|
||||
if(inclusionLevel == 0)
|
||||
((ASTScope)currentScope).addDeclaration(element);
|
||||
}
|
||||
|
||||
private void enterScope(IASTNode node){
|
||||
if(node instanceof IASTScope){
|
||||
pushScope((IASTScope)node);
|
||||
}
|
||||
}
|
||||
|
||||
private void exitScope(IASTNode node){
|
||||
if(node instanceof IASTScope){
|
||||
popScope();
|
||||
}
|
||||
}
|
||||
|
||||
private void pushScope( IASTScope scope ){
|
||||
scopeStack.addFirst( currentScope );
|
||||
currentScope = (IASTScope)scope;
|
||||
}
|
||||
|
||||
private IASTScope popScope(){
|
||||
IASTScope oldScope = currentScope;
|
||||
currentScope = (scopeStack.size() > 0 ) ? (IASTScope) scopeStack.removeFirst() : null;
|
||||
return oldScope;
|
||||
}
|
||||
|
||||
private IASTScope peekAtScope(){
|
||||
return currentScope;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMacro(org.eclipse.cdt.core.parser.ast.IASTMacro)
|
||||
*/
|
||||
public void acceptMacro(IASTMacro macro) {
|
||||
if(inclusionLevel == 0)
|
||||
macros.add(macro);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptVariable(org.eclipse.cdt.core.parser.ast.IASTVariable)
|
||||
*/
|
||||
public void acceptVariable(IASTVariable variable) {
|
||||
addElement(variable);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptFunctionDeclaration(org.eclipse.cdt.core.parser.ast.IASTFunction)
|
||||
*/
|
||||
public void acceptFunctionDeclaration(IASTFunction function) {
|
||||
addElement(function);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptTypedefDeclaration(org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration)
|
||||
*/
|
||||
public void acceptTypedefDeclaration(IASTTypedefDeclaration typedef) {
|
||||
addElement(typedef);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptEnumerationSpecifier(org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier)
|
||||
*/
|
||||
public void acceptEnumerationSpecifier(IASTEnumerationSpecifier enumeration) {
|
||||
enterScope(enumeration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptElaboratedForewardDeclaration(org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier)
|
||||
*/
|
||||
public void acceptElaboratedForewardDeclaration(IASTElaboratedTypeSpecifier elaboratedType) {
|
||||
enterScope(elaboratedType);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptAbstractTypeSpecDeclaration(org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration)
|
||||
*/
|
||||
public void acceptAbstractTypeSpecDeclaration(IASTAbstractTypeSpecifierDeclaration abstractDeclaration) {
|
||||
addElement(abstractDeclaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion)
|
||||
*/
|
||||
public void enterInclusion(IASTInclusion inclusion) {
|
||||
if(inclusionLevel == 0)
|
||||
inclusions.add(inclusion);
|
||||
inclusionLevel++;
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterNamespaceDefinition(org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition)
|
||||
*/
|
||||
public void enterNamespaceDefinition(IASTNamespaceDefinition namespaceDefinition) {
|
||||
addElement(namespaceDefinition);
|
||||
enterScope(namespaceDefinition);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterClassSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier)
|
||||
*/
|
||||
public void enterClassSpecifier(IASTClassSpecifier classSpecification) {
|
||||
enterScope(classSpecification);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterLinkageSpecification(org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification)
|
||||
*/
|
||||
public void enterLinkageSpecification(IASTLinkageSpecification linkageSpec) {
|
||||
enterScope(linkageSpec);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterCompilationUnit(org.eclipse.cdt.core.parser.ast.IASTCompilationUnit)
|
||||
*/
|
||||
public void enterCompilationUnit(IASTCompilationUnit compilationUnit) {
|
||||
enterScope(compilationUnit);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptMethodDeclaration(org.eclipse.cdt.core.parser.ast.IASTMethod)
|
||||
*/
|
||||
public void acceptMethodDeclaration(IASTMethod method) {
|
||||
addElement(method);
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptField(org.eclipse.cdt.core.parser.ast.IASTField)
|
||||
*/
|
||||
public void acceptField(IASTField field) {
|
||||
addElement(field);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitCompilationUnit(org.eclipse.cdt.core.parser.ast.IASTCompilationUnit)
|
||||
*/
|
||||
public void exitCompilationUnit(IASTCompilationUnit compilationUnit) {
|
||||
exitScope(compilationUnit);
|
||||
this.compilationUnit = compilationUnit;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitInclusion(org.eclipse.cdt.core.parser.ast.IASTInclusion)
|
||||
*/
|
||||
public void exitInclusion( IASTInclusion inclusion )
|
||||
{
|
||||
inclusionLevel--;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.IQuickParseCallback#getCompilationUnit()
|
||||
*/
|
||||
public IASTCompilationUnit getCompilationUnit() {
|
||||
return compilationUnit; }
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitClassSpecifier(org.eclipse.cdt.core.parser.ast.IASTClassSpecifier)
|
||||
*/
|
||||
public void exitClassSpecifier(IASTClassSpecifier classSpecification) {
|
||||
exitScope(classSpecification);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitLinkageSpecification(org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification)
|
||||
*/
|
||||
public void exitLinkageSpecification(IASTLinkageSpecification linkageSpec) {
|
||||
exitScope(linkageSpec);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitNamespaceDefinition(org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition)
|
||||
*/
|
||||
public void exitNamespaceDefinition(IASTNamespaceDefinition namespaceDefinition) {
|
||||
exitScope(namespaceDefinition);
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterFunctionBody(org.eclipse.cdt.core.parser.ast.IASTFunction)
|
||||
*/
|
||||
public void enterFunctionBody(IASTFunction function) {
|
||||
addElement(function);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterMethodBody(org.eclipse.cdt.core.parser.ast.IASTMethod)
|
||||
*/
|
||||
public void enterMethodBody(IASTMethod method) {
|
||||
addElement(method);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterTemplateDeclaration(org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration)
|
||||
*/
|
||||
public void enterTemplateDeclaration(IASTTemplateDeclaration declaration) {
|
||||
addElement(declaration);
|
||||
}
|
||||
|
||||
}
|
|
@ -10,6 +10,7 @@ import java.util.HashMap;
|
|||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.IBuffer;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
|
@ -465,7 +466,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
|
|||
try {
|
||||
removeChildren();
|
||||
CModelBuilder modelBuilder = new CModelBuilder(this);
|
||||
return modelBuilder.parse();
|
||||
|
||||
boolean quickParseMode = ! (CCorePlugin.getDefault().useStructuralParseMode());
|
||||
return modelBuilder.parse(quickParseMode);
|
||||
} catch (Exception e) {
|
||||
// FIXME: use the debug log for this exception.
|
||||
//System.out.println(e);
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2003-12-15 Hoda Amer
|
||||
Fixed [Bug 47234] new ParserMode required for a better CModel :
|
||||
- Added a core plugin preference to build the CModel in Structural mode
|
||||
- Added StructuralParseCallBack class
|
||||
- Added lists of declarations to AST Scopes in the complete AST
|
||||
|
||||
2003-12-12 John Camelon
|
||||
Added preliminary keyword support into IASTCompletionNode::getKeywords().
|
||||
Refactored parser to put keyword string literals in one utility class.
|
||||
|
|
|
@ -13,13 +13,15 @@ package org.eclipse.cdt.core.parser;
|
|||
import java.io.Reader;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ast.IASTFactory;
|
||||
import org.eclipse.cdt.internal.core.parser.*;
|
||||
import org.eclipse.cdt.internal.core.model.StructuralParseCallback;
|
||||
import org.eclipse.cdt.internal.core.parser.CompleteParser;
|
||||
import org.eclipse.cdt.internal.core.parser.ContextualParser;
|
||||
import org.eclipse.cdt.internal.core.parser.LineOffsetReconciler;
|
||||
import org.eclipse.cdt.internal.core.parser.Preprocessor;
|
||||
import org.eclipse.cdt.internal.core.parser.QuickParseCallback;
|
||||
import org.eclipse.cdt.internal.core.parser.QuickParser;
|
||||
import org.eclipse.cdt.internal.core.parser.Scanner;
|
||||
import org.eclipse.cdt.internal.core.parser.StructuralParser;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.complete.CompleteParseASTFactory;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.quick.QuickParseASTFactory;
|
||||
|
||||
|
@ -85,7 +87,12 @@ public class ParserFactory {
|
|||
{
|
||||
return new QuickParseCallback();
|
||||
}
|
||||
|
||||
|
||||
public static IQuickParseCallback createStructuralParseCallback()
|
||||
{
|
||||
return new StructuralParseCallback();
|
||||
}
|
||||
|
||||
public static IParserLogService createDefaultLogService()
|
||||
{
|
||||
return defaultLogService;
|
||||
|
|
|
@ -42,6 +42,15 @@ public class QuickParseCallback extends NullSourceElementRequestor implements IQ
|
|||
return macros.iterator();
|
||||
}
|
||||
|
||||
public Iterator getDeclarations(){
|
||||
try{
|
||||
return compilationUnit.getDeclarations();
|
||||
}
|
||||
catch (ASTNotImplementedException ne )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void exitMethodBody( IASTMethod method )
|
||||
{
|
||||
|
@ -89,25 +98,19 @@ public class QuickParseCallback extends NullSourceElementRequestor implements IQ
|
|||
|
||||
public OffsetableIterator()
|
||||
{
|
||||
try
|
||||
{
|
||||
declarationIter = compilationUnit.getDeclarations();
|
||||
}
|
||||
catch (ASTNotImplementedException ne )
|
||||
{
|
||||
|
||||
}
|
||||
inclusionIter = inclusions.iterator();
|
||||
macroIter = macros.iterator();
|
||||
declarationIter = getDeclarations();
|
||||
inclusionIter = getInclusions();
|
||||
macroIter = getMacros();
|
||||
updateInclusionIterator();
|
||||
updateDeclarationIterator();
|
||||
updateMacroIterator();
|
||||
updateDeclarationIterator();
|
||||
}
|
||||
|
||||
private Object updateDeclarationIterator()
|
||||
{
|
||||
Object offsetable = currentDeclaration;
|
||||
currentDeclaration = ( declarationIter.hasNext() ) ? (IASTOffsetableElement)declarationIter.next() : null;
|
||||
Object offsetable = currentDeclaration;
|
||||
if(declarationIter != null)
|
||||
currentDeclaration = ( declarationIter.hasNext() ) ? (IASTOffsetableElement)declarationIter.next() : null;
|
||||
return offsetable;
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.parser.ast.complete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
|
@ -19,6 +20,7 @@ import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
|||
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTScope;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.ASTQualifiedNamedElement;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
|
||||
|
@ -32,7 +34,7 @@ import org.eclipse.cdt.internal.core.parser.pst.IDerivableContainerSymbol.IParen
|
|||
*/
|
||||
public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier
|
||||
{
|
||||
|
||||
private List declarations = new ArrayList();
|
||||
public class BaseIterator implements Iterator
|
||||
{
|
||||
|
||||
|
@ -256,6 +258,16 @@ public class ASTClassSpecifier extends ASTScope implements IASTClassSpecifier
|
|||
{
|
||||
offsets.setNameEndOffset(o);
|
||||
}
|
||||
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return declarations.iterator();
|
||||
}
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
declarations.add(declaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind)
|
||||
*/
|
||||
|
|
|
@ -6,8 +6,13 @@
|
|||
*/
|
||||
package org.eclipse.cdt.internal.core.parser.ast.complete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCodeScope;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
|
||||
|
||||
/**
|
||||
|
@ -18,6 +23,7 @@ import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
|
|||
*/
|
||||
public class ASTCodeScope extends ASTScope implements IASTCodeScope {
|
||||
|
||||
private List declarations = new ArrayList();
|
||||
private final IASTCodeScope ownerCodeScope;
|
||||
|
||||
/**
|
||||
|
@ -71,7 +77,17 @@ public class ASTCodeScope extends ASTScope implements IASTCodeScope {
|
|||
{
|
||||
return ownerCodeScope;
|
||||
}
|
||||
|
||||
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return declarations.iterator();
|
||||
}
|
||||
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
declarations.add(declaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind)
|
||||
*/
|
||||
|
|
|
@ -10,8 +10,13 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.parser.ast.complete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
|
||||
|
||||
/**
|
||||
|
@ -22,7 +27,8 @@ public class ASTCompilationUnit
|
|||
extends ASTScope
|
||||
implements IASTCompilationUnit
|
||||
{
|
||||
/**
|
||||
private List declarations = new ArrayList();
|
||||
/**
|
||||
* @param symbol
|
||||
*/
|
||||
public ASTCompilationUnit(ISymbol symbol)
|
||||
|
@ -64,7 +70,16 @@ public class ASTCompilationUnit
|
|||
/* do nothing */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return declarations.iterator();
|
||||
}
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
declarations.add(declaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind)
|
||||
*/
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.parser.ast.complete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
|
@ -17,6 +18,7 @@ import org.eclipse.cdt.core.parser.ISourceElementRequestor;
|
|||
import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTArrayModifier;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCodeScope;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTExceptionSpecification;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTFunction;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
|
||||
|
@ -42,7 +44,7 @@ public class ASTFunction extends ASTScope implements IASTFunction
|
|||
private final List parameters;
|
||||
protected final ASTReferenceStore references;
|
||||
private final int nameEndOffset;
|
||||
|
||||
private List declarations = new ArrayList();
|
||||
/**
|
||||
* @param symbol
|
||||
* @param parameters
|
||||
|
@ -319,7 +321,15 @@ public class ASTFunction extends ASTScope implements IASTFunction
|
|||
return hasFunctionTryBlock;
|
||||
}
|
||||
|
||||
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return declarations.iterator();
|
||||
}
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
declarations.add(declaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind)
|
||||
*/
|
||||
|
|
|
@ -10,7 +10,12 @@
|
|||
***********************************************************************/
|
||||
package org.eclipse.cdt.internal.core.parser.ast.complete;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.ASTQualifiedNamedElement;
|
||||
import org.eclipse.cdt.internal.core.parser.ast.NamedOffsets;
|
||||
|
@ -27,6 +32,7 @@ public class ASTNamespaceDefinition
|
|||
|
||||
private NamedOffsets namedOffsets = new NamedOffsets();
|
||||
private final ASTQualifiedNamedElement qualifiedName;
|
||||
private List declarations = new ArrayList();
|
||||
|
||||
/**
|
||||
* @param namespaceSymbol
|
||||
|
@ -158,7 +164,16 @@ public class ASTNamespaceDefinition
|
|||
{
|
||||
namedOffsets.setNameEndOffset(o);
|
||||
}
|
||||
|
||||
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return declarations.iterator();
|
||||
}
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
declarations.add(declaration);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind)
|
||||
*/
|
||||
|
|
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete;
|
|||
import java.util.Iterator;
|
||||
|
||||
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTScope;
|
||||
import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
|
||||
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
|
||||
|
@ -39,9 +40,13 @@ public abstract class ASTScope extends ASTSymbol implements IASTScope
|
|||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.parser.ast.IASTScope#getDeclarations()
|
||||
*/
|
||||
public Iterator getDeclarations() throws ASTNotImplementedException
|
||||
public Iterator getDeclarations()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addDeclaration(IASTDeclaration declaration)
|
||||
{
|
||||
throw new ASTNotImplementedException();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -65,7 +65,8 @@ public class CCorePlugin extends Plugin {
|
|||
public final static String PREF_BINARY_PARSER = "binaryparser";
|
||||
public final static String DEFAULT_BINARY_PARSER_SIMPLE_ID = "ELF";
|
||||
public final static String DEFAULT_BINARY_PARSER_UNIQ_ID = PLUGIN_ID + "." + DEFAULT_BINARY_PARSER_SIMPLE_ID;
|
||||
|
||||
public final static String PREF_USE_STRUCTURAL_PARSE_MODE = "useStructualParseMode";
|
||||
|
||||
public final static String ERROR_PARSER_SIMPLE_ID = "ErrorParser"; //$NON-NLS-1$
|
||||
|
||||
// Build Model Interface Discovery
|
||||
|
@ -236,6 +237,10 @@ public class CCorePlugin extends Plugin {
|
|||
|
||||
fDescriptorManager = new CDescriptorManager();
|
||||
fDescriptorManager.startup();
|
||||
|
||||
// Set the default for using the structual parse mode to build the CModel
|
||||
getPluginPreferences().setDefault(PREF_USE_STRUCTURAL_PARSE_MODE, false);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -750,4 +755,16 @@ public class CCorePlugin extends Plugin {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Preference to turn on/off the use of structural parse mode to build the CModel
|
||||
public void setStructuralParseMode(boolean useNewParser) {
|
||||
getPluginPreferences().setValue(PREF_USE_STRUCTURAL_PARSE_MODE, useNewParser);
|
||||
savePluginPreferences();
|
||||
}
|
||||
|
||||
public boolean useStructuralParseMode() {
|
||||
return getPluginPreferences().getBoolean(PREF_USE_STRUCTURAL_PARSE_MODE);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,3 +1,9 @@
|
|||
2003-12-15 Hoda Amer
|
||||
Fixed [Bug 47234] new ParserMode required for a better CModel :
|
||||
- Added a user preference to build the CModel using Structural mode
|
||||
Enabled the Completion Engine and called the parser in Contextual Mode
|
||||
Changed default user preference to Project scope until the completion engine is ready
|
||||
|
||||
2003-12-15 Thomas Fletcher
|
||||
Re-activate the hover help based on the function summary extension point.
|
||||
Fix a bug in the FunctionSummary class which displayed arguments as
|
||||
|
|
|
@ -17,7 +17,7 @@ CBasePreferencePage.consoleOnTop.label=Bring C-Build view to top when building (
|
|||
CBasePreferencePage.buildConsole.errorMessage=Value must be an integer between 10 and 2147483647
|
||||
CBasePreferencePage.linkToEditor.label=Link view selection to active editor
|
||||
CBasePreferencePage.CUChildren.label=Show file members in Project View
|
||||
CBasePreferencePage.useNewParser.label=Use New Parser for Code Model
|
||||
CBasePreferencePage.OutlineView.structuralParseMode.label=Use Structural-Parse mode to build the CModel
|
||||
|
||||
CBasePreferencePage.editorFont.label=C Editor font:
|
||||
CBasePreferencePage.consoleFont.label=C-Build view font:
|
||||
|
|
|
@ -277,6 +277,10 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
|
|||
|
||||
store.setDefault(ExtendedTextEditorPreferenceConstants.EDITOR_OVERVIEW_RULER, true);
|
||||
|
||||
store.setDefault(ContentAssistPreference.CURRENT_FILE_SEARCH_SCOPE, false);
|
||||
store.setDefault(ContentAssistPreference.PROJECT_SEARCH_SCOPE, true);
|
||||
store.setDefault(ContentAssistPreference.PROJECT_AND_DEPENDENCY_SEARCH_SCOPE, false);
|
||||
|
||||
store.setDefault(ContentAssistPreference.AUTOACTIVATION_TRIGGERS_DOT, true);
|
||||
store.setDefault(ContentAssistPreference.AUTOACTIVATION_TRIGGERS_ARROW, true);
|
||||
store.setDefault(ContentAssistPreference.AUTOACTIVATION_TRIGGERS_DOUBLECOLON, true);
|
||||
|
@ -293,9 +297,6 @@ public class CEditorPreferencePage extends PreferencePage implements IWorkbenchP
|
|||
//store.setDefault(ContentAssistPreference.CASE_SENSITIVITY, false);
|
||||
store.setDefault(ContentAssistPreference.ORDER_PROPOSALS, false);
|
||||
store.setDefault(ContentAssistPreference.ADD_INCLUDE, true);
|
||||
store.setDefault(ContentAssistPreference.CURRENT_FILE_SEARCH_SCOPE, true);
|
||||
store.setDefault(ContentAssistPreference.PROJECT_SEARCH_SCOPE, false);
|
||||
store.setDefault(ContentAssistPreference.PROJECT_AND_DEPENDENCY_SEARCH_SCOPE, false);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ package org.eclipse.cdt.internal.ui.preferences;
|
|||
* All Rights Reserved.
|
||||
*/
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.cdt.ui.PreferenceConstants;
|
||||
|
@ -24,8 +25,8 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements
|
|||
|
||||
private static final String LINK_TO_EDITOR_LABEL= "CBasePreferencePage.linkToEditor.label";
|
||||
private static final String SHOW_CU_CHILDREN_LABEL= "CBasePreferencePage.CUChildren.label";
|
||||
private static final String USE_NEW_PARSER_LABEL= "CBasePreferencePage.useNewParser.label";
|
||||
|
||||
private static final String USE_STRUCTURAL_PARSE_MODE_LABEL= "CBasePreferencePage.OutlineView.structuralParseMode.label";
|
||||
|
||||
public CPluginPreferencePage() {
|
||||
super(GRID);
|
||||
setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
|
||||
|
@ -50,6 +51,9 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements
|
|||
|
||||
BooleanFieldEditor showCUChildrenEditor= new BooleanFieldEditor(PreferenceConstants.PREF_SHOW_CU_CHILDREN, CUIPlugin.getResourceString(SHOW_CU_CHILDREN_LABEL), parent);
|
||||
addField(showCUChildrenEditor);
|
||||
|
||||
BooleanFieldEditor useStructuralParseMode= new BooleanFieldEditor(PreferenceConstants.PREF_USE_STRUCTURAL_PARSE_MODE, CUIPlugin.getResourceString(USE_STRUCTURAL_PARSE_MODE_LABEL), parent);
|
||||
addField(useStructuralParseMode);
|
||||
}
|
||||
|
||||
|
||||
|
@ -61,10 +65,15 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements
|
|||
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_SHOW_CU_CHILDREN);
|
||||
}
|
||||
|
||||
public static boolean useStructuralParseMode() {
|
||||
return CUIPlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.PREF_USE_STRUCTURAL_PARSE_MODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IWorkbenchPreferencePage#init
|
||||
*/
|
||||
public void init(IWorkbench workbench) {
|
||||
CUIPlugin.getDefault().getPreferenceStore().setValue(CCorePlugin.PREF_USE_STRUCTURAL_PARSE_MODE, CCorePlugin.getDefault().useStructuralParseMode());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -73,6 +82,7 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements
|
|||
public static void initDefaults(IPreferenceStore prefs) {
|
||||
prefs.setDefault(PreferenceConstants.PREF_LINK_TO_EDITOR, true);
|
||||
prefs.setDefault(PreferenceConstants.PREF_SHOW_CU_CHILDREN, true);
|
||||
prefs.setDefault(PreferenceConstants.PREF_USE_STRUCTURAL_PARSE_MODE, CCorePlugin.getDefault().useStructuralParseMode());
|
||||
prefs.setDefault(PreferenceConstants.EDITOR_SHOW_SEGMENTS, false);
|
||||
}
|
||||
|
||||
|
@ -82,7 +92,8 @@ public class CPluginPreferencePage extends FieldEditorPreferencePage implements
|
|||
public boolean performOk() {
|
||||
if (!super.performOk())
|
||||
return false;
|
||||
|
||||
// tell the Core Plugin about this preference
|
||||
CCorePlugin.getDefault().setStructuralParseMode(useStructuralParseMode());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,15 +12,12 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.CoreModel;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.IMember;
|
||||
import org.eclipse.cdt.core.model.IMethod;
|
||||
import org.eclipse.cdt.core.model.IMethodDeclaration;
|
||||
import org.eclipse.cdt.core.model.IStructure;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
|
||||
import org.eclipse.cdt.core.search.BasicSearchMatch;
|
||||
import org.eclipse.cdt.core.search.BasicSearchResultCollector;
|
||||
import org.eclipse.cdt.core.search.ICSearchConstants;
|
||||
|
@ -28,9 +25,7 @@ import org.eclipse.cdt.core.search.ICSearchScope;
|
|||
import org.eclipse.cdt.core.search.SearchEngine;
|
||||
import org.eclipse.cdt.internal.core.model.CElement;
|
||||
import org.eclipse.cdt.internal.core.model.IWorkingCopy;
|
||||
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
|
||||
import org.eclipse.cdt.internal.core.search.matching.OrPattern;
|
||||
import org.eclipse.cdt.internal.core.sourcedependency.DependencyQueryJob;
|
||||
import org.eclipse.cdt.internal.corext.template.ContextType;
|
||||
import org.eclipse.cdt.internal.corext.template.ContextTypeRegistry;
|
||||
import org.eclipse.cdt.internal.ui.CCompletionContributorManager;
|
||||
|
@ -46,8 +41,6 @@ import org.eclipse.cdt.ui.IFunctionSummary;
|
|||
import org.eclipse.cdt.ui.IWorkingCopyManager;
|
||||
import org.eclipse.cdt.ui.text.ICCompletionProposal;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.jface.preference.IPreferenceStore;
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
|
@ -327,6 +320,12 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
* Evaluate the actual proposals for C
|
||||
*/
|
||||
public ICCompletionProposal[] evalProposals(IDocument document, int pos, int length, ITranslationUnit unit) {
|
||||
try{
|
||||
currentOffset = pos;
|
||||
currentSourceUnit = unit.getWorkingCopy();
|
||||
} catch (CModelException e){
|
||||
|
||||
}
|
||||
return order (evalProposals(document, pos, length, getCurrentScope (unit, pos)));
|
||||
}
|
||||
|
||||
|
@ -336,6 +335,7 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
String frag = "";
|
||||
int pos = startPos;
|
||||
|
||||
|
||||
// Move back the pos by one the position is 0-based
|
||||
if (pos > 0) {
|
||||
pos--;
|
||||
|
@ -415,7 +415,7 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
ArrayList completions = new ArrayList();
|
||||
|
||||
// Look in index manager
|
||||
addProposalsFromModel(region, frag,currentScope, completions);
|
||||
addProposalsFromModel(region, completions);
|
||||
|
||||
// Loot in the contributed completions
|
||||
addProposalsFromCompletionContributors(region, frag, completions);
|
||||
|
@ -472,20 +472,21 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
}
|
||||
|
||||
|
||||
private void addProposalsFromModel (IRegion region, String frag, ICElement currentScope, ArrayList completions) {
|
||||
List elementsFound = new LinkedList();
|
||||
String prefix = frag + "*";
|
||||
private void addProposalsFromModel (IRegion region, ArrayList completions) {
|
||||
|
||||
// TODO: change that to resource scope later
|
||||
if (currentScope == null)
|
||||
if (currentSourceUnit == null)
|
||||
return;
|
||||
|
||||
// clear the completion list at the result collector
|
||||
resultCollector.clearCompletions();
|
||||
|
||||
//invoke the completion engine
|
||||
//IASTCompletionNode completionNode = completionEngine.complete(currentSourceUnit, currentOffset, completions);
|
||||
|
||||
IASTCompletionNode completionNode = completionEngine.complete(currentSourceUnit, currentOffset, completions);
|
||||
if(completionNode == null)
|
||||
return;
|
||||
String prefix = completionNode.getCompletionPrefix();
|
||||
String searchPrefix = prefix + "*";
|
||||
|
||||
// figure out the search scope
|
||||
IPreferenceStore store = CUIPlugin.getDefault().getPreferenceStore();
|
||||
boolean fileScope = store.getBoolean(ContentAssistPreference.CURRENT_FILE_SEARCH_SCOPE);
|
||||
|
@ -494,14 +495,32 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
ICSearchScope scope = null;
|
||||
|
||||
if ((projectScope) || (projectScopeAndDependency)){
|
||||
List elementsFound = new LinkedList();
|
||||
resultCollector.clearCompletions();
|
||||
//////////////////////
|
||||
|
||||
ICElement[] projectScopeElement = new ICElement[1];
|
||||
projectScopeElement[0] = (ICElement)currentScope.getCProject();
|
||||
projectScopeElement[0] = (ICElement)currentSourceUnit.getCProject();
|
||||
scope = SearchEngine.createCSearchScope(projectScopeElement, projectScopeAndDependency);
|
||||
|
||||
OrPattern orPattern = new OrPattern();
|
||||
// search for global variables, functions, classes, structs, unions, enums, macros, and namespaces
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.FUNCTION, ICSearchConstants.DEFINITIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( searchPrefix, ICSearchConstants.NAMESPACE, ICSearchConstants.DEFINITIONS, false ));
|
||||
searchEngine.search(CUIPlugin.getWorkspace(), orPattern, scope, searchResultCollector, true);
|
||||
elementsFound.addAll(searchResultCollector.getSearchResults());
|
||||
|
||||
sendResultsToCollector(elementsFound.iterator(), region.getOffset(), region.getLength(), prefix );
|
||||
}
|
||||
else{
|
||||
//Try to get the file
|
||||
IResource actualFile = currentScope.getUnderlyingResource();
|
||||
IProject project = currentScope.getCProject().getProject();
|
||||
/* //Try to get the file
|
||||
IResource actualFile = currentSourceUnit.getUnderlyingResource();
|
||||
IProject project = currentSourceUnit.getCProject().getProject();
|
||||
ArrayList dependencies = new ArrayList();
|
||||
if (actualFile != null){
|
||||
//Get file's dependencies
|
||||
|
@ -513,59 +532,8 @@ public class CCompletionProcessor implements IContentAssistProcessor {
|
|||
}
|
||||
//Create CFileSearchScope
|
||||
scope = SearchEngine.createCFileSearchScope((IFile) actualFile, dependencies);
|
||||
}
|
||||
*/ }
|
||||
|
||||
OrPattern orPattern = new OrPattern();
|
||||
// search for global variables, functions, classes, structs, unions, enums and macros
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.VAR, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.FUNCTION, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.FUNCTION, ICSearchConstants.DEFINITIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.ENUM, ICSearchConstants.DECLARATIONS, false ));
|
||||
orPattern.addPattern(SearchEngine.createSearchPattern( prefix, ICSearchConstants.MACRO, ICSearchConstants.DECLARATIONS, false ));
|
||||
searchEngine.search(CUIPlugin.getWorkspace(), orPattern, scope, searchResultCollector, true);
|
||||
elementsFound.addAll(searchResultCollector.getSearchResults());
|
||||
|
||||
if((currentScope instanceof IMethod) || (currentScope instanceof IMethodDeclaration) ){
|
||||
// add the methods and fields of the parent class
|
||||
// Work around until CElement scope is implemented
|
||||
IStructure parentClass = (IStructure) currentScope.getParent();
|
||||
ArrayList children = new ArrayList();
|
||||
children.addAll(parentClass.getChildrenOfType(ICElement.C_METHOD));
|
||||
children.addAll(parentClass.getChildrenOfType(ICElement.C_METHOD_DECLARATION));
|
||||
children.addAll(parentClass.getChildrenOfType(ICElement.C_FIELD));
|
||||
Iterator c = children.iterator();
|
||||
while (c.hasNext()){
|
||||
IMember child = (IMember)c.next();
|
||||
if (child.getElementName().startsWith(frag))
|
||||
{
|
||||
BasicSearchMatch childMatch = new BasicSearchMatch();
|
||||
childMatch.setType(child.getElementType());
|
||||
childMatch.setParentName(parentClass.getElementName());
|
||||
if(child.getVisibility() == ASTAccessVisibility.PUBLIC )
|
||||
childMatch.setVisibility(ICElement.CPP_PUBLIC);
|
||||
else if(child.getVisibility() == ASTAccessVisibility.PROTECTED )
|
||||
childMatch.setVisibility(ICElement.CPP_PROTECTED);
|
||||
else if(child.getVisibility() == ASTAccessVisibility.PRIVATE )
|
||||
childMatch.setVisibility(ICElement.CPP_PRIVATE);
|
||||
childMatch.setConst(child.isConst());
|
||||
childMatch.setVolatile(child.isVolatile());
|
||||
childMatch.setStatic(child.isStatic());
|
||||
if(child instanceof IMethodDeclaration){
|
||||
childMatch.setName(((IMethodDeclaration)child).getSignature());
|
||||
childMatch.setReturnType( ((IMethodDeclaration)child).getReturnType() );
|
||||
}
|
||||
else {
|
||||
childMatch.setName(child.getElementName());
|
||||
}
|
||||
|
||||
elementsFound.add(childMatch);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sendResultsToCollector(elementsFound.iterator(), region.getOffset(), region.getLength(), frag );
|
||||
completions.addAll(resultCollector.getCompletions());
|
||||
}
|
||||
|
||||
|
|
|
@ -165,8 +165,8 @@ public class CompletionEngine implements RelevanceConstants{
|
|||
IParser parser = null;
|
||||
try
|
||||
{
|
||||
IScanner scanner = ParserFactory.createScanner( reader, realPath.toOSString(), scanInfo, ParserMode.COMPLETE_PARSE, language, requestor, ParserUtil.getParserLogService() );
|
||||
parser = ParserFactory.createParser( scanner, requestor, ParserMode.COMPLETE_PARSE, language, ParserUtil.getParserLogService() );
|
||||
IScanner scanner = ParserFactory.createScanner( reader, realPath.toOSString(), scanInfo, ParserMode.CONTEXTUAL_PARSE, language, requestor, ParserUtil.getParserLogService() );
|
||||
parser = ParserFactory.createParser( scanner, requestor, ParserMode.CONTEXTUAL_PARSE, language, ParserUtil.getParserLogService() );
|
||||
}
|
||||
catch( ParserFactoryException pfe )
|
||||
{
|
||||
|
@ -269,6 +269,8 @@ public class CompletionEngine implements RelevanceConstants{
|
|||
}
|
||||
|
||||
private void addToCompletions (LookupResult result){
|
||||
if(result == null)
|
||||
return;
|
||||
Iterator nodes = result.getNodes();
|
||||
while (nodes.hasNext()){
|
||||
IASTNode node = (IASTNode) nodes.next();
|
||||
|
|
|
@ -12,8 +12,8 @@ import org.eclipse.jface.preference.PreferenceConverter;
|
|||
import org.eclipse.cdt.internal.ui.text.ICColorConstants;
|
||||
|
||||
/**
|
||||
* Preference constants used in the JDT-UI preference store. Clients should only read the
|
||||
* JDT-UI preference store using these values. Clients are not allowed to modify the
|
||||
* Preference constants used in the CDT-UI preference store. Clients should only read the
|
||||
* CDT-UI preference store using these values. Clients are not allowed to modify the
|
||||
* preference store programmatically.
|
||||
*
|
||||
* @since 2.0
|
||||
|
@ -54,6 +54,14 @@ public class PreferenceConstants {
|
|||
* </p>
|
||||
*/
|
||||
public static final String PREF_SHOW_CU_CHILDREN= "org.eclipse.cdt.ui.editor.CUChildren"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* A named preference that speficies whether to use the parser's structural mode to build the CModel.
|
||||
* <p>
|
||||
* Value is of type <code>Boolean</code>.
|
||||
* </p>
|
||||
*/
|
||||
public static final String PREF_USE_STRUCTURAL_PARSE_MODE= "org.eclipse.cdt.ui.editor.UseStructuralMode"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* A named preference that controls if segmented view (show selected element only) is turned on or off.
|
||||
|
|
Loading…
Add table
Reference in a new issue