diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java index 4b026f2c198..17da7a03409 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java @@ -278,17 +278,34 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor int size = templates.size(); for( int i = 0; i < size; i++ ){ ITemplateSymbol template = (ITemplateSymbol) templates.get(i); - ITemplateSymbol origTemplate = (ITemplateSymbol) ((ISymbol)symbols.get(i)).getContainingSymbol(); - + ISymbol origContainer = (ISymbol) symbols.get(i); + if ( origContainer instanceof IDeferredTemplateInstance ) + origContainer = ((IDeferredTemplateInstance) origContainer).getTemplate().getTemplatedSymbol(); + ITemplateSymbol origTemplate = (ITemplateSymbol)origContainer.getContainingSymbol(); + ObjectMap containerDefnMap = null; List tList = template.getParameterList(); + if( origTemplate.getDefinitionParameterMap().containsKey( origContainer ) ){ + containerDefnMap = (ObjectMap) origTemplate.getDefinitionParameterMap().get( origContainer ); + } List oList = origTemplate.getParameterList(); int tListSize = tList.size(); if( oList.size() < tListSize ) throw new ParserSymbolTableException( ParserSymbolTableException.r_BadTemplate ); ObjectMap defnMap = new ObjectMap(tListSize); - for( int j = 0; j < tListSize; j++ ){ + for( int j = 0; j < tListSize; j++ ) { ISymbol param = (ISymbol) tList.get(j); ISymbol origParam = (ISymbol) oList.get(j); + if( containerDefnMap != null ) { + ISymbol keyParam, valParam; + for( int k = 0; k < containerDefnMap.size(); ++k ) { + keyParam = (ISymbol) containerDefnMap.keyAt( k ); + valParam = (ISymbol) containerDefnMap.getAt( k ); + if ( valParam.equals(origParam) ) { + origParam = keyParam; + break; + } + } + } defnMap.put( param, origParam ); } |