From d7e2618b8f8f5363dcb9834b0da2fd3e4190e20a Mon Sep 17 00:00:00 2001 From: Michi Date: Sat, 3 Jan 2015 16:53:38 +0100 Subject: [PATCH] Bug 424565 - 'Open Declaration' on use of alias template defined in base class This should work now for AliasTemplates from AST and PDOM. SourceHover is also affected. Are there any unit tests for this? Change-Id: I54a9c2d6cd0851f901b917a57d79616298699299 Signed-off-by: Michi Reviewed-on: https://git.eclipse.org/r/38919 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin Tested-by: Sergey Prigogin --- .../internal/core/dom/parser/cpp/semantics/CPPVisitor.java | 7 +++++-- .../internal/ui/search/actions/OpenDeclarationsJob.java | 4 ++++ .../eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 8e39fe55b17..0d6bbd28aa5 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -143,6 +143,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypeTransformationSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; @@ -1476,7 +1477,7 @@ public class CPPVisitor extends ASTQueries { shouldVisitNames = true; this.decls = new IASTName[DEFAULT_LIST_SIZE]; - final String bname= binding.getName(); + final String bname = binding.getName(); if (bname.length() > 0 && !bname.startsWith("operator")) { //$NON-NLS-1$ requiredName= bname.toCharArray(); } @@ -1489,6 +1490,7 @@ public class CPPVisitor extends ASTQueries { } else if (binding instanceof ICPPTemplateParameter) { kind = KIND_TEMPLATE_PARAMETER; } else if (binding instanceof ICompositeType || + binding instanceof ICPPAliasTemplate || binding instanceof ITypedef || binding instanceof IEnumeration) { kind = KIND_TYPE; @@ -1542,7 +1544,8 @@ public class CPPVisitor extends ASTQueries { case KIND_TYPE: case KIND_COMPOSITE: if (prop == IASTCompositeTypeSpecifier.TYPE_NAME || - prop == IASTEnumerationSpecifier.ENUMERATION_NAME || + prop == ICPPASTAliasDeclaration.ALIAS_NAME || + prop == IASTEnumerationSpecifier.ENUMERATION_NAME || prop == ICPPASTUsingDeclaration.NAME) { break; } else if (prop == IASTElaboratedTypeSpecifier.TYPE_NAME) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java index 7b9ab93f919..aaedd0596bd 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/actions/OpenDeclarationsJob.java @@ -61,6 +61,7 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; @@ -254,6 +255,9 @@ class OpenDeclarationsJob extends Job implements ASTRunnable { } private IName[] findDeclNames(IASTTranslationUnit ast, NameKind kind, IBinding binding) throws CoreException { + if (binding instanceof ICPPAliasTemplateInstance) { + binding = ((ICPPAliasTemplateInstance) binding).getTemplateDefinition(); + } IName[] declNames = findNames(fIndex, ast, kind, binding); // Bug 207320, handle template instances. while (declNames.length == 0 && binding instanceof ICPPSpecialization) { diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java index 6a355378c39..cbb883aea81 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/c/hover/CSourceHover.java @@ -80,6 +80,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypeId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPAliasTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; @@ -661,6 +662,9 @@ public class CSourceHover extends AbstractCEditorTextHover { * @throws CoreException */ private IName[] findDefinitions(IASTTranslationUnit ast, IBinding binding) throws CoreException { + if (binding instanceof ICPPAliasTemplateInstance) { + binding = ((ICPPAliasTemplateInstance) binding).getTemplateDefinition(); + } IName[] declNames= ast.getDefinitionsInAST(binding); if (declNames.length == 0 && ast.getIndex() != null) { // search definitions in index