diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java index ea732995765..efe51de205c 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/DOMBuilder.java @@ -834,4 +834,11 @@ public class DOMBuilder implements IParserCallback public void templateTypeParameterAbort(Object typeParm) { typeParm = null; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorAbort(java.lang.Object) + */ + public void pointerOperatorAbort(Object ptrOperator) { + ptrOperator = null; + } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java index 37418c68a56..97726972ba5 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/Declarator.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.eclipse.cdt.internal.core.parser.util.*; import org.eclipse.cdt.internal.core.parser.util.DeclSpecifier; import org.eclipse.cdt.internal.core.parser.util.Name; diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java index 2a9824d3e55..f9b1c53cb1f 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumerationSpecifier.java @@ -12,8 +12,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.dom; +import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import org.eclipse.cdt.internal.core.parser.util.Name; @@ -29,7 +29,7 @@ public class EnumerationSpecifier extends TypeSpecifier { } private Name name = null; - private List enumeratorDefinitions = new LinkedList(); + private List enumeratorDefinitions = new ArrayList(); public void addEnumeratorDefinition( EnumeratorDefinition def ) { diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog b/core/org.eclipse.cdt.core/parser/ChangeLog index 0ba23100129..bb3a17b7e57 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog +++ b/core/org.eclipse.cdt.core/parser/ChangeLog @@ -2,6 +2,10 @@ Parser Symbol Table, better support for function resolution with pointers and references as parameters. Also support for typedefs as function parameters +2003-03-31 John Camelon + Updated NewModelBuilder to work for ElaboratedTypeSpecifiers, PointerOperators, Const Methods. + Fixed bug35878. + 2003-03-31 John Camelon Updated Scanner to work for Strings literals like L"this string" Updated Scanner to work for floating points literals. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/Declarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/Declarator.java index 95698cc37a0..5d6facdf5f9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/Declarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/Declarator.java @@ -1,5 +1,6 @@ package org.eclipse.cdt.internal.core.model; +import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.internal.core.parser.util.Name; @@ -15,7 +16,8 @@ import org.eclipse.cdt.internal.core.parser.util.Name; public class Declarator { private Name name; - + private boolean isConst = false; + private boolean isVolatile = false; /** * Returns the name. * @return Name @@ -49,4 +51,49 @@ public class Declarator { public void setParameterDeclarationClause(List parameterDeclarationClause) { this.parameterDeclarationClause = parameterDeclarationClause; } + + private List pointerOperators = new ArrayList(); + + /** + * @return List + */ + public List getPointerOperators() { + return pointerOperators; + } + + public void addPointerOperator( PointerOperator po ) + { + pointerOperators.add( po ); + } + + /** + * @return boolean + */ + public boolean isConst() { + return isConst; + } + + /** + * Sets the isConst. + * @param isConst The isConst to set + */ + public void setConst(boolean isConst) { + this.isConst = isConst; + } + + /** + * @return boolean + */ + public boolean isVolatile() { + return isVolatile; + } + + /** + * Sets the isVolatile. + * @param isVolatile The isVolatile to set + */ + public void setVolatile(boolean isVolatile) { + this.isVolatile = isVolatile; + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java index 00efbb67ceb..5f1869ebdd7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java @@ -334,16 +334,39 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T Structure elem = new Structure( wrapper.getParent(), wrapper.getKind(), null ); wrapper.setElement( elem ); wrapper.getParent().addChild(elem); - String name = currName.toString(); + String name = wrapper.getName().toString(); elem.setElementName( name ); - elem.setIdPos(currName.getStartOffset(), name.length()); - elem.setPos(currName.getStartOffset(), name.length()); + elem.setIdPos(wrapper.getName().getStartOffset(), name.length()); + elem.setPos(wrapper.getName().getStartOffset(), name.length()); } /** * @see org.eclipse.cdt.internal.core.parser.IParserCallback#elaboratedTypeSpecifierBegin(java.lang.Object) */ public Object elaboratedTypeSpecifierBegin(Object container, Token classKey) { - return null; + if( container instanceof SimpleDeclarationWrapper ) + { + SimpleDeclarationWrapper c = (SimpleDeclarationWrapper)container; + + int kind; + switch (classKey.getType()) { + case Token.t_class: + kind = ICElement.C_CLASS; + break; + case Token.t_struct: + kind = ICElement.C_STRUCT; + break; + default: + kind = ICElement.C_UNION; + } + + SimpleDeclarationWrapper wrapper = new SimpleDeclarationWrapper(); + wrapper.setKind( kind ); + wrapper.setParent( c.getParent() ); + + return wrapper; + } + else + return null; } /** @@ -356,6 +379,11 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#elaboratedTypeSpecifierName(java.lang.Object) */ public void elaboratedTypeSpecifierName(Object elab) { + if( elab instanceof SimpleDeclarationWrapper ) + { + SimpleDeclarationWrapper wrapper = (SimpleDeclarationWrapper)elab; + wrapper.setName( currName ); + } } @@ -399,8 +427,9 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorBegin(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token) */ public Object pointerOperatorBegin(Object container) { - // TODO Auto-generated method stub - return null; + Declarator d = (Declarator)container; + PointerOperator po = new PointerOperator(d); + return po; } @@ -408,7 +437,8 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorEnd(java.lang.Object) */ public void pointerOperatorEnd(Object ptrOperator) { - // TODO Auto-generated method stub + PointerOperator po = (PointerOperator)ptrOperator; + po.getOwnerDeclarator().addPointerOperator( po ); } @@ -417,31 +447,57 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T */ public void pointerOperatorName(Object ptrOperator) { // TODO Auto-generated method stub - } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorType(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token) */ public void pointerOperatorType(Object ptrOperator, Token type) { - // TODO Auto-generated method stub - - } + PointerOperator po=(PointerOperator)ptrOperator; + switch( type.getType() ) + { + case Token.tSTAR: + po.setKind( PointerOperator.k_pointer ); + break; + case Token.tAMPER: + po.setKind( PointerOperator.k_reference ); + break; + default: + } } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorCVModifier(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token) */ public void pointerOperatorCVModifier(Object ptrOperator, Token modifier) { - // TODO Auto-generated method stub - + PointerOperator po=(PointerOperator)ptrOperator; + switch( modifier.getType() ) + { + case Token.t_const: + po.setConst( true ); + break; + case Token.t_volatile: + po.setVolatile( true ); + break; + default: + } } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#declaratorCVModifier(java.lang.Object, org.eclipse.cdt.internal.core.parser.Token) */ public void declaratorCVModifier(Object declarator, Token modifier) { - // TODO Auto-generated method stub - + Declarator d = (Declarator)declarator; + switch( modifier.getType() ) + { + case Token.t_const: + d.setConst( true ); + break; + case Token.t_volatile: + d.setVolatile(true); + break; + default: + break; + } } /* (non-Javadoc) @@ -585,39 +641,32 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierBegin(java.lang.Object) */ public Object enumSpecifierBegin(Object container) { - // TODO Auto-generated method stub - return null; + return null; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierId(java.lang.Object) */ public void enumSpecifierId(Object enumSpec) { - // TODO Auto-generated method stub - } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierAbort(java.lang.Object) */ public void enumSpecifierAbort(Object enumSpec) { - // TODO Auto-generated method stub - + enumSpec = null; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierEnd(java.lang.Object) */ public void enumSpecifierEnd(Object enumSpec) { - // TODO Auto-generated method stub - } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumDefinitionBegin(java.lang.Object) */ public Object enumDefinitionBegin(Object enumSpec) { - // TODO Auto-generated method stub return null; } @@ -625,16 +674,12 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumDefinitionId(java.lang.Object) */ public void enumDefinitionId(Object enumDefn) { - // TODO Auto-generated method stub - } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumDefinitionEnd(java.lang.Object) */ public void enumDefinitionEnd(Object enumDefn) { - // TODO Auto-generated method stub - } /* (non-Javadoc) @@ -713,32 +758,28 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationBegin(java.lang.Object) */ public Object explicitInstantiationBegin(Object container) { - // TODO Auto-generated method stub - return null; + // until explicit-instantiations are part of the code model just return the container object + return container; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitInstantiationEnd(java.lang.Object) */ public void explicitInstantiationEnd(Object instantiation) { - // TODO Auto-generated method stub - } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationBegin(java.lang.Object) */ public Object explicitSpecializationBegin(Object container) { - // TODO Auto-generated method stub - return null; + // until explicit-specializations are part of the code model just return the container object + return container; } /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.IParserCallback#explicitSpecializationEnd(java.lang.Object) */ public void explicitSpecializationEnd(Object instantiation) { - // TODO Auto-generated method stub - } /* (non-Javadoc) @@ -753,8 +794,8 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T * @see org.eclipse.cdt.internal.core.parser.IParserCallback#templateDeclarationBegin(java.lang.Object, boolean) */ public Object templateDeclarationBegin(Object container, boolean exported) { - // TODO Auto-generated method stub - return null; + // until linkageSpecs are part of the code model just return the container object + return container; } /* (non-Javadoc) @@ -810,7 +851,13 @@ org.eclipse.cdt.internal.core.newparser.IParserCallback#beginSimpleDeclaration(T */ public void templateTypeParameterAbort(Object typeParm) { // TODO Auto-generated method stub - + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorAbort(java.lang.Object) + */ + public void pointerOperatorAbort(Object ptrOperator) { + ptrOperator = null; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/PointerOperator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/PointerOperator.java new file mode 100644 index 00000000000..e74d86978d7 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/PointerOperator.java @@ -0,0 +1,86 @@ +/********************************************************************** + * Created on Mar 31, 2003 + * + * Copyright (c) 2002,2003 Rational Software Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v0.5 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v05.html + * + * Contributors: + * Rational Software - Initial API and implementation +***********************************************************************/ +package org.eclipse.cdt.internal.core.model; + +/** + * @author jcamelon + * + */ +public class PointerOperator { + + private final Declarator ownerDeclarator; + + public PointerOperator( Declarator decl ) + { + ownerDeclarator = decl; + } + + /** + * @return Declarator + */ + public Declarator getOwnerDeclarator() { + return ownerDeclarator; + } + public static final int k_pointer = 1; + public static final int k_reference = 2; + + private boolean isConst = false; + private boolean isVolatile = false; + private int kind; + + /** + * @return boolean + */ + public boolean isConst() { + return isConst; + } + + /** + * @return boolean + */ + public boolean isVolatile() { + return isVolatile; + } + + /** + * @return int + */ + public int getKind() { + return kind; + } + + /** + * Sets the isConst. + * @param isConst The isConst to set + */ + public void setConst(boolean isConst) { + this.isConst = isConst; + } + + /** + * Sets the isVolatile. + * @param isVolatile The isVolatile to set + */ + public void setVolatile(boolean isVolatile) { + this.isVolatile = isVolatile; + } + + /** + * Sets the kind. + * @param kind The kind to set + */ + public void setKind(int kind) { + this.kind = kind; + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java index 1976c2f0dfb..e35a7ca8cac 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java @@ -704,4 +704,10 @@ public class ExpressionEvaluator implements IParserCallback { public void templateTypeParameterAbort(Object typeParm) { } + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorAbort(java.lang.Object) + */ + public void pointerOperatorAbort(Object ptrOperator) { + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java index 4b8994de0d1..ab1c9d247b3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IParserCallback.java @@ -46,6 +46,7 @@ public interface IParserCallback { public void pointerOperatorType( Object ptrOperator, Token type ); public void pointerOperatorName( Object ptrOperator ); public void pointerOperatorCVModifier( Object ptrOperator, Token modifier ); + public void pointerOperatorAbort( Object ptrOperator ); public void pointerOperatorEnd( Object ptrOperator ); public Object argumentsBegin( Object declarator ); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java index 59c1cfa87a8..015a748a0ea 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/NullParserCallback.java @@ -605,4 +605,10 @@ public class NullParserCallback implements IParserCallback { public void templateTypeParameterAbort(Object typeParm) { } + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.IParserCallback#pointerOperatorAbort(java.lang.Object) + */ + public void pointerOperatorAbort(Object ptrOperator) { + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 4cc76e20852..e5414830d5c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -1105,7 +1105,7 @@ c, quick); try{ ptrOp = callback.pointerOperatorBegin( owner );} catch( Exception e ) {} if (t == Token.tAMPER) { - try{ callback.pointerOperatorType( ptrOp, consume() ); } catch( Exception e ) {} + try{ callback.pointerOperatorType( ptrOp, consume(Token.tAMPER) ); } catch( Exception e ) {} try{ callback.pointerOperatorEnd( ptrOp );} catch( Exception e ) {} return; } @@ -1139,6 +1139,7 @@ c, quick); } backup(mark); + try{ callback.pointerOperatorAbort( ptrOp ); } catch( Exception e ) { } throw backtrack; } @@ -1977,7 +1978,8 @@ c, quick); return scanner.nextToken(); } catch (EndOfFile e) { throw e; - } catch (Exception e) { + } catch (ScannerException e) { + e.printStackTrace(); return null; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java index 6ab97c45ee5..5f101db1a04 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java @@ -586,7 +586,12 @@ public class Scanner implements IScanner { c = getChar(); if (c == 'x') { - if( ! firstCharZero ) + if( ! firstCharZero && floatingPoint ) + { + ungetChar( c ); + return newToken( Token.tDOT, ".", currentContext ); + } + else if( ! firstCharZero ) throw new ScannerException( "Invalid Hexidecimal @ offset " + currentContext.getOffset() ); hex = true; @@ -706,6 +711,7 @@ public class Scanner implements IScanner { if (throwExceptionOnBadPreprocessorSyntax) throw new ScannerException( BAD_PP + currentContext.getOffset()); + } else { int type = ((Integer) directive).intValue();