mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 21:05:37 +02:00
Updates to completion parse 2.
This commit is contained in:
parent
689000d042
commit
7a4aed4b37
5 changed files with 72 additions and 19 deletions
|
@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTProblem;
|
import org.eclipse.cdt.core.dom.ast.IASTProblem;
|
||||||
|
@ -64,7 +65,6 @@ import org.eclipse.cdt.core.parser.IToken;
|
||||||
import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
|
import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
|
||||||
import org.eclipse.cdt.core.parser.ParseError;
|
import org.eclipse.cdt.core.parser.ParseError;
|
||||||
import org.eclipse.cdt.core.parser.ParserMode;
|
import org.eclipse.cdt.core.parser.ParserMode;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author jcamelon
|
* @author jcamelon
|
||||||
|
@ -511,7 +511,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
IASTExpressionStatement exprStmt = createExpressionStatement();
|
IASTExpressionStatement exprStmt = createExpressionStatement();
|
||||||
exprStmt.setParent(result);
|
exprStmt.setParent(result);
|
||||||
exprStmt.setPropertyInParent(IASTCompoundStatement.NESTED_STATEMENT);
|
exprStmt.setPropertyInParent(IASTCompoundStatement.NESTED_STATEMENT);
|
||||||
IASTIdExpression expr = new CPPASTIdExpression(); // Obviously need a factory
|
IASTIdExpression expr = createIdExpression();
|
||||||
exprStmt.setExpression(expr);
|
exprStmt.setExpression(expr);
|
||||||
expr.setParent(exprStmt);
|
expr.setParent(exprStmt);
|
||||||
expr.setPropertyInParent(IASTExpressionStatement.EXPFRESSION);
|
expr.setPropertyInParent(IASTExpressionStatement.EXPFRESSION);
|
||||||
|
@ -523,6 +523,24 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
if (completionNode == null)
|
if (completionNode == null)
|
||||||
completionNode = new ASTCompletionNode(token);
|
completionNode = new ASTCompletionNode(token);
|
||||||
completionNode.addName(exprName);
|
completionNode.addName(exprName);
|
||||||
|
|
||||||
|
// Now the declaration statement
|
||||||
|
IASTDeclarationStatement declStmt = createDeclarationStatement();
|
||||||
|
declStmt.setParent(result);
|
||||||
|
declStmt.setPropertyInParent(IASTCompoundStatement.NESTED_STATEMENT);
|
||||||
|
IASTSimpleDeclaration decl = createSimpleDeclaration();
|
||||||
|
declStmt.setDeclaration(decl);
|
||||||
|
decl.setParent(declStmt);
|
||||||
|
decl.setPropertyInParent(IASTDeclarationStatement.DECLARATION);
|
||||||
|
IASTNamedTypeSpecifier declSpec = createNamedTypeSpecifier();
|
||||||
|
decl.setDeclSpecifier(declSpec);
|
||||||
|
declSpec.setParent(decl);
|
||||||
|
declSpec.setPropertyInParent(IASTSimpleDeclaration.DECL_SPECIFIER);
|
||||||
|
IASTName declSpecName = createName(token);
|
||||||
|
declSpec.setName(declSpecName);
|
||||||
|
declSpecName.setParent(declSpec);
|
||||||
|
declSpecName.setPropertyInParent(IASTNamedTypeSpecifier.NAME);
|
||||||
|
completionNode.addName(declSpecName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1268,6 +1286,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
return !parsePassed;
|
return !parsePassed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected abstract IASTSimpleDeclaration createSimpleDeclaration();
|
||||||
|
|
||||||
|
protected abstract IASTNamedTypeSpecifier createNamedTypeSpecifier();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@ -1333,6 +1355,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
*/
|
*/
|
||||||
protected abstract IASTIfStatement createIfStatement();
|
protected abstract IASTIfStatement createIfStatement();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected abstract IASTIdExpression createIdExpression();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -527,7 +527,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected CASTSimpleDeclaration createSimpleDeclaration() {
|
protected IASTSimpleDeclaration createSimpleDeclaration() {
|
||||||
return new CASTSimpleDeclaration();
|
return new CASTSimpleDeclaration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1501,7 +1501,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
return elabSpec;
|
return elabSpec;
|
||||||
}
|
}
|
||||||
if (isIdentifier) {
|
if (isIdentifier) {
|
||||||
ICASTTypedefNameSpecifier declSpec = createNamedTypeSpecifier();
|
ICASTTypedefNameSpecifier declSpec = (ICASTTypedefNameSpecifier)createNamedTypeSpecifier();
|
||||||
declSpec.setConst(isConst);
|
declSpec.setConst(isConst);
|
||||||
declSpec.setRestrict(isRestrict);
|
declSpec.setRestrict(isRestrict);
|
||||||
declSpec.setVolatile(isVolatile);
|
declSpec.setVolatile(isVolatile);
|
||||||
|
@ -1545,7 +1545,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected ICASTTypedefNameSpecifier createNamedTypeSpecifier() {
|
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() {
|
||||||
return new CASTTypedefNameSpecifier();
|
return new CASTTypedefNameSpecifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3233,7 +3233,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
return classSpec;
|
return classSpec;
|
||||||
}
|
}
|
||||||
if (duple != null) {
|
if (duple != null) {
|
||||||
ICPPASTNamedTypeSpecifier nameSpec = createNamedTypeSpecifier();
|
ICPPASTNamedTypeSpecifier nameSpec = (ICPPASTNamedTypeSpecifier)createNamedTypeSpecifier();
|
||||||
nameSpec.setIsTypename(isTypename);
|
nameSpec.setIsTypename(isTypename);
|
||||||
IASTName name = createName(duple);
|
IASTName name = createName(duple);
|
||||||
nameSpec.setName(name);
|
nameSpec.setName(name);
|
||||||
|
@ -3307,7 +3307,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected ICPPASTNamedTypeSpecifier createNamedTypeSpecifier() {
|
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() {
|
||||||
return new CPPASTNamedTypeSpecifier();
|
return new CPPASTNamedTypeSpecifier();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -196,7 +196,7 @@ public class InternalASTServiceProvider implements IASTServiceProvider {
|
||||||
else
|
else
|
||||||
scannerExtensionConfiguration = C_GNU_SCANNER_EXTENSION;
|
scannerExtensionConfiguration = C_GNU_SCANNER_EXTENSION;
|
||||||
|
|
||||||
IScanner scanner = new DOMScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE,
|
IScanner scanner = new DOMScanner(reader, scanInfo, ParserMode.COMPLETION_PARSE,
|
||||||
l, ParserFactory.createDefaultLogService(),
|
l, ParserFactory.createDefaultLogService(),
|
||||||
scannerExtensionConfiguration, fileCreator);
|
scannerExtensionConfiguration, fileCreator);
|
||||||
scanner.setContentAssistMode(offset);
|
scanner.setContentAssistMode(offset);
|
||||||
|
@ -204,11 +204,11 @@ public class InternalASTServiceProvider implements IASTServiceProvider {
|
||||||
// assume GCC
|
// assume GCC
|
||||||
ISourceCodeParser parser = null;
|
ISourceCodeParser parser = null;
|
||||||
if (l == ParserLanguage.C)
|
if (l == ParserLanguage.C)
|
||||||
parser = new GNUCSourceParser(scanner, ParserMode.COMPLETE_PARSE,
|
parser = new GNUCSourceParser(scanner, ParserMode.COMPLETION_PARSE,
|
||||||
ParserUtil.getParserLogService(),
|
ParserUtil.getParserLogService(),
|
||||||
new GCCParserExtensionConfiguration());
|
new GCCParserExtensionConfiguration());
|
||||||
else
|
else
|
||||||
parser = new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE,
|
parser = new GNUCPPSourceParser(scanner, ParserMode.COMPLETION_PARSE,
|
||||||
ParserUtil.getParserLogService(),
|
ParserUtil.getParserLogService(),
|
||||||
new GPPParserExtensionConfiguration());
|
new GPPParserExtensionConfiguration());
|
||||||
|
|
||||||
|
|
|
@ -10,16 +10,21 @@
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
package org.eclipse.cdt.internal.ui.text.contentassist;
|
package org.eclipse.cdt.internal.ui.text.contentassist;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.CDOM;
|
import org.eclipse.cdt.core.dom.CDOM;
|
||||||
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
import org.eclipse.cdt.core.dom.ICodeReaderFactory;
|
||||||
import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException;
|
import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException;
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
|
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
import org.eclipse.cdt.core.model.IWorkingCopy;
|
import org.eclipse.cdt.core.model.IWorkingCopy;
|
||||||
import org.eclipse.cdt.core.parser.CodeReader;
|
import org.eclipse.cdt.core.parser.CodeReader;
|
||||||
import org.eclipse.cdt.core.parser.ParserUtil;
|
import org.eclipse.cdt.core.parser.ParserUtil;
|
||||||
|
@ -54,6 +59,7 @@ public class CCompletionProcessor2 implements IContentAssistProcessor {
|
||||||
int offset) {
|
int offset) {
|
||||||
errorMessage = null;
|
errorMessage = null;
|
||||||
try {
|
try {
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
IWorkingCopy workingCopy = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput());
|
IWorkingCopy workingCopy = CUIPlugin.getDefault().getWorkingCopyManager().getWorkingCopy(editor.getEditorInput());
|
||||||
ASTCompletionNode completionNode = CDOM.getInstance().getCompletionNode(
|
ASTCompletionNode completionNode = CDOM.getInstance().getCompletionNode(
|
||||||
(IFile)workingCopy.getResource(),
|
(IFile)workingCopy.getResource(),
|
||||||
|
@ -71,22 +77,30 @@ public class CCompletionProcessor2 implements IContentAssistProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
IASTName[] names = completionNode.getNames();
|
long stopTime = System.currentTimeMillis();
|
||||||
IASTTranslationUnit tu = names[0].getTranslationUnit();
|
System.out.println("Completion Parse: " + (stopTime - startTime) + "ms");
|
||||||
IBinding binding = names[0].resolveBinding();
|
|
||||||
int repLength = completionNode.getLength();
|
int repLength = completionNode.getLength();
|
||||||
int repOffset = offset - repLength;
|
int repOffset = offset - repLength;
|
||||||
|
List proposals = new ArrayList();
|
||||||
|
|
||||||
ICompletionProposal prop = createBindingCompletionProposal(binding, repOffset, repLength);
|
IASTName[] names = completionNode.getNames();
|
||||||
ICompletionProposal prop2 = createBindingCompletionProposal(binding, repOffset, repLength);
|
for (int i = 0; i < names.length; ++i) {
|
||||||
|
IBinding binding = names[0].resolveBinding();
|
||||||
|
|
||||||
|
if (binding != null && !(binding instanceof IProblemBinding))
|
||||||
|
proposals.add(createBindingCompletionProposal(binding, repOffset, repLength));
|
||||||
|
}
|
||||||
|
|
||||||
return new ICompletionProposal[] { prop, prop2 };
|
if (!proposals.isEmpty())
|
||||||
|
return (ICompletionProposal[])proposals.toArray(new ICompletionProposal[proposals.size()]);
|
||||||
} catch (UnsupportedDialectException e) {
|
} catch (UnsupportedDialectException e) {
|
||||||
errorMessage = "Unsupported Dialect Exception";
|
errorMessage = "Unsupported Dialect Exception";
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
errorMessage = e.toString();
|
errorMessage = e.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorMessage = "No completions found";
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,8 +146,20 @@ public class CCompletionProcessor2 implements IContentAssistProcessor {
|
||||||
|
|
||||||
private ICompletionProposal createBindingCompletionProposal(IBinding binding, int offset, int length) {
|
private ICompletionProposal createBindingCompletionProposal(IBinding binding, int offset, int length) {
|
||||||
ImageDescriptor imageDescriptor = null;
|
ImageDescriptor imageDescriptor = null;
|
||||||
if (binding instanceof ITypedef)
|
|
||||||
imageDescriptor = CElementImageProvider.getTypedefImageDescriptor();
|
try {
|
||||||
|
if (binding instanceof ITypedef)
|
||||||
|
imageDescriptor = CElementImageProvider.getTypedefImageDescriptor();
|
||||||
|
else if (binding instanceof ICompositeType) {
|
||||||
|
if (((ICompositeType)binding).getKey() == ICPPClassType.k_class)
|
||||||
|
imageDescriptor = CElementImageProvider.getClassImageDescriptor();
|
||||||
|
else if (((ICompositeType)binding).getKey() == ICompositeType.k_struct)
|
||||||
|
imageDescriptor = CElementImageProvider.getStructImageDescriptor();
|
||||||
|
else if (((ICompositeType)binding).getKey() == ICompositeType.k_union)
|
||||||
|
imageDescriptor = CElementImageProvider.getUnionImageDescriptor();
|
||||||
|
}
|
||||||
|
} catch (DOMException e) {
|
||||||
|
}
|
||||||
|
|
||||||
Image image = imageDescriptor != null
|
Image image = imageDescriptor != null
|
||||||
? CUIPlugin.getImageDescriptorRegistry().get( imageDescriptor )
|
? CUIPlugin.getImageDescriptorRegistry().get( imageDescriptor )
|
||||||
|
|
Loading…
Add table
Reference in a new issue