mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-06 17:26:01 +02:00
Fixed Bug 84374 - [Lengths] bad lengths for ICPPASTNewExpression
This commit is contained in:
parent
1362e388a1
commit
2edfe202ea
2 changed files with 154 additions and 112 deletions
|
@ -40,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
|
||||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||||
import org.eclipse.cdt.internal.core.parser.ParserException;
|
import org.eclipse.cdt.internal.core.parser.ParserException;
|
||||||
|
|
||||||
|
@ -292,6 +293,20 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBug84374() throws Exception
|
||||||
|
{
|
||||||
|
String code = "class P1 { public: int x; };\nclass P2 { public: int x; };\nclass B : public P1, public P2 {};\nvoid main() {\nB * b = new B();\n}"; //$NON-NLS-1$
|
||||||
|
IASTTranslationUnit tu = parse( code, ParserLanguage.CPP );
|
||||||
|
IASTFunctionDefinition main = (IASTFunctionDefinition) tu.getDeclarations()[3];
|
||||||
|
IASTCompoundStatement statement = (IASTCompoundStatement) main.getBody();
|
||||||
|
IASTDeclarationStatement decl = (IASTDeclarationStatement) statement.getStatements()[0];
|
||||||
|
IASTSimpleDeclaration b = (IASTSimpleDeclaration) decl.getDeclaration();
|
||||||
|
IASTInitializerExpression initializerExpression = (IASTInitializerExpression) b.getDeclarators()[0].getInitializer();
|
||||||
|
assertSoleLocation( initializerExpression, code.indexOf( "new B()"), "new B()".length() ); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
ICPPASTNewExpression newExpression = (ICPPASTNewExpression) initializerExpression.getExpression();
|
||||||
|
assertSoleLocation( newExpression, code.indexOf( "new B()"), "new B()".length() ); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
}
|
||||||
|
|
||||||
public void testBug83737() throws Exception {
|
public void testBug83737() throws Exception {
|
||||||
String code = "void f() { if( a == 0 ) g( a ); else if( a < 0 ) g( a >> 1 ); else if( a > 0 ) g( *(&a + 2) ); }"; //$NON-NLS-1$
|
String code = "void f() { if( a == 0 ) g( a ); else if( a < 0 ) g( a >> 1 ); else if( a > 0 ) g( *(&a + 2) ); }"; //$NON-NLS-1$
|
||||||
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
||||||
|
@ -312,7 +327,6 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
assertSoleLocation( second_if, second_if_start, total_if_end - second_if_start );
|
assertSoleLocation( second_if, second_if_start, total_if_end - second_if_start );
|
||||||
assertSoleLocation( third_if, third_if_start, total_if_end - third_if_start );
|
assertSoleLocation( third_if, third_if_start, total_if_end - third_if_start );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -41,7 +41,6 @@ import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
|
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||||
|
@ -67,6 +66,7 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
@ -548,8 +548,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
if (nameDuple != null) {
|
if (nameDuple != null) {
|
||||||
IASTName name = createName(nameDuple);
|
IASTName name = createName(nameDuple);
|
||||||
ICPPASTPointerToMember p2m = createPointerToMember(isRestrict);
|
ICPPASTPointerToMember p2m = createPointerToMember(isRestrict);
|
||||||
((ASTNode) p2m).setOffsetAndLength(nameDuple.getFirstToken().getOffset(), last
|
((ASTNode) p2m).setOffsetAndLength(nameDuple.getFirstToken()
|
||||||
.getEndOffset() - nameDuple.getFirstToken().getOffset() );
|
.getOffset(), last.getEndOffset()
|
||||||
|
- nameDuple.getFirstToken().getOffset());
|
||||||
p2m.setConst(isConst);
|
p2m.setConst(isConst);
|
||||||
p2m.setVolatile(isVolatile);
|
p2m.setVolatile(isVolatile);
|
||||||
p2m.setName(name);
|
p2m.setName(name);
|
||||||
|
@ -894,7 +895,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
IASTDeclarator declarator = null;
|
IASTDeclarator declarator = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
declSpecifier = declSpecifierSeq(false, false);
|
declSpecifier = declSpecifierSeq(true, true);
|
||||||
declarator = declarator(SimpleDeclarationStrategy.TRY_CONSTRUCTOR,
|
declarator = declarator(SimpleDeclarationStrategy.TRY_CONSTRUCTOR,
|
||||||
true);
|
true);
|
||||||
} catch (BacktrackException bt) {
|
} catch (BacktrackException bt) {
|
||||||
|
@ -910,10 +911,18 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
declarator)
|
declarator)
|
||||||
- startingOffset);
|
- startingOffset);
|
||||||
}
|
}
|
||||||
|
if (declSpecifier instanceof IASTSimpleDeclSpecifier
|
||||||
|
&& ((ASTNode) declSpecifier).getLength() == 0) {
|
||||||
|
backup(mark);
|
||||||
|
throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
|
||||||
|
declarator)
|
||||||
|
- startingOffset);
|
||||||
|
}
|
||||||
|
|
||||||
IASTTypeId result = createTypeId();
|
IASTTypeId result = createTypeId();
|
||||||
((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset(
|
((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset(
|
||||||
declSpecifier, declarator) - startingOffset);
|
declSpecifier, declarator)
|
||||||
|
- startingOffset);
|
||||||
|
|
||||||
result.setDeclSpecifier(declSpecifier);
|
result.setDeclSpecifier(declSpecifier);
|
||||||
declSpecifier.setParent(result);
|
declSpecifier.setParent(result);
|
||||||
|
@ -986,7 +995,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
*
|
*
|
||||||
* newexpression: ::? new newplacement? newtypeid newinitializer? ::? new
|
* newexpression: ::? new newplacement? newtypeid newinitializer? ::? new
|
||||||
* newplacement? ( typeid ) newinitializer? newplacement: ( expressionlist )
|
* newplacement? ( typeid ) newinitializer? newplacement: ( expressionlist )
|
||||||
* newtypeid: typespecifierseq newdeclarator? newdeclarator: ptroperator
|
* newtypeid: typespecifierseq newdeclarator? newdeclarator: ptroperator *
|
||||||
* newdeclarator? | directnewdeclarator directnewdeclarator: [ expression ]
|
* newdeclarator? | directnewdeclarator directnewdeclarator: [ expression ]
|
||||||
* directnewdeclarator [ constantexpression ] newinitializer: (
|
* directnewdeclarator [ constantexpression ] newinitializer: (
|
||||||
* expressionlist? )
|
* expressionlist? )
|
||||||
|
@ -1012,6 +1021,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
IASTExpression newInitializerExpressions = null;
|
IASTExpression newInitializerExpressions = null;
|
||||||
boolean isNewTypeId = false;
|
boolean isNewTypeId = false;
|
||||||
|
|
||||||
|
master_new_loop: for (int i = 0; i < 2; ++i) {
|
||||||
|
IToken loopMark = LA(1);
|
||||||
if (LT(1) == IToken.tLPAREN) {
|
if (LT(1) == IToken.tLPAREN) {
|
||||||
lastOffset = consume(IToken.tLPAREN).getEndOffset();
|
lastOffset = consume(IToken.tLPAREN).getEndOffset();
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
|
@ -1019,7 +1030,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// Try to consume placement list
|
// Try to consume placement list
|
||||||
// Note: since expressionList and expression are the same...
|
if (i == 0) {
|
||||||
backtrackMarker = mark();
|
backtrackMarker = mark();
|
||||||
newPlacementExpressions = expression();
|
newPlacementExpressions = expression();
|
||||||
lastOffset = consume(IToken.tRPAREN).getEndOffset();
|
lastOffset = consume(IToken.tRPAREN).getEndOffset();
|
||||||
|
@ -1029,10 +1040,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
} //pop 1st Parent
|
} //pop 1st Parent
|
||||||
placementParseFailure = true;
|
placementParseFailure = true;
|
||||||
throwBacktrack(backtrackMarker.getOffset(), backtrackMarker
|
throwBacktrack(backtrackMarker.getOffset(),
|
||||||
.getLength());
|
backtrackMarker.getLength());
|
||||||
} else
|
} else
|
||||||
placementParseFailure = false;
|
placementParseFailure = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (LT(1) == IToken.tLPAREN) {
|
if (LT(1) == IToken.tLPAREN) {
|
||||||
beforeSecondParen = mark();
|
beforeSecondParen = mark();
|
||||||
lastOffset = consume(IToken.tLPAREN).getEndOffset();
|
lastOffset = consume(IToken.tLPAREN).getEndOffset();
|
||||||
|
@ -1053,7 +1066,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
} //pop 1st Paren
|
} //pop 1st Paren
|
||||||
} else {
|
break master_new_loop;
|
||||||
|
}
|
||||||
if (!typeIdInParen) {
|
if (!typeIdInParen) {
|
||||||
if (LT(1) == IToken.tLBRACKET) {
|
if (LT(1) == IToken.tLBRACKET) {
|
||||||
// CASE: new (typeid-looking-as-placement) [expr]...
|
// CASE: new (typeid-looking-as-placement) [expr]...
|
||||||
|
@ -1072,12 +1086,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
backtrackMarker = mark();
|
backtrackMarker = mark();
|
||||||
typeId = typeId(true);
|
typeId = typeId(true);
|
||||||
lastOffset = calculateEndOffset(typeId);
|
lastOffset = calculateEndOffset(typeId);
|
||||||
|
break master_new_loop;
|
||||||
} catch (BacktrackException e) {
|
} catch (BacktrackException e) {
|
||||||
// Hmmm, so it wasn't typeId after all... Then it is
|
// Hmmm, so it wasn't typeId after all... Then it is
|
||||||
// CASE: new (typeid-looking-as-placement)
|
// CASE: new (typeid-looking-as-placement)
|
||||||
backup(backtrackMarker);
|
backup(loopMark);
|
||||||
// TODO fix this
|
placementParseFailure = true;
|
||||||
return null;
|
continue master_new_loop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1125,6 +1140,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
break master_new_loop;
|
||||||
} catch (BacktrackException e) {
|
} catch (BacktrackException e) {
|
||||||
// CASE: new
|
// CASE: new
|
||||||
// (typeid-looking-as-placement)(initializer-not-looking-as-typeid)
|
// (typeid-looking-as-placement)(initializer-not-looking-as-typeid)
|
||||||
|
@ -1135,21 +1151,27 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}//pop that 2nd paren
|
}//pop that 2nd paren
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// CASE: new typeid ...
|
// CASE: new typeid ...
|
||||||
// new parameters do not start with '('
|
// new parameters do not start with '('
|
||||||
// i.e it has to be a plain typeId
|
// i.e it has to be a plain typeId
|
||||||
typeId = typeId(true);
|
typeId = typeId(true);
|
||||||
|
lastOffset = calculateEndOffset(typeId);
|
||||||
isNewTypeId = true;
|
isNewTypeId = true;
|
||||||
|
break master_new_loop;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ICPPASTNewExpression result = createNewExpression();
|
ICPPASTNewExpression result = createNewExpression();
|
||||||
((ASTNode) result).setOffset(startingOffset);
|
((ASTNode) result).setOffsetAndLength(startingOffset, lastOffset
|
||||||
|
- startingOffset);
|
||||||
result.setIsGlobal(isGlobal);
|
result.setIsGlobal(isGlobal);
|
||||||
|
if (typeId != null) {
|
||||||
result.setIsNewTypeId(isNewTypeId);
|
result.setIsNewTypeId(isNewTypeId);
|
||||||
result.setTypeId(typeId);
|
result.setTypeId(typeId);
|
||||||
typeId.setParent(result);
|
typeId.setParent(result);
|
||||||
typeId.setPropertyInParent(ICPPASTNewExpression.TYPE_ID);
|
typeId.setPropertyInParent(ICPPASTNewExpression.TYPE_ID);
|
||||||
|
}
|
||||||
if (newPlacementExpressions != null) {
|
if (newPlacementExpressions != null) {
|
||||||
result.setNewPlacement(newPlacementExpressions);
|
result.setNewPlacement(newPlacementExpressions);
|
||||||
newPlacementExpressions.setParent(result);
|
newPlacementExpressions.setParent(result);
|
||||||
|
@ -1159,14 +1181,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
|
|
||||||
while (LT(1) == IToken.tLBRACKET) {
|
while (LT(1) == IToken.tLBRACKET) {
|
||||||
// array new
|
// array new
|
||||||
consume();
|
lastOffset = consume().getEndOffset();
|
||||||
|
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.push(IToken.tLBRACKET);
|
templateIdScopes.push(IToken.tLBRACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
IASTExpression a = assignmentExpression();
|
IASTExpression a = assignmentExpression();
|
||||||
consume(IToken.tRBRACKET);
|
lastOffset = consume(IToken.tRBRACKET).getEndOffset();
|
||||||
result.addNewTypeIdArrayExpression(a);
|
result.addNewTypeIdArrayExpression(a);
|
||||||
a.setParent(result);
|
a.setParent(result);
|
||||||
a
|
a
|
||||||
|
@ -1178,7 +1200,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
// newinitializer
|
// newinitializer
|
||||||
if (LT(1) == IToken.tLPAREN) {
|
if (LT(1) == IToken.tLPAREN) {
|
||||||
consume(IToken.tLPAREN);
|
lastOffset = consume(IToken.tLPAREN).getEndOffset();
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.push(IToken.tLPAREN);
|
templateIdScopes.push(IToken.tLPAREN);
|
||||||
}
|
}
|
||||||
|
@ -1187,19 +1209,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
// empty new Initializer
|
// empty new Initializer
|
||||||
//if the next token is the RPAREN, then we have an Empty expression
|
//if the next token is the RPAREN, then we have an Empty expression
|
||||||
// in our list.
|
// in our list.
|
||||||
|
if (LT(1) != IToken.tRPAREN)
|
||||||
newInitializerExpressions = expression();
|
newInitializerExpressions = expression();
|
||||||
|
|
||||||
int lo = consume(IToken.tRPAREN).getEndOffset();
|
lastOffset = consume(IToken.tRPAREN).getEndOffset();
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
}
|
}
|
||||||
|
if (newInitializerExpressions != null) {
|
||||||
result.setNewInitializer(newInitializerExpressions);
|
result.setNewInitializer(newInitializerExpressions);
|
||||||
newInitializerExpressions.setParent(result);
|
newInitializerExpressions.setParent(result);
|
||||||
newInitializerExpressions
|
newInitializerExpressions
|
||||||
.setPropertyInParent(ICPPASTNewExpression.NEW_INITIALIZER);
|
.setPropertyInParent(ICPPASTNewExpression.NEW_INITIALIZER);
|
||||||
((CPPASTNode) result).setLength(lo - startingOffset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
((CPPASTNode) result).setLength(lastOffset - startingOffset);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1679,7 +1704,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
}
|
}
|
||||||
return buildUnaryExpression( IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(), finalOffset );
|
return buildUnaryExpression(
|
||||||
|
IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(),
|
||||||
|
finalOffset);
|
||||||
case IToken.tIDENTIFIER:
|
case IToken.tIDENTIFIER:
|
||||||
case IToken.tCOLONCOLON:
|
case IToken.tCOLONCOLON:
|
||||||
case IToken.t_operator:
|
case IToken.t_operator:
|
||||||
|
@ -3141,7 +3168,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
elabSpec.setStorageClass(storageClass);
|
elabSpec.setStorageClass(storageClass);
|
||||||
elabSpec.setVirtual(isVirtual);
|
elabSpec.setVirtual(isVirtual);
|
||||||
elabSpec.setExplicit(isExplicit);
|
elabSpec.setExplicit(isExplicit);
|
||||||
((CPPASTNode)elabSpec).setOffsetAndLength( startOffset, calculateEndOffset(elabSpec)- startOffset );
|
((CPPASTNode) elabSpec).setOffsetAndLength(startOffset,
|
||||||
|
calculateEndOffset(elabSpec) - startOffset);
|
||||||
return elabSpec;
|
return elabSpec;
|
||||||
}
|
}
|
||||||
if (enumSpec != null) {
|
if (enumSpec != null) {
|
||||||
|
@ -3154,7 +3182,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
((ICPPASTDeclSpecifier) enumSpec).setExplicit(isExplicit);
|
((ICPPASTDeclSpecifier) enumSpec).setExplicit(isExplicit);
|
||||||
enumSpec.setInline(isInline);
|
enumSpec.setInline(isInline);
|
||||||
enumSpec.setStorageClass(storageClass);
|
enumSpec.setStorageClass(storageClass);
|
||||||
((CPPASTNode)enumSpec).setOffsetAndLength( startOffset, calculateEndOffset(enumSpec) - startOffset );
|
((CPPASTNode) enumSpec).setOffsetAndLength(startOffset,
|
||||||
|
calculateEndOffset(enumSpec) - startOffset);
|
||||||
return (ICPPASTDeclSpecifier) enumSpec;
|
return (ICPPASTDeclSpecifier) enumSpec;
|
||||||
}
|
}
|
||||||
if (classSpec != null) {
|
if (classSpec != null) {
|
||||||
|
@ -3167,7 +3196,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
classSpec.setStorageClass(storageClass);
|
classSpec.setStorageClass(storageClass);
|
||||||
classSpec.setVirtual(isVirtual);
|
classSpec.setVirtual(isVirtual);
|
||||||
classSpec.setExplicit(isExplicit);
|
classSpec.setExplicit(isExplicit);
|
||||||
((CPPASTNode)classSpec).setOffsetAndLength( startOffset, calculateEndOffset(classSpec) - startOffset );
|
((CPPASTNode) classSpec).setOffsetAndLength(startOffset,
|
||||||
|
calculateEndOffset(classSpec) - startOffset);
|
||||||
return classSpec;
|
return classSpec;
|
||||||
}
|
}
|
||||||
if (duple != null) {
|
if (duple != null) {
|
||||||
|
@ -3187,7 +3217,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
nameSpec.setStorageClass(storageClass);
|
nameSpec.setStorageClass(storageClass);
|
||||||
nameSpec.setVirtual(isVirtual);
|
nameSpec.setVirtual(isVirtual);
|
||||||
nameSpec.setExplicit(isExplicit);
|
nameSpec.setExplicit(isExplicit);
|
||||||
((CPPASTNode)nameSpec).setOffsetAndLength( startOffset, last.getEndOffset() - startOffset );
|
((CPPASTNode) nameSpec).setOffsetAndLength(startOffset, last
|
||||||
|
.getEndOffset()
|
||||||
|
- startOffset);
|
||||||
return nameSpec;
|
return nameSpec;
|
||||||
}
|
}
|
||||||
ICPPASTSimpleDeclSpecifier simpleDeclSpec = null;
|
ICPPASTSimpleDeclSpecifier simpleDeclSpec = null;
|
||||||
|
@ -3325,7 +3357,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
d.setInitializer(initializer);
|
d.setInitializer(initializer);
|
||||||
initializer.setParent(d);
|
initializer.setParent(d);
|
||||||
initializer.setPropertyInParent(IASTDeclarator.INITIALIZER);
|
initializer.setPropertyInParent(IASTDeclarator.INITIALIZER);
|
||||||
((ASTNode)d).setLength( calculateEndOffset( initializer ) - ((ASTNode)d).getOffset() );
|
((ASTNode) d).setLength(calculateEndOffset(initializer)
|
||||||
|
- ((ASTNode) d).getOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
|
@ -3529,7 +3562,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((!LA(2).looksLikeExpression()
|
if ((!LA(2).looksLikeExpression()
|
||||||
&& strategy != SimpleDeclarationStrategy.TRY_VARIABLE && !failed)) {
|
&& strategy != SimpleDeclarationStrategy.TRY_VARIABLE
|
||||||
|
&& !failed && !forTypeID)) {
|
||||||
// parameterDeclarationClause
|
// parameterDeclarationClause
|
||||||
isFunction = true;
|
isFunction = true;
|
||||||
// TODO need to create a temporary scope object here
|
// TODO need to create a temporary scope object here
|
||||||
|
@ -3911,7 +3945,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
|
|
||||||
IASTNode n = mostRelevantScopeNode;
|
IASTNode n = mostRelevantScopeNode;
|
||||||
mostRelevantScopeNode = astClassSpecifier;
|
mostRelevantScopeNode = astClassSpecifier;
|
||||||
astClassSpecifier.setParent( n );
|
astClassSpecifier.setParent(n);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
memberDeclarationLoop: while (LT(1) != IToken.tRBRACE) {
|
memberDeclarationLoop: while (LT(1) != IToken.tRBRACE) {
|
||||||
|
@ -4025,43 +4059,35 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
baseSpecifierLoop: for (;;) {
|
baseSpecifierLoop: for (;;) {
|
||||||
switch (LT(1)) {
|
switch (LT(1)) {
|
||||||
case IToken.t_virtual:
|
case IToken.t_virtual:
|
||||||
if (firstToken == null)
|
if (firstToken == null) {
|
||||||
{
|
|
||||||
firstToken = consume(IToken.t_virtual);
|
firstToken = consume(IToken.t_virtual);
|
||||||
last = firstToken;
|
last = firstToken;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
last = consume(IToken.t_virtual);
|
last = consume(IToken.t_virtual);
|
||||||
isVirtual = true;
|
isVirtual = true;
|
||||||
break;
|
break;
|
||||||
case IToken.t_public:
|
case IToken.t_public:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_public;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_public;
|
||||||
if (firstToken == null)
|
if (firstToken == null) {
|
||||||
{
|
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
last = firstToken;
|
last = firstToken;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
case IToken.t_protected:
|
case IToken.t_protected:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_protected;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_protected;
|
||||||
if (firstToken == null)
|
if (firstToken == null) {
|
||||||
{
|
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
last = firstToken;
|
last = firstToken;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
case IToken.t_private:
|
case IToken.t_private:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_private;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_private;
|
||||||
if (firstToken == null)
|
if (firstToken == null) {
|
||||||
{
|
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
last = firstToken;
|
last = firstToken;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
case IToken.tCOLONCOLON:
|
case IToken.tCOLONCOLON:
|
||||||
|
@ -4069,7 +4095,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
//to get templates right we need to use the class as the scope
|
//to get templates right we need to use the class as the scope
|
||||||
ITokenDuple d = name();
|
ITokenDuple d = name();
|
||||||
name = createName(d);
|
name = createName(d);
|
||||||
if( firstToken == null )
|
if (firstToken == null)
|
||||||
firstToken = d.getFirstToken();
|
firstToken = d.getFirstToken();
|
||||||
last = d.getLastToken();
|
last = d.getLastToken();
|
||||||
break;
|
break;
|
||||||
|
@ -4105,9 +4131,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
name = createName();
|
name = createName();
|
||||||
baseSpec = createBaseSpecifier();
|
baseSpec = createBaseSpecifier();
|
||||||
if (firstToken != null)
|
if (firstToken != null)
|
||||||
((ASTNode) baseSpec)
|
((ASTNode) baseSpec).setOffsetAndLength(firstToken
|
||||||
.setOffsetAndLength(firstToken.getOffset(), last
|
.getOffset(), last.getEndOffset()
|
||||||
.getEndOffset()
|
|
||||||
- firstToken.getOffset());
|
- firstToken.getOffset());
|
||||||
baseSpec.setVirtual(isVirtual);
|
baseSpec.setVirtual(isVirtual);
|
||||||
baseSpec.setVisibility(visibility);
|
baseSpec.setVisibility(visibility);
|
||||||
|
@ -4428,7 +4453,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
*/
|
*/
|
||||||
protected IASTName createName(IToken token) {
|
protected IASTName createName(IToken token) {
|
||||||
CPPASTName n = new CPPASTName(token.getCharImage());
|
CPPASTName n = new CPPASTName(token.getCharImage());
|
||||||
n.setOffsetAndLength( token.getOffset(), token.getLength() );
|
n.setOffsetAndLength(token.getOffset(), token.getLength());
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4728,18 +4753,21 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/*
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser#resolveOtherAmbiguitiesAsDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement, org.eclipse.cdt.core.dom.ast.IASTExpressionStatement)
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser#resolveOtherAmbiguitiesAsDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement,
|
||||||
|
* org.eclipse.cdt.core.dom.ast.IASTExpressionStatement)
|
||||||
*/
|
*/
|
||||||
protected boolean resolveOtherAmbiguitiesAsDeclaration(
|
protected boolean resolveOtherAmbiguitiesAsDeclaration(
|
||||||
IASTDeclarationStatement ds,
|
IASTDeclarationStatement ds,
|
||||||
IASTExpressionStatement expressionStatement) {
|
IASTExpressionStatement expressionStatement) {
|
||||||
if( expressionStatement.getExpression() instanceof IASTArraySubscriptExpression )
|
if (expressionStatement.getExpression() instanceof IASTArraySubscriptExpression) {
|
||||||
{
|
IASTArraySubscriptExpression arraySub = (IASTArraySubscriptExpression) expressionStatement
|
||||||
IASTArraySubscriptExpression arraySub = (IASTArraySubscriptExpression) expressionStatement.getExpression();
|
.getExpression();
|
||||||
if( ! ( arraySub.getArrayExpression() instanceof IASTIdExpression ||
|
if (!(arraySub.getArrayExpression() instanceof IASTIdExpression
|
||||||
arraySub.getArrayExpression() instanceof IASTArraySubscriptExpression ||
|
|| arraySub.getArrayExpression() instanceof IASTArraySubscriptExpression || arraySub
|
||||||
arraySub.getArrayExpression() instanceof IASTFieldReference ))
|
.getArrayExpression() instanceof IASTFieldReference))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super
|
return super
|
||||||
|
|
Loading…
Add table
Reference in a new issue