1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00
John Camelon 2004-06-06 04:23:22 +00:00
parent 15e615de07
commit a549ff4f27
2 changed files with 54 additions and 37 deletions

View file

@ -1914,4 +1914,9 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
{ {
parse( "#define DEF1(A1) A1\n#define DEF2 DEF1(DEF2)\nDEF2;", false ); //$NON-NLS-1$ parse( "#define DEF1(A1) A1\n#define DEF2 DEF1(DEF2)\nDEF2;", false ); //$NON-NLS-1$
} }
public void testBug65569() throws Exception
{
parse( "class Sample;\nstruct Sample { /* ... */ };" ); //$NON-NLS-1$
}
} }

View file

@ -356,7 +356,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
} }
if ( throwOnError ) if ( throwOnError )
handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, image, -1, -1, name.getLineNumber() ); handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, image, -1, -1, name.getLineNumber(), true );
return null; return null;
} }
break; break;
@ -497,7 +497,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
try { try {
usingDirective = ((ASTScope)scope).getContainerSymbol().addUsingDirective( (IContainerSymbol)symbol ); usingDirective = ((ASTScope)scope).getContainerSymbol().addUsingDirective( (IContainerSymbol)symbol );
} catch (ParserSymbolTableException pste) { } catch (ParserSymbolTableException pste) {
handleProblem( pste.createProblemID(), duple.toString(), startingOffset, endingOffset, startingLine ); handleProblem( pste.createProblemID(), duple.toString(), startingOffset, endingOffset, startingLine, true );
} }
ASTUsingDirective using = new ASTUsingDirective( scopeToSymbol(scope), usingDirective, startingOffset, startingLine, endingOffset, endingLine, references ); ASTUsingDirective using = new ASTUsingDirective( scopeToSymbol(scope), usingDirective, startingOffset, startingLine, endingOffset, endingLine, references );
@ -564,13 +564,13 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem(e.createProblemID(), name.getLastToken().getImage(), startingOffset, endingOffset, startingLine ); handleProblem(e.createProblemID(), name.getLastToken().getImage(), startingOffset, endingOffset, startingLine, true );
} }
} else } else
try { try {
endResult = scopeToSymbol(scope).addUsingDeclaration(name.getLastToken().getImage()); endResult = scopeToSymbol(scope).addUsingDeclaration(name.getLastToken().getImage());
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
handleProblem(e.createProblemID(), name.getLastToken().getImage(), startingOffset, endingOffset, startingLine ); handleProblem(e.createProblemID(), name.getLastToken().getImage(), startingOffset, endingOffset, startingLine, true );
} }
if( endResult != null ) if( endResult != null )
@ -618,14 +618,14 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem( e.createProblemID(), identifier, nameOffset, nameEndOffset, nameLineNumber ); handleProblem( e.createProblemID(), identifier, nameOffset, nameEndOffset, nameLineNumber, true );
} }
} }
if( namespaceSymbol != null ) if( namespaceSymbol != null )
{ {
if( namespaceSymbol.getType() != TypeInfo.t_namespace ) if( namespaceSymbol.getType() != TypeInfo.t_namespace )
handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, identifier, nameOffset, nameEndOffset, nameLineNumber ); handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, identifier, nameOffset, nameEndOffset, nameLineNumber, true );
} }
else else
{ {
@ -744,7 +744,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
else else
currentScopeSymbol = (IContainerSymbol) temp; currentScopeSymbol = (IContainerSymbol) temp;
if( currentScopeSymbol == null ) if( currentScopeSymbol == null )
handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, containerSymbolName.toString(), containerSymbolName.getFirstToken().getOffset(), containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getLineNumber() ); handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, containerSymbolName.toString(), containerSymbolName.getFirstToken().getOffset(), containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getLineNumber(), true );
nameToken = name.getLastSegment().getFirstToken(); nameToken = name.getLastSegment().getFirstToken();
} else { } else {
@ -767,14 +767,24 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem(IProblem.SEMANTIC_UNIQUE_NAME_PREDEFINED, name.toString(), nameOffset, nameEndOffset, nameLine); handleProblem(IProblem.SEMANTIC_UNIQUE_NAME_PREDEFINED, name.toString(), nameOffset, nameEndOffset, nameLine, true);
} }
if( classSymbol != null && ! classSymbol.isForwardDeclaration() ) if( classSymbol != null && ! classSymbol.isForwardDeclaration() )
handleProblem( IProblem.SEMANTIC_UNIQUE_NAME_PREDEFINED, newSymbolName, nameOffset, nameEndOffset, nameLine ); handleProblem( IProblem.SEMANTIC_UNIQUE_NAME_PREDEFINED, newSymbolName, nameOffset, nameEndOffset, nameLine, true );
if( classSymbol != null && classSymbol.getType() != pstType ) if( classSymbol != null && classSymbol.getType() != pstType )
handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, newSymbolName, nameOffset, nameEndOffset, nameLine ); {
boolean isError = true;
if( classSymbol.isType( TypeInfo.t_class, TypeInfo.t_union ) )
{
if ( ( pstType == TypeInfo.t_class || pstType == TypeInfo.t_struct || pstType == TypeInfo.t_union ) )
isError = false;
}
handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, newSymbolName, nameOffset, nameEndOffset, nameLine, isError );
}
} }
IDerivableContainerSymbol newSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType ); IDerivableContainerSymbol newSymbol = pst.newDerivableContainerSymbol( newSymbolName, pstType );
@ -832,16 +842,16 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
protected void handleProblem( int id, String attribute ) throws ASTSemanticException protected void handleProblem( int id, String attribute ) throws ASTSemanticException
{ {
handleProblem( null, id, attribute, -1, -1, -1 ); //TODO make this right handleProblem( null, id, attribute, -1, -1, -1, true ); //TODO make this right
} }
protected void handleProblem( IASTScope scope, int id, String attribute ) throws ASTSemanticException protected void handleProblem( IASTScope scope, int id, String attribute ) throws ASTSemanticException
{ {
handleProblem( scope, id, attribute, -1, -1, -1 ); handleProblem( scope, id, attribute, -1, -1, -1, true );
} }
protected void handleProblem( int id, String attribute, int startOffset, int endOffset, int lineNumber) throws ASTSemanticException { protected void handleProblem( int id, String attribute, int startOffset, int endOffset, int lineNumber, boolean isError) throws ASTSemanticException {
handleProblem( null, id, attribute, startOffset, endOffset, lineNumber ); handleProblem( null, id, attribute, startOffset, endOffset, lineNumber, isError );
} }
/** /**
@ -850,19 +860,21 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
* @param startOffset * @param startOffset
* @param endOffset * @param endOffset
* @param lineNumber * @param lineNumber
* @param isError TODO
* @throws ASTSemanticException * @throws ASTSemanticException
*/ */
protected void handleProblem( IASTScope scope, int id, String attribute, int startOffset, int endOffset, int lineNumber) throws ASTSemanticException { protected void handleProblem( IASTScope scope, int id, String attribute, int startOffset, int endOffset, int lineNumber, boolean isError) throws ASTSemanticException {
IProblem p = problemFactory.createProblem( id, IProblem p = problemFactory.createProblem( id,
startOffset, endOffset, lineNumber, fileProvider.getCurrentFilename(), attribute, false, true ); startOffset, endOffset, lineNumber, fileProvider.getCurrentFilename(), attribute, !isError, isError );
TraceUtil.outputTrace(logService, "CompleteParseASTFactory - IProblem : ", p, null, null, null ); //$NON-NLS-1$ TraceUtil.outputTrace(logService, "CompleteParseASTFactory - IProblem : ", p, null, null, null ); //$NON-NLS-1$
if( shouldThrowException( scope, id ) ) if( shouldThrowException( scope, id, !isError ) )
throw new ASTSemanticException(p); throw new ASTSemanticException(p);
} }
protected boolean shouldThrowException( IASTScope scope, int id ){ protected boolean shouldThrowException( IASTScope scope, int id, boolean isWarning ){
if( isWarning ) return false;
if( scope != null ){ if( scope != null ){
IContainerSymbol symbol = scopeToSymbol( scope ); IContainerSymbol symbol = scopeToSymbol( scope );
if( symbol.isTemplateMember() ){ if( symbol.isTemplateMember() ){
@ -1056,7 +1068,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
catch (ParserSymbolTableException e1) catch (ParserSymbolTableException e1)
{ {
if( e1.reason == ParserSymbolTableException.r_InvalidOverload ) if( e1.reason == ParserSymbolTableException.r_InvalidOverload )
handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, name, startingOffset, endingOffset, startingLine ); handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, name, startingOffset, endingOffset, startingLine, true );
// assert false : e1; // assert false : e1;
} }
ASTEnumerator enumerator = new ASTEnumerator( enumeratorSymbol, enumeration, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endLine, initialValue ); ASTEnumerator enumerator = new ASTEnumerator( enumeratorSymbol, enumeration, startingOffset, startingLine, nameOffset, nameEndOffset, nameLine, endingOffset, endLine, initialValue );
@ -2004,11 +2016,11 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
} }
else else
handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, image, -1, -1, current.getLineNumber() ); handleProblem( IProblem.SEMANTIC_NAME_NOT_FOUND, image, -1, -1, current.getLineNumber(), true );
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem( e.createProblemID(), image,typeName.getStartOffset(), typeName.getEndOffset(), typeName.getLineNumber() ); handleProblem( e.createProblemID(), image,typeName.getStartOffset(), typeName.getEndOffset(), typeName.getLineNumber(), true );
} }
} }
s.setTypeSymbol( typeSymbol ); s.setTypeSymbol( typeSymbol );
@ -2073,7 +2085,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
){ ){
if( parentScope.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier ){ if( parentScope.getASTExtension().getPrimaryDeclaration() instanceof IASTElaboratedTypeSpecifier ){
//we are trying to define a member of a class for which we only have a forward declaration //we are trying to define a member of a class for which we only have a forward declaration
handleProblem( scope, IProblem.SEMANTICS_RELATED, name.toString(), startOffset, nameEndOffset, startLine ); handleProblem( scope, IProblem.SEMANTICS_RELATED, name.toString(), startOffset, nameEndOffset, startLine, true );
} }
IASTScope methodParentScope = (IASTScope)parentScope.getASTExtension().getPrimaryDeclaration(); IASTScope methodParentScope = (IASTScope)parentScope.getASTExtension().getPrimaryDeclaration();
ITokenDuple newName = name.getLastSegment(); ITokenDuple newName = name.getLastSegment();
@ -2121,7 +2133,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
while (p.hasNext()){ while (p.hasNext()){
ASTParameterDeclaration param = (ASTParameterDeclaration)p.next(); ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
if( param.getSymbol() == null ) if( param.getSymbol() == null )
handleProblem( IProblem.SEMANTICS_RELATED, param.getName(), param.getNameOffset(), param.getEndingOffset(), param.getStartingLine() ); handleProblem( IProblem.SEMANTICS_RELATED, param.getName(), param.getNameOffset(), param.getEndingOffset(), param.getStartingLine(), true );
functionParameters.add(param.getSymbol().getTypeInfo()); functionParameters.add(param.getSymbol().getTypeInfo());
} }
@ -2470,7 +2482,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
while (p.hasNext()){ while (p.hasNext()){
ASTParameterDeclaration param = (ASTParameterDeclaration)p.next(); ASTParameterDeclaration param = (ASTParameterDeclaration)p.next();
if( param.getSymbol() == null ) if( param.getSymbol() == null )
handleProblem( IProblem.SEMANTICS_RELATED, param.getName(), param.getNameOffset(), param.getEndingOffset(), param.getNameLineNumber() ); handleProblem( IProblem.SEMANTICS_RELATED, param.getName(), param.getNameOffset(), param.getEndingOffset(), param.getNameLineNumber(), true );
functionParameters.add(param.getSymbol().getTypeInfo()); functionParameters.add(param.getSymbol().getTypeInfo());
} }
@ -2493,7 +2505,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
ownerScope.getContainingSymbol().isType( TypeInfo.t_block ) ) ownerScope.getContainingSymbol().isType( TypeInfo.t_block ) )
{ {
//only needs to be previously declared if we are in a local class //only needs to be previously declared if we are in a local class
handleProblem( IProblem.SEMANTIC_ILLFORMED_FRIEND, nameDuple.toString(), nameDuple.getStartOffset(), nameDuple.getEndOffset(), nameDuple.getLineNumber() ); handleProblem( IProblem.SEMANTIC_ILLFORMED_FRIEND, nameDuple.toString(), nameDuple.getStartOffset(), nameDuple.getEndOffset(), nameDuple.getLineNumber(), true );
} }
} else if( functionDeclaration != null && functionDeclaration.isType( isConstructor ? TypeInfo.t_constructor : TypeInfo.t_function ) ) } else if( functionDeclaration != null && functionDeclaration.isType( isConstructor ? TypeInfo.t_constructor : TypeInfo.t_function ) )
@ -2527,7 +2539,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem(e.createProblemID(), nameDuple.toString(), nameDuple.getStartOffset(), nameDuple.getEndOffset(), nameDuple.getLineNumber() ); handleProblem(e.createProblemID(), nameDuple.toString(), nameDuple.getStartOffset(), nameDuple.getEndOffset(), nameDuple.getLineNumber(), true );
} }
resolveLeftoverConstructorInitializerMembers( symbol, constructorChain ); resolveLeftoverConstructorInitializerMembers( symbol, constructorChain );
@ -2607,7 +2619,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
IContainerSymbol ownerScope = scopeToSymbol( scope ); IContainerSymbol ownerScope = scopeToSymbol( scope );
if( name == null ) if( name == null )
handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null, startingOffset, nameEndOffset, nameLine ); handleProblem( IProblem.SEMANTIC_NAME_NOT_PROVIDED, null, startingOffset, nameEndOffset, nameLine, true );
if(name.getSegmentCount() > 1) if(name.getSegmentCount() > 1)
{ {
@ -2936,7 +2948,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
try { try {
template.addTemplateParameter( param.getSymbol() ); template.addTemplateParameter( param.getSymbol() );
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
handleProblem( e.createProblemID(), param.getName(), startingOffset, -1, startingLine ); handleProblem( e.createProblemID(), param.getName(), startingOffset, -1, startingLine, true );
} }
} }
@ -2970,7 +2982,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
try { try {
template.addTemplateParameter( param.getSymbol() ); template.addTemplateParameter( param.getSymbol() );
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
handleProblem( e.createProblemID(), param.getName(), param.getStartingOffset(), param.getEndingOffset(), param.getStartingLine() ); //$NON-NLS-1$ handleProblem( e.createProblemID(), param.getName(), param.getStartingOffset(), param.getEndingOffset(), param.getStartingLine(), true ); //$NON-NLS-1$
} }
} }
symbol = template; symbol = template;
@ -3047,7 +3059,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
ISymbol typeSymbol = cloneSimpleTypeSymbol( name, mapping, null ); ISymbol typeSymbol = cloneSimpleTypeSymbol( name, mapping, null );
if( typeSymbol == null ) if( typeSymbol == null )
handleProblem( scope, IProblem.SEMANTICS_RELATED, name, nameOffset, nameEndOffset, nameLine ); handleProblem( scope, IProblem.SEMANTICS_RELATED, name, nameOffset, nameEndOffset, nameLine, true );
setPointerOperators( typeSymbol, mapping.getPointerOperators(), mapping.getArrayModifiers() ); setPointerOperators( typeSymbol, mapping.getPointerOperators(), mapping.getArrayModifiers() );
@ -3126,7 +3138,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
containerSymbolName.toString(), containerSymbolName containerSymbolName.toString(), containerSymbolName
.getFirstToken().getOffset(), .getFirstToken().getOffset(),
containerSymbolName.getLastToken().getEndOffset(), containerSymbolName.getLastToken().getEndOffset(),
containerSymbolName.getLastToken().getLineNumber()); containerSymbolName.getLastToken().getLineNumber(), true);
nameToken = name.getLastSegment().getFirstToken(); nameToken = name.getLastSegment().getFirstToken();
} }
//template-id //template-id
@ -3149,7 +3161,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
handleProblem(e.createProblemID(), nameToken.getImage(), handleProblem(e.createProblemID(), nameToken.getImage(),
nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getOffset(), nameToken.getEndOffset(),
nameToken.getLineNumber()); nameToken.getLineNumber(), true);
} }
} }
List args = null; List args = null;
@ -3165,7 +3177,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} catch (ParserSymbolTableException e) { } catch (ParserSymbolTableException e) {
handleProblem(e.createProblemID(), nameToken.getImage(), handleProblem(e.createProblemID(), nameToken.getImage(),
nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getOffset(), nameToken.getEndOffset(),
nameToken.getLineNumber()); nameToken.getLineNumber(), true);
} }
} else { } else {
handleProblem(IProblem.SEMANTIC_INVALID_TEMPLATE, nameToken handleProblem(IProblem.SEMANTIC_INVALID_TEMPLATE, nameToken
@ -3189,7 +3201,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} catch (ParserSymbolTableException e1) { } catch (ParserSymbolTableException e1) {
handleProblem(e1.createProblemID(), nameToken.getImage(), handleProblem(e1.createProblemID(), nameToken.getImage(),
nameToken.getOffset(), nameToken.getEndOffset(), nameToken.getOffset(), nameToken.getEndOffset(),
nameToken.getLineNumber()); nameToken.getLineNumber(), true);
} }
ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier( ASTElaboratedTypeSpecifier elab = new ASTElaboratedTypeSpecifier(
checkSymbol, kind, startingOffset, startingLine, name checkSymbol, kind, startingOffset, startingLine, name
@ -3226,7 +3238,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} else { } else {
handleProblem(IProblem.SEMANTIC_NAME_NOT_FOUND, newSymbolName, handleProblem(IProblem.SEMANTIC_NAME_NOT_FOUND, newSymbolName,
nameToken.getOffset(), nameToken.getEndOffset(), nameToken nameToken.getOffset(), nameToken.getEndOffset(), nameToken
.getLineNumber()); .getLineNumber(), true);
} }
@ -3252,7 +3264,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
ISymbol namespaceSymbol = lookupQualifiedName( startingSymbol, alias, references, true ); ISymbol namespaceSymbol = lookupQualifiedName( startingSymbol, alias, references, true );
if( namespaceSymbol.getType() != TypeInfo.t_namespace ) if( namespaceSymbol.getType() != TypeInfo.t_namespace )
handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, alias.toString(), startingOffset, endOffset, startingLine ); handleProblem( IProblem.SEMANTIC_INVALID_OVERLOAD, alias.toString(), startingOffset, endOffset, startingLine, true );
ISymbol newSymbol = pst.newContainerSymbol( identifier, TypeInfo.t_namespace ); ISymbol newSymbol = pst.newContainerSymbol( identifier, TypeInfo.t_namespace );
newSymbol.setTypeSymbol( namespaceSymbol ); newSymbol.setTypeSymbol( namespaceSymbol );
@ -3263,7 +3275,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
handleProblem( e.createProblemID(), identifier, startingOffset, endOffset, startingLine ); handleProblem( e.createProblemID(), identifier, startingOffset, endOffset, startingLine, true );
} }
ASTNamespaceAlias astAlias = new ASTNamespaceAlias( ASTNamespaceAlias astAlias = new ASTNamespaceAlias(