1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-29 20:05:35 +02:00

fixing template problems

- finding class definitions for classes nested in templates.
- comparing defered template instances
This commit is contained in:
Andrew Niefer 2005-05-30 19:35:02 +00:00
parent 1786169b2b
commit e7864031ca
3 changed files with 21 additions and 9 deletions

View file

@ -233,6 +233,10 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
{ {
IBinding binding = name.resolveBinding(); IBinding binding = name.resolveBinding();
if( binding == CPPClassType.this ){ if( binding == CPPClassType.this ){
if( name instanceof ICPPASTQualifiedName ){
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
name = ns[ ns.length - 1 ];
}
result = name; result = name;
return PROCESS_ABORT; return PROCESS_ABORT;
} }
@ -241,7 +245,9 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
} }
public int visit( IASTDeclaration declaration ){ 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 ){ public int visit( IASTDeclSpecifier declSpec ){
return (declSpec instanceof ICPPASTCompositeTypeSpecifier ) ? PROCESS_CONTINUE : PROCESS_SKIP; return (declSpec instanceof ICPPASTCompositeTypeSpecifier ) ? PROCESS_CONTINUE : PROCESS_SKIP;
@ -254,6 +260,10 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
FindDefinitionAction action = new FindDefinitionAction(); FindDefinitionAction action = new FindDefinitionAction();
IASTNode node = CPPVisitor.getContainingBlockItem( getPhysicalNode() ).getParent(); 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 ); node.accept( action );
definition = action.result; definition = action.result;

View file

@ -168,13 +168,12 @@ public class CPPDeferredClassInstance extends CPPInstance implements ICPPClassTy
return true; return true;
//allow some fuzziness here. //allow some fuzziness here.
if( !(type instanceof CPPDeferredClassInstance ) ) if( type instanceof CPPDeferredClassInstance ){
return false; ICPPClassTemplate typeClass = (ICPPClassTemplate) ((CPPDeferredClassInstance)type).getSpecializedBinding();
return (typeClass == classTemplate );
ICPPClassTemplate typeClass = (ICPPClassTemplate) ((CPPDeferredClassInstance)type).getSpecializedBinding(); } else if( type instanceof ICPPClassTemplate && classTemplate == type ){
if( typeClass != classTemplate ) return true;
return false; }
return false;
return true;
} }
} }

View file

@ -892,6 +892,9 @@ public class CPPVisitor {
if( binding == null ){ if( binding == null ){
binding = CPPSemantics.resolveBinding( name ); binding = CPPSemantics.resolveBinding( name );
name.setBinding( binding ); name.setBinding( binding );
if( name instanceof ICPPASTTemplateId && binding instanceof ICPPSpecialization ){
((ICPPASTTemplateId)name).getTemplateName().setBinding( ((ICPPSpecialization)binding).getSpecializedBinding() );
}
} }
return binding; return binding;
} }