mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
fixing bug 65114, NPE in getParentClassSpecifier(), caused by template
lookup issues in the class base clause
This commit is contained in:
parent
b9af09113a
commit
8d55216fb7
4 changed files with 77 additions and 40 deletions
|
@ -1,9 +1,9 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004 IBM Corporation and others.
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v0.5
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v05.html
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* IBM Corp. - Rational Software - initial implementation
|
* IBM Corp. - Rational Software - initial implementation
|
||||||
|
@ -1012,4 +1012,36 @@ public class CompleteParseASTTemplateTest extends CompleteParseBaseTest {
|
||||||
assertAllReferences( 4, createTaskList( new Task( simple ), new Task( _Tp ),
|
assertAllReferences( 4, createTaskList( new Task( simple ), new Task( _Tp ),
|
||||||
new Task( malloc ), new Task( inst ) ) );
|
new Task( malloc ), new Task( inst ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBug655114_2() throws Exception
|
||||||
|
{
|
||||||
|
Writer writer = new StringWriter();
|
||||||
|
writer.write( "template < typename _Alloc > class base_allocator { int _Tp; }; \n"); //$NON-NLS-1$
|
||||||
|
writer.write( "template < class T > class B {}; \n"); //$NON-NLS-1$
|
||||||
|
writer.write( "template <> class B < int > {}; \n"); //$NON-NLS-1$
|
||||||
|
writer.write( "template < typename _Alloc > class allocator; \n"); //$NON-NLS-1$
|
||||||
|
writer.write( "template < typename _Tp > class allocator : base_allocator<_Tp>, B<_Tp> {}; \n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
Iterator i = parse( writer.toString() ).getDeclarations();
|
||||||
|
|
||||||
|
IASTTemplateDeclaration base = (IASTTemplateDeclaration) i.next();
|
||||||
|
IASTClassSpecifier baseCls = (IASTClassSpecifier) base.getOwnedDeclaration();
|
||||||
|
|
||||||
|
IASTTemplateDeclaration B1 = (IASTTemplateDeclaration) i.next();
|
||||||
|
IASTTemplateDeclaration B2 = (IASTTemplateDeclaration) i.next();
|
||||||
|
|
||||||
|
IASTClassSpecifier B1cls = (IASTClassSpecifier) B1.getOwnedDeclaration();
|
||||||
|
IASTClassSpecifier B2cls = (IASTClassSpecifier) B2.getOwnedDeclaration();
|
||||||
|
|
||||||
|
IASTTemplateDeclaration forward = (IASTTemplateDeclaration) i.next();
|
||||||
|
IASTTemplateDeclaration allocator = (IASTTemplateDeclaration) i.next();
|
||||||
|
|
||||||
|
IASTClassSpecifier cls = (IASTClassSpecifier) allocator.getOwnedDeclaration();
|
||||||
|
i = cls.getBaseClauses();
|
||||||
|
IASTBaseSpecifier clause = (IASTBaseSpecifier) i.next();
|
||||||
|
assertEquals( clause.getParentClassSpecifier(), baseCls );
|
||||||
|
clause = (IASTBaseSpecifier) i.next();
|
||||||
|
assertEquals( clause.getParentClassSpecifier(), B1cls );
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2002,2003 Rational Software Corporation and others.
|
* Copyright (c) 2002,2003, 2004 Rational Software Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v0.5
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v05.html
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Rational Software - Initial API and implementation
|
* Rational Software - Initial API and implementation
|
||||||
|
@ -2836,6 +2836,8 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
ASTAccessVisibility visibility = ASTAccessVisibility.PUBLIC;
|
ASTAccessVisibility visibility = ASTAccessVisibility.PUBLIC;
|
||||||
ITokenDuple nameDuple = null;
|
ITokenDuple nameDuple = null;
|
||||||
|
|
||||||
|
ArrayList bases = null;
|
||||||
|
|
||||||
baseSpecifierLoop : for (;;)
|
baseSpecifierLoop : for (;;)
|
||||||
{
|
{
|
||||||
switch (LT(1))
|
switch (LT(1))
|
||||||
|
@ -2861,26 +2863,17 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
break;
|
break;
|
||||||
case IToken.tCOLONCOLON :
|
case IToken.tCOLONCOLON :
|
||||||
case IToken.tIDENTIFIER :
|
case IToken.tIDENTIFIER :
|
||||||
nameDuple = name(astClassSpec.getOwnerScope(), CompletionKind.CLASS_REFERENCE, KeywordSetKey.BASE_SPECIFIER );
|
//to get templates right we need to use the class as the scope
|
||||||
|
nameDuple = name(astClassSpec, CompletionKind.CLASS_REFERENCE, KeywordSetKey.BASE_SPECIFIER );
|
||||||
break;
|
break;
|
||||||
case IToken.tCOMMA :
|
case IToken.tCOMMA :
|
||||||
try
|
//because we are using the class as the scope to get the name, we need to postpone adding the base
|
||||||
{
|
//specifiers until after we have all the nameDuples
|
||||||
astFactory.addBaseSpecifier(
|
if( bases == null ){
|
||||||
astClassSpec,
|
bases = new ArrayList(5);
|
||||||
isVirtual,
|
}
|
||||||
visibility,
|
bases.add( new Object[] { isVirtual ? Boolean.TRUE : Boolean.FALSE, visibility, nameDuple } );
|
||||||
nameDuple );
|
|
||||||
}
|
|
||||||
catch (ASTSemanticException e)
|
|
||||||
{
|
|
||||||
failParse();
|
|
||||||
throw backtrack;
|
|
||||||
} catch (Exception e)
|
|
||||||
{
|
|
||||||
logException( "baseSpecifier_1::addBaseSpecifier", e ); //$NON-NLS-1$
|
|
||||||
throw backtrack;
|
|
||||||
}
|
|
||||||
isVirtual = false;
|
isVirtual = false;
|
||||||
visibility = ASTAccessVisibility.PUBLIC;
|
visibility = ASTAccessVisibility.PUBLIC;
|
||||||
nameDuple = null;
|
nameDuple = null;
|
||||||
|
@ -2894,7 +2887,18 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
astFactory.addBaseSpecifier(
|
if( bases != null ){
|
||||||
|
int size = bases.size();
|
||||||
|
for( int i = 0; i < size; i++ ){
|
||||||
|
Object [] data = (Object[]) bases.get( i );
|
||||||
|
astFactory.addBaseSpecifier( astClassSpec,
|
||||||
|
((Boolean)data[0]).booleanValue(),
|
||||||
|
(ASTAccessVisibility) data[1],
|
||||||
|
(ITokenDuple)data[2] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
astFactory.addBaseSpecifier(
|
||||||
astClassSpec,
|
astClassSpec,
|
||||||
isVirtual,
|
isVirtual,
|
||||||
visibility,
|
visibility,
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2002,2003,2004 Rational Software Corporation and others.
|
* Copyright (c) 2002,2003,2004 Rational Software Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v0.5
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v05. html
|
* http://www.eclipse.org/legal/cpl-v10. html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* Rational Software - Initial API and implementation
|
* Rational Software - Initial API and implementation
|
||||||
|
@ -370,7 +370,8 @@ public class ParserSymbolTable {
|
||||||
IContainerSymbol containing = lookIn.getContainingSymbol();
|
IContainerSymbol containing = lookIn.getContainingSymbol();
|
||||||
IContainerSymbol outer = (containing != null ) ? containing.getContainingSymbol() : null;
|
IContainerSymbol outer = (containing != null ) ? containing.getContainingSymbol() : null;
|
||||||
if( ( containing instanceof IDerivableContainerSymbol && outer instanceof ITemplateSymbol) ||
|
if( ( containing instanceof IDerivableContainerSymbol && outer instanceof ITemplateSymbol) ||
|
||||||
( lookIn instanceof IParameterizedSymbol && containing instanceof ITemplateSymbol ) )
|
( lookIn instanceof IParameterizedSymbol && containing instanceof ITemplateSymbol ) ||
|
||||||
|
( lookIn instanceof IDerivableContainerSymbol && containing instanceof ITemplateSymbol ) )
|
||||||
{
|
{
|
||||||
data.templateMember = lookIn;
|
data.templateMember = lookIn;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Copyright (c) 2004 Rational Software Corporation and others.
|
* Copyright (c) 2004 Rational Software Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Common Public License v0.5
|
* are made available under the terms of the Common Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
* http://www.eclipse.org/legal/cpl-v05.html
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
*
|
*
|
||||||
* Contributors:
|
* Contributors:
|
||||||
* IBM Rational Software - Initial API and implementation
|
* IBM Rational Software - Initial API and implementation
|
||||||
|
@ -24,17 +24,17 @@ import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
|
||||||
*/
|
*/
|
||||||
public class CompletionTest_ClassReference_Prefix extends CompletionProposalsBaseTest{
|
public class CompletionTest_ClassReference_Prefix extends CompletionProposalsBaseTest{
|
||||||
|
|
||||||
private final String fileName = "CompletionTestStart20.h";
|
private final String fileName = "CompletionTestStart20.h"; //$NON-NLS-1$
|
||||||
private final String fileFullPath ="resources/contentassist/" + fileName;
|
private final String fileFullPath ="resources/contentassist/" + fileName; //$NON-NLS-1$
|
||||||
private final String headerFileName = "CompletionTestStart.h";
|
private final String headerFileName = "CompletionTestStart.h"; //$NON-NLS-1$
|
||||||
private final String headerFileFullPath ="resources/contentassist/" + headerFileName;
|
private final String headerFileFullPath ="resources/contentassist/" + headerFileName; //$NON-NLS-1$
|
||||||
private final String expectedScopeName = "ASTCompilationUnit";
|
private final String expectedScopeName = "ASTClassSpecifier"; //$NON-NLS-1$
|
||||||
private final String expectedContextName = "null";
|
private final String expectedContextName = "null"; //$NON-NLS-1$
|
||||||
private final CompletionKind expectedKind = CompletionKind.CLASS_REFERENCE;
|
private final CompletionKind expectedKind = CompletionKind.CLASS_REFERENCE;
|
||||||
private final String expectedPrefix = "a";
|
private final String expectedPrefix = "a"; //$NON-NLS-1$
|
||||||
private final String[] expectedResults = {
|
private final String[] expectedResults = {
|
||||||
"aClass",
|
"aClass", //$NON-NLS-1$
|
||||||
"anotherClass"
|
"anotherClass" //$NON-NLS-1$
|
||||||
};
|
};
|
||||||
|
|
||||||
public CompletionTest_ClassReference_Prefix(String name) {
|
public CompletionTest_ClassReference_Prefix(String name) {
|
||||||
|
@ -43,7 +43,7 @@ public class CompletionTest_ClassReference_Prefix extends CompletionProposalsBa
|
||||||
|
|
||||||
public static Test suite() {
|
public static Test suite() {
|
||||||
TestSuite suite= new TestSuite(CompletionTest_ClassReference_Prefix.class.getName());
|
TestSuite suite= new TestSuite(CompletionTest_ClassReference_Prefix.class.getName());
|
||||||
suite.addTest(new CompletionTest_ClassReference_Prefix("testCompletionProposals"));
|
suite.addTest(new CompletionTest_ClassReference_Prefix("testCompletionProposals")); //$NON-NLS-1$
|
||||||
return suite;
|
return suite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ public class CompletionTest_ClassReference_Prefix extends CompletionProposalsBa
|
||||||
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getCompletionPosition()
|
* @see org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest#getCompletionPosition()
|
||||||
*/
|
*/
|
||||||
protected int getCompletionPosition() {
|
protected int getCompletionPosition() {
|
||||||
return getBuffer().indexOf(" a ") + 2;
|
return getBuffer().indexOf(" a ") + 2; //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|
Loading…
Add table
Reference in a new issue