diff options
author | Nathan Ridge | 2016-12-26 03:52:05 +0000 |
---|---|---|
committer | Nathan Ridge | 2017-01-03 21:28:08 +0000 |
commit | cc59253516399d8932fb5717c28e840fb28553c4 (patch) | |
tree | f3846af000f700c44bf5b30268af604081c20030 /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom | |
parent | b9baf5b478ba8123db821cbd4f28ed0f33f70eb0 (diff) | |
download | org.eclipse.cdt-cc59253516399d8932fb5717c28e840fb28553c4.tar.gz org.eclipse.cdt-cc59253516399d8932fb5717c28e840fb28553c4.tar.xz org.eclipse.cdt-cc59253516399d8932fb5717c28e840fb28553c4.zip |
Bug 292236 - Consider using-declarations when determining accessibility for content assist
Change-Id: Id6d04b67f3c2c7e3392ba09222f4242fbb66b342
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom')
5 files changed, 69 insertions, 0 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java index a9d74762eb2..ca339a7be77 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java @@ -43,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; @@ -636,6 +637,11 @@ public class PDOMASTAdapter { public ICPPClassType[] getNestedClasses() { return ((ICPPClassType) fDelegate).getNestedClasses(); } + + @Override + public ICPPUsingDeclaration[] getUsingDeclarations() { + return ((ICPPClassType) fDelegate).getUsingDeclarations(); + } @Override public boolean isSameType(IType type) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index eecd7f27bbc..a92949ff091 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecialization.RecursionResolvingBinding; @@ -361,6 +362,28 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization return ICPPClassType.EMPTY_CLASS_ARRAY; } } + + @Override + public ICPPUsingDeclaration[] getUsingDeclarations() { + CCorePlugin.log(new Exception("Unsafe method call. Instantiation of dependent expressions may not work.")); //$NON-NLS-1$ + return getUsingDeclarations(null); + } + + @Override + public ICPPUsingDeclaration[] getUsingDeclarations(IASTNode point) { + IScope scope= getCompositeScope(); + if (scope instanceof ICPPClassSpecializationScope) { + return ((ICPPClassSpecializationScope) scope).getUsingDeclarations(point); + } + try { + PDOMClassUtil.UsingDeclarationCollector visitor = new PDOMClassUtil.UsingDeclarationCollector(); + PDOMCPPClassScope.acceptViaCache(this, visitor, false); + return visitor.getUsingDeclarations(); + } catch (CoreException e) { + CCorePlugin.log(e); + return ICPPUsingDeclaration.EMPTY_USING_DECL_ARRAY; + } + } @Override public IBinding[] getFriends() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 6eae0307abb..f2a36792d1e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; @@ -373,6 +374,18 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO return ICPPClassType.EMPTY_CLASS_ARRAY; } } + + @Override + public ICPPUsingDeclaration[] getUsingDeclarations() { + try { + PDOMClassUtil.UsingDeclarationCollector visitor = new PDOMClassUtil.UsingDeclarationCollector(); + PDOMCPPClassScope.acceptViaCache(this, visitor, false); + return visitor.getUsingDeclarations(); + } catch (CoreException e) { + CCorePlugin.log(e); + return ICPPUsingDeclaration.EMPTY_USING_DECL_ARRAY; + } + } @Override public IBinding[] getFriends() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java index da1b0d4487a..5c2f2da54ea 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTypeArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; @@ -319,6 +320,11 @@ public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding public ICPPClassType[] getNestedClasses() { return ICPPClassType.EMPTY_CLASS_ARRAY; } + + @Override + public ICPPUsingDeclaration[] getUsingDeclarations() { + return ICPPUsingDeclaration.EMPTY_USING_DECL_ARRAY; + } @Override public IScope getCompositeScope() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java index 63e28480fad..7e32cfe75b3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMClassUtil.java @@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.core.runtime.CoreException; @@ -136,4 +137,24 @@ class PDOMClassUtil { return nestedClasses.toArray(new ICPPClassType[nestedClasses.size()]); } } + + static class UsingDeclarationCollector implements IPDOMVisitor { + private final List<ICPPUsingDeclaration> usingDeclarations = new ArrayList<>(); + + @Override + public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof ICPPUsingDeclaration) { + usingDeclarations.add((ICPPUsingDeclaration) node); + } + return false; + } + + @Override + public void leave(IPDOMNode node) throws CoreException { + } + + public ICPPUsingDeclaration[] getUsingDeclarations() { + return usingDeclarations.toArray(new ICPPUsingDeclaration[usingDeclarations.size()]); + } + } } |