From e7864031caaa90c06de32cd57fc9828d142b0bfe Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Mon, 30 May 2005 19:35:02 +0000 Subject: [PATCH] fixing template problems - finding class definitions for classes nested in templates. - comparing defered template instances --- .../core/dom/parser/cpp/CPPClassType.java | 12 +++++++++++- .../dom/parser/cpp/CPPDeferredClassInstance.java | 15 +++++++-------- .../internal/core/dom/parser/cpp/CPPVisitor.java | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index bb74e9462ac..8b48b750796 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -233,6 +233,10 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType { { IBinding binding = name.resolveBinding(); if( binding == CPPClassType.this ){ + if( name instanceof ICPPASTQualifiedName ){ + IASTName [] ns = ((ICPPASTQualifiedName)name).getNames(); + name = ns[ ns.length - 1 ]; + } result = name; return PROCESS_ABORT; } @@ -241,7 +245,9 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType { } public int visit( IASTDeclaration declaration ){ - return (declaration instanceof IASTSimpleDeclaration ) ? PROCESS_CONTINUE : PROCESS_SKIP; + if( declaration instanceof IASTSimpleDeclaration || declaration instanceof ICPPASTTemplateDeclaration ) + return PROCESS_CONTINUE; + return PROCESS_SKIP; } public int visit( IASTDeclSpecifier declSpec ){ return (declSpec instanceof ICPPASTCompositeTypeSpecifier ) ? PROCESS_CONTINUE : PROCESS_SKIP; @@ -254,6 +260,10 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType { FindDefinitionAction action = new FindDefinitionAction(); IASTNode node = CPPVisitor.getContainingBlockItem( getPhysicalNode() ).getParent(); + if( node instanceof ICPPASTCompositeTypeSpecifier ) + node = CPPVisitor.getContainingBlockItem( node.getParent() ); + while( node instanceof ICPPASTTemplateDeclaration ) + node = node.getParent(); node.accept( action ); definition = action.result; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index dd7fc664c73..e42066b0fb3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -168,13 +168,12 @@ public class CPPDeferredClassInstance extends CPPInstance implements ICPPClassTy return true; //allow some fuzziness here. - if( !(type instanceof CPPDeferredClassInstance ) ) - return false; - - ICPPClassTemplate typeClass = (ICPPClassTemplate) ((CPPDeferredClassInstance)type).getSpecializedBinding(); - if( typeClass != classTemplate ) - return false; - - return true; + if( type instanceof CPPDeferredClassInstance ){ + ICPPClassTemplate typeClass = (ICPPClassTemplate) ((CPPDeferredClassInstance)type).getSpecializedBinding(); + return (typeClass == classTemplate ); + } else if( type instanceof ICPPClassTemplate && classTemplate == type ){ + return true; + } + return false; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 14d7a48e13e..3b1adec7bf0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -892,6 +892,9 @@ public class CPPVisitor { if( binding == null ){ binding = CPPSemantics.resolveBinding( name ); name.setBinding( binding ); + if( name instanceof ICPPASTTemplateId && binding instanceof ICPPSpecialization ){ + ((ICPPASTTemplateId)name).getTemplateName().setBinding( ((ICPPSpecialization)binding).getSpecializedBinding() ); + } } return binding; }