1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-08 16:55:38 +02:00

Adding using declaration/directive support.

Refactored use of ICPPASTQualifiedName.
This commit is contained in:
John Camelon 2004-11-20 19:29:14 +00:00
parent 0ad6f1bcb0
commit f6aa88405c
7 changed files with 193 additions and 75 deletions

View file

@ -25,7 +25,7 @@ public interface ICPPASTNamespaceAlias extends IASTDeclaration {
public IASTName getAlias(); public IASTName getAlias();
public void setAlias( IASTName name ); public void setAlias( IASTName name );
public ICPPASTQualifiedName getQualifiedName(); public IASTName getQualifiedName();
public void setQualifiedName( ICPPASTQualifiedName qualifiedName ); public void setQualifiedName( IASTName qualifiedName );
} }

View file

@ -0,0 +1,30 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTName;
/**
* @author jcamelon
*/
public interface ICPPASTUsingDeclaration extends IASTDeclaration {
public static final ASTNodeProperty NAME = new ASTNodeProperty( "Name"); //$NON-NLS-1$
public void setIsTypename( boolean value );
public boolean isTypename();
public IASTName getName();
public void setName(IASTName name);
}

View file

@ -0,0 +1,27 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp;
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTName;
/**
* @author jcamelon
*/
public interface ICPPASTUsingDirective extends IASTDeclaration {
public static final ASTNodeProperty QUALIFIED_NAME = new ASTNodeProperty( "Name"); //$NON-NLS-1$
public IASTName getQualifiedName();
public void setQualifiedName( IASTName qualifiedName );
}

View file

@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.parser2.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.internal.core.parser2.c.CASTNode; import org.eclipse.cdt.internal.core.parser2.c.CASTNode;
/** /**
@ -22,7 +21,7 @@ public class CPPASTNamespaceAlias extends CASTNode implements
ICPPASTNamespaceAlias { ICPPASTNamespaceAlias {
private IASTName alias; private IASTName alias;
private ICPPASTQualifiedName qualifiedName; private IASTName qualifiedName;
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#getAlias() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#getAlias()
@ -41,14 +40,14 @@ public class CPPASTNamespaceAlias extends CASTNode implements
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#getQualifiedName() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#getQualifiedName()
*/ */
public ICPPASTQualifiedName getQualifiedName() { public IASTName getQualifiedName() {
return qualifiedName; return qualifiedName;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#setQualifiedName(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName) * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias#setQualifiedName(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName)
*/ */
public void setQualifiedName(ICPPASTQualifiedName qualifiedName) { public void setQualifiedName(IASTName qualifiedName) {
this.qualifiedName = qualifiedName; this.qualifiedName = qualifiedName;
} }

View file

@ -0,0 +1,53 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.parser2.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
/**
* @author jcamelon
*/
public class CPPASTUsingDeclaration extends CPPASTNode implements
ICPPASTUsingDeclaration {
private boolean typeName;
private IASTName name;
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration#setIsTypename(boolean)
*/
public void setIsTypename(boolean value) {
this.typeName = value;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration#isTypename()
*/
public boolean isTypename() {
return typeName;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration#getName()
*/
public IASTName getName() {
return name;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration#setName(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public void setName(IASTName name) {
this.name = name;
}
}

View file

@ -0,0 +1,38 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.parser2.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective;
/**
* @author jcamelon
*/
public class CPPASTUsingDirective extends CPPASTNode implements
ICPPASTUsingDirective {
private IASTName name;
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective#getQualifiedName()
*/
public IASTName getQualifiedName() {
return name;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective#setQualifiedName(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName)
*/
public void setQualifiedName(IASTName qualifiedName) {
this.name = qualifiedName;
}
}

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.internal.core.parser2.cpp; package org.eclipse.cdt.internal.core.parser2.cpp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
@ -30,6 +29,8 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective;
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
import org.eclipse.cdt.core.parser.BacktrackException; import org.eclipse.cdt.core.parser.BacktrackException;
import org.eclipse.cdt.core.parser.EndOfFileException; import org.eclipse.cdt.core.parser.EndOfFileException;
@ -2073,7 +2074,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @throws BacktrackException * @throws BacktrackException
* request for a backtrack * request for a backtrack
*/ */
protected Object usingClause() throws EndOfFileException, protected IASTDeclaration usingClause() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken firstToken = consume(IToken.t_using); IToken firstToken = consume(IToken.t_using);
@ -2081,39 +2082,23 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// using-directive // using-directive
consume(IToken.t_namespace); consume(IToken.t_namespace);
// optional :: and nested classes handled in name
ITokenDuple duple = null;
int endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0; int endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
IASTName name = null;
if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON) if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON)
duple = name(); name = createName( name() );
else else
throwBacktrack(firstToken.getOffset(), endOffset, firstToken throwBacktrack(firstToken.getOffset(), endOffset, firstToken
.getLineNumber(), firstToken.getFilename()); .getLineNumber(), firstToken.getFilename());
if (LT(1) == IToken.tSEMI) {
IToken last = consume(IToken.tSEMI); consume(IToken.tSEMI);
Object astUD = null; ICPPASTUsingDirective astUD = createUsingDirective();
((CPPASTNode)astUD).setOffset( firstToken.getOffset() );
try { astUD.setQualifiedName( name );
astUD = null; /* name.setParent( astUD );
* astFactory.createUsingDirective(scope, name.setPropertyInParent( ICPPASTUsingDirective.QUALIFIED_NAME );
* duple, firstToken.getOffset(), return astUD;
* firstToken.getLineNumber(),
* last.getEndOffset(), last.getLineNumber()); }
* catch( ASTSemanticException ase ) { backup(
* last ); throwBacktrack( ase.getProblem() );
*/
} catch (Exception e1) {
logException("usingClause:createUsingDirective", e1); //$NON-NLS-1$
throwBacktrack(firstToken.getOffset(), last.getEndOffset(),
firstToken.getLineNumber(), last.getFilename());
}
// astUD.acceptElement(requestor );
return astUD;
}
endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
throwBacktrack(firstToken.getOffset(), endOffset, firstToken
.getLineNumber(), firstToken.getFilename());
} }
boolean typeName = false; boolean typeName = false;
if (LT(1) == IToken.t_typename) { if (LT(1) == IToken.t_typename) {
@ -2121,43 +2106,29 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
consume(IToken.t_typename); consume(IToken.t_typename);
} }
ITokenDuple name = null; IASTName name = createName( name() );
if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON) { consume( IToken.tSEMI );
// optional :: and nested classes handled in name ICPPASTUsingDeclaration result = createUsingDeclaration();
name = name(); ((CPPASTNode)result).setOffset( firstToken.getOffset() );
} else { result.setIsTypename( typeName );
throwBacktrack(firstToken.getOffset(), result.setName( name );
(lastToken != null) ? lastToken.getEndOffset() : 0, name.setPropertyInParent( ICPPASTUsingDeclaration.NAME );
firstToken.getLineNumber(), firstToken.getFilename()); name.setParent( result );
} return result;
if (LT(1) == IToken.tSEMI) { }
IToken last = consume(IToken.tSEMI);
Object declaration = null; /**
try { * @return
declaration = null; /* */
* astFactory.createUsingDeclaration( scope, private ICPPASTUsingDeclaration createUsingDeclaration() {
* typeName, name, firstToken.getOffset(), return new CPPASTUsingDeclaration();
* firstToken.getLineNumber(), }
* last.getEndOffset(),
* last.getLineNumber()); /**
*/ * @return
} catch (Exception e1) { */
logException("usingClause:createUsingDeclaration", e1); //$NON-NLS-1$ protected ICPPASTUsingDirective createUsingDirective() {
// if (e1 instanceof ASTSemanticException return new CPPASTUsingDirective();
// && ((ASTSemanticException) e1).getProblem() != null)
// throwBacktrack(((ASTSemanticException) e1).getProblem());
// else
throwBacktrack(firstToken.getOffset(), last.getEndOffset(),
firstToken.getLineNumber(), firstToken
.getFilename());
}
// declaration.acceptElement( requestor );
return declaration;
}
int endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
throwBacktrack(firstToken.getOffset(), endOffset, firstToken
.getLineNumber(), firstToken.getFilename());
return null;
} }
/** /**
@ -2614,8 +2585,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
case IToken.t_namespace: case IToken.t_namespace:
return namespaceDefinitionOrAlias(); return namespaceDefinitionOrAlias();
case IToken.t_using: case IToken.t_using:
usingClause(); return usingClause();
break;
case IToken.t_export: case IToken.t_export:
case IToken.t_template: case IToken.t_template:
templateDeclaration(); templateDeclaration();
@ -2754,7 +2724,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
ITokenDuple duple = name(); ITokenDuple duple = name();
ICPPASTQualifiedName qualifiedName = createQualifiedName( duple ); IASTName qualifiedName = createName( duple );
consume(IToken.tSEMI); consume(IToken.tSEMI);
ICPPASTNamespaceAlias alias = createNamespaceAlias(); ICPPASTNamespaceAlias alias = createNamespaceAlias();
@ -2822,6 +2792,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
* @return * @return
*/ */
protected IASTName createName(ITokenDuple duple) { protected IASTName createName(ITokenDuple duple) {
if( duple.getSegmentCount() != 1 ) return createQualifiedName( duple );
CASTName name = new CASTName( duple.toCharArray() ); CASTName name = new CASTName( duple.toCharArray() );
name.setOffset( duple.getStartOffset()); name.setOffset( duple.getStartOffset());
return name; return name;