Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 61328 Details for
Bug 167098
Index: no support for templates
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
initial patch
patch167098v1.txt (text/plain), 187.55 KB, created by
Bryan Wilkinson
on 2007-03-19 16:11:56 EDT
(
hide
)
Description:
initial patch
Filename:
MIME Type:
Creator:
Bryan Wilkinson
Created:
2007-03-19 16:11:56 EDT
Size:
187.55 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.cdt.core >Index: parser/org/eclipse/cdt/internal/core/pdom/PDOM.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java,v >retrieving revision 1.60 >diff -u -r1.60 PDOM.java >--- parser/org/eclipse/cdt/internal/core/pdom/PDOM.java 14 Mar 2007 12:37:10 -0000 1.60 >+++ parser/org/eclipse/cdt/internal/core/pdom/PDOM.java 19 Mar 2007 20:03:57 -0000 >@@ -73,7 +73,7 @@ > public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { > protected Database db; > >- public static final int VERSION = 26; >+ public static final int VERSION = 27; > // 0 - the beginning of it all > // 1 - first change to kick off upgrades > // 2 - added file inclusions >@@ -101,6 +101,7 @@ > // 24 - file local scopes (161216) > // 25 - change ordering of bindings (175275) > // 26 - add properties storage >+ // 27 - templates: classes, functions, limited nesting support, only template type parameters > > public static final int LINKAGES = Database.DATA_AREA; > public static final int FILE_INDEX = Database.DATA_AREA + 4; >Index: parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java,v >retrieving revision 1.2 >diff -u -r1.2 ICPPSpecialization.java >--- parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java 23 Jun 2005 16:02:11 -0000 1.2 >+++ parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPSpecialization.java 19 Mar 2007 20:03:56 -0000 >@@ -15,6 +15,7 @@ > package org.eclipse.cdt.core.dom.ast.cpp; > > import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.parser.util.ObjectMap; > > /** > * @author aniefer >@@ -36,4 +37,11 @@ > * @return > */ > public IBinding getSpecializedBinding(); >+ >+ /** >+ * return a map which maps from template parameter to the corresponding >+ * template argument >+ * @return >+ */ >+ public ObjectMap getArgumentMap(); > } >Index: parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java,v >retrieving revision 1.4 >diff -u -r1.4 ICPPTemplateInstance.java >--- parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java 23 Jun 2005 16:02:11 -0000 1.4 >+++ parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateInstance.java 19 Mar 2007 20:03:56 -0000 >@@ -14,7 +14,6 @@ > package org.eclipse.cdt.core.dom.ast.cpp; > > import org.eclipse.cdt.core.dom.ast.IType; >-import org.eclipse.cdt.core.parser.util.ObjectMap; > > /** > * @author aniefer >@@ -43,11 +42,4 @@ > * @return > */ > public IType [] getArguments(); >- >- /** >- * return a map which maps from template parameter to the corresponding >- * template argument >- * @return >- */ >- public ObjectMap getArgumentMap(); > } >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java,v >retrieving revision 1.6 >diff -u -r1.6 CPPSpecialization.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java 31 Oct 2006 10:08:55 -0000 1.6 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java 19 Mar 2007 20:03:57 -0000 >@@ -111,4 +111,7 @@ > public ILinkage getLinkage() { > return Linkage.CPP_LINKAGE; > } >+ public ObjectMap getArgumentMap() { >+ return argumentMap; >+ } > } >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java,v >retrieving revision 1.4 >diff -u -r1.4 CPPClassTemplatePartialSpecialization.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java 23 Jun 2005 16:02:11 -0000 1.4 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplatePartialSpecialization.java 19 Mar 2007 20:03:56 -0000 >@@ -65,7 +65,7 @@ > } > > IType [] specArgs = getArguments(); >- if( specArgs.length != arguments.length ){ >+ if( specArgs.length != args.length ){ > return null; > } > >@@ -103,4 +103,8 @@ > public IBinding getSpecializedBinding() { > return getPrimaryClassTemplate(); > } >+ >+ public ObjectMap getArgumentMap() { >+ return null; >+ } > } >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java,v >retrieving revision 1.7 >diff -u -r1.7 CPPTemplateScope.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java 6 Feb 2007 12:17:08 -0000 1.7 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateScope.java 19 Mar 2007 20:03:57 -0000 >@@ -60,8 +60,8 @@ > * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPScope#getScopeName() > */ > public IName getScopeName() { >- // TODO Auto-generated method stub >- return null; >+ ICPPASTTemplateDeclaration template = (ICPPASTTemplateDeclaration) getPhysicalNode(); >+ return CPPTemplates.getTemplateName(template); > } > > public IScope getParent() { >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java,v >retrieving revision 1.24 >diff -u -r1.24 CPPTemplates.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java 11 Jan 2007 03:22:53 -0000 1.24 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java 19 Mar 2007 20:03:57 -0000 >@@ -176,10 +176,33 @@ > ICPPTemplateDefinition template = getContainingTemplate( templateParameter ); > > IBinding binding = null; >- if( template instanceof CPPTemplateDefinition ){ >- binding = ((CPPTemplateDefinition)template).resolveTemplateParameter( templateParameter ); >- } else if( template instanceof CPPTemplateTemplateParameter ){ >+ if( template instanceof CPPTemplateTemplateParameter ){ > binding = ((CPPTemplateTemplateParameter)template).resolveTemplateParameter( templateParameter ); >+ } else if (template instanceof CPPTemplateDefinition) { >+ binding = ((CPPTemplateDefinition) template).resolveTemplateParameter(templateParameter); >+ } else if (template != null) { >+ IASTName name = CPPTemplates.getTemplateParameterName(templateParameter); >+ binding = name.getBinding(); >+ >+ if (binding == null) { >+ ICPPASTTemplateDeclaration templateDecl = (ICPPASTTemplateDeclaration) templateParameter.getParent(); >+ ICPPASTTemplateParameter[] ps = templateDecl.getTemplateParameters(); >+ >+ int i = 0; >+ for (; i < ps.length; i++) { >+ if (templateParameter == ps[i]) >+ break; >+ } >+ >+ try { >+ ICPPTemplateParameter[] params = template.getTemplateParameters(); >+ if (i < params.length) { >+ binding = params[i]; >+ name.setBinding(binding); >+ } >+ } catch (DOMException e) { >+ } >+ } > } > > return binding; >@@ -249,10 +272,10 @@ > template = ((ICPPSpecialization)template).getSpecializedBinding(); > } > >- if( template != null && template instanceof ICPPInternalTemplate ){ >+ if( template != null && template instanceof ICPPInternalTemplateInstantiator){ > IASTNode [] args = id.getTemplateArguments(); > IType [] types = CPPTemplates.createTypeArray( args ); >- return ((ICPPInternalTemplate)template).instantiate( types ); >+ return ((ICPPInternalTemplateInstantiator) template).instantiate(types); > } > } else { > //functions are instatiated as part of the resolution process >@@ -279,8 +302,8 @@ > > ICPPClassTemplate classTemplate = (ICPPClassTemplate) template; > IType [] args = createTypeArray( id.getTemplateArguments() ); >- if( classTemplate instanceof ICPPInternalTemplate ){ >- IBinding binding = ((ICPPInternalTemplate)classTemplate).instantiate( args ); >+ if( classTemplate instanceof ICPPInternalTemplateInstantiator ){ >+ IBinding binding = ((ICPPInternalTemplateInstantiator)classTemplate).instantiate( args ); > return binding; > } > return null; >@@ -330,7 +353,9 @@ > if( spec == null ) { > ICPPScope scope = (ICPPScope) CPPVisitor.getContainingScope( id ); > spec = new CPPClassSpecialization(binding, scope, argMap ); >- ((ICPPInternalTemplate)template).addSpecialization( args, (ICPPSpecialization) spec ); >+ if (template instanceof ICPPInternalTemplate) { >+ ((ICPPInternalTemplate)template).addSpecialization( args, (ICPPSpecialization) spec ); >+ } > } > IASTNode parent = id.getParent(); > while( !(parent instanceof IASTDeclSpecifier ) ) >@@ -727,6 +752,9 @@ > } > } > } else { >+ while (templateDecl.getDeclaration() instanceof ICPPASTTemplateDeclaration) { >+ templateDecl = (ICPPASTTemplateDeclaration) templateDecl.getDeclaration(); >+ } > return templateDecl; > } > } >@@ -845,7 +873,8 @@ > if( bindingsToClear == null ) > bindingsToClear = new ObjectSet( templateParams.length ); > tn.setBinding( defParams[i] ); >- ((ICPPInternalBinding)defParams[i]).addDeclaration( tn ); >+ if (defParams[i] instanceof ICPPInternalBinding) >+ ((ICPPInternalBinding)defParams[i]).addDeclaration( tn ); > bindingsToClear.put( defParams[i] ); > } > >@@ -1002,7 +1031,7 @@ > instanceArgs = (IType[]) ArrayUtil.append( IType.class, instanceArgs, (arg != null) ? arg : mapped ); > } > instanceArgs = (IType[]) ArrayUtil.trim( IType.class, instanceArgs ); >- ICPPSpecialization temp = (ICPPSpecialization) ((ICPPInternalTemplate)template).instantiate( instanceArgs ); >+ ICPPSpecialization temp = (ICPPSpecialization) ((ICPPInternalTemplateInstantiator)template).instantiate( instanceArgs ); > if( temp != null ) > instances = (IFunction[]) ArrayUtil.append( IFunction.class, instances, temp ); > } >@@ -1274,7 +1303,7 @@ > return -1; > } > >- static protected ICPPTemplateDefinition matchTemplatePartialSpecialization( ICPPClassTemplate template, IType[] args ) throws DOMException{ >+ static public ICPPTemplateDefinition matchTemplatePartialSpecialization( ICPPClassTemplate template, IType[] args ) throws DOMException{ > if( template == null ){ > return null; > } >@@ -1532,7 +1561,7 @@ > arg = arguments[i]; > //If the argument is a template parameter, we can't instantiate yet, defer for later > if( typeContainsTemplateParameter( arg ) ){ >- return ((ICPPInternalTemplate)template).deferredInstance( arguments ); >+ return ((ICPPInternalTemplateInstantiator)template).deferredInstance(arguments); > } > } else { > IType defaultType = null; >@@ -1569,7 +1598,7 @@ > } > } > >- ICPPSpecialization instance = ((ICPPInternalTemplate)template).getInstance( actualArgs ); >+ ICPPSpecialization instance = ((ICPPInternalTemplateInstantiator)template).getInstance( actualArgs ); > if( instance != null ){ > return instance; > } >@@ -1587,7 +1616,8 @@ > return e.getProblem(); > } > instance = (ICPPTemplateInstance) CPPTemplates.createInstance( scope, template, map, arguments ); >- ((ICPPInternalTemplate)template).addSpecialization( arguments, instance ); >+ if (template instanceof ICPPInternalTemplate) >+ ((ICPPInternalTemplate)template).addSpecialization( arguments, instance ); > > return instance; > } >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java,v >retrieving revision 1.12 >diff -u -r1.12 CPPClassInstance.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java 24 Oct 2006 17:03:12 -0000 1.12 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java 19 Mar 2007 20:03:56 -0000 >@@ -23,6 +23,7 @@ > import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; > 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.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; >@@ -172,7 +173,7 @@ > return true; > if( type instanceof ITypedef ) > return ((ITypedef)type).isSameType( this ); >- if( type instanceof CPPDeferredClassInstance ) >+ if( type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType ) > return type.isSameType( this ); //the CPPDeferredClassInstance has some fuzziness > > if( type instanceof ICPPTemplateInstance ){ >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java,v >retrieving revision 1.5 >diff -u -r1.5 CPPClassTemplateSpecialization.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java 3 Jan 2007 22:56:30 -0000 1.5 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplateSpecialization.java 19 Mar 2007 20:03:56 -0000 >@@ -16,11 +16,13 @@ > > import org.eclipse.cdt.core.dom.ast.DOMException; > import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IProblemBinding; > import org.eclipse.cdt.core.dom.ast.IType; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; > import org.eclipse.cdt.core.parser.util.ArrayUtil; > import org.eclipse.cdt.core.parser.util.ObjectMap; >@@ -94,7 +96,20 @@ > } > > public IBinding instantiate(IType[] arguments) { >- // TODO Auto-generated method stub >+ ICPPTemplateDefinition template = null; >+ >+ try { >+ template = CPPTemplates.matchTemplatePartialSpecialization( (ICPPClassTemplate) this, arguments ); >+ } catch (DOMException e) { >+ return e.getProblem(); >+ } >+ >+ if( template instanceof IProblemBinding ) >+ return template; >+ if( template != null && template instanceof ICPPClassTemplatePartialSpecialization ){ >+ return ((CPPTemplateDefinition)template).instantiate( arguments ); >+ } >+ > return CPPTemplates.instantiateTemplate( this, arguments, argumentMap ); > } > >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java,v >retrieving revision 1.7 >diff -u -r1.7 CPPDeferredFunctionInstance.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java 23 Jun 2005 16:02:12 -0000 1.7 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java 19 Mar 2007 20:03:56 -0000 >@@ -21,6 +21,7 @@ > import org.eclipse.cdt.core.dom.ast.IParameter; > import org.eclipse.cdt.core.dom.ast.IScope; > import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; >@@ -32,7 +33,7 @@ > /** > * @author aniefer > */ >-public class CPPDeferredFunctionInstance extends CPPInstance implements ICPPFunction, ICPPInternalFunction { >+public class CPPDeferredFunctionInstance extends CPPInstance implements ICPPFunction, ICPPInternalFunction, ICPPDeferredTemplateInstance { > private IParameter [] parameters; > private IType[] arguments; > private IFunctionType functionType; >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java,v >retrieving revision 1.5 >diff -u -r1.5 CPPTemplateTypeParameter.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java 23 Jun 2005 16:02:12 -0000 1.5 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java 19 Mar 2007 20:03:57 -0000 >@@ -23,6 +23,7 @@ > import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; > import org.eclipse.cdt.core.parser.util.ObjectMap; >+import org.eclipse.cdt.internal.core.index.IIndexType; > > /** > * @author aniefer >@@ -72,8 +73,8 @@ > public boolean isSameType( IType type ) { > if( type == this ) > return true; >- if( type instanceof ITypedef ) >- return ((ITypedef)type).isSameType( this ); >+ if( type instanceof ITypedef || type instanceof IIndexType ) >+ return type.isSameType( this ); > return false; > } > >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java,v >retrieving revision 1.10 >diff -u -r1.10 CPPDeferredClassInstance.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java 25 Nov 2005 02:02:01 -0000 1.10 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java 19 Mar 2007 20:03:56 -0000 >@@ -23,6 +23,7 @@ > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; > 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.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; >@@ -32,7 +33,8 @@ > /** > * @author aniefer > */ >-public class CPPDeferredClassInstance extends CPPInstance implements ICPPClassType { >+public class CPPDeferredClassInstance extends CPPInstance implements >+ ICPPClassType, ICPPDeferredTemplateInstance { > > public IType [] arguments = null; > public ICPPClassTemplate classTemplate = null; >@@ -169,8 +171,8 @@ > return true; > > //allow some fuzziness here. >- if( type instanceof CPPDeferredClassInstance ){ >- ICPPClassTemplate typeClass = (ICPPClassTemplate) ((CPPDeferredClassInstance)type).getSpecializedBinding(); >+ if( type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType ){ >+ ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance)type).getSpecializedBinding(); > return (typeClass == classTemplate ); > } else if( type instanceof ICPPClassTemplate && classTemplate == type ){ > return true; >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPInstance.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPInstance.java,v >retrieving revision 1.6 >diff -u -r1.6 CPPInstance.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPInstance.java 23 Jun 2005 16:02:11 -0000 1.6 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPInstance.java 19 Mar 2007 20:03:56 -0000 >@@ -39,13 +39,6 @@ > } > > /* (non-Javadoc) >- * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPInstance#getArgumentMap() >- */ >- public ObjectMap getArgumentMap() { >- return argumentMap; >- } >- >- /* (non-Javadoc) > * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArguments() > */ > public IType[] getArguments() { >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java,v >retrieving revision 1.23 >diff -u -r1.23 CPPClassTemplate.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java 29 Jan 2007 11:51:43 -0000 1.23 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java 19 Mar 2007 20:03:56 -0000 >@@ -450,6 +450,8 @@ > checkForDefinition(); > if( definition != null ) { > IASTNode parent = definition.getParent(); >+ while (parent instanceof IASTName) >+ parent = parent.getParent(); > if (parent instanceof ICPPASTCompositeTypeSpecifier) { > ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier)parent; > return compSpec.getScope(); >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplate.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplate.java,v >retrieving revision 1.2 >diff -u -r1.2 ICPPInternalTemplate.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplate.java 23 Jun 2005 16:02:11 -0000 1.2 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplate.java 19 Mar 2007 20:03:57 -0000 >@@ -14,7 +14,6 @@ > */ > package org.eclipse.cdt.internal.core.dom.parser.cpp; > >-import org.eclipse.cdt.core.dom.ast.IBinding; > import org.eclipse.cdt.core.dom.ast.IType; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; > >@@ -22,13 +21,6 @@ > * @author aniefer > * > */ >-public interface ICPPInternalTemplate extends ICPPInternalBinding { >- >+public interface ICPPInternalTemplate extends ICPPInternalBinding, ICPPInternalTemplateInstantiator { > public void addSpecialization( IType [] arguments, ICPPSpecialization specialization ); >- >- public IBinding instantiate( IType [] arguments ); >- >- public ICPPSpecialization deferredInstance( IType [] arguments ); >- >- public ICPPSpecialization getInstance( IType [] arguments ); > } >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java,v >retrieving revision 1.153 >diff -u -r1.153 CPPSemantics.java >--- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java 26 Feb 2007 09:54:06 -0000 1.153 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java 19 Mar 2007 20:03:57 -0000 >@@ -680,7 +680,8 @@ > } > if( binding instanceof ICPPClassTemplate ){ > ASTNodeProperty prop = data.astName.getPropertyInParent(); >- if( prop != ICPPASTQualifiedName.SEGMENT_NAME && prop != ICPPASTTemplateId.TEMPLATE_NAME ){ >+ if( prop != ICPPASTQualifiedName.SEGMENT_NAME && prop != ICPPASTTemplateId.TEMPLATE_NAME && >+ binding instanceof ICPPInternalBinding){ > try { > IASTNode def = ((ICPPInternalBinding)binding).getDefinition(); > if( def != null ){ >@@ -2034,7 +2035,7 @@ > { > //ok, delegates are synonyms > } else if( type instanceof ICPPClassTemplate && temp instanceof ICPPSpecialization && >- ((ICPPSpecialization)temp).getSpecializedBinding() == type ) >+ ((IType) type).isSameType((IType) ((ICPPSpecialization)temp).getSpecializedBinding())) > { > //ok, stay with the template, the specialization, if applicable, will come out during instantiation > } else if( type != temp && !((IType)type).isSameType( (IType) temp )) { >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java,v >retrieving revision 1.15 >diff -u -r1.15 PDOMCPPField.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java 31 Jan 2007 13:26:18 -0000 1.15 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPField.java 19 Mar 2007 20:03:57 -0000 >@@ -17,6 +17,7 @@ > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; > import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; > import org.eclipse.core.runtime.CoreException; > > /** >@@ -25,7 +26,7 @@ > */ > class PDOMCPPField extends PDOMCPPVariable implements ICPPField { > >- public PDOMCPPField(PDOM pdom, PDOMCPPClassType parent, ICPPField field) >+ public PDOMCPPField(PDOM pdom, PDOMNode parent, ICPPField field) > throws CoreException { > super(pdom, parent, field); > } >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java,v >retrieving revision 1.18 >diff -u -r1.18 PDOMCPPMethod.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java 15 Dec 2006 11:30:00 -0000 1.18 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java 19 Mar 2007 20:03:58 -0000 >@@ -54,7 +54,7 @@ > private static final int CV_OFFSET = PDOMCPPAnnotation.MAX_EXTRA_OFFSET + 1; > > public PDOMCPPMethod(PDOM pdom, PDOMNode parent, ICPPMethod method) throws CoreException { >- super(pdom, parent, method); >+ super(pdom, parent, method, true); > > Database db = pdom.getDB(); > >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java,v >retrieving revision 1.45 >diff -u -r1.45 PDOMCPPClassType.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java 26 Feb 2007 09:06:51 -0000 1.45 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java 19 Mar 2007 20:03:57 -0000 >@@ -187,7 +187,7 @@ > } > } > >- private void acceptInHierarchy(Set visited, IPDOMVisitor visitor) throws CoreException { >+ protected void acceptInHierarchy(Set visited, IPDOMVisitor visitor) throws CoreException { > if (visited.contains(this)) > return; > visited.add(this); >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java,v >retrieving revision 1.20 >diff -u -r1.20 PDOMCPPFunction.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java 13 Feb 2007 09:14:33 -0000 1.20 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java 19 Mar 2007 20:03:57 -0000 >@@ -29,7 +29,7 @@ > import org.eclipse.cdt.internal.core.index.IIndexType; > import org.eclipse.cdt.internal.core.pdom.PDOM; > import org.eclipse.cdt.internal.core.pdom.db.Database; >-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; > import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; > import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; > import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation; >@@ -39,68 +39,68 @@ > * @author Doug Schaefer > * > */ >-class PDOMCPPFunction extends PDOMCPPBinding implements IIndexType, ICPPFunction, ICPPFunctionType { >+class PDOMCPPFunction extends PDOMCPPBinding implements IIndexType, ICPPFunction, ICPPFunctionType, IPDOMOverloader { > > /** > * Offset of total number of function parameters (relative to the > * beginning of the record). > */ >- private static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0; >+ private static final int NUM_PARAMS = PDOMCPPBinding.RECORD_SIZE + 0; > > /** > * Offset of pointer to the first parameter of this function (relative to > * the beginning of the record). > */ >- private static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4; >+ private static final int FIRST_PARAM = PDOMCPPBinding.RECORD_SIZE + 4; > > /** > * Offset of hash of parameter information to allow fast comparison > */ >- private static final int SIGNATURE_MEMENTO = PDOMBinding.RECORD_SIZE + 8; >+ private static final int SIGNATURE_MEMENTO = PDOMCPPBinding.RECORD_SIZE + 8; > > /** > * Offset for return type of this function (relative to > * the beginning of the record). > */ >- private static final int RETURN_TYPE = PDOMBinding.RECORD_SIZE + 12; >+ private static final int RETURN_TYPE = PDOMCPPBinding.RECORD_SIZE + 12; > > /** > * Offset of annotation information (relative to the beginning of the > * record). > */ >- protected static final int ANNOTATION = PDOMBinding.RECORD_SIZE + 16; // byte >+ protected static final int ANNOTATION = PDOMCPPBinding.RECORD_SIZE + 16; // byte > > /** > * The size in bytes of a PDOMCPPFunction record in the database. > */ >- protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 17; >+ protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 17; > >- public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function) throws CoreException { >+ public PDOMCPPFunction(PDOM pdom, PDOMNode parent, ICPPFunction function, boolean setTypes) throws CoreException { > super(pdom, parent, function.getNameCharArray()); > > Database db = pdom.getDB(); > IBinding binding = function; > try { > IFunctionType ft= function.getType(); >- IType rt= ft.getReturnType(); >- if (rt != null) { >- PDOMNode typeNode = getLinkageImpl().addType(this, rt); >- if (typeNode != null) { >- db.putInt(record + RETURN_TYPE, typeNode.getRecord()); >- } >- } >- > IParameter[] params= function.getParameters(); > IType[] paramTypes= ft.getParameterTypes(); > db.putInt(record + NUM_PARAMS, params.length); > >- for (int i=0; i<params.length; ++i) { >- IType pt= i<paramTypes.length ? paramTypes[i] : null; >- setFirstParameter(new PDOMCPPParameter(pdom, this, params[i], pt)); >- } > db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(binding)); >- IFunctionType ftype = function.getType(); >- db.putInt(record + SIGNATURE_MEMENTO, getSignatureMemento(ftype.getParameterTypes())); >+ Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(binding); >+ pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); >+ >+ if (setTypes) { >+ IType rt= ft.getReturnType(); >+ if (rt != null) { >+ setReturnType(rt); >+ } >+ >+ for (int i=0; i<params.length; ++i) { >+ IType pt= i<paramTypes.length ? paramTypes[i] : null; >+ setFirstParameter(new PDOMCPPParameter(pdom, this, params[i], pt)); >+ } >+ } > } catch (DOMException e) { > throw new CoreException(Util.createStatus(e)); > } >@@ -220,6 +220,13 @@ > return null; > } > >+ public void setReturnType(IType type) throws CoreException { >+ PDOMNode typeNode = getLinkageImpl().addType(this, type); >+ if (typeNode != null) { >+ pdom.getDB().putInt(record + RETURN_TYPE, typeNode.getRecord()); >+ } >+ } >+ > public boolean isConst() { > // ISO/IEC 14882:2003 9.3.1.3 > // Only applicable to member functions >@@ -279,32 +286,7 @@ > public Object clone() { > throw new PDOMNotImplementedError(); > } >- >- public static int getSignatureMemento(IType[] types) throws DOMException { >- if(types.length==1) { >- if(types[0] instanceof IBasicType) { >- if(((IBasicType)types[0]).getType()==IBasicType.t_void) { >- types = new IType[0]; >- } >- } >- } >- StringBuffer result = new StringBuffer(); >- result.append('('); >- for(int i=0; i<types.length; i++) { >- if (i>0) { >- result.append(','); >- } >- result.append(ASTTypeUtil.getType(types[i])); >- } >- result.append(')'); >- return result.toString().hashCode(); >- } >- >- public static int getSignatureMemento(IFunctionType type) throws DOMException { >- IType[] params = type.getParameterTypes(); >- return getSignatureMemento(params); >- } >- >+ > public int compareTo(Object other) { > int cmp = super.compareTo(other); > if(cmp==0) { >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java,v >retrieving revision 1.2 >diff -u -r1.2 CPPFindBinding.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java 23 Feb 2007 17:05:43 -0000 1.2 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/CPPFindBinding.java 19 Mar 2007 20:03:57 -0000 >@@ -15,14 +15,12 @@ > import org.eclipse.cdt.core.dom.IPDOMVisitor; > import org.eclipse.cdt.core.dom.ast.DOMException; > import org.eclipse.cdt.core.dom.ast.IBinding; >-import org.eclipse.cdt.core.dom.ast.IFunction; >-import org.eclipse.cdt.core.dom.ast.IFunctionType; >-import org.eclipse.cdt.core.dom.ast.IType; > import org.eclipse.cdt.internal.core.pdom.PDOM; > import org.eclipse.cdt.internal.core.pdom.db.BTree; > import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; > import org.eclipse.cdt.internal.core.pdom.db.IString; > import org.eclipse.cdt.internal.core.pdom.dom.FindBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; > import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; > import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; > import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; >@@ -33,57 +31,56 @@ > > /** > * Look up bindings in BTree objects and IPDOMNode objects. This additionally >- * takes into account function/method parameters for overloading. >+ * takes into account function/method parameters as well as template >+ * specialization arguments for overloading, . > */ > public class CPPFindBinding extends FindBinding { >- public static PDOMBinding findBinding(BTree btree, final PDOM pdom, final char[]name, final int c2, final IType[] types) throws CoreException { >+ public static PDOMBinding findBinding(BTree btree, final PDOM pdom, final char[]name, final int c2, final int ty2) throws CoreException { > final PDOMBinding[] result = new PDOMBinding[1]; >- try { >- final int ty2 = PDOMCPPFunction.getSignatureMemento(types); >- btree.accept(new IBTreeVisitor() { >- public int compare(int record) throws CoreException { >- IString nm1 = PDOMNamedNode.getDBName(pdom, record); >- >- int cmp= nm1.compare(name, false); >- cmp= cmp==0 ? nm1.compare(name, true) : cmp; >- >- if(cmp==0) { >- int c1 = PDOMNode.getNodeType(pdom, record); >- cmp = c1 < c2 ? -1 : (c1 > c2 ? 1 : 0); >- if(cmp==0) { >- PDOMBinding binding = pdom.getBinding(record); >- if(binding instanceof PDOMCPPFunction) { >- int ty1 = ((PDOMCPPFunction)binding).getSignatureMemento(); >- cmp = ty1 < ty2 ? -1 : (ty1 > ty2 ? 1 : 0); >- } >+ >+ btree.accept(new IBTreeVisitor() { >+ public int compare(int record) throws CoreException { >+ IString nm1 = PDOMNamedNode.getDBName(pdom, record); >+ >+ int cmp = nm1.compare(name, false); >+ cmp = cmp == 0 ? nm1.compare(name, true) : cmp; >+ >+ if (cmp == 0) { >+ int c1 = PDOMNode.getNodeType(pdom, record); >+ cmp = c1 < c2 ? -1 : (c1 > c2 ? 1 : 0); >+ if (cmp == 0) { >+ PDOMBinding binding = pdom.getBinding(record); >+ if (binding instanceof IPDOMOverloader) { >+ int ty1 = ((IPDOMOverloader) binding) >+ .getSignatureMemento(); >+ cmp = ty1 < ty2 ? -1 : (ty1 > ty2 ? 1 : 0); > } > } >- return cmp; > } >- public boolean visit(int record) throws CoreException { >- result[0] = pdom.getBinding(record); >- return false; >- } >- }); >- } catch(DOMException de) { >- CCorePlugin.log(de); >- } >+ return cmp; >+ } >+ >+ public boolean visit(int record) throws CoreException { >+ result[0] = pdom.getBinding(record); >+ return false; >+ } >+ }); >+ > return result[0]; > } > > >- public static PDOMBinding findBinding(PDOMNode node, final PDOM pdom, final char[]name, final int constant, final IType[] types) { >+ public static PDOMBinding findBinding(PDOMNode node, final PDOM pdom, final char[]name, final int constant, final int ty2) { > final PDOMBinding[] result = new PDOMBinding[1]; > try { >- final int ty2 = PDOMCPPFunction.getSignatureMemento(types); > node.accept(new IPDOMVisitor() { > public boolean visit(IPDOMNode binding) throws CoreException { > if(binding instanceof PDOMNamedNode) { > PDOMNamedNode nnode = (PDOMNamedNode) binding; > if(nnode.hasName(name)) { > if(nnode.getNodeType() == constant) { >- if(binding instanceof PDOMCPPFunction) { >- int ty1 = ((PDOMCPPFunction)binding).getSignatureMemento(); >+ if(binding instanceof IPDOMOverloader) { >+ int ty1 = ((IPDOMOverloader)binding).getSignatureMemento(); > if(ty1==ty2) { > result[0] = (PDOMBinding) binding; > throw new CoreException(Status.OK_STATUS); >@@ -102,40 +99,35 @@ > } else { > CCorePlugin.log(ce); > } >- } catch(DOMException de) { >- CCorePlugin.log(de); > } > return null; > } > > >- public static PDOMBinding findBinding(BTree btree, PDOMLinkage linkage, IBinding binding) throws CoreException { >- if(binding instanceof IFunction) { >- try { >- IFunctionType type = ((IFunction) binding).getType(); >- return findBinding(btree, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), type.getParameterTypes()); >- } catch(DOMException de) { >- CCorePlugin.log(de); >- return null; >- } >+ public static PDOMBinding findBinding(BTree btree, PDOMLinkage linkage, IBinding binding) throws CoreException { >+ Integer memento = null; >+ try { >+ memento = PDOMCPPOverloaderUtil.getSignatureMemento(binding); >+ } catch (DOMException e) { >+ } >+ if(memento != null) { >+ return findBinding(btree, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), memento.intValue()); > } > return findBinding(btree, linkage.getPDOM(), binding.getNameCharArray(), new int [] {linkage.getBindingType(binding)}); > } > >- >- public static PDOMBinding findBinding(PDOMNode node, PDOMLinkage linkage, IBinding binding) { >- if(binding instanceof IFunction) { >- try { >- IFunctionType type = ((IFunction) binding).getType(); >- return findBinding(node, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), type.getParameterTypes()); >- } catch(DOMException de) { >- CCorePlugin.log(de); >- return null; >- } >+ public static PDOMBinding findBinding(PDOMNode node, PDOMLinkage linkage, IBinding binding) throws CoreException { >+ Integer memento = null; >+ try { >+ memento = PDOMCPPOverloaderUtil.getSignatureMemento(binding); >+ } catch (DOMException e) { >+ } >+ if(memento != null) { >+ return findBinding(node, linkage.getPDOM(), binding.getNameCharArray(), linkage.getBindingType(binding), memento.intValue()); > } > return findBinding(node, linkage.getPDOM(), binding.getNameCharArray(), new int[] {linkage.getBindingType(binding)}); > } >- >+ > public static class CPPBindingBTreeComparator extends FindBinding.DefaultBindingBTreeComparator { > public CPPBindingBTreeComparator(PDOM pdom) { > super(pdom); >@@ -145,9 +137,9 @@ > if(cmp==0) { > PDOMBinding binding1 = pdom.getBinding(record1); > PDOMBinding binding2 = pdom.getBinding(record2); >- if(binding1 instanceof PDOMCPPFunction && binding2 instanceof PDOMCPPFunction) { >- int ty1 = ((PDOMCPPFunction)binding1).getSignatureMemento(); >- int ty2 = ((PDOMCPPFunction)binding2).getSignatureMemento(); >+ if(binding1 instanceof IPDOMOverloader && binding2 instanceof IPDOMOverloader) { >+ int ty1 = ((IPDOMOverloader)binding1).getSignatureMemento(); >+ int ty2 = ((IPDOMOverloader)binding2).getSignatureMemento(); > cmp = ty1 < ty2 ? -1 : (ty1 > ty2 ? 1 : 0); > } > } >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java,v >retrieving revision 1.62 >diff -u -r1.62 PDOMCPPLinkage.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java 8 Feb 2007 15:44:45 -0000 1.62 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java 19 Mar 2007 20:03:58 -0000 >@@ -13,6 +13,9 @@ > > package org.eclipse.cdt.internal.core.pdom.dom.cpp; > >+import java.util.ArrayList; >+import java.util.List; >+ > import org.eclipse.cdt.core.CCorePlugin; > import org.eclipse.cdt.core.dom.ast.DOMException; > import org.eclipse.cdt.core.dom.ast.IASTName; >@@ -20,6 +23,7 @@ > import org.eclipse.cdt.core.dom.ast.IBinding; > import org.eclipse.cdt.core.dom.ast.IEnumeration; > import org.eclipse.cdt.core.dom.ast.IEnumerator; >+import org.eclipse.cdt.core.dom.ast.IFunctionType; > import org.eclipse.cdt.core.dom.ast.IParameter; > import org.eclipse.cdt.core.dom.ast.IProblemBinding; > import org.eclipse.cdt.core.dom.ast.IScope; >@@ -28,20 +32,29 @@ > import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; > 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.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; > 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.ICPPNamespaceAlias; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; >-import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+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.ICPPTemplateTypeParameter; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; > import org.eclipse.cdt.internal.core.Util; > import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassInstanceScope; > import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction; > import org.eclipse.cdt.internal.core.pdom.PDOM; > import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; >@@ -94,7 +107,79 @@ > public static final int CPP_POINTER_TO_MEMBER_TYPE= PDOMLinkage.LAST_NODE_TYPE + 13; > public static final int CPP_CONSTRUCTOR= PDOMLinkage.LAST_NODE_TYPE + 14; > public static final int CPP_REFERENCE_TYPE= PDOMLinkage.LAST_NODE_TYPE + 15; >- >+ public static final int CPP_FUNCTION_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 16; >+ public static final int CPP_CLASS_TEMPLATE= PDOMLinkage.LAST_NODE_TYPE + 17; >+ public static final int CPP_CLASS_TEMPLATE_PARTIAL_SPEC= PDOMLinkage.LAST_NODE_TYPE + 18; >+ public static final int CPP_FUNCTION_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 19; >+ public static final int CPP_DEFERRED_FUNCTION_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 20; >+ public static final int CPP_CLASS_INSTANCE= PDOMLinkage.LAST_NODE_TYPE + 21; >+ public static final int CPP_DEFERRED_CLASS_INSTANCE= PDOMCPPLinkage.LAST_NODE_TYPE + 22; >+ public static final int CPP_TEMPLATE_TYPE_PARAMETER= PDOMLinkage.LAST_NODE_TYPE + 23; >+ public static final int CPP_TEMPLATE_NON_TYPE_PARAMETER= PDOMLinkage.LAST_NODE_TYPE + 24; >+ public static final int CPP_PARAMETER_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 25; >+ public static final int CPP_FIELD_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 26; >+ public static final int CPP_FUNCTION_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 27; >+ public static final int CPP_METHOD_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 28; >+ public static final int CPP_CONSTRUCTOR_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 29; >+ public static final int CPP_CLASS_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 30; >+ public static final int CPP_CLASS_TEMPLATE_SPECIALIZATION= PDOMLinkage.LAST_NODE_TYPE + 31; >+ >+ private class ConfigurePartialSpecialization implements Runnable { >+ PDOMCPPClassTemplatePartialSpecialization partial; >+ ICPPClassTemplatePartialSpecialization binding; >+ >+ public ConfigurePartialSpecialization(PDOMCPPClassTemplatePartialSpecialization partial, ICPPClassTemplatePartialSpecialization binding) { >+ this.partial = partial; >+ this.binding = binding; >+ } >+ >+ public void run() { >+ try { >+ IType[] args = binding.getArguments(); >+ for (int i = 0; i < args.length; i++) { >+ partial.addArgument(args[i]); >+ } >+ } catch (CoreException e) { >+ } catch (DOMException e) { >+ } finally { >+ partial = null; >+ binding = null; >+ } >+ } >+ } >+ >+ private class ConfigureFunctionTemplate implements Runnable { >+ PDOMCPPFunctionTemplate template; >+ ICPPFunction binding; >+ >+ public ConfigureFunctionTemplate(PDOMCPPFunctionTemplate template, ICPPFunction binding) { >+ this.template = template; >+ this.binding = binding; >+ } >+ >+ public void run() { >+ try { >+ IFunctionType ft = binding.getType(); >+ template.setReturnType(ft.getReturnType()); >+ >+ IParameter[] params= binding.getParameters(); >+ IType[] paramTypes= ft.getParameterTypes(); >+ >+ for (int i=0; i<params.length; ++i) { >+ IType pt= i<paramTypes.length ? paramTypes[i] : null; >+ template.setFirstParameter(new PDOMCPPParameter(pdom, PDOMCPPLinkage.this, params[i], pt)); >+ } >+ } catch (CoreException e) { >+ } catch (DOMException e) { >+ } finally { >+ template = null; >+ binding = null; >+ } >+ } >+ } >+ >+ List postProcesses = new ArrayList(); >+ > public PDOMBinding addBinding(IASTName name) throws CoreException { > if (name == null || name instanceof ICPPASTQualifiedName) > return null; >@@ -116,16 +201,18 @@ > return null; > > PDOMBinding pdomBinding = addBinding(binding); >- if (pdomBinding instanceof PDOMCPPClassType) { >- PDOMCPPClassType pdomClassType= (PDOMCPPClassType) pdomBinding; >+ if (pdomBinding instanceof PDOMCPPClassType || pdomBinding instanceof PDOMCPPClassSpecialization) { > if (binding instanceof ICPPClassType && name.isDefinition()) { >- addImplicitMethods(pdomClassType, (ICPPClassType) binding); >+ addImplicitMethods(pdomBinding, (ICPPClassType) binding); > } > } >+ >+ handlePostProcesses(); >+ > return pdomBinding; > } > >- private PDOMBinding addBinding(IBinding binding) throws CoreException { >+ public PDOMBinding addBinding(IBinding binding) throws CoreException { > // assign names to anonymous types. > binding= PDOMASTAdapter.getAdapterIfAnonymous(binding); > if (binding == null) { >@@ -135,7 +222,8 @@ > PDOMBinding pdomBinding = adaptBinding(binding); > try { > if (pdomBinding == null) { >- PDOMNode parent = getAdaptedParent(binding, true); >+ boolean addParent = shouldAddParent(binding); >+ PDOMNode parent = getAdaptedParent(binding, true, addParent); > if (parent == null) > return null; > pdomBinding = addBinding(parent, binding); >@@ -147,28 +235,104 @@ > return pdomBinding; > } > >+ private boolean shouldAddParent(IBinding binding) throws CoreException { >+ if (binding instanceof ICPPTemplateParameter) { >+ return true; >+ } else if (binding instanceof ICPPClassTemplatePartialSpecialization) { >+ return true; >+ } else if (binding instanceof ICPPSpecialization) { >+ try { >+ IScope scope = binding.getScope(); >+ if (scope instanceof CPPClassInstanceScope) >+ return true; >+ } catch (DOMException e) { >+ } >+ } >+ return false; >+ } >+ > private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException { > PDOMBinding pdomBinding= null; > >- if (binding instanceof ICPPField ) { >- if (parent instanceof PDOMCPPClassType) { >- pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding); >+ if (binding instanceof ICPPSpecialization) { >+ IBinding specialized = ((ICPPSpecialization)binding).getSpecializedBinding(); >+ PDOMBinding pdomSpecialized = addBinding(specialized); >+ >+ if (binding instanceof ICPPDeferredTemplateInstance) { >+ if (binding instanceof ICPPFunction && pdomSpecialized instanceof ICPPFunctionTemplate) { >+ pdomBinding = new PDOMCPPDeferredFunctionInstance(pdom, >+ parent, (ICPPFunction) binding, >+ (PDOMCPPFunctionTemplate) pdomSpecialized); >+ } else if (binding instanceof ICPPClassType && pdomSpecialized instanceof ICPPClassTemplate) { >+ pdomBinding = new PDOMCPPDeferredClassInstance(pdom, >+ parent, (ICPPClassType) binding, >+ (PDOMCPPClassTemplate) pdomSpecialized); >+ } >+ } else if (binding instanceof ICPPTemplateInstance) { >+ if (binding instanceof ICPPFunction && pdomSpecialized instanceof PDOMCPPFunctionTemplate) { >+ pdomBinding = new PDOMCPPFunctionInstance(pdom, parent, >+ (ICPPFunction) binding, >+ (PDOMCPPFunctionTemplate) pdomSpecialized); >+ } else if (binding instanceof ICPPClassType && pdomSpecialized instanceof PDOMCPPClassTemplate) { >+ pdomBinding = new PDOMCPPClassInstance(pdom, parent, >+ (ICPPClassType) binding, pdomSpecialized); >+ } else if (binding instanceof ICPPClassType && pdomSpecialized instanceof PDOMCPPClassTemplateSpecialization) { >+ pdomBinding = new PDOMCPPClassInstance(pdom, parent, >+ (ICPPClassType) binding, pdomSpecialized); >+ } >+ } else if (binding instanceof ICPPClassTemplatePartialSpecialization) { >+ pdomBinding = new PDOMCPPClassTemplatePartialSpecialization( >+ pdom, parent, >+ (ICPPClassTemplatePartialSpecialization) binding, >+ (PDOMCPPClassTemplate) pdomSpecialized); >+ } else if (binding instanceof ICPPField && pdomSpecialized instanceof PDOMCPPField) { >+ pdomBinding = new PDOMCPPFieldSpecialization(pdom, parent, >+ (ICPPField) binding, (PDOMCPPField) pdomSpecialized); >+ } else if (binding instanceof ICPPConstructor) { >+ pdomBinding = new PDOMCPPConstructorSpecialization(pdom, parent, >+ (ICPPConstructor) binding, pdomSpecialized); >+ } else if (binding instanceof ICPPMethod) { >+ pdomBinding = new PDOMCPPMethodSpecialization(pdom, parent, >+ (ICPPMethod) binding, pdomSpecialized); >+ } else if (binding instanceof ICPPFunction) { >+ pdomBinding = new PDOMCPPFunctionSpecialization(pdom, parent, >+ (ICPPFunction) binding, pdomSpecialized); >+ } else if (binding instanceof ICPPClassTemplate) { >+ pdomBinding = new PDOMCPPClassTemplateSpecialization(pdom, parent, >+ (ICPPClassTemplate) binding, pdomSpecialized); >+ } else if (binding instanceof ICPPClassType) { >+ pdomBinding = new PDOMCPPClassSpecialization(pdom, parent, >+ (ICPPClassType) binding, pdomSpecialized); >+ } >+ } else if (binding instanceof ICPPField ) { >+ if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) { >+ pdomBinding = new PDOMCPPField(pdom, parent, (ICPPField) binding); > } > } else if (binding instanceof ICPPVariable) { > if (!(binding.getScope() instanceof CPPBlockScope)) { > ICPPVariable var= (ICPPVariable) binding; > pdomBinding = new PDOMCPPVariable(pdom, parent, var); > } >+ } else if (binding instanceof ICPPFunctionTemplate) { >+ if (binding instanceof ICPPConstructor) { >+ //TODO >+ } else if (binding instanceof ICPPMethod) { >+ //TODO >+ } else if (binding instanceof ICPPFunction) { >+ pdomBinding= new PDOMCPPFunctionTemplate(pdom, parent, (ICPPFunctionTemplate) binding); >+ } > } else if (binding instanceof ICPPConstructor) { >- if (parent instanceof PDOMCPPClassType) { >+ if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) { > pdomBinding = new PDOMCPPConstructor(pdom, parent, (ICPPConstructor)binding); > } > } else if (binding instanceof ICPPMethod) { >- if (parent instanceof PDOMCPPClassType) { >+ if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) { > pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding); > } > } else if (binding instanceof ICPPFunction) { >- pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding); >+ pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding, true); >+ } else if (binding instanceof ICPPClassTemplate) { >+ pdomBinding= new PDOMCPPClassTemplate(pdom, parent, (ICPPClassTemplate) binding); > } else if (binding instanceof ICPPClassType) { > pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding); > } else if (binding instanceof ICPPNamespaceAlias) { >@@ -185,15 +349,33 @@ > (PDOMCPPEnumeration)pdomEnumeration); > } else if (binding instanceof ITypedef) { > pdomBinding = new PDOMCPPTypedef(pdom, parent, (ITypedef)binding); >+ } else if (binding instanceof ICPPTemplateTypeParameter) { >+ pdomBinding = new PDOMCPPTemplateTypeParameter(pdom, parent, (ICPPTemplateTypeParameter)binding); > } > > if(pdomBinding!=null) { > parent.addChild(pdomBinding); > } >+ >+ pushPostProcess(pdomBinding, binding); >+ > return pdomBinding; > } >- >- private void addImplicitMethods(PDOMCPPClassType type, ICPPClassType binding) throws CoreException { >+ >+ private void pushPostProcess(PDOMBinding pdomBinding, IBinding binding) throws CoreException, DOMException { >+ if (pdomBinding instanceof PDOMCPPClassTemplatePartialSpecialization && >+ binding instanceof ICPPClassTemplatePartialSpecialization) { >+ PDOMCPPClassTemplatePartialSpecialization pdomSpec = (PDOMCPPClassTemplatePartialSpecialization) pdomBinding; >+ ICPPClassTemplatePartialSpecialization spec = (ICPPClassTemplatePartialSpecialization) binding; >+ postProcesses.add(postProcesses.size(), new ConfigurePartialSpecialization(pdomSpec, spec)); >+ } else if (pdomBinding instanceof PDOMCPPFunctionTemplate && binding instanceof ICPPFunction) { >+ PDOMCPPFunctionTemplate pdomTemplate = (PDOMCPPFunctionTemplate) pdomBinding; >+ ICPPFunction function = (ICPPFunction) binding; >+ postProcesses.add(postProcesses.size(), new ConfigureFunctionTemplate(pdomTemplate, function)); >+ } >+ } >+ >+ private void addImplicitMethods(PDOMBinding type, ICPPClassType binding) throws CoreException { > try { > IScope scope = binding.getCompositeScope(); > if (scope instanceof ICPPClassScope) { >@@ -211,15 +393,46 @@ > } > > public int getBindingType(IBinding binding) { >- if (binding instanceof ICPPTemplateDefinition) >- // this must be before class type >- return 0; >- else if (binding instanceof ICPPField) >+ if (binding instanceof ICPPSpecialization) { >+ if (binding instanceof ICPPDeferredTemplateInstance) { >+ if (binding instanceof ICPPFunction) >+ return CPP_DEFERRED_FUNCTION_INSTANCE; >+ if (binding instanceof ICPPClassType) >+ return CPP_DEFERRED_CLASS_INSTANCE; >+ } else if (binding instanceof ICPPTemplateInstance) { >+ if (binding instanceof ICPPFunction) >+ return CPP_FUNCTION_INSTANCE; >+ else if (binding instanceof ICPPClassType) >+ return CPP_CLASS_INSTANCE; >+ } else if (binding instanceof ICPPClassTemplatePartialSpecialization) { >+ return CPP_CLASS_TEMPLATE_PARTIAL_SPEC; >+ } else if (binding instanceof ICPPField) >+ return CPP_FIELD_SPECIALIZATION; >+ else if (binding instanceof ICPPConstructor) >+ return CPP_CONSTRUCTOR_SPECIALIZATION; >+ else if (binding instanceof ICPPMethod) >+ return CPP_METHOD_SPECIALIZATION; >+ else if (binding instanceof ICPPFunction) >+ return CPP_FUNCTION_SPECIALIZATION; >+ else if (binding instanceof ICPPClassTemplate) >+ return CPP_CLASS_TEMPLATE_SPECIALIZATION; >+ else if (binding instanceof ICPPClassType) >+ return CPP_CLASS_SPECIALIZATION; >+ } else if (binding instanceof ICPPField) > // this must be before variables > return CPPFIELD; > else if (binding instanceof ICPPVariable) > return CPPVARIABLE; >- else if (binding instanceof ICPPConstructor) >+ else if (binding instanceof ICPPFunctionTemplate) { >+ // this must be before functions >+ if (binding instanceof ICPPConstructor) { >+ //TODO >+ } else if (binding instanceof ICPPMethod) { >+ //TODO >+ } else if (binding instanceof ICPPFunction) { >+ return CPP_FUNCTION_TEMPLATE; >+ } >+ } else if (binding instanceof ICPPConstructor) > // before methods > return CPP_CONSTRUCTOR; > else if (binding instanceof ICPPMethod) >@@ -227,6 +440,9 @@ > return CPPMETHOD; > else if (binding instanceof ICPPFunction) > return CPPFUNCTION; >+ else if (binding instanceof ICPPClassTemplate) >+ // this must be before class type >+ return CPP_CLASS_TEMPLATE; > else if (binding instanceof ICPPClassType) > return CPPCLASSTYPE; > else if (binding instanceof ICPPNamespaceAlias) >@@ -239,8 +455,12 @@ > return CPPENUMERATOR; > else if (binding instanceof ITypedef) > return CPPTYPEDEF; >- else >- return 0; >+ else if (binding instanceof ICPPTemplateTypeParameter) >+ return CPP_TEMPLATE_TYPE_PARAMETER; >+ else if (binding instanceof ICPPTemplateNonTypeParameter) >+ return CPP_TEMPLATE_NON_TYPE_PARAMETER; >+ >+ return 0; > } > > /** >@@ -266,7 +486,7 @@ > } > } > >- PDOMNode parent = getAdaptedParent(binding, false); >+ PDOMNode parent = getAdaptedParent(binding, false, false); > > if (parent == this) { > return CPPFindBinding.findBinding(getIndex(), this, binding); >@@ -288,31 +508,48 @@ > } > > public PDOMNode addType(PDOMNode parent, IType type) throws CoreException { >- if (type instanceof IProblemBinding) { >- return null; >- } >- if (type instanceof ICPPBasicType) { >- return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType)type); >- } >- if (type instanceof ICPPClassType) { >- return addBinding((ICPPClassType) type); >- } >- if (type instanceof IEnumeration) { >- return addBinding((IEnumeration) type); >- } >- if (type instanceof ITypedef) { >- return addBinding((ITypedef) type); >- } >- if (type instanceof ICPPReferenceType) { >- return new PDOMCPPReferenceType(pdom, parent, (ICPPReferenceType)type); >- } >- if (type instanceof ICPPPointerToMemberType) { >- return new PDOMCPPPointerToMemberType(pdom, parent, (ICPPPointerToMemberType)type); >+ try { >+ if (type instanceof IProblemBinding) { >+ return null; >+ } >+ if (type instanceof ICPPBasicType) { >+ return new PDOMCPPBasicType(pdom, parent, (ICPPBasicType)type); >+ } >+ if (type instanceof ICPPClassType) { >+ return addBinding((ICPPClassType) type); >+ } >+ if (type instanceof IEnumeration) { >+ return addBinding((IEnumeration) type); >+ } >+ if (type instanceof ITypedef) { >+ return addBinding((ITypedef) type); >+ } >+ if (type instanceof ICPPReferenceType) { >+ return new PDOMCPPReferenceType(pdom, parent, (ICPPReferenceType)type); >+ } >+ if (type instanceof ICPPPointerToMemberType) { >+ return new PDOMCPPPointerToMemberType(pdom, parent, (ICPPPointerToMemberType)type); >+ } >+ if (type instanceof ICPPTemplateTypeParameter) { >+ return addBinding((ICPPTemplateTypeParameter) type); >+ } >+ >+ return super.addType(parent, type); >+ } finally { >+ handlePostProcesses(); > } >- >- return super.addType(parent, type); > } > >+ private void handlePostProcesses() { >+ while (!postProcesses.isEmpty()) { >+ popPostProcess().run(); >+ } >+ } >+ >+ private Runnable popPostProcess() { >+ return (Runnable) postProcesses.remove(postProcesses.size() - 1); >+ } >+ > public PDOMNode getNode(int record) throws CoreException { > if (record == 0) > return null; >@@ -346,7 +583,34 @@ > return new PDOMCPPPointerToMemberType(pdom, record); > case CPP_REFERENCE_TYPE: > return new PDOMCPPReferenceType(pdom, record); >- >+ case CPP_FUNCTION_TEMPLATE: >+ return new PDOMCPPFunctionTemplate(pdom, record); >+ case CPP_CLASS_TEMPLATE: >+ return new PDOMCPPClassTemplate(pdom, record); >+ case CPP_CLASS_TEMPLATE_PARTIAL_SPEC: >+ return new PDOMCPPClassTemplatePartialSpecialization(pdom, record); >+ case CPP_FUNCTION_INSTANCE: >+ return new PDOMCPPFunctionInstance(pdom, record); >+ case CPP_DEFERRED_FUNCTION_INSTANCE: >+ return new PDOMCPPDeferredFunctionInstance(pdom, record); >+ case CPP_CLASS_INSTANCE: >+ return new PDOMCPPClassInstance(pdom, record); >+ case CPP_DEFERRED_CLASS_INSTANCE: >+ return new PDOMCPPDeferredClassInstance(pdom, record); >+ case CPP_TEMPLATE_TYPE_PARAMETER: >+ return new PDOMCPPTemplateTypeParameter(pdom, record); >+ case CPP_FIELD_SPECIALIZATION: >+ return new PDOMCPPFieldSpecialization(pdom, record); >+ case CPP_FUNCTION_SPECIALIZATION: >+ return new PDOMCPPFunctionSpecialization(pdom, record); >+ case CPP_METHOD_SPECIALIZATION: >+ return new PDOMCPPMethodSpecialization(pdom, record); >+ case CPP_CONSTRUCTOR_SPECIALIZATION: >+ return new PDOMCPPConstructorSpecialization(pdom, record); >+ case CPP_CLASS_SPECIALIZATION: >+ return new PDOMCPPClassSpecialization(pdom, record); >+ case CPP_CLASS_TEMPLATE_SPECIALIZATION: >+ return new PDOMCPPClassTemplateSpecialization(pdom, record); > default: > return super.getNode(record); > } >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java,v >retrieving revision 1.41 >diff -u -r1.41 PDOMCLinkage.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java 8 Feb 2007 15:44:45 -0000 1.41 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java 19 Mar 2007 20:03:57 -0000 >@@ -78,7 +78,7 @@ > public PDOMBinding addBinding(IBinding binding) throws CoreException { > PDOMBinding pdomBinding = adaptBinding(binding); > if (pdomBinding == null) { >- PDOMNode parent = getAdaptedParent(binding, true); >+ PDOMNode parent = getAdaptedParent(binding, true, false); > if (parent == null) > return null; > >@@ -176,7 +176,7 @@ > return null; > } > } >- PDOMNode parent = getAdaptedParent(binding, false); >+ PDOMNode parent = getAdaptedParent(binding, false, false); > > if (parent == this) { > return FindBinding.findBinding(getIndex(), getPDOM(), binding.getNameCharArray(), new int[] {getBindingType(binding)}); >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java,v >retrieving revision 1.35 >diff -u -r1.35 PDOMLinkage.java >--- parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java 26 Feb 2007 09:54:06 -0000 1.35 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java 19 Mar 2007 20:03:57 -0000 >@@ -29,11 +29,17 @@ > import org.eclipse.cdt.core.dom.ast.IQualifierType; > import org.eclipse.cdt.core.dom.ast.IScope; > import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; > import org.eclipse.cdt.core.index.IIndexBinding; > import org.eclipse.cdt.core.index.IIndexLinkage; > import org.eclipse.cdt.internal.core.Util; > import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassInstanceScope; > import org.eclipse.cdt.internal.core.index.IIndexScope; > import org.eclipse.cdt.internal.core.index.composite.CompositeScope; > import org.eclipse.cdt.internal.core.pdom.PDOM; >@@ -175,6 +181,8 @@ > > public abstract PDOMBinding addBinding(IASTName name) throws CoreException; > >+ public abstract PDOMBinding addBinding(IBinding binding) throws CoreException; >+ > public abstract PDOMBinding adaptBinding(IBinding binding) throws CoreException; > > public abstract PDOMBinding resolveBinding(IASTName name) throws CoreException; >@@ -190,7 +198,7 @@ > * </ul> > * @throws CoreException > */ >- protected PDOMNode getAdaptedParent(IBinding binding, boolean createFileLocalScope) throws CoreException { >+ protected PDOMNode getAdaptedParent(IBinding binding, boolean createFileLocalScope, boolean addParent) throws CoreException { > try { > IScope scope = binding.getScope(); > if (scope == null) { >@@ -203,7 +211,14 @@ > // in an index the null scope represents global scope. > return this; > } >- return null; >+ >+ if (binding instanceof ICPPDeferredTemplateInstance) { >+ ICPPDeferredTemplateInstance deferred = (ICPPDeferredTemplateInstance) binding; >+ ICPPTemplateDefinition template = deferred.getTemplateDefinition(); >+ scope = template.getScope(); >+ } else { >+ return null; >+ } > } > > if(scope instanceof IIndexScope) { >@@ -215,6 +230,10 @@ > } > > // the scope is from the ast >+ if (scope instanceof ICPPTemplateScope && !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPTemplateInstance)) { >+ scope = scope.getParent(); >+ } >+ > if (scope instanceof ICPPNamespaceScope) { > IName name= scope.getScopeName(); > if (name != null && name.toCharArray().length == 0) { >@@ -234,10 +253,22 @@ > return this; > } > else { >- IName scopeName = scope.getScopeName(); >- if (scopeName instanceof IASTName) { >- IBinding scopeBinding = ((IASTName) scopeName).resolveBinding(); >- PDOMBinding scopePDOMBinding = adaptBinding(scopeBinding); >+ IBinding scopeBinding = null; >+ if (scope instanceof CPPClassInstanceScope) { >+ scopeBinding = ((CPPClassInstanceScope)scope).getClassType(); >+ } else { >+ IName scopeName = scope.getScopeName(); >+ if (scopeName instanceof IASTName) { >+ scopeBinding = ((IASTName) scopeName).resolveBinding(); >+ } >+ } >+ if (scopeBinding != null) { >+ PDOMBinding scopePDOMBinding = null; >+ if (addParent) { >+ scopePDOMBinding = addBinding(scopeBinding); >+ } else { >+ scopePDOMBinding = adaptBinding(scopeBinding); >+ } > if (scopePDOMBinding != null) > return scopePDOMBinding; > } >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameterSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameterSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameterSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameterSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,128 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.Database; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPParameterSpecialization extends PDOMCPPSpecialization >+ implements ICPPParameter { >+ >+ /** >+ * Offset of pointer to the next parameter (relative to the >+ * beginning of the record). >+ */ >+ private static final int NEXT_PARAM = PDOMCPPSpecialization.RECORD_SIZE + 0; >+ >+ /** >+ * Offset of pointer to type information for this parameter >+ * (relative to the beginning of the record). >+ */ >+ private static final int TYPE = PDOMCPPSpecialization.RECORD_SIZE + 4; >+ >+ /** >+ * The size in bytes of a PDOMCPPParameterSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8; >+ >+ public PDOMCPPParameterSpecialization(PDOM pdom, PDOMNode parent, ICPPParameter param, PDOMCPPParameter specialized, IType type) >+ throws CoreException { >+ super(pdom, parent, (ICPPSpecialization) param, specialized); >+ >+ Database db = pdom.getDB(); >+ >+ db.putInt(record + NEXT_PARAM, 0); >+ >+ try { >+ if (type == null) >+ type= param.getType(); >+ if (type != null) { >+ PDOMNode typeNode = getLinkageImpl().addType(this, type); >+ db.putInt(record + TYPE, typeNode != null ? typeNode.getRecord() : 0); >+ } >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPParameterSpecialization(PDOM pdom, int record) { >+ super(pdom, record); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_PARAMETER_SPECIALIZATION; >+ } >+ >+ public void setNextParameter(PDOMCPPParameterSpecialization nextParam) throws CoreException { >+ int rec = nextParam != null ? nextParam.getRecord() : 0; >+ pdom.getDB().putInt(record + NEXT_PARAM, rec); >+ } >+ >+ public PDOMCPPParameterSpecialization getNextParameter() throws CoreException { >+ int rec = pdom.getDB().getInt(record + NEXT_PARAM); >+ return rec != 0 ? new PDOMCPPParameterSpecialization(pdom, rec) : null; >+ } >+ >+ public IType getType() throws DOMException { >+ try { >+ PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE)); >+ return node instanceof IType ? (IType)node : null; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return null; >+ } >+ } >+ >+ private ICPPParameter getParameter(){ >+ return (ICPPParameter) getSpecializedBinding(); >+ } >+ >+ public boolean hasDefaultValue() { >+ return getParameter().hasDefaultValue(); >+ } >+ >+ public boolean isAuto() throws DOMException { >+ return getParameter().isAuto(); >+ } >+ >+ public boolean isRegister() throws DOMException { >+ return getParameter().isRegister(); >+ } >+ >+ public boolean isExtern() throws DOMException { >+ return false; >+ } >+ >+ public boolean isStatic() throws DOMException { >+ return false; >+ } >+ >+ public boolean isMutable() throws DOMException { >+ return false; >+ } >+ >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,108 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IField; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; >+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.ICPPDeferredTemplateInstance; >+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.internal.core.index.IIndexType; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPDeferredClassInstance extends PDOMCPPInstance implements >+ ICPPClassType, IIndexType, ICPPDeferredTemplateInstance { >+ >+ /** >+ * The size in bytes of a PDOMCPPDeferredClassInstance record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPInstance.RECORD_SIZE + 0; >+ >+ public PDOMCPPDeferredClassInstance(PDOM pdom, PDOMNode parent, ICPPClassType classType, PDOMCPPClassTemplate instantiated) >+ throws CoreException { >+ super(pdom, parent, (ICPPTemplateInstance) classType, instantiated); >+ } >+ >+ public PDOMCPPDeferredClassInstance(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_DEFERRED_CLASS_INSTANCE; >+ } >+ >+ public ICPPBase[] getBases() throws DOMException { >+ return ((ICPPClassType) getSpecializedBinding()).getBases(); >+ } >+ >+ public IScope getCompositeScope() throws DOMException { >+ return ((ICPPClassType) getSpecializedBinding()).getCompositeScope(); >+ } >+ >+ public int getKey() throws DOMException { >+ return ((ICPPClassType) getSpecializedBinding()).getKey(); >+ } >+ >+ public boolean isSameType(IType type) { >+ if( type instanceof PDOMNode ) { >+ PDOMNode node = (PDOMNode) type; >+ if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { >+ return true; >+ } >+ } >+ >+ ICPPClassTemplate classTemplate = (ICPPClassTemplate) getTemplateDefinition(); >+ >+ //allow some fuzziness here. >+ if( type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType ){ >+ ICPPClassTemplate typeClass = (ICPPClassTemplate) ((ICPPDeferredTemplateInstance)type).getSpecializedBinding(); >+ return (typeClass == classTemplate ); >+ } else if( type instanceof ICPPClassTemplate && classTemplate == type ){ >+ return true; >+ } else if( type instanceof ICPPTemplateInstance && ((ICPPTemplateInstance)type).getTemplateDefinition() == classTemplate ){ >+ return true; >+ } >+ return false; >+ } >+ >+ public ICPPConstructor[] getConstructors() throws DOMException { >+ return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; >+ } >+ >+ //Unimplemented >+ public IField findField(String name) throws DOMException { fail(); return null; } >+ public ICPPMethod[] getAllDeclaredMethods() throws DOMException { fail(); return null; } >+ public ICPPField[] getDeclaredFields() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getDeclaredMethods() throws DOMException { fail(); return null; } >+ public IField[] getFields() throws DOMException { fail(); return null; } >+ public IBinding[] getFriends() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } >+ public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } >+ public Object clone() {fail();return null;} >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,219 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IASTName; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IField; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.ITypedef; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; >+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.ICPPDeferredTemplateInstance; >+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.index.IIndexBinding; >+import org.eclipse.cdt.core.parser.util.ObjectMap; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics; >+import org.eclipse.cdt.internal.core.index.IIndexScope; >+import org.eclipse.cdt.internal.core.index.IIndexType; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPClassInstance extends PDOMCPPInstance implements >+ ICPPClassType, ICPPClassScope, IPDOMMemberOwner, IIndexType, IIndexScope { >+ >+ private static final int MEMBERLIST = PDOMCPPInstance.RECORD_SIZE + 0; >+ >+ /** >+ * The size in bytes of a PDOMCPPClassInstance record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPInstance.RECORD_SIZE + 4; >+ >+ public PDOMCPPClassInstance(PDOM pdom, PDOMNode parent, ICPPClassType classType, PDOMBinding instantiated) >+ throws CoreException { >+ super(pdom, parent, (ICPPTemplateInstance) classType, instantiated); >+ } >+ >+ public PDOMCPPClassInstance(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CLASS_INSTANCE; >+ } >+ >+ public ICPPBase[] getBases() throws DOMException { >+ //TODO Get bases >+ return ICPPBase.EMPTY_BASE_ARRAY; >+ } >+ >+ private static class ConstructorCollector implements IPDOMVisitor { >+ private List fConstructors = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof ICPPConstructor) >+ fConstructors.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPConstructor[] getConstructors() { >+ return (ICPPConstructor[])fConstructors.toArray(new ICPPConstructor[fConstructors.size()]); >+ } >+ } >+ >+ public ICPPConstructor[] getConstructors() throws DOMException { >+ ConstructorCollector visitor= new ConstructorCollector(); >+ try { >+ accept(visitor); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return visitor.getConstructors(); >+ } >+ >+ public int getKey() throws DOMException { >+ return ((ICPPClassType)getSpecializedBinding()).getKey(); >+ } >+ >+ public IScope getCompositeScope() throws DOMException { >+ return this; >+ } >+ >+ public boolean isSameType(IType type) { >+ if( type instanceof PDOMNode ) { >+ PDOMNode node = (PDOMNode) type; >+ if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { >+ return true; >+ } >+ } >+ if( type instanceof ITypedef ) >+ return ((ITypedef)type).isSameType( this ); >+ if( type instanceof ICPPDeferredTemplateInstance && type instanceof ICPPClassType ) >+ return type.isSameType( this ); //the CPPDeferredClassInstance has some fuzziness >+ >+ if( type instanceof ICPPTemplateInstance ){ >+ if( getSpecializedBinding() != ((ICPPTemplateInstance)type).getTemplateDefinition() ) >+ return false; >+ >+ ObjectMap m1 = getArgumentMap(), m2 = ((ICPPTemplateInstance)type).getArgumentMap(); >+ if( m1 == null || m2 == null || m1.size() != m2.size()) >+ return false; >+ for( int i = 0; i < m1.size(); i++ ){ >+ IType t1 = (IType) m1.getAt( i ); >+ IType t2 = (IType) m2.getAt( i ); >+ if( t1 == null || ! t1.isSameType( t2 ) ) >+ return false; >+ } >+ return true; >+ } >+ >+ return false; >+ } >+ >+ //ICPPClassType unimplemented >+ public IField findField(String name) throws DOMException { fail(); return null; } >+ public ICPPMethod[] getAllDeclaredMethods() throws DOMException { fail(); return null; } >+ public ICPPField[] getDeclaredFields() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getDeclaredMethods() throws DOMException { fail(); return null; } >+ public IField[] getFields() throws DOMException { fail(); return null; } >+ public IBinding[] getFriends() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } >+ public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } >+ public Object clone() {fail();return null;} >+ >+ public ICPPClassType getClassType() { >+ return this; >+ } >+ >+ public IBinding[] find(String name) throws DOMException { >+ return find(name, false); >+ } >+ >+ public IBinding[] find(String name, boolean prefixLookup) >+ throws DOMException { >+ try { >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null, prefixLookup, !prefixLookup); >+ accept(visitor); >+ return visitor.getBindings(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding getBinding(IASTName name, boolean resolve) >+ throws DOMException { >+ try { >+ if (getDBName().equals(name.toCharArray())) { >+ if (CPPClassScope.isConstructorReference(name)){ >+ return CPPSemantics.resolveAmbiguities(name, getConstructors()); >+ } >+ //9.2 ... The class-name is also inserted into the scope of the class itself >+ return this; >+ } >+ >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray()); >+ accept(visitor); >+ return CPPSemantics.resolveAmbiguities(name, visitor.getBindings()); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ //ICPPClassScope unimplemented >+ public ICPPMethod[] getImplicitMethods() { fail(); return null; } >+ >+ public IIndexBinding getScopeBinding() { >+ return this; >+ } >+ >+ public void addChild(PDOMNode member) throws CoreException { >+ addMember(member); >+ } >+ >+ public void addMember(PDOMNode member) throws CoreException { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); >+ list.addMember(member); >+ } >+ >+ public void accept(IPDOMVisitor visitor) throws CoreException { >+ super.accept(visitor); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); >+ list.accept(visitor); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPConstructorSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,51 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPConstructorSpecialization extends >+ PDOMCPPMethodSpecialization implements ICPPConstructor { >+ >+ /** >+ * The size in bytes of a PDOMCPPConstructorSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPMethodSpecialization.RECORD_SIZE + 0; >+ >+ public PDOMCPPConstructorSpecialization(PDOM pdom, PDOMNode parent, ICPPConstructor constructor, PDOMBinding specialized) throws CoreException { >+ super(pdom, parent, constructor, specialized); >+ } >+ >+ public PDOMCPPConstructorSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CONSTRUCTOR_SPECIALIZATION; >+ } >+ >+ public boolean isExplicit() throws DOMException { >+ return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.EXPLICIT_CONSTRUCTOR_OFFSET); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,149 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.parser.util.ObjectMap; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+abstract class PDOMCPPSpecialization extends PDOMCPPBinding implements >+ ICPPSpecialization, IPDOMOverloader { >+ >+ private static final int ARGMAP_PARAMS = PDOMCPPBinding.RECORD_SIZE + 0; >+ private static final int ARGMAP_ARGS = PDOMCPPBinding.RECORD_SIZE + 4; >+ private static final int SIGNATURE_MEMENTO = PDOMCPPBinding.RECORD_SIZE + 8; >+ private static final int SPECIALIZED = PDOMCPPBinding.RECORD_SIZE + 12; >+ >+ /** >+ * The size in bytes of a PDOMCPPSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 16; >+ >+ public PDOMCPPSpecialization(PDOM pdom, PDOMNode parent, ICPPSpecialization spec, PDOMNamedNode specialized) >+ throws CoreException { >+ super(pdom, parent, spec.getName().toCharArray()); >+ pdom.getDB().putInt(record + SPECIALIZED, specialized.getRecord()); >+ >+ PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl()); >+ PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl()); >+ ObjectMap argMap = ((ICPPSpecialization)spec).getArgumentMap(); >+ if (argMap != null) { >+ for (int i = 0; i < argMap.size(); i++) { >+ PDOMNode paramNode = getLinkageImpl().addType(this, (IType) argMap.keyAt(i)); >+ paramList.addMember(paramNode); >+ PDOMNode argNode = getLinkageImpl().addType(this, (IType) argMap.getAt(i)); >+ argList.addMember(argNode); >+ } >+ } >+ try { >+ Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(spec); >+ pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); >+ } catch (DOMException e) { >+ } >+ } >+ >+ public PDOMCPPSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ public IBinding getSpecializedBinding() { >+ try { >+ int specializedRec = pdom.getDB().getInt(record + SPECIALIZED); >+ PDOMNode node = specializedRec != 0 ? >+ getLinkageImpl().getNode(specializedRec) : null; >+ if (node instanceof IBinding) { >+ return (IBinding) node; >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ private static class NodeCollector implements IPDOMVisitor { >+ private List nodes = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ nodes.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public IPDOMNode[] getNodes() { >+ return (IPDOMNode[])nodes.toArray(new IPDOMNode[nodes.size()]); >+ } >+ } >+ >+ public ObjectMap getArgumentMap() { >+ try { >+ PDOMNodeLinkedList paramList = new PDOMNodeLinkedList(pdom, record + ARGMAP_PARAMS, getLinkageImpl()); >+ PDOMNodeLinkedList argList = new PDOMNodeLinkedList(pdom, record + ARGMAP_ARGS, getLinkageImpl()); >+ NodeCollector paramVisitor = new NodeCollector(); >+ paramList.accept(paramVisitor); >+ IPDOMNode[] paramNodes = paramVisitor.getNodes(); >+ NodeCollector argVisitor = new NodeCollector(); >+ argList.accept(argVisitor); >+ IPDOMNode[] argNodes = argVisitor.getNodes(); >+ >+ ObjectMap map = new ObjectMap(paramNodes.length); >+ for (int i = 0; i < paramNodes.length; i++) { >+ map.put(paramNodes[i], argNodes[i]); >+ } >+ >+ return map; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public int getSignatureMemento() throws CoreException { >+ return pdom.getDB().getInt(record + SIGNATURE_MEMENTO); >+ } >+ >+ private static IType[] getArguments(ObjectMap argMap) { >+ IType[] args = new IType[argMap.size()]; >+ for (int i = 0; i < argMap.size(); i++) { >+ args[i] = (IType) argMap.getAt(i); >+ } >+ return args; >+ } >+ >+ public boolean matchesArguments(IType[] arguments) { >+ IType [] args = getArguments(getArgumentMap()); >+ if( args.length == arguments.length ){ >+ int i = 0; >+ for(; i < args.length; i++) { >+ if( !( args[i].isSameType( arguments[i] ) ) ) >+ break; >+ } >+ return i == args.length; >+ } >+ return false; >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplatePartialSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,169 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.parser.util.ObjectMap; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMOverloader; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPClassTemplatePartialSpecialization extends >+ PDOMCPPClassTemplate implements ICPPClassTemplatePartialSpecialization, ICPPSpecialization, IPDOMOverloader { >+ >+ private static final int ARGUMENTS = PDOMCPPClassTemplate.RECORD_SIZE + 0; >+ private static final int SIGNATURE_MEMENTO = PDOMCPPClassTemplate.RECORD_SIZE + 4; >+ private static final int PRIMARY = PDOMCPPClassTemplate.RECORD_SIZE + 8; >+ private static final int NEXT_PARTIAL = PDOMCPPClassTemplate.RECORD_SIZE + 12; >+ >+ /** >+ * The size in bytes of a PDOMCPPClassTemplatePartialSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPClassTemplate.RECORD_SIZE + 16; >+ >+ public PDOMCPPClassTemplatePartialSpecialization(PDOM pdom, >+ PDOMNode parent, ICPPClassTemplatePartialSpecialization partial, PDOMBinding primary) throws CoreException { >+ super(pdom, parent, partial); >+ pdom.getDB().putInt(record + PRIMARY, primary.getRecord()); >+ if (primary instanceof PDOMCPPClassTemplate) { >+ ((PDOMCPPClassTemplate)primary).addPartial(this); >+ } else if (primary instanceof PDOMCPPClassTemplateSpecialization) { >+ ((PDOMCPPClassTemplateSpecialization)primary).addPartial(this); >+ } >+ >+ try { >+ Integer memento = PDOMCPPOverloaderUtil.getSignatureMemento(partial); >+ pdom.getDB().putInt(record + SIGNATURE_MEMENTO, memento != null ? memento.intValue() : 0); >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPClassTemplatePartialSpecialization(PDOM pdom, >+ int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ public int getSignatureMemento() throws CoreException { >+ return pdom.getDB().getInt(record + SIGNATURE_MEMENTO); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CLASS_TEMPLATE_PARTIAL_SPEC; >+ } >+ >+ public PDOMCPPClassTemplatePartialSpecialization getNextPartial() throws CoreException { >+ int value = pdom.getDB().getInt(record + NEXT_PARTIAL); >+ return value != 0 ? new PDOMCPPClassTemplatePartialSpecialization(pdom, value) : null; >+ } >+ >+ public void setNextPartial(PDOMCPPClassTemplatePartialSpecialization partial) throws CoreException { >+ int value = partial != null ? partial.getRecord() : 0; >+ pdom.getDB().putInt(record + NEXT_PARTIAL, value); >+ } >+ >+ public ICPPClassTemplate getPrimaryClassTemplate() { >+ try { >+ return new PDOMCPPClassTemplate(pdom, pdom.getDB().getInt(record + PRIMARY)); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return null; >+ } >+ } >+ >+ public IBinding getSpecializedBinding() { >+ return getPrimaryClassTemplate(); >+ } >+ >+ public void addArgument(IType type) throws CoreException { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); >+ PDOMNode typeNode = getLinkageImpl().addType(this, type); >+ list.addMember(typeNode); >+ } >+ >+ private static class TemplateArgumentCollector implements IPDOMVisitor { >+ private List args = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof IType) >+ args.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public IType[] getTemplateArguments() { >+ return (IType[])args.toArray(new IType[args.size()]); >+ } >+ } >+ >+ public IType[] getArguments() { >+ try { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); >+ TemplateArgumentCollector visitor = new TemplateArgumentCollector(); >+ list.accept(visitor); >+ >+ return visitor.getTemplateArguments(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IType[0]; >+ } >+ } >+ >+ public int compareTo(Object other) { >+ int cmp = super.compareTo(other); >+ if(cmp==0) { >+ if(other instanceof PDOMCPPClassTemplatePartialSpecialization) { >+ try { >+ PDOMCPPClassTemplatePartialSpecialization otherSpec = (PDOMCPPClassTemplatePartialSpecialization) other; >+ int mySM = getSignatureMemento(); >+ int otherSM = otherSpec.getSignatureMemento(); >+ return mySM == otherSM ? 0 : mySM < otherSM ? -1 : 1; >+ } catch(CoreException ce) { >+ CCorePlugin.log(ce); >+ } >+ } else { >+ throw new PDOMNotImplementedError(); >+ } >+ } >+ return cmp; >+ } >+ >+ public IBinding instantiate(IType[] args) { >+ return getInstance( args ); >+ } >+ >+ public ObjectMap getArgumentMap() { >+ return null; >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMOverloader.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMOverloader.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMOverloader.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMOverloader.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,32 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom; >+ >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * Interface for any element in the PDOM that can have the same name as a >+ * sibling, but differ in other ways (i.e. function parameters, template >+ * arguments). >+ * >+ * @author Bryan Wilkinson >+ */ >+public interface IPDOMOverloader { >+ >+ /** >+ * Gets the signature memento for this PDOM element, which will be unique >+ * for all sibling IPDOMOverloaders with the same name. >+ * >+ * @return >+ * @throws CoreException >+ */ >+ public int getSignatureMemento() throws CoreException; >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,271 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBasicType; >+import org.eclipse.cdt.core.dom.ast.IFunctionType; >+import org.eclipse.cdt.core.dom.ast.IParameter; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.ITypedef; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.index.IIndexType; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.Database; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; >+import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPFunctionSpecialization extends PDOMCPPSpecialization >+ implements IIndexType, ICPPFunction, ICPPFunctionType { >+ >+ /** >+ * Offset of total number of function parameters (relative to the >+ * beginning of the record). >+ */ >+ private static final int NUM_PARAMS = PDOMCPPSpecialization.RECORD_SIZE + 0; >+ >+ /** >+ * Offset of pointer to the first parameter of this function (relative to >+ * the beginning of the record). >+ */ >+ private static final int FIRST_PARAM = PDOMCPPSpecialization.RECORD_SIZE + 4; >+ >+ /** >+ * Offset for return type of this function (relative to >+ * the beginning of the record). >+ */ >+ private static final int RETURN_TYPE = PDOMCPPSpecialization.RECORD_SIZE + 8; >+ >+ /** >+ * Offset of annotation information (relative to the beginning of the >+ * record). >+ */ >+ protected static final int ANNOTATION = PDOMCPPSpecialization.RECORD_SIZE + 12; // byte >+ >+ /** >+ * The size in bytes of a PDOMCPPFunction record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 13; >+ >+ public PDOMCPPFunctionSpecialization(PDOM pdom, PDOMNode parent, ICPPFunction function, PDOMBinding specialized) throws CoreException { >+ super(pdom, parent, (ICPPSpecialization) function, specialized); >+ if (specialized instanceof PDOMCPPFunctionTemplate) { >+ ((PDOMCPPFunctionTemplate)specialized).addMember(this); >+ } >+ >+ Database db = pdom.getDB(); >+ try { >+ IFunctionType ft= function.getType(); >+ IType rt= ft.getReturnType(); >+ if (rt != null) { >+ PDOMNode typeNode = getLinkageImpl().addType(this, rt); >+ if (typeNode != null) { >+ db.putInt(record + RETURN_TYPE, typeNode.getRecord()); >+ } >+ } >+ >+ IParameter[] params= function.getParameters(); >+ IType[] paramTypes= ft.getParameterTypes(); >+ db.putInt(record + NUM_PARAMS, params.length); >+ >+ ICPPFunction sFunc= (ICPPFunction) ((ICPPSpecialization)function).getSpecializedBinding(); >+ IParameter[] sParams= sFunc.getParameters(); >+ IType[] sParamTypes= sFunc.getType().getParameterTypes(); >+ >+ for (int i=0; i<params.length; ++i) { >+ IType pt= i<paramTypes.length ? paramTypes[i] : null; >+ //TODO shouldn't need to make new parameter (find old one) >+ PDOMCPPParameter sParam = new PDOMCPPParameter(pdom, this, sParams[i], sParamTypes[i]); >+ setFirstParameter(new PDOMCPPParameterSpecialization(pdom, this, (ICPPParameter) params[i], sParam, pt)); >+ } >+ db.putByte(record + ANNOTATION, PDOMCPPAnnotation.encodeAnnotation(function)); >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPFunctionSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_FUNCTION_SPECIALIZATION; >+ } >+ >+ public PDOMCPPParameterSpecialization getFirstParameter() throws CoreException { >+ int rec = pdom.getDB().getInt(record + FIRST_PARAM); >+ return rec != 0 ? new PDOMCPPParameterSpecialization(pdom, rec) : null; >+ } >+ >+ public void setFirstParameter(PDOMCPPParameterSpecialization param) throws CoreException { >+ if (param != null) >+ param.setNextParameter(getFirstParameter()); >+ int rec = param != null ? param.getRecord() : 0; >+ pdom.getDB().putInt(record + FIRST_PARAM, rec); >+ } >+ >+ public boolean isInline() throws DOMException { >+ return getBit(getByte(record + ANNOTATION), PDOMCAnnotation.INLINE_OFFSET); >+ } >+ >+ public boolean isMutable() throws DOMException { >+ throw new PDOMNotImplementedError(); >+ } >+ >+ public IScope getFunctionScope() throws DOMException { >+ throw new PDOMNotImplementedError(); >+ } >+ >+ public IParameter[] getParameters() throws DOMException { >+ try { >+ int n = pdom.getDB().getInt(record + NUM_PARAMS); >+ IParameter[] params = new IParameter[n]; >+ PDOMCPPParameterSpecialization param = getFirstParameter(); >+ while (param != null) { >+ params[--n] = param; >+ param = param.getNextParameter(); >+ } >+ return params; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IParameter[0]; >+ } >+ } >+ >+ public IFunctionType getType() throws DOMException { >+ return this; >+ } >+ >+ public boolean isAuto() throws DOMException { >+ // ISO/IEC 14882:2003 7.1.1.2 >+ return false; >+ } >+ >+ public boolean isExtern() throws DOMException { >+ return getBit(getByte(record + ANNOTATION), PDOMCAnnotation.EXTERN_OFFSET); >+ } >+ >+ public boolean isRegister() throws DOMException { >+ // ISO/IEC 14882:2003 7.1.1.2 >+ return false; >+ } >+ >+ public boolean isStatic() throws DOMException { >+ return getBit(getByte(record + ANNOTATION), PDOMCAnnotation.STATIC_OFFSET); >+ } >+ >+ public boolean takesVarArgs() throws DOMException { >+ return getBit(getByte(record + ANNOTATION), PDOMCAnnotation.VARARGS_OFFSET); >+ } >+ >+ public boolean isSameType(IType type) { >+ if (type instanceof ITypedef) { >+ return type.isSameType(this); >+ } >+ >+ try { >+ if (type instanceof ICPPFunctionType) { >+ ICPPFunctionType ft = (ICPPFunctionType) type; >+ IType rt1= getReturnType(); >+ IType rt2= ft.getReturnType(); >+ if (rt1 != rt2) { >+ if (rt1 == null || !rt1.isSameType(rt2)) { >+ return false; >+ } >+ } >+ >+ IType[] params1= getParameterTypes(); >+ IType[] params2= ft.getParameterTypes(); >+ if( params1.length == 1 && params2.length == 0 ){ >+ if( !(params1[0] instanceof IBasicType) || ((IBasicType)params1[0]).getType() != IBasicType.t_void ) >+ return false; >+ } else if( params2.length == 1 && params1.length == 0 ){ >+ if( !(params2[0] instanceof IBasicType) || ((IBasicType)params2[0]).getType() != IBasicType.t_void ) >+ return false; >+ } else if( params1.length != params2.length ){ >+ return false; >+ } else { >+ for( int i = 0; i < params1.length; i++ ){ >+ if (params1[i] == null || ! params1[i].isSameType( params2[i] ) ) >+ return false; >+ } >+ } >+ >+ if( isConst() != ft.isConst() || isVolatile() != ft.isVolatile() ) >+ return false; >+ >+ return true; >+ } >+ return false; >+ } catch (DOMException e) { >+ } >+ return false; >+ } >+ >+ public boolean isConst() { >+ // ISO/IEC 14882:2003 9.3.1.3 >+ // Only applicable to member functions >+ return false; >+ } >+ >+ public boolean isVolatile() { >+ // ISO/IEC 14882:2003 9.3.1.3 >+ // Only applicable to member functions >+ return false; >+ } >+ >+ public IType[] getParameterTypes() throws DOMException { >+ try { >+ int n = pdom.getDB().getInt(record + NUM_PARAMS); >+ IType[] types = new IType[n]; >+ PDOMCPPParameterSpecialization param = getFirstParameter(); >+ while (param != null) { >+ types[--n] = param.getType(); >+ param = param.getNextParameter(); >+ } >+ return types; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IType[0]; >+ } >+ } >+ >+ public IType getReturnType() throws DOMException { >+ try { >+ PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + RETURN_TYPE)); >+ if (node instanceof IType) { >+ return (IType) node; >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public Object clone() {fail();return null;} >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPOverloaderUtil.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,160 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.dom.IName; >+import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IASTName; >+import org.eclipse.cdt.core.dom.ast.IBasicType; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IFunction; >+import org.eclipse.cdt.core.dom.ast.IFunctionType; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; >+import org.eclipse.cdt.core.parser.util.ObjectMap; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * Determines the signatures and signature mementos for bindings that can have >+ * siblings with the same name. >+ * >+ * @author Bryan Wilkinson >+ */ >+public class PDOMCPPOverloaderUtil { >+ >+ /** >+ * Returns the signature for the binding. Returns an empty string if a >+ * signature is not required for the binding. >+ * >+ * @param binding >+ * @return the signature or an empty string >+ * @throws CoreException >+ * @throws DOMException >+ */ >+ public static String getSignature(IBinding binding) throws CoreException, DOMException { >+ StringBuffer buffer = new StringBuffer(); >+ if (binding instanceof ICPPTemplateInstance) { >+ ICPPTemplateInstance inst = (ICPPTemplateInstance) binding; >+ buffer.append(getTemplateArgString(inst.getArguments(), true)); >+ } else if (binding instanceof ICPPClassTemplatePartialSpecialization) { >+ ICPPClassTemplatePartialSpecialization partial = (ICPPClassTemplatePartialSpecialization) binding; >+ buffer.append(getTemplateArgString(partial.getArguments(), false)); >+ } else if (binding instanceof ICPPSpecialization) { >+ ICPPSpecialization spec = (ICPPSpecialization) binding; >+ ObjectMap argMap = spec.getArgumentMap(); >+ IType[] args = new IType[argMap.size()]; >+ for (int i = 0; i < argMap.size(); i++) { >+ args[i] = (IType) argMap.getAt(i); >+ } >+ buffer.append(getTemplateArgString(args, false)); >+ } >+ >+ if (binding instanceof IFunction) { >+ IFunction function = (IFunction) binding; >+ buffer.append(getFunctionParameterString((function.getType()))); >+ } >+ >+ return buffer.toString(); >+ } >+ >+ /** >+ * Constructs a string in the format: >+ * <typeName1,typeName2,...> >+ * >+ * @param types >+ * @param qualifyTemplateParameters >+ * @return >+ * @throws CoreException >+ * @throws DOMException >+ */ >+ private static String getTemplateArgString(IType[] types, boolean qualifyTemplateParameters) throws CoreException, DOMException { >+ StringBuffer buffer = new StringBuffer(); >+ buffer.append('<'); >+ for (int i = 0; i < types.length; i++) { >+ if (i>0) { >+ buffer.append(','); >+ } >+ if (qualifyTemplateParameters && types[i] instanceof ICPPTemplateParameter) { >+ ICPPBinding parent = null; >+ if (types[i] instanceof PDOMNode) { >+ parent = (ICPPBinding)((PDOMNode)types[i]).getParentNode(); >+ } else { >+ IName parentName = ((ICPPTemplateParameter)types[i]).getScope().getScopeName(); >+ if (parentName instanceof IASTName) { >+ parent = (ICPPBinding)((IASTName)parentName).resolveBinding(); >+ } >+ } >+ //identical template parameters from different templates must have unique signatures >+ if (parent != null) { >+ buffer.append(CPPVisitor.renderQualifiedName(parent.getQualifiedName())); >+ String sig = getSignature(parent); >+ if (sig != null) >+ buffer.append(sig); >+ buffer.append("::"); >+ } >+ buffer.append(((ICPPTemplateParameter)types[i]).getName()); >+ } else { >+ buffer.append(ASTTypeUtil.getType(types[i])); >+ } >+ } >+ buffer.append('>'); >+ return buffer.toString(); >+ } >+ >+ /** >+ * Constructs a string in the format: >+ * (paramName1,paramName2,...) >+ * >+ * @param fType >+ * @return >+ * @throws DOMException >+ */ >+ private static String getFunctionParameterString(IFunctionType fType) throws DOMException { >+ IType[] types = fType.getParameterTypes(); >+ if(types.length==1) { >+ if(types[0] instanceof IBasicType) { >+ if(((IBasicType)types[0]).getType()==IBasicType.t_void) { >+ types = new IType[0]; >+ } >+ } >+ } >+ StringBuffer result = new StringBuffer(); >+ result.append('('); >+ for(int i=0; i<types.length; i++) { >+ if (i>0) { >+ result.append(','); >+ } >+ result.append(ASTTypeUtil.getType(types[i])); >+ } >+ result.append(')'); >+ return result.toString(); >+ } >+ >+ /** >+ * Gets the signature memento for the passed binding. >+ * >+ * @param binding >+ * @return the hash code of the binding's signature string >+ * @throws CoreException >+ * @throws DOMException >+ */ >+ public static Integer getSignatureMemento(IBinding binding) throws CoreException, DOMException { >+ String sig = getSignature(binding); >+ return sig.length() == 0 ? null : new Integer(sig.hashCode()); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFieldSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,114 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.ICompositeType; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPFieldSpecialization extends PDOMCPPSpecialization implements >+ ICPPField { >+ >+ private static final int TYPE = PDOMCPPSpecialization.RECORD_SIZE + 0; >+ >+ /** >+ * The size in bytes of a PDOMCPPFieldSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 4; >+ >+ public PDOMCPPFieldSpecialization(PDOM pdom, PDOMNode parent, >+ ICPPField field, PDOMCPPField specialized) >+ throws CoreException { >+ super(pdom, parent, (ICPPSpecialization) field, specialized); >+ >+ try { >+ IType type = field.getType(); >+ PDOMNode typeNode = getLinkageImpl().addType(this, type); >+ if (typeNode != null) { >+ pdom.getDB().putInt(record + TYPE, typeNode.getRecord()); >+ } >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPFieldSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_FIELD_SPECIALIZATION; >+ } >+ >+ private ICPPField getField() { >+ return (ICPPField) getSpecializedBinding(); >+ } >+ >+ public ICompositeType getCompositeTypeOwner() throws DOMException { >+ return getClassOwner(); >+ } >+ >+ public IType getType() throws DOMException { >+ try { >+ PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE)); >+ if (node instanceof IType) { >+ return (IType) node; >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public boolean isAuto() throws DOMException { >+ return getField().isAuto(); >+ } >+ >+ public boolean isExtern() throws DOMException { >+ return getField().isExtern(); >+ } >+ >+ public boolean isRegister() throws DOMException { >+ return getField().isRegister(); >+ } >+ >+ public boolean isStatic() throws DOMException { >+ return getField().isStatic(); >+ } >+ >+ public ICPPClassType getClassOwner() throws DOMException { >+ return getField().getClassOwner(); >+ } >+ >+ public int getVisibility() throws DOMException { >+ return getField().getVisibility(); >+ } >+ >+ public boolean isMutable() throws DOMException { >+ return getField().isMutable(); >+ } >+} >Index: parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java >diff -N parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,19 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.core.dom.ast.cpp; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+public interface ICPPDeferredTemplateInstance extends ICPPTemplateInstance { >+ >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethodSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,110 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.Database; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPMethodSpecialization extends PDOMCPPFunctionSpecialization >+ implements ICPPMethod { >+ >+ /** >+ * Offset of remaining annotation information (relative to the beginning of >+ * the record). >+ */ >+ protected static final int ANNOTATION1 = PDOMCPPFunctionSpecialization.RECORD_SIZE; // byte >+ >+ /** >+ * The size in bytes of a PDOMCPPMethodSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPFunctionSpecialization.RECORD_SIZE + 1; >+ >+ /** >+ * The bit offset of CV qualifier flags within ANNOTATION1. >+ */ >+ private static final int CV_OFFSET = PDOMCPPAnnotation.MAX_EXTRA_OFFSET + 1; >+ >+ public PDOMCPPMethodSpecialization(PDOM pdom, PDOMNode parent, ICPPMethod method, PDOMBinding specialized) throws CoreException { >+ super(pdom, parent, method, specialized); >+ Database db = pdom.getDB(); >+ >+ try { >+ ICPPFunctionType type = (ICPPFunctionType) method.getType(); >+ byte annotation = 0; >+ annotation |= PDOMCAnnotation.encodeCVQualifiers(type) << CV_OFFSET; >+ annotation |= PDOMCPPAnnotation.encodeExtraAnnotation(method); >+ db.putByte(record + ANNOTATION1, annotation); >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPMethodSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_METHOD_SPECIALIZATION; >+ } >+ >+ public boolean isDestructor() throws DOMException { >+ return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.DESTRUCTOR_OFFSET); >+ } >+ >+ public boolean isImplicit() { >+ return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.IMPLICIT_METHOD_OFFSET); >+ } >+ >+ public boolean isVirtual() throws DOMException { >+ return getBit(getByte(record + ANNOTATION1), PDOMCPPAnnotation.VIRTUAL_OFFSET); >+ } >+ >+ public boolean isExtern() throws DOMException { >+ // ISO/IEC 14882:2003 9.2.6 >+ return false; >+ } >+ >+ public ICPPClassType getClassOwner() throws DOMException { >+ ICPPMethod f = (ICPPMethod) getSpecializedBinding(); >+ if( f != null ) >+ return f.getClassOwner(); >+ return null; >+ } >+ >+ public int getVisibility() throws DOMException { >+ return PDOMCPPAnnotation.getVisibility(getByte(record + ANNOTATION)); >+ } >+ >+ public boolean isConst() { >+ return getBit(getByte(record + ANNOTATION1), PDOMCAnnotation.CONST_OFFSET + CV_OFFSET); >+ } >+ >+ public boolean isVolatile() { >+ return getBit(getByte(record + ANNOTATION1), PDOMCAnnotation.VOLATILE_OFFSET + CV_OFFSET); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPInstance.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,101 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+abstract class PDOMCPPInstance extends PDOMCPPSpecialization implements >+ ICPPTemplateInstance { >+ >+ private static final int ARGUMENTS = PDOMCPPSpecialization.RECORD_SIZE + 0; >+ >+ /** >+ * The size in bytes of a PDOMCPPInstance record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 4; >+ >+ public PDOMCPPInstance(PDOM pdom, PDOMNode parent, ICPPTemplateInstance inst, PDOMBinding instantiated) >+ throws CoreException { >+ super(pdom, parent, inst, instantiated); >+ >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); >+ IType[] args = inst.getArguments(); >+ for (int i = 0; i < args.length; i++) { >+ PDOMNode typeNode = getLinkageImpl().addType(this, args[i]); >+ list.addMember(typeNode); >+ } >+ } >+ >+ public PDOMCPPInstance(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ public ICPPTemplateDefinition getTemplateDefinition() { >+ return (ICPPTemplateDefinition) getSpecializedBinding(); >+ } >+ >+ private static class TemplateArgumentCollector implements IPDOMVisitor { >+ private List args = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof IType) >+ args.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public IType[] getTemplateArguments() { >+ return (IType[])args.toArray(new IType[args.size()]); >+ } >+ } >+ >+ public IType[] getArguments() { >+ try { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + ARGUMENTS, getLinkageImpl()); >+ TemplateArgumentCollector visitor = new TemplateArgumentCollector(); >+ list.accept(visitor); >+ >+ return visitor.getTemplateArguments(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IType[0]; >+ } >+ } >+ >+ public boolean matchesArguments(IType[] arguments) { >+ IType [] args = getArguments(); >+ if( args.length == arguments.length ){ >+ int i = 0; >+ for(; i < args.length; i++) { >+ if( !( args[i].isSameType( arguments[i] ) ) ) >+ break; >+ } >+ return i == args.length; >+ } >+ return false; >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplateInstantiator.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplateInstantiator.java >diff -N parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplateInstantiator.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalTemplateInstantiator.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,28 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.dom.parser.cpp; >+ >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+public interface ICPPInternalTemplateInstantiator { >+ >+ public IBinding instantiate( IType [] arguments ); >+ >+ public ICPPSpecialization deferredInstance( IType [] arguments ); >+ >+ public ICPPSpecialization getInstance( IType [] arguments ); >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionTemplate.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,170 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+public class PDOMCPPFunctionTemplate extends PDOMCPPFunction implements >+ ICPPFunctionTemplate, ICPPInternalTemplateInstantiator, >+ IPDOMMemberOwner { >+ >+ private static final int TEMPLATE_PARAMS = PDOMCPPFunction.RECORD_SIZE + 0; >+ private static final int INSTANCES = PDOMCPPFunction.RECORD_SIZE + 4; >+ private static final int SPECIALIZATIONS = PDOMCPPFunction.RECORD_SIZE + 8; >+ >+ /** >+ * The size in bytes of a PDOMCPPFunctionTemplate record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPFunction.RECORD_SIZE + 12; >+ >+ public PDOMCPPFunctionTemplate(PDOM pdom, PDOMNode parent, >+ ICPPFunctionTemplate template) throws CoreException { >+ super(pdom, parent, (ICPPFunction) template, false); >+ } >+ >+ public PDOMCPPFunctionTemplate(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_FUNCTION_TEMPLATE; >+ } >+ >+ private static class TemplateParameterCollector implements IPDOMVisitor { >+ private List params = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof ICPPTemplateParameter) >+ params.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPTemplateParameter[] getTemplateParameters() { >+ return (ICPPTemplateParameter[])params.toArray(new ICPPTemplateParameter[params.size()]); >+ } >+ } >+ >+ public ICPPTemplateParameter[] getTemplateParameters() throws DOMException { >+ try { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); >+ TemplateParameterCollector visitor = new TemplateParameterCollector(); >+ list.accept(visitor); >+ >+ return visitor.getTemplateParameters(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new ICPPTemplateParameter[0]; >+ } >+ } >+ >+ public ICPPSpecialization deferredInstance(IType[] arguments) { >+ return getInstance(arguments); >+ } >+ >+ private static class InstanceFinder implements IPDOMVisitor { >+ private ICPPSpecialization instance = null; >+ private IType[] arguments; >+ >+ public InstanceFinder(IType[] arguments) { >+ this.arguments = arguments; >+ } >+ >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (instance == null && node instanceof PDOMCPPSpecialization) { >+ PDOMCPPSpecialization spec = (PDOMCPPSpecialization) node; >+ if (spec.matchesArguments(arguments)) { >+ instance = spec; >+ } >+ } >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPSpecialization getInstance() { >+ return instance; >+ } >+ } >+ >+ public ICPPSpecialization getInstance(IType[] arguments) { >+ try { >+ InstanceFinder visitor = new InstanceFinder(arguments); >+ >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ >+ if (visitor.getInstance() == null) { >+ list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.accept(visitor); >+ } >+ >+ return visitor.getInstance(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding instantiate(IType[] arguments) { >+ return getInstance(arguments); >+ } >+ >+ public void addChild(PDOMNode child) throws CoreException { >+ addMember(child); >+ } >+ >+ public void addMember(PDOMNode member) throws CoreException { >+ if (member instanceof ICPPTemplateParameter) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); >+ list.addMember(member); >+ } else if (member instanceof ICPPTemplateInstance) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.addMember(member); >+ } else if (member instanceof ICPPSpecialization) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.addMember(member); >+ } >+ } >+ >+ public void accept(IPDOMVisitor visitor) throws CoreException { >+ super.accept(visitor); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + TEMPLATE_PARAMS, getLinkageImpl()); >+ list.accept(visitor); >+ list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,47 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPDeferredFunctionInstance extends PDOMCPPFunctionInstance >+ implements ICPPDeferredTemplateInstance { >+ >+ /** >+ * The size in bytes of a PDOMCPPDeferredFunctionInstance record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPFunctionInstance.RECORD_SIZE + 0; >+ >+ public PDOMCPPDeferredFunctionInstance(PDOM pdom, PDOMNode parent, ICPPFunction function, PDOMCPPFunctionTemplate instantiated) >+ throws CoreException { >+ super(pdom, parent, function, instantiated); >+ } >+ >+ public PDOMCPPDeferredFunctionInstance(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_DEFERRED_FUNCTION_INSTANCE; >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,220 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IASTName; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IField; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.ITypedef; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; >+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.ICPPSpecialization; >+import org.eclipse.cdt.core.index.IIndexBinding; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics; >+import org.eclipse.cdt.internal.core.index.IIndexScope; >+import org.eclipse.cdt.internal.core.index.IIndexType; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector; >+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements >+ ICPPClassType, ICPPClassScope, IPDOMMemberOwner, IIndexType, IIndexScope { >+ >+ private static final int MEMBERLIST = PDOMCPPSpecialization.RECORD_SIZE + 0; >+ >+ /** >+ * The size in bytes of a PDOMCPPClassSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 4; >+ >+ public PDOMCPPClassSpecialization(PDOM pdom, PDOMNode parent, ICPPClassType classType, PDOMBinding specialized) >+ throws CoreException { >+ super(pdom, parent, (ICPPSpecialization) classType, specialized); >+ if (specialized instanceof PDOMCPPClassTemplate) { >+ ((PDOMCPPClassTemplate)specialized).addMember(this); >+ } else if (specialized instanceof PDOMCPPClassTemplateSpecialization) { >+ ((PDOMCPPClassTemplateSpecialization)specialized).addMember(this); >+ } >+ } >+ >+ public PDOMCPPClassSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CLASS_SPECIALIZATION; >+ } >+ >+ public IField findField(String name) throws DOMException { fail(); return null; } >+ public ICPPMethod[] getAllDeclaredMethods() throws DOMException { fail(); return null; } >+ >+ public ICPPBase[] getBases() throws DOMException { >+ //TODO Get bases >+ return ICPPBase.EMPTY_BASE_ARRAY; >+ } >+ >+ private static class ConstructorCollector implements IPDOMVisitor { >+ private List fConstructors = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof ICPPConstructor) >+ fConstructors.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPConstructor[] getConstructors() { >+ return (ICPPConstructor[])fConstructors.toArray(new ICPPConstructor[fConstructors.size()]); >+ } >+ } >+ >+ public ICPPConstructor[] getConstructors() throws DOMException { >+ try { >+ if (hasDefinition()) { >+ ConstructorCollector visitor= new ConstructorCollector(); >+ accept(visitor); >+ return visitor.getConstructors(); >+ } else { >+ return ((ICPPClassType)getSpecializedBinding()).getConstructors(); >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY; >+ } >+ } >+ >+ //ICPPClassType unimplemented >+ public ICPPField[] getDeclaredFields() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getDeclaredMethods() throws DOMException { fail(); return null; } >+ public IField[] getFields() throws DOMException { fail(); return null; } >+ public IBinding[] getFriends() throws DOMException { fail(); return null; } >+ public ICPPMethod[] getMethods() throws DOMException { fail(); return null; } >+ public ICPPClassType[] getNestedClasses() throws DOMException { fail(); return null; } >+ >+ public IScope getCompositeScope() throws DOMException { >+ try { >+ if (hasDefinition()) { >+ return this; >+ } else { >+ return ((ICPPClassType)getSpecializedBinding()).getCompositeScope(); >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return null; >+ } >+ } >+ >+ public int getKey() throws DOMException { >+ return ((ICPPClassType)getSpecializedBinding()).getKey(); >+ } >+ >+ public boolean isSameType(IType type) { >+ if( type instanceof PDOMNode ) { >+ PDOMNode node = (PDOMNode) type; >+ if (node.getPDOM() == getPDOM() && node.getRecord() == getRecord()) { >+ return true; >+ } >+ } >+ if( type instanceof ITypedef ) >+ return ((ITypedef)type).isSameType( this ); >+ >+ return false; >+ } >+ >+ public Object clone() {fail();return null;} >+ >+ public ICPPClassType getClassType() { >+ return this; >+ } >+ >+ public IBinding[] find(String name) throws DOMException { >+ return find(name, false); >+ } >+ >+ public IBinding[] find(String name, boolean prefixLookup) >+ throws DOMException { >+ try { >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null, prefixLookup, !prefixLookup); >+ accept(visitor); >+ return visitor.getBindings(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding getBinding(IASTName name, boolean resolve) >+ throws DOMException { >+ try { >+ if (getDBName().equals(name.toCharArray())) { >+ if (CPPClassScope.isConstructorReference(name)){ >+ return CPPSemantics.resolveAmbiguities(name, getConstructors()); >+ } >+ //9.2 ... The class-name is also inserted into the scope of the class itself >+ return this; >+ } >+ >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray()); >+ accept(visitor); >+ return CPPSemantics.resolveAmbiguities(name, visitor.getBindings()); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ //ICPPClassScope unimplemented >+ public ICPPMethod[] getImplicitMethods() { fail(); return null; } >+ >+ public IIndexBinding getScopeBinding() { >+ return this; >+ } >+ >+ public void addChild(PDOMNode member) throws CoreException { >+ addMember(member); >+ } >+ >+ public void addMember(PDOMNode member) throws CoreException { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); >+ list.addMember(member); >+ } >+ >+ public void accept(IPDOMVisitor visitor) throws CoreException { >+ super.accept(visitor); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); >+ list.accept(visitor); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,104 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.ITypedef; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements >+ ICPPTemplateTypeParameter, IType { >+ >+ private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; >+ >+ /** >+ * The size in bytes of a PDOMCPPTemplateTypeParameter record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 4; >+ >+ public PDOMCPPTemplateTypeParameter(PDOM pdom, PDOMNode parent, >+ ICPPTemplateTypeParameter param) throws CoreException { >+ super(pdom, parent, param.getName().toCharArray()); >+ >+ try { >+ IType dflt = param.getDefault(); >+ if (dflt != null) { >+ PDOMNode typeNode = getLinkageImpl().addType(this, dflt); >+ if (typeNode != null) { >+ pdom.getDB().putInt(record + DEFAULT_TYPE, typeNode.getRecord()); >+ } >+ } >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPTemplateTypeParameter(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_TEMPLATE_TYPE_PARAMETER; >+ } >+ >+ public boolean isSameType(IType type) { >+ if (type instanceof ITypedef) { >+ return type.isSameType(this); >+ } >+ >+ if (type instanceof PDOMNode) { >+ PDOMNode node= (PDOMNode) type; >+ if (node.getPDOM() == getPDOM()) { >+ return node.getRecord() == getRecord(); >+ } >+ } >+ >+ if (type instanceof ICPPTemplateTypeParameter && !(type instanceof ProblemBinding)) { >+ ICPPTemplateTypeParameter ttp= (ICPPTemplateTypeParameter) type; >+ try { >+ char[][] ttpName= ttp.getQualifiedNameCharArray(); >+ return hasQualifiedName(ttpName, ttpName.length-1); >+ } catch (DOMException e) { >+ CCorePlugin.log(e); >+ } >+ } >+ return false; >+ } >+ >+ public IType getDefault() throws DOMException { >+ try { >+ PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + DEFAULT_TYPE)); >+ if (node instanceof IType) { >+ return (IType) node; >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public Object clone() { fail();return null; } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunctionInstance.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,256 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBasicType; >+import org.eclipse.cdt.core.dom.ast.IFunctionType; >+import org.eclipse.cdt.core.dom.ast.IParameter; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.ITypedef; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.internal.core.Util; >+import org.eclipse.cdt.internal.core.index.IIndexType; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.Database; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPFunctionInstance extends PDOMCPPInstance implements IIndexType, >+ ICPPFunction, ICPPFunctionType { >+ >+ /** >+ * Offset of total number of function parameters (relative to the >+ * beginning of the record). >+ */ >+ private static final int NUM_PARAMS = PDOMCPPInstance.RECORD_SIZE + 0; >+ >+ /** >+ * Offset of pointer to the first parameter of this function (relative to >+ * the beginning of the record). >+ */ >+ private static final int FIRST_PARAM = PDOMCPPInstance.RECORD_SIZE + 4; >+ >+ /** >+ * Offset for return type of this function (relative to >+ * the beginning of the record). >+ */ >+ private static final int RETURN_TYPE = PDOMCPPInstance.RECORD_SIZE + 8; >+ >+ /** >+ * The size in bytes of a PDOMCPPFunctionInstance record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPInstance.RECORD_SIZE + 12; >+ >+ public PDOMCPPFunctionInstance(PDOM pdom, PDOMNode parent, ICPPFunction function, PDOMCPPFunctionTemplate instantiated) >+ throws CoreException { >+ super(pdom, parent, (ICPPTemplateInstance) function, instantiated); >+ >+ Database db = pdom.getDB(); >+ try { >+ IFunctionType ft= function.getType(); >+ IType rt= ft.getReturnType(); >+ if (rt != null) { >+ PDOMNode typeNode = getLinkageImpl().addType(this, rt); >+ if (typeNode != null) { >+ db.putInt(record + RETURN_TYPE, typeNode.getRecord()); >+ } >+ } >+ >+ IParameter[] params= function.getParameters(); >+ IType[] paramTypes= ft.getParameterTypes(); >+ db.putInt(record + NUM_PARAMS, params.length); >+ >+ ICPPFunction sFunc= (ICPPFunction) ((ICPPSpecialization)function).getSpecializedBinding(); >+ IParameter[] sParams= sFunc.getParameters(); >+ IType[] sParamTypes= sFunc.getType().getParameterTypes(); >+ >+ for (int i=0; i<params.length; ++i) { >+ IType pt= i<paramTypes.length ? paramTypes[i] : null; >+ //TODO shouldn't need to make new parameter (find old one) >+ PDOMCPPParameter sParam = new PDOMCPPParameter(pdom, this, sParams[i], sParamTypes[i]); >+ setFirstParameter(new PDOMCPPParameterSpecialization(pdom, this, (ICPPParameter) params[i], sParam, pt)); >+ } >+ } catch (DOMException e) { >+ throw new CoreException(Util.createStatus(e)); >+ } >+ } >+ >+ public PDOMCPPFunctionInstance(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_FUNCTION_INSTANCE; >+ } >+ >+ public PDOMCPPParameterSpecialization getFirstParameter() throws CoreException { >+ int rec = pdom.getDB().getInt(record + FIRST_PARAM); >+ return rec != 0 ? new PDOMCPPParameterSpecialization(pdom, rec) : null; >+ } >+ >+ public void setFirstParameter(PDOMCPPParameterSpecialization param) throws CoreException { >+ if (param != null) >+ param.setNextParameter(getFirstParameter()); >+ int rec = param != null ? param.getRecord() : 0; >+ pdom.getDB().putInt(record + FIRST_PARAM, rec); >+ } >+ >+ public IParameter[] getParameters() throws DOMException { >+ try { >+ int n = pdom.getDB().getInt(record + NUM_PARAMS); >+ IParameter[] params = new IParameter[n]; >+ PDOMCPPParameterSpecialization param = getFirstParameter(); >+ while (param != null) { >+ params[--n] = param; >+ param = param.getNextParameter(); >+ } >+ return params; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IParameter[0]; >+ } >+ } >+ >+ public IFunctionType getType() throws DOMException { >+ return this; >+ } >+ >+ public boolean isInline() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isInline(); >+ } >+ >+ public boolean isMutable() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isMutable(); >+ } >+ >+ public boolean isAuto() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isAuto(); >+ } >+ >+ public boolean isExtern() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isExtern(); >+ } >+ >+ public boolean isRegister() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isRegister(); >+ } >+ >+ public boolean isStatic() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).isStatic(); >+ } >+ >+ public boolean takesVarArgs() throws DOMException { >+ return ((ICPPFunction)getTemplateDefinition()).takesVarArgs(); >+ } >+ >+ public IScope getFunctionScope() throws DOMException { fail(); return null; } >+ >+ public boolean isSameType(IType type) { >+ if (type instanceof ITypedef) { >+ return type.isSameType(this); >+ } >+ >+ try { >+ if (type instanceof ICPPFunctionType) { >+ ICPPFunctionType ft = (ICPPFunctionType) type; >+ IType rt1= getReturnType(); >+ IType rt2= ft.getReturnType(); >+ if (rt1 != rt2) { >+ if (rt1 == null || !rt1.isSameType(rt2)) { >+ return false; >+ } >+ } >+ >+ IType[] params1= getParameterTypes(); >+ IType[] params2= ft.getParameterTypes(); >+ if( params1.length == 1 && params2.length == 0 ){ >+ if( !(params1[0] instanceof IBasicType) || ((IBasicType)params1[0]).getType() != IBasicType.t_void ) >+ return false; >+ } else if( params2.length == 1 && params1.length == 0 ){ >+ if( !(params2[0] instanceof IBasicType) || ((IBasicType)params2[0]).getType() != IBasicType.t_void ) >+ return false; >+ } else if( params1.length != params2.length ){ >+ return false; >+ } else { >+ for( int i = 0; i < params1.length; i++ ){ >+ if (params1[i] == null || ! params1[i].isSameType( params2[i] ) ) >+ return false; >+ } >+ } >+ >+ if( isConst() != ft.isConst() || isVolatile() != ft.isVolatile() ) >+ return false; >+ >+ return true; >+ } >+ return false; >+ } catch (DOMException e) { >+ } >+ return false; >+ } >+ >+ public boolean isConst() { >+ // ISO/IEC 14882:2003 9.3.1.3 >+ // Only applicable to member functions >+ return false; >+ } >+ >+ public boolean isVolatile() { >+ // ISO/IEC 14882:2003 9.3.1.3 >+ // Only applicable to member functions >+ return false; >+ } >+ >+ public IType[] getParameterTypes() throws DOMException { >+ try { >+ int n = pdom.getDB().getInt(record + NUM_PARAMS); >+ IType[] types = new IType[n]; >+ PDOMCPPParameterSpecialization param = getFirstParameter(); >+ while (param != null) { >+ types[--n] = param.getType(); >+ param = param.getNextParameter(); >+ } >+ return types; >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new IType[0]; >+ } >+ } >+ >+ public IType getReturnType() throws DOMException { >+ try { >+ PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + RETURN_TYPE)); >+ if (node instanceof IType) { >+ return (IType) node; >+ } >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public Object clone() {fail();return null;} >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplate.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,347 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+import java.util.HashSet; >+import java.util.List; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.ILinkage; >+import org.eclipse.cdt.core.dom.IName; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IASTName; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IProblemBinding; >+import org.eclipse.cdt.core.dom.ast.IScope; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope; >+import org.eclipse.cdt.core.index.IIndexBinding; >+import org.eclipse.cdt.core.index.IndexFilter; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; >+import org.eclipse.cdt.internal.core.index.IIndexScope; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.BindingCollector; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+class PDOMCPPClassTemplate extends PDOMCPPClassType implements >+ ICPPClassTemplate, ICPPInternalTemplateInstantiator { >+ >+ private static final int PARAMETERS = PDOMCPPClassType.RECORD_SIZE + 0; >+ private static final int INSTANCES = PDOMCPPClassType.RECORD_SIZE + 4; >+ private static final int SPECIALIZATIONS = PDOMCPPClassType.RECORD_SIZE + 8; >+ private static final int FIRST_PARTIAL = PDOMCPPClassType.RECORD_SIZE + 12; >+ >+ /** >+ * The size in bytes of a PDOMCPPClassTemplate record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPClassType.RECORD_SIZE + 16; >+ >+ public PDOMCPPClassTemplate(PDOM pdom, PDOMNode parent, ICPPClassTemplate template) >+ throws CoreException { >+ super(pdom, parent, (ICPPClassType) template); >+ } >+ >+ public PDOMCPPClassTemplate(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CLASS_TEMPLATE; >+ } >+ >+ private static class TemplateParameterCollector implements IPDOMVisitor { >+ private List params = new ArrayList(); >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (node instanceof ICPPTemplateParameter) >+ params.add(node); >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPTemplateParameter[] getTemplateParameters() { >+ return (ICPPTemplateParameter[])params.toArray(new ICPPTemplateParameter[params.size()]); >+ } >+ } >+ >+ public ICPPTemplateParameter[] getTemplateParameters() throws DOMException { >+ try { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); >+ TemplateParameterCollector visitor = new TemplateParameterCollector(); >+ list.accept(visitor); >+ >+ return visitor.getTemplateParameters(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new ICPPTemplateParameter[0]; >+ } >+ } >+ >+ private PDOMCPPClassTemplatePartialSpecialization getFirstPartial() throws CoreException { >+ int value = pdom.getDB().getInt(record + FIRST_PARTIAL); >+ return value != 0 ? new PDOMCPPClassTemplatePartialSpecialization(pdom, value) : null; >+ } >+ >+ public void addPartial(PDOMCPPClassTemplatePartialSpecialization partial) throws CoreException { >+ PDOMCPPClassTemplatePartialSpecialization first = getFirstPartial(); >+ partial.setNextPartial(first); >+ pdom.getDB().putInt(record + FIRST_PARTIAL, partial.getRecord()); >+ } >+ >+ public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { >+ try { >+ ArrayList partials = new ArrayList(); >+ for (PDOMCPPClassTemplatePartialSpecialization partial = getFirstPartial(); >+ partial != null; >+ partial = partial.getNextPartial()) { >+ partials.add(partial); >+ } >+ >+ return (ICPPClassTemplatePartialSpecialization[]) partials >+ .toArray(new ICPPClassTemplatePartialSpecialization[partials >+ .size()]); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new ICPPClassTemplatePartialSpecialization[0]; >+ } >+ } >+ >+ public ICPPTemplateDefinition getTemplateDefinition() throws DOMException { >+ return null; >+ } >+ >+ public IBinding getBinding(IASTName name, boolean resolve) throws DOMException { >+ try { >+ if (getDBName().equals(name.toCharArray())) { >+ if (CPPClassScope.isConstructorReference(name)){ >+ return CPPSemantics.resolveAmbiguities(name, getConstructors()); >+ } >+ //9.2 ... The class-name is also inserted into the scope of the class itself >+ return this; >+ } >+ >+ IndexFilter filter = new IndexFilter() { >+ public boolean acceptBinding(IBinding binding) { >+ return !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPSpecialization); >+ } >+ public boolean acceptImplicitMethods() { >+ return true; >+ } >+ public boolean acceptLinkage(ILinkage linkage) { >+ return linkage.getID() == ILinkage.CPP_LINKAGE_ID; >+ } >+ }; >+ >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter, false, true); >+ accept(visitor); >+ return CPPSemantics.resolveAmbiguities(name, visitor.getBindings()); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding[] find(String name, boolean prefixLookup) throws DOMException { >+ try { >+ IndexFilter filter = new IndexFilter() { >+ public boolean acceptBinding(IBinding binding) { >+ return !(binding instanceof ICPPTemplateParameter || binding instanceof ICPPSpecialization); >+ } >+ public boolean acceptImplicitMethods() { >+ return true; >+ } >+ public boolean acceptLinkage(ILinkage linkage) { >+ return linkage.getID() == ILinkage.CPP_LINKAGE_ID; >+ } >+ }; >+ >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), filter, prefixLookup, !prefixLookup); >+ acceptInHierarchy(new HashSet(), visitor); >+ return visitor.getBindings(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ private class PDOMCPPTemplateScope implements ICPPTemplateScope, IIndexScope { >+ public IBinding[] find(String name) throws DOMException { >+ return find(name, false); >+ } >+ >+ public IBinding[] find(String name, boolean prefixLookup) >+ throws DOMException { >+ try { >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray(), null, prefixLookup, !prefixLookup); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); >+ list.accept(visitor); >+ >+ return visitor.getBindings(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding getBinding(IASTName name, boolean resolve) >+ throws DOMException { >+ try { >+ BindingCollector visitor = new BindingCollector(getLinkageImpl(), name.toCharArray()); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); >+ list.accept(visitor); >+ >+ return CPPSemantics.resolveAmbiguities(name, visitor.getBindings()); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IScope getParent() throws DOMException { >+ return PDOMCPPClassTemplate.super.getParent(); >+ } >+ >+ public ICPPTemplateDefinition getTemplateDefinition() >+ throws DOMException { >+ return null; >+ } >+ >+ public IName getScopeName() throws DOMException { >+ return null; >+ } >+ >+ public IIndexBinding getScopeBinding() { >+ return PDOMCPPClassTemplate.this; >+ } >+ } >+ >+ private PDOMCPPTemplateScope scope; >+ >+ public IScope getParent() throws DOMException { >+ if (scope == null) { >+ scope = new PDOMCPPTemplateScope(); >+ } >+ return scope; >+ } >+ >+ public void accept(IPDOMVisitor visitor) throws CoreException { >+ super.accept(visitor); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); >+ list.accept(visitor); >+ list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ } >+ >+ public void addMember(PDOMNode member) throws CoreException { >+ if (member instanceof ICPPTemplateParameter) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + PARAMETERS, getLinkageImpl()); >+ list.addMember(member); >+ } else if (member instanceof ICPPTemplateInstance) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.addMember(member); >+ } else if (member instanceof ICPPSpecialization) { >+ if (this.equals(((ICPPSpecialization)member).getSpecializedBinding())) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.addMember(member); >+ } else { >+ super.addMember(member); >+ } >+ } else { >+ super.addMember(member); >+ } >+ } >+ >+ public ICPPSpecialization deferredInstance(IType[] arguments) { >+ return getInstance( arguments ); >+ } >+ >+ private static class InstanceFinder implements IPDOMVisitor { >+ private ICPPSpecialization instance = null; >+ private IType[] arguments; >+ >+ public InstanceFinder(IType[] arguments) { >+ this.arguments = arguments; >+ } >+ >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (instance == null && node instanceof PDOMCPPSpecialization) { >+ PDOMCPPSpecialization spec = (PDOMCPPSpecialization) node; >+ if (spec.matchesArguments(arguments)) { >+ instance = spec; >+ } >+ } >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPSpecialization getInstance() { >+ return instance; >+ } >+ } >+ >+ public ICPPSpecialization getInstance(IType[] arguments) { >+ try { >+ InstanceFinder visitor = new InstanceFinder(arguments); >+ >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ >+ if (visitor.getInstance() == null) { >+ list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.accept(visitor); >+ } >+ >+ return visitor.getInstance(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding instantiate(IType[] arguments) { >+ ICPPTemplateDefinition template = null; >+ try { >+ template = CPPTemplates.matchTemplatePartialSpecialization(this, arguments); >+ } catch (DOMException e) { >+ return e.getProblem(); >+ } >+ >+ if( template instanceof IProblemBinding ) >+ return template; >+ if( template != null && template instanceof ICPPClassTemplatePartialSpecialization ){ >+ return ((PDOMCPPClassTemplate)template).instantiate( arguments ); >+ } >+ >+ return getInstance(arguments); >+ } >+} >Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java >=================================================================== >RCS file: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java >diff -N parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassTemplateSpecialization.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,186 @@ >+/******************************************************************************* >+ * Copyright (c) 2007 QNX Software Systems and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * QNX - Initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.cdt.internal.core.pdom.dom.cpp; >+ >+import java.util.ArrayList; >+ >+import org.eclipse.cdt.core.CCorePlugin; >+import org.eclipse.cdt.core.dom.IPDOMNode; >+import org.eclipse.cdt.core.dom.IPDOMVisitor; >+import org.eclipse.cdt.core.dom.ast.DOMException; >+import org.eclipse.cdt.core.dom.ast.IBinding; >+import org.eclipse.cdt.core.dom.ast.IProblemBinding; >+import org.eclipse.cdt.core.dom.ast.IType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplates; >+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalTemplateInstantiator; >+import org.eclipse.cdt.internal.core.pdom.PDOM; >+import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; >+import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; >+import org.eclipse.core.runtime.CoreException; >+ >+/** >+ * @author Bryan Wilkinson >+ * >+ */ >+public class PDOMCPPClassTemplateSpecialization extends >+ PDOMCPPClassSpecialization implements ICPPClassTemplate, ICPPInternalTemplateInstantiator { >+ >+ private static final int INSTANCES = PDOMCPPClassSpecialization.RECORD_SIZE + 0; >+ private static final int SPECIALIZATIONS = PDOMCPPClassSpecialization.RECORD_SIZE + 4; >+ private static final int FIRST_PARTIAL = PDOMCPPClassSpecialization.RECORD_SIZE + 8; >+ >+ /** >+ * The size in bytes of a PDOMCPPClassTemplateSpecialization record in the database. >+ */ >+ protected static final int RECORD_SIZE = PDOMCPPClassSpecialization.RECORD_SIZE + 12; >+ >+ public PDOMCPPClassTemplateSpecialization(PDOM pdom, PDOMNode parent, ICPPClassTemplate template, PDOMBinding specialized) >+ throws CoreException { >+ super(pdom, parent, (ICPPClassType) template, specialized); >+ } >+ >+ public PDOMCPPClassTemplateSpecialization(PDOM pdom, int bindingRecord) { >+ super(pdom, bindingRecord); >+ } >+ >+ protected int getRecordSize() { >+ return RECORD_SIZE; >+ } >+ >+ public int getNodeType() { >+ return PDOMCPPLinkage.CPP_CLASS_TEMPLATE_SPECIALIZATION; >+ } >+ >+ private PDOMCPPClassTemplatePartialSpecialization getFirstPartial() throws CoreException { >+ int value = pdom.getDB().getInt(record + FIRST_PARTIAL); >+ return value != 0 ? new PDOMCPPClassTemplatePartialSpecialization(pdom, value) : null; >+ } >+ >+ public void addPartial(PDOMCPPClassTemplatePartialSpecialization partial) throws CoreException { >+ PDOMCPPClassTemplatePartialSpecialization first = getFirstPartial(); >+ partial.setNextPartial(first); >+ pdom.getDB().putInt(record + FIRST_PARTIAL, partial.getRecord()); >+ } >+ >+ public ICPPClassTemplatePartialSpecialization[] getPartialSpecializations() throws DOMException { >+ try { >+ ArrayList partials = new ArrayList(); >+ for (PDOMCPPClassTemplatePartialSpecialization partial = getFirstPartial(); >+ partial != null; >+ partial = partial.getNextPartial()) { >+ partials.add(partial); >+ } >+ >+ return (ICPPClassTemplatePartialSpecialization[]) partials >+ .toArray(new ICPPClassTemplatePartialSpecialization[partials >+ .size()]); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ return new ICPPClassTemplatePartialSpecialization[0]; >+ } >+ } >+ >+ public ICPPTemplateParameter[] getTemplateParameters() throws DOMException { >+ ICPPClassTemplate template = (ICPPClassTemplate) getSpecializedBinding(); >+ return template.getTemplateParameters(); >+ } >+ >+ public ICPPSpecialization deferredInstance(IType[] arguments) { >+ return getInstance( arguments ); >+ } >+ >+ private static class InstanceFinder implements IPDOMVisitor { >+ private ICPPSpecialization instance = null; >+ private IType[] arguments; >+ >+ public InstanceFinder(IType[] arguments) { >+ this.arguments = arguments; >+ } >+ >+ public boolean visit(IPDOMNode node) throws CoreException { >+ if (instance == null && node instanceof PDOMCPPSpecialization) { >+ PDOMCPPSpecialization spec = (PDOMCPPSpecialization) node; >+ if (spec.matchesArguments(arguments)) { >+ instance = spec; >+ } >+ } >+ return false; >+ } >+ public void leave(IPDOMNode node) throws CoreException { >+ } >+ public ICPPSpecialization getInstance() { >+ return instance; >+ } >+ } >+ >+ public ICPPSpecialization getInstance(IType[] arguments) { >+ try { >+ InstanceFinder visitor = new InstanceFinder(arguments); >+ >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ >+ if (visitor.getInstance() == null) { >+ list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.accept(visitor); >+ } >+ >+ return visitor.getInstance(); >+ } catch (CoreException e) { >+ CCorePlugin.log(e); >+ } >+ return null; >+ } >+ >+ public IBinding instantiate(IType[] arguments) { >+ ICPPTemplateDefinition template = null; >+ try { >+ template = CPPTemplates.matchTemplatePartialSpecialization(this, arguments); >+ } catch (DOMException e) { >+ return e.getProblem(); >+ } >+ >+ if( template instanceof IProblemBinding ) >+ return template; >+ if( template != null && template instanceof ICPPClassTemplatePartialSpecialization ){ >+ return ((PDOMCPPClassTemplate)template).instantiate( arguments ); >+ } >+ >+ return getInstance(arguments); >+ } >+ >+ public void addMember(PDOMNode member) throws CoreException { >+ if (member instanceof ICPPTemplateInstance) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.addMember(member); >+ } else if (member instanceof ICPPSpecialization >+ && !(member instanceof ICPPClassTemplatePartialSpecialization)) { >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + SPECIALIZATIONS, getLinkageImpl()); >+ list.addMember(member); >+ } else { >+ super.addMember(member); >+ } >+ } >+ >+ public void accept(IPDOMVisitor visitor) throws CoreException { >+ super.accept(visitor); >+ PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + INSTANCES, getLinkageImpl()); >+ list.accept(visitor); >+ } >+} >#P org.eclipse.cdt.ui >Index: src/org/eclipse/cdt/internal/ui/IndexLabelProvider.java >=================================================================== >RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/IndexLabelProvider.java,v >retrieving revision 1.6 >diff -u -r1.6 IndexLabelProvider.java >--- src/org/eclipse/cdt/internal/ui/IndexLabelProvider.java 8 Feb 2007 14:02:26 -0000 1.6 >+++ src/org/eclipse/cdt/internal/ui/IndexLabelProvider.java 19 Mar 2007 20:04:00 -0000 >@@ -27,13 +27,19 @@ > import org.eclipse.cdt.core.dom.ast.IEnumeration; > import org.eclipse.cdt.core.dom.ast.IEnumerator; > import org.eclipse.cdt.core.dom.ast.IFunction; >+import org.eclipse.cdt.core.dom.ast.IType; > import org.eclipse.cdt.core.dom.ast.ITypedef; > import org.eclipse.cdt.core.dom.ast.IVariable; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; > import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; >+import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; > import org.eclipse.cdt.core.model.ICContainer; > import org.eclipse.cdt.core.model.ICProject; > import org.eclipse.cdt.core.model.ITranslationUnit; >+import org.eclipse.cdt.core.parser.util.ObjectMap; > import org.eclipse.cdt.ui.CUIPlugin; > > import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; >@@ -54,6 +60,62 @@ > } else if (element instanceof PDOMNode) { > try { > String result = ((PDOMNamedNode)element).getDBName().getString(); >+ >+ if (element instanceof ICPPTemplateInstance) { >+ StringBuffer buffer = null; >+ if (element instanceof ICPPDeferredTemplateInstance) { >+ buffer = new StringBuffer("Dfrd: "); //$NON-NLS-1$ >+ } else { >+ buffer = new StringBuffer("Inst: "); //$NON-NLS-1$ >+ } >+ buffer.append(result); >+ buffer.append('<'); >+ IType[] types = ((ICPPTemplateInstance) element).getArguments(); >+ for (int i = 0; i < types.length; i++) { >+ if (i > 0) >+ buffer.append(','); >+ buffer.append(ASTTypeUtil.getType(types[i])); >+ } >+ buffer.append('>'); >+ result = buffer.toString(); >+ } else if (element instanceof ICPPClassTemplatePartialSpecialization) { >+ StringBuffer buffer = new StringBuffer("Part: "); //$NON-NLS-1$ >+ buffer.append(result); >+ buffer.append('<'); >+ try { >+ IType[] types = ((ICPPClassTemplatePartialSpecialization) element).getArguments(); >+ for (int i = 0; i < types.length; i++) { >+ if (i > 0) >+ buffer.append(','); >+ buffer.append(ASTTypeUtil.getType(types[i])); >+ } >+ } catch (DOMException e) { >+ } >+ buffer.append('>'); >+ result = buffer.toString(); >+ } else if (element instanceof ICPPSpecialization) { >+ PDOMNode parentOfSpec = ((PDOMNode)((ICPPSpecialization)element).getSpecializedBinding()).getParentNode(); >+ PDOMNode parent = ((PDOMNode)element).getParentNode(); >+ PDOMNode grandParent = parent != null ? parent.getParentNode() : null; >+ boolean showArgs = parentOfSpec == null || grandParent == null || !parentOfSpec.equals(grandParent); >+ >+ StringBuffer buffer = null; >+ buffer = new StringBuffer("Spec: "); //$NON-NLS-1$ >+ buffer.append(result); >+ >+ if (showArgs) { >+ buffer.append('<'); >+ ObjectMap argMap = ((ICPPSpecialization) element).getArgumentMap(); >+ for (int i = 0; i < argMap.size(); i++) { >+ if (i > 0) >+ buffer.append(','); >+ buffer.append(ASTTypeUtil.getType((IType) argMap.getAt(i))); >+ } >+ buffer.append('>'); >+ } >+ >+ result = buffer.toString(); >+ } > > /* > * aftodo - Ideally here we'd call ASTTypeUtil.getType but
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
bjorn.freeman-benson
:
iplog+
Actions:
View
|
Diff
Attachments on
bug 167098
: 61328 |
62811
|
63901
|
64365
|
64651
|
64767