From 33d33a8cd6081beac4d62e3556d82f818122cb55 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sun, 1 Oct 2017 00:34:38 -0400 Subject: [PATCH] Bug 525350 - Ensure a lookup point is always set during indexing, code analysis, and code completion Also push a more accurate lookup point in a few places. Change-Id: I635569178d8d9afd23f7782aeebdaed714f1a10d --- .../AbstractClassInstantiationChecker.java | 8 +++- .../cxx/model/AbstractIndexAstChecker.java | 3 ++ .../dom/parser/cpp/CPPASTFieldReference.java | 35 ++++++++------- .../cpp/CPPASTRangeBasedForStatement.java | 43 +++++++++++-------- .../cdt/internal/core/pdom/PDOMWriter.java | 8 +++- .../DOMCompletionProposalComputer.java | 24 +++++------ 6 files changed, 73 insertions(+), 48 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java index df768a2a8f0..6bcdb9fa303 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/AbstractClassInstantiationChecker.java @@ -42,6 +42,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.SemanticQueries; import org.eclipse.cdt.core.parser.util.StringUtil; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; /** * Reports a problem if object of a class cannot be created because @@ -191,7 +192,12 @@ public class AbstractClassInstantiationChecker extends AbstractIndexAstChecker { ICPPClassType classType = (ICPPClassType) unwindedType; ICPPMethod[] pureVirtualMethods = pureVirtualMethodsCache.get(classType); if (pureVirtualMethods == null) { - pureVirtualMethods = SemanticQueries.getPureVirtualMethods(classType, problemNode); + CPPSemantics.pushLookupPoint(problemNode); + try { + pureVirtualMethods = SemanticQueries.getPureVirtualMethods(classType); + } finally { + CPPSemantics.popLookupPoint(); + } pureVirtualMethodsCache.put(classType, pureVirtualMethods); } diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractIndexAstChecker.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractIndexAstChecker.java index 2d3e2823467..c9ec33b5e00 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractIndexAstChecker.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractIndexAstChecker.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -113,11 +114,13 @@ public abstract class AbstractIndexAstChecker extends AbstractCheckerWithProblem context.add(modelCache); } } + CPPSemantics.pushLookupPoint(ast); try { processAst(ast); } finally { modelCache = null; setContext(null); + CPPSemantics.popLookupPoint(); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java index e650c341d89..64bb2e46120 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java @@ -245,22 +245,27 @@ public class CPPASTFieldReference extends ASTNode @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { - IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - - int j = 0; - for (int i = 0; i < bindings.length; i++) { - IBinding binding = bindings[i]; - if (!(binding instanceof ICPPMethod && ((ICPPMethod) binding).isImplicit())) { - if (i != j) - bindings[j] = binding; - j++; + CPPSemantics.pushLookupPoint(this); + try { + IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); + + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; + if (!(binding instanceof ICPPMethod && ((ICPPMethod) binding).isImplicit())) { + if (i != j) + bindings[j] = binding; + j++; + } } - } - - - if (j < bindings.length) - return Arrays.copyOfRange(bindings, 0, j); - return bindings; + + + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; + } finally { + CPPSemantics.popLookupPoint(); + } } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java index d1dce4ce5eb..1ea1cdfb9d4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTRangeBasedForStatement.java @@ -131,25 +131,30 @@ public class CPPASTRangeBasedForStatement extends CPPASTAttributeOwner implement fImplicitNames= IASTImplicitName.EMPTY_NAME_ARRAY; } else if (type instanceof ICPPClassType) { ICPPClassType ct= (ICPPClassType) type; - if (CPPSemantics.findBindings(ct.getCompositeScope(), CPPVisitor.BEGIN, true, this).length > 0) { - CPPASTName name = new CPPASTName(CPPVisitor.BEGIN); - name.setOffset(position.getOffset()); - CPPASTFieldReference fieldRef = new CPPASTFieldReference(name, forInitExpr.copy()); - IASTExpression expr= new CPPASTFunctionCallExpression(fieldRef, CPPVisitor.NO_ARGS); - expr.setParent(this); - expr.setPropertyInParent(ICPPASTRangeBasedForStatement.INITIALIZER); - CPPASTImplicitName begin= new CPPASTImplicitName(name.toCharArray(), this); - begin.setBinding(name.resolveBinding()); - begin.setOffsetAndLength(position); - - name = new CPPASTName(CPPVisitor.END); - name.setOffset(position.getOffset()); - fieldRef.setFieldName(name); - CPPASTImplicitName end= new CPPASTImplicitName(name.toCharArray(), this); - end.setBinding(name.resolveBinding()); - end.setOffsetAndLength(position); - - fImplicitNames= new IASTImplicitName[] {begin, end}; + CPPSemantics.pushLookupPoint(this); + try { + if (CPPSemantics.findBindings(ct.getCompositeScope(), CPPVisitor.BEGIN, true, this).length > 0) { + CPPASTName name = new CPPASTName(CPPVisitor.BEGIN); + name.setOffset(position.getOffset()); + CPPASTFieldReference fieldRef = new CPPASTFieldReference(name, forInitExpr.copy()); + IASTExpression expr= new CPPASTFunctionCallExpression(fieldRef, CPPVisitor.NO_ARGS); + expr.setParent(this); + expr.setPropertyInParent(ICPPASTRangeBasedForStatement.INITIALIZER); + CPPASTImplicitName begin= new CPPASTImplicitName(name.toCharArray(), this); + begin.setBinding(name.resolveBinding()); + begin.setOffsetAndLength(position); + + name = new CPPASTName(CPPVisitor.END); + name.setOffset(position.getOffset()); + fieldRef.setFieldName(name); + CPPASTImplicitName end= new CPPASTImplicitName(name.toCharArray(), this); + end.setBinding(name.resolveBinding()); + end.setOffsetAndLength(position); + + fImplicitNames= new IASTImplicitName[] {begin, end}; + } + } finally { + CPPSemantics.popLookupPoint(); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java index 2fd598d537a..a0ff9786c04 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java @@ -64,6 +64,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalDeclaredVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.index.FileContentKey; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndex; @@ -527,7 +528,12 @@ public abstract class PDOMWriter implements IPDOMASTProcessor { } } }; - ast.accept(visitor); + CPPSemantics.pushLookupPoint(ast); + try { + ast.accept(visitor); + } finally { + CPPSemantics.popLookupPoint(); + } if ((fSkipReferences & SKIP_MACRO_REFERENCES) == 0) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java index 1dc60c3cc9e..71f17585c8d 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionProposalComputer.java @@ -180,19 +180,19 @@ public class DOMCompletionProposalComputer extends ParsingBasedProposalComputer handleMacros = prefix.length() > 0; } - IBinding[] bindings = astContext.findBindings(name, !context.isContextInformationStyle()); - - if (bindings != null) { - AccessContext accessibilityContext = new AccessContext(name, true); - try { - CPPSemantics.pushLookupPoint(completionNode.getTranslationUnit()); - for (IBinding binding : bindings) { - if (accessibilityContext.isAccessible(binding)) - handleBinding(binding, context, prefix, astContext, proposals); - } - } finally { - CPPSemantics.popLookupPoint(); + CPPSemantics.pushLookupPoint(name); + try { + IBinding[] bindings = astContext.findBindings(name, !context.isContextInformationStyle()); + + if (bindings != null) { + AccessContext accessibilityContext = new AccessContext(name, true); + for (IBinding binding : bindings) { + if (accessibilityContext.isAccessible(binding)) + handleBinding(binding, context, prefix, astContext, proposals); + } } + } finally { + CPPSemantics.popLookupPoint(); } }