1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Fixed 84133 - "typdef" seems the same as "typedef" to AST DOM

This commit is contained in:
John Camelon 2005-02-01 15:55:07 +00:00
parent 6d063588c2
commit bcedb9a5c1
3 changed files with 2415 additions and 2408 deletions

View file

@ -1930,4 +1930,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return calculateEndOffset(declarator); return calculateEndOffset(declarator);
} }
/**
* @param token
*/
protected void throwBacktrack(IToken token) throws BacktrackException {
throwBacktrack( token.getOffset(), token.getLength() );
}
} }

View file

@ -174,11 +174,9 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
((CASTNode) newDesignators.get(0)).getOffset(), ((CASTNode) newDesignators.get(0)).getOffset(),
((CASTNode) newDesignators.get(0)).getLength()); ((CASTNode) newDesignators.get(0)).getLength());
for (int i = 0; i < newDesignators.size(); ++i) { for (int i = 0; i < newDesignators.size(); ++i) {
ICASTDesignator d = (ICASTDesignator) newDesignators ICASTDesignator d = (ICASTDesignator) newDesignators.get(i);
.get(i);
d.setParent(desigInitializer); d.setParent(desigInitializer);
d d.setPropertyInParent(ICASTDesignatedInitializer.DESIGNATOR);
.setPropertyInParent(ICASTDesignatedInitializer.DESIGNATOR);
desigInitializer.addDesignator(d); desigInitializer.addDesignator(d);
} }
desigInitializer.setOperandInitializer(initializer); desigInitializer.setOperandInitializer(initializer);
@ -219,9 +217,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression assignmentExpression = assignmentExpression(); IASTExpression assignmentExpression = assignmentExpression();
IASTInitializerExpression result = createInitializerExpression(); IASTInitializerExpression result = createInitializerExpression();
result.setExpression(assignmentExpression); result.setExpression(assignmentExpression);
((ASTNode) result).setOffsetAndLength( ((ASTNode) result).setOffsetAndLength(((ASTNode) assignmentExpression)
((ASTNode) assignmentExpression).getOffset(), .getOffset(), ((ASTNode) assignmentExpression).getLength());
((ASTNode) assignmentExpression).getLength());
assignmentExpression.setParent(result); assignmentExpression.setParent(result);
assignmentExpression assignmentExpression
.setPropertyInParent(IASTInitializerExpression.INITIALIZER_EXPRESSION); .setPropertyInParent(IASTInitializerExpression.INITIALIZER_EXPRESSION);
@ -272,19 +269,17 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
n.setParent(designator); n.setParent(designator);
n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME); n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME);
if (designatorList == Collections.EMPTY_LIST) if (designatorList == Collections.EMPTY_LIST)
designatorList = new ArrayList( designatorList = new ArrayList(DEFAULT_DESIGNATOR_LIST_SIZE);
DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} else if (LT(1) == IToken.tLBRACKET) { } else if (LT(1) == IToken.tLBRACKET) {
IToken mark = consume(IToken.tLBRACKET); IToken mark = consume(IToken.tLBRACKET);
int offset = mark.getOffset(); int offset = mark.getOffset();
IASTExpression constantExpression = expression(); IASTExpression constantExpression = expression();
if (LT(1) == IToken.tRBRACKET) { if (LT(1) == IToken.tRBRACKET) {
int lastOffset = consume(IToken.tRBRACKET) int lastOffset = consume(IToken.tRBRACKET).getEndOffset();
.getEndOffset();
ICASTArrayDesignator designator = createArrayDesignator(); ICASTArrayDesignator designator = createArrayDesignator();
((ASTNode) designator).setOffsetAndLength(offset, ((ASTNode) designator).setOffsetAndLength(offset, lastOffset
lastOffset - offset); - offset);
designator.setSubscriptExpression(constantExpression); designator.setSubscriptExpression(constantExpression);
constantExpression.setParent(designator); constantExpression.setParent(designator);
constantExpression constantExpression
@ -301,8 +296,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression constantExpression1 = expression(); IASTExpression constantExpression1 = expression();
consume(IToken.tELLIPSIS); consume(IToken.tELLIPSIS);
IASTExpression constantExpression2 = expression(); IASTExpression constantExpression2 = expression();
int lastOffset = consume(IToken.tRBRACKET) int lastOffset = consume(IToken.tRBRACKET).getEndOffset();
.getEndOffset();
IGCCASTArrayRangeDesignator designator = createArrayRangeDesignator(); IGCCASTArrayRangeDesignator designator = createArrayRangeDesignator();
((ASTNode) designator).setOffsetAndLength(startOffset, ((ASTNode) designator).setOffsetAndLength(startOffset,
lastOffset - startOffset); lastOffset - startOffset);
@ -324,15 +318,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IToken identifier = identifier(); IToken identifier = identifier();
int lastOffset = consume(IToken.tCOLON).getEndOffset(); int lastOffset = consume(IToken.tCOLON).getEndOffset();
ICASTFieldDesignator designator = createFieldDesignator(); ICASTFieldDesignator designator = createFieldDesignator();
((ASTNode) designator).setOffsetAndLength(identifier ((ASTNode) designator).setOffsetAndLength(
.getOffset(), lastOffset - identifier.getOffset()); identifier.getOffset(), lastOffset
- identifier.getOffset());
IASTName n = createName(identifier); IASTName n = createName(identifier);
designator.setName(n); designator.setName(n);
n.setParent(designator); n.setParent(designator);
n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME); n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME);
if (designatorList == Collections.EMPTY_LIST) if (designatorList == Collections.EMPTY_LIST)
designatorList = new ArrayList( designatorList = new ArrayList(DEFAULT_DESIGNATOR_LIST_SIZE);
DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} }
} }
@ -344,15 +338,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IToken identifier = identifier(); IToken identifier = identifier();
int lastOffset = consume(IToken.tCOLON).getEndOffset(); int lastOffset = consume(IToken.tCOLON).getEndOffset();
ICASTFieldDesignator designator = createFieldDesignator(); ICASTFieldDesignator designator = createFieldDesignator();
((ASTNode) designator).setOffsetAndLength(identifier ((ASTNode) designator).setOffsetAndLength(
.getOffset(), lastOffset - identifier.getOffset()); identifier.getOffset(), lastOffset
- identifier.getOffset());
IASTName n = createName(identifier); IASTName n = createName(identifier);
designator.setName(n); designator.setName(n);
n.setParent(designator); n.setParent(designator);
n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME); n.setPropertyInParent(ICASTFieldDesignator.FIELD_NAME);
if (designatorList == Collections.EMPTY_LIST) if (designatorList == Collections.EMPTY_LIST)
designatorList = new ArrayList( designatorList = new ArrayList(DEFAULT_DESIGNATOR_LIST_SIZE);
DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} else if (LT(1) == IToken.tLBRACKET) { } else if (LT(1) == IToken.tLBRACKET) {
int startOffset = consume(IToken.tLBRACKET).getOffset(); int startOffset = consume(IToken.tLBRACKET).getOffset();
@ -372,8 +366,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
constantExpression2 constantExpression2
.setPropertyInParent(IGCCASTArrayRangeDesignator.SUBSCRIPT_CEILING_EXPRESSION); .setPropertyInParent(IGCCASTArrayRangeDesignator.SUBSCRIPT_CEILING_EXPRESSION);
if (designatorList == Collections.EMPTY_LIST) if (designatorList == Collections.EMPTY_LIST)
designatorList = new ArrayList( designatorList = new ArrayList(DEFAULT_DESIGNATOR_LIST_SIZE);
DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} }
} }
@ -582,17 +575,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTProblem p = failParse(b); IASTProblem p = failParse(b);
IASTProblemDeclaration pd = createProblemDeclaration(); IASTProblemDeclaration pd = createProblemDeclaration();
pd.setProblem(p); pd.setProblem(p);
((CASTNode) pd).setOffsetAndLength(((CASTNode) p) ((CASTNode) pd).setOffsetAndLength(((CASTNode) p).getOffset(),
.getOffset(), ((CASTNode) p).getLength()); ((CASTNode) p).getLength());
p.setParent(pd); p.setParent(pd);
p.setPropertyInParent(IASTProblemHolder.PROBLEM); p.setPropertyInParent(IASTProblemHolder.PROBLEM);
pd.setParent(translationUnit); pd.setParent(translationUnit);
pd pd.setPropertyInParent(IASTTranslationUnit.OWNED_DECLARATION);
.setPropertyInParent(IASTTranslationUnit.OWNED_DECLARATION);
translationUnit.addDeclaration(pd); translationUnit.addDeclaration(pd);
errorHandling(); errorHandling();
if (lastBacktrack != -1 if (lastBacktrack != -1 && lastBacktrack == LA(1).hashCode()) {
&& lastBacktrack == LA(1).hashCode()) {
// we haven't progressed from the // we haven't progressed from the
// last backtrack // last backtrack
// try and find tne next definition // try and find tne next definition
@ -652,8 +643,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
conditionalExpression); conditionalExpression);
case IToken.tSTARASSIGN: case IToken.tSTARASSIGN:
return assignmentOperatorExpression( return assignmentOperatorExpression(
IASTBinaryExpression.op_multiplyAssign, IASTBinaryExpression.op_multiplyAssign, conditionalExpression);
conditionalExpression);
case IToken.tDIVASSIGN: case IToken.tDIVASSIGN:
return assignmentOperatorExpression( return assignmentOperatorExpression(
IASTBinaryExpression.op_divideAssign, conditionalExpression); IASTBinaryExpression.op_divideAssign, conditionalExpression);
@ -684,8 +674,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
conditionalExpression); conditionalExpression);
case IToken.tBITORASSIGN: case IToken.tBITORASSIGN:
return assignmentOperatorExpression( return assignmentOperatorExpression(
IASTBinaryExpression.op_binaryOrAssign, IASTBinaryExpression.op_binaryOrAssign, conditionalExpression);
conditionalExpression);
} }
return conditionalExpression; return conditionalExpression;
} }
@ -910,8 +899,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
IASTTypeId t = typeId(false); IASTTypeId t = typeId(false);
int lastOffset = consume(IToken.tRPAREN).getEndOffset(); int lastOffset = consume(IToken.tRPAREN).getEndOffset();
IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST); IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST);
firstExpression = buildTypeIdInitializerExpression(t, i, firstExpression = buildTypeIdInitializerExpression(t, i, offset,
offset, lastOffset); lastOffset);
break; break;
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
backup(m); backup(m);
@ -1125,7 +1114,9 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
//TODO - do we need to return a wrapper? //TODO - do we need to return a wrapper?
IASTExpression lhs = expression(); IASTExpression lhs = expression();
int finalOffset = consume(IToken.tRPAREN).getEndOffset(); int finalOffset = consume(IToken.tRPAREN).getEndOffset();
return buildUnaryExpression( IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(), finalOffset ); return buildUnaryExpression(
IASTUnaryExpression.op_bracketedPrimary, lhs, t.getOffset(),
finalOffset);
case IToken.tIDENTIFIER: case IToken.tIDENTIFIER:
int startingOffset = LA(1).getOffset(); int startingOffset = LA(1).getOffset();
@ -1184,7 +1175,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
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);
@ -1423,6 +1415,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.t_struct: case IToken.t_struct:
case IToken.t_union: case IToken.t_union:
if (flags.haveEncounteredTypename())
throwBacktrack(LA(1));
try { try {
structSpec = structOrUnionSpecifier(); structSpec = structOrUnionSpecifier();
flags.setEncounteredTypename(true); flags.setEncounteredTypename(true);
@ -1433,6 +1427,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
} }
case IToken.t_enum: case IToken.t_enum:
if (flags.haveEncounteredTypename())
throwBacktrack(LA(1));
try { try {
enumSpec = enumSpecifier(); enumSpec = enumSpecifier();
flags.setEncounteredTypename(true); flags.setEncounteredTypename(true);
@ -1544,8 +1540,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
* "}" * "}"
* *
* @param owner * @param owner
* IParserCallback object that represents the declaration that * IParserCallback object that represents the declaration that owns
* owns this classSpecifier * this classSpecifier
* *
* @return TODO * @return TODO
* @throws BacktrackException * @throws BacktrackException
@ -1672,7 +1668,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
name.setParent(result); name.setParent(result);
name.setPropertyInParent(IASTElaboratedTypeSpecifier.TYPE_NAME); name.setPropertyInParent(IASTElaboratedTypeSpecifier.TYPE_NAME);
result.setKind(eck); result.setKind(eck);
((ASTNode)result).setOffsetAndLength( t.getOffset(), calculateEndOffset(name) - t.getOffset() ); ((ASTNode) result).setOffsetAndLength(t.getOffset(),
calculateEndOffset(name) - t.getOffset());
return result; return result;
} }
@ -1694,7 +1691,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
d.setInitializer(i); d.setInitializer(i);
i.setParent(d); i.setParent(d);
i.setPropertyInParent(IASTDeclarator.INITIALIZER); i.setPropertyInParent(IASTDeclarator.INITIALIZER);
((ASTNode)d).setLength( calculateEndOffset( i ) - ((ASTNode)d).getOffset() ); ((ASTNode) d).setLength(calculateEndOffset(i)
- ((ASTNode) d).getOffset());
} }
return d; return d;
} finally { } finally {
@ -1801,15 +1799,14 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
if (decl instanceof IASTSimpleDeclaration) { if (decl instanceof IASTSimpleDeclaration) {
declaration = ((IASTSimpleDeclaration) decl); declaration = ((IASTSimpleDeclaration) decl);
IASTDeclarator[] decltors = declaration.getDeclarators(); IASTDeclarator[] decltors = declaration
.getDeclarators();
for (int k = 0; k < decltors.length; k++) { for (int k = 0; k < decltors.length; k++) {
boolean decltorOk = false; boolean decltorOk = false;
for (int j = 0; j < parmNames.length; j++) { for (int j = 0; j < parmNames.length; j++) {
if (CharArrayUtils.equals( if (CharArrayUtils.equals(decltors[k]
decltors[k].getName() .getName().toCharArray(),
.toCharArray(), parmNames[j].toCharArray())) {
parmNames[j]
.toCharArray())) {
decltorOk = true; decltorOk = true;
break; break;
} }
@ -1829,8 +1826,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
((ASTNode) declaration).getOffset()); ((ASTNode) declaration).getOffset());
} }
} catch (BacktrackException b) { } catch (BacktrackException b) {
parmDeclarations[i] = createKnRCProblemDeclaration( parmDeclarations[i] = createKnRCProblemDeclaration(b
b.getLength(), b.getOffset()); .getLength(), b.getOffset());
} }
} }
@ -1908,8 +1905,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
if (declaratorName != null) { if (declaratorName != null) {
functionDecltor.setName(declaratorName); functionDecltor.setName(declaratorName);
declaratorName.setParent(functionDecltor); declaratorName.setParent(functionDecltor);
declaratorName declaratorName.setPropertyInParent(IASTDeclarator.DECLARATOR_NAME);
.setPropertyInParent(IASTDeclarator.DECLARATOR_NAME);
} }
for (int i = 0; i < parmNames.length; ++i) { for (int i = 0; i < parmNames.length; ++i) {

View file

@ -3095,6 +3095,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
case IToken.t_class: case IToken.t_class:
case IToken.t_struct: case IToken.t_struct:
case IToken.t_union: case IToken.t_union:
if (flags.haveEncounteredTypename())
throwBacktrack(LA(1));
try { try {
classSpec = classSpecifier(); classSpec = classSpecifier();
flags.setEncounteredTypename(true); flags.setEncounteredTypename(true);
@ -3105,6 +3107,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
} }
case IToken.t_enum: case IToken.t_enum:
if (flags.haveEncounteredTypename())
throwBacktrack(LA(1));
try { try {
enumSpec = enumSpecifier(); enumSpec = enumSpecifier();
flags.setEncounteredTypename(true); flags.setEncounteredTypename(true);