diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java index 474c6897bd9..ff8a031a0ae 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/ClassSpecifier.java @@ -4,15 +4,17 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.eclipse.cdt.internal.core.parser.Token; import org.eclipse.cdt.internal.core.parser.util.AccessSpecifier; import org.eclipse.cdt.internal.core.parser.util.ClassKey; import org.eclipse.cdt.internal.core.parser.util.Name; -public class ClassSpecifier extends TypeSpecifier implements IScope, IOffsettable { +public class ClassSpecifier extends TypeSpecifier implements IScope, IOffsetable { private AccessSpecifier access = new AccessSpecifier( AccessSpecifier.v_private ); private ClassKey key = new ClassKey(); - private int startingOffset = 0, totalLength = 0; + private int startingOffset = 0, totalLength = 0; + private Token classKeyToken = null; public int getClassKey() { return key.getClassKey(); } @@ -83,4 +85,20 @@ public class ClassSpecifier extends TypeSpecifier implements IScope, IOffsettabl totalLength = i; } + /** + * Returns the classKeyToken. + * @return Token + */ + public Token getClassKeyToken() { + return classKeyToken; + } + + /** + * Sets the classKeyToken. + * @param classKeyToken The classKeyToken to set + */ + public void setClassKeyToken(Token classKeyToken) { + this.classKeyToken = classKeyToken; + } + } 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 42d30b711e4..b914a232a84 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 @@ -59,6 +59,7 @@ public class DOMBuilder implements IParserCallback ClassSpecifier classSpecifier = new ClassSpecifier(kind, decl); classSpecifier.setCurrentVisibility( visibility ); classSpecifier.setStartingOffset( classKey.getOffset() ); + classSpecifier.setClassKeyToken( classKey ); decl.setTypeSpecifier(classSpecifier); return classSpecifier; } @@ -156,7 +157,7 @@ public class DOMBuilder implements IParserCallback * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#inclusionBegin(java.lang.String) */ public void inclusionBegin(String includeFile, int offset, int inclusionBeginOffset) { - translationUnit.addInclusion( new Inclusion( includeFile, offset, inclusionBeginOffset, offset + includeFile.length() + 1 ) ); + translationUnit.addInclusion( new Inclusion( includeFile, offset, inclusionBeginOffset, offset - inclusionBeginOffset + includeFile.length() + 1 ) ); } /** @@ -180,7 +181,7 @@ public class DOMBuilder implements IParserCallback ((IScope)container).addDeclaration(decl); if( container instanceof ClassSpecifier ) decl.setAccessSpecifier(new AccessSpecifier( ((ClassSpecifier)container).getCurrentVisibility() )); - ((IOffsettable)decl).setStartingOffset( firstToken.getOffset() ); + ((IOffsetable)decl).setStartingOffset( firstToken.getOffset() ); return decl; } @@ -188,7 +189,7 @@ public class DOMBuilder implements IParserCallback * @see org.eclipse.cdt.internal.core.newparser.IParserCallback#simpleDeclarationEnd(org.eclipse.cdt.internal.core.newparser.Token) */ public void simpleDeclarationEnd(Object declaration, Token lastToken) { - IOffsettable offsetable = (IOffsettable)declaration; + IOffsetable offsetable = (IOffsetable)declaration; offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset()); } @@ -364,7 +365,10 @@ public class DOMBuilder implements IParserCallback * @see org.eclipse.cdt.internal.core.parser.IParserCallback#simpleDeclSpecifierName(java.lang.Object) */ public Object simpleDeclSpecifierName(Object declaration) { - return declaration; + DeclSpecifier.Container decl = (DeclSpecifier.Container)declaration; + DeclSpecifier declSpec = decl.getDeclSpecifier(); + declSpec.setName( currName ); + return declSpec; } /* (non-Javadoc) @@ -520,7 +524,8 @@ public class DOMBuilder implements IParserCallback public Object namespaceDefinitionBegin(Object container, Token namespace) { IScope ownerScope = (IScope)container; NamespaceDefinition namespaceDef = new NamespaceDefinition(ownerScope); - ((IOffsettable)namespaceDef).setStartingOffset( namespace.getOffset() ); + namespaceDef.setStartToken(namespace); + ((IOffsetable)namespaceDef).setStartingOffset( namespace.getOffset() ); return namespaceDef; } @@ -637,8 +642,9 @@ public class DOMBuilder implements IParserCallback public Object enumSpecifierBegin(Object container, Token enumKey) { SimpleDeclaration decl = (SimpleDeclaration)container; EnumerationSpecifier es = new EnumerationSpecifier( decl ); + es.setStartToken(enumKey); decl.setTypeSpecifier(es); - ((IOffsettable)decl).setStartingOffset( enumKey.getOffset() ); + ((IOffsetable)es).setStartingOffset( enumKey.getOffset() ); return es; } @@ -663,7 +669,7 @@ public class DOMBuilder implements IParserCallback * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumSpecifierEnd(java.lang.Object) */ public void enumSpecifierEnd(Object enumSpec, Token closingBrace) { - IOffsettable offsetable = (IOffsettable)enumSpec; + IOffsetable offsetable = (IOffsetable)enumSpec; offsetable.setTotalLength( closingBrace.getOffset() + closingBrace.getLength() - offsetable.getStartingOffset()); } @@ -683,7 +689,7 @@ public class DOMBuilder implements IParserCallback public Object enumeratorId(Object enumDefn) { EnumeratorDefinition definition = (EnumeratorDefinition)enumDefn; definition.setName( currName ); - ((IOffsettable)enumDefn).setStartingOffset( currName.getStartOffset() ); + ((IOffsetable)enumDefn).setStartingOffset( currName.getStartOffset() ); return definition; } @@ -691,7 +697,7 @@ public class DOMBuilder implements IParserCallback * @see org.eclipse.cdt.internal.core.parser.IParserCallback#enumDefinitionEnd(java.lang.Object) */ public void enumeratorEnd(Object enumDefn, Token lastToken) { - IOffsettable offsetable = (IOffsettable)enumDefn; + IOffsetable offsetable = (IOffsetable)enumDefn; offsetable.setTotalLength( lastToken.getOffset() + lastToken.getLength() - offsetable.getStartingOffset()); } 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 db20188ad7e..364efbcfdb1 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 @@ -16,13 +16,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.eclipse.cdt.internal.core.parser.Token; import org.eclipse.cdt.internal.core.parser.util.Name; /** * @author jcamelon * */ -public class EnumerationSpecifier extends TypeSpecifier implements IOffsettable { +public class EnumerationSpecifier extends TypeSpecifier implements IOffsetable { public EnumerationSpecifier(SimpleDeclaration declaration) { super(declaration); @@ -31,6 +32,7 @@ public class EnumerationSpecifier extends TypeSpecifier implements IOffsettable private Name name = null; private List enumeratorDefinitions = new ArrayList(); private int startingOffset = 0, totalLength = 0; + private Token startToken = null; public void addEnumeratorDefinition( EnumeratorDefinition def ) { @@ -88,4 +90,20 @@ public class EnumerationSpecifier extends TypeSpecifier implements IOffsettable totalLength = i; } + /** + * Returns the startToken. + * @return Token + */ + public Token getStartToken() { + return startToken; + } + + /** + * Sets the startToken. + * @param startToken The startToken to set + */ + public void setStartToken(Token startToken) { + this.startToken = startToken; + } + } diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java index 9c3c0be19d0..e2d13776ac9 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/EnumeratorDefinition.java @@ -18,7 +18,7 @@ import org.eclipse.cdt.internal.core.parser.util.Name; * @author jcamelon * */ -public class EnumeratorDefinition implements IExpressionOwner, IOffsettable { +public class EnumeratorDefinition implements IExpressionOwner, IOffsetable { private Expression initialValue = null; private Name name = null; diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsettable.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java similarity index 96% rename from core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsettable.java rename to core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java index 4805742c497..a836493e6e2 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsettable.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/IOffsetable.java @@ -17,7 +17,7 @@ package org.eclipse.cdt.internal.core.dom; * @author jcamelon * */ -public interface IOffsettable { +public interface IOffsetable { /** * @return diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java index 30eb7ffe93c..12cc8a82360 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/NamespaceDefinition.java @@ -16,18 +16,20 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.eclipse.cdt.internal.core.parser.Token; import org.eclipse.cdt.internal.core.parser.util.Name; /** * @author jcamelon * */ -public class NamespaceDefinition extends Declaration implements IScope, IOffsettable { +public class NamespaceDefinition extends Declaration implements IScope, IOffsetable { private List declarations = new LinkedList(); private IScope ownerScope; private Name name = null; private int startingOffset = 0, totalLength = 0; + private Token startToken = null; public NamespaceDefinition( IScope owner ) { @@ -100,4 +102,20 @@ public class NamespaceDefinition extends Declaration implements IScope, IOffsett totalLength = i; } + /** + * Returns the startToken. + * @return Token + */ + public Token getStartToken() { + return startToken; + } + + /** + * Sets the startToken. + * @param startToken The startToken to set + */ + public void setStartToken(Token startToken) { + this.startToken = startToken; + } + } diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java index 9190cbaef51..089dff537f8 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/PreprocessorStatement.java @@ -16,11 +16,11 @@ package org.eclipse.cdt.internal.core.dom; * @author jcamelon * */ -public class PreprocessorStatement { +public class PreprocessorStatement implements IOffsetable { - private final int startingOffset, totalLength; - final private int nameOffset; - final private String name; + private int startingOffset, totalLength; + private final int nameOffset; + private final String name; public PreprocessorStatement( String name, int nameOffset, int startingOffset, int totalLength ) { @@ -62,5 +62,17 @@ public class PreprocessorStatement { public int getNameLength() { return name.length(); } + /** + * @see org.eclipse.cdt.internal.core.dom.IOffsettable#setStartingOffset(int) + */ + public void setStartingOffset(int i) { + startingOffset = i; + } + /** + * @see org.eclipse.cdt.internal.core.dom.IOffsettable#setTotalLength(int) + */ + public void setTotalLength(int i) { + totalLength = i; + } } diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java index f9fd393e799..e2c7a37e355 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/SimpleDeclaration.java @@ -7,7 +7,7 @@ import java.util.List; import org.eclipse.cdt.internal.core.parser.util.AccessSpecifier; import org.eclipse.cdt.internal.core.parser.util.DeclSpecifier; -public class SimpleDeclaration extends Declaration implements DeclSpecifier.Container, IOffsettable, TypeSpecifier.IOwner { +public class SimpleDeclaration extends Declaration implements DeclSpecifier.Container, IOffsetable, TypeSpecifier.IOwner { private int startingOffset = 0, totalLength = 0; private AccessSpecifier accessSpecifier = null; diff --git a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java index fa13ebc9dd4..008241b8877 100644 --- a/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java +++ b/core/org.eclipse.cdt.core/dom/org/eclipse/cdt/internal/core/dom/TranslationUnit.java @@ -13,9 +13,11 @@ public class TranslationUnit implements IScope { private List declarations = new LinkedList(); private List macros = new ArrayList(); private List inclusions = new ArrayList(); + private List offsetables = new ArrayList(); public void addDeclaration(Declaration declaration) { declarations.add(declaration); + offsetables.add(declaration); } public List getDeclarations() { @@ -38,11 +40,21 @@ public class TranslationUnit implements IScope { public void addMacro(Macro macro) { macros.add(macro); + offsetables.add(macro); } public void addInclusion(Inclusion inclusion) { inclusions.add(inclusion); + offsetables.add(inclusion); } + /** + * Returns the offsetables. + * @return List + */ + public List getOffsetables() { + return Collections.unmodifiableList( offsetables ); + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/INamespace.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/INamespace.java index fdc504d1d18..2bb81c39ee7 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/INamespace.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/INamespace.java @@ -8,4 +8,6 @@ package org.eclipse.cdt.core.model; * Represents a package declaration in a C translation unit. */ public interface INamespace extends ICElement, IParent, ISourceManipulation, ISourceReference { + + String getTypeName(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITypeDef.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITypeDef.java index 17a6fc9e176..649f0b7ace2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITypeDef.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITypeDef.java @@ -9,4 +9,9 @@ package org.eclipse.cdt.core.model; * Represents a field declared in a type. */ public interface ITypeDef extends ICElement, ISourceManipulation, ISourceReference { + /** + * Returns the type of the typedef item + * @return String + */ + String getTypeName(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Field.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Field.java index c60529c114c..bd594ca53ac 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Field.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Field.java @@ -8,7 +8,7 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IField; -public class Field extends SourceManipulation implements IField { +public class Field extends VariableDeclaration implements IField { public Field(ICElement parent, String name) { super(parent, name, CElement.C_FIELD); @@ -66,23 +66,10 @@ public class Field extends SourceManipulation implements IField { getFieldInfo().setVisibility(visibility); } - public FieldInfo getFieldInfo(){ return (FieldInfo) getElementInfo(); } - /** - * Returns true if the member as class scope. - * For example static methods in C++ have class scope - * - * @see IMember - * @exception CModelException if this element does not exist or if an - * exception occurs while accessing its corresponding resource. - */ - public boolean hasClassScope(){ - return false; - } - protected CElementInfo createElementInfo () { return new FieldInfo(this); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionDeclaration.java index 89a20823fd3..c8ad3e80bac 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionDeclaration.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionDeclaration.java @@ -65,6 +65,10 @@ public class FunctionDeclaration extends SourceManipulation implements IFunction else{ sig += "()"; } + if(isConst()) + sig += " const"; + if(isVolatile()) + sig += " volatile"; return sig; } @@ -105,7 +109,11 @@ public class FunctionDeclaration extends SourceManipulation implements IFunction * @see org.eclipse.cdt.core.model.IDeclaration#isConst() */ public boolean isConst(){ - return false; + return getFunctionInfo().isConst(); + } + + public void setConst(boolean isConst){ + getFunctionInfo().setConst(isConst); } /** diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionInfo.java index 980e600f5a5..6e0f2cbd8fa 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionInfo.java @@ -10,6 +10,7 @@ class FunctionInfo extends SourceManipulationInfo { protected int flags; protected boolean isStatic; protected boolean isVolatile; + protected boolean isConst; protected FunctionInfo (CElement element) { @@ -67,4 +68,20 @@ class FunctionInfo extends SourceManipulationInfo { ); } + /** + * Returns the isConst. + * @return boolean + */ + public boolean isConst() { + return isConst; + } + + /** + * Sets the isConst. + * @param isConst The isConst to set + */ + public void setConst(boolean isConst) { + this.isConst = isConst; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Namespace.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Namespace.java index d52bca43905..5a32725aa16 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Namespace.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Namespace.java @@ -16,8 +16,25 @@ import org.eclipse.cdt.core.model.INamespace; public class Namespace extends SourceManipulation implements INamespace{ + String typeName = ""; public Namespace(ICElement parent, String name) { super(parent, name, CElement.C_NAMESPACE); } + /** + * Returns the typeName. + * @return String + */ + public String getTypeName() { + return typeName; + } + + /** + * Sets the typeName. + * @param typeName The typeName to set + */ + public void setTypeName(String typeName) { + this.typeName = typeName; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnitInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnitInfo.java index d754dacdad2..c73d7c12aba 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnitInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnitInfo.java @@ -11,7 +11,6 @@ import java.io.StringBufferInputStream; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ISourceRange; -import org.eclipse.cdt.internal.core.parser.Parser; import org.eclipse.cdt.internal.parser.CStructurizer; import org.eclipse.core.runtime.IPath; @@ -44,9 +43,9 @@ class TranslationUnitInfo extends OpenableInfo { removeChildren(); if (CCorePlugin.getDefault().useNewParser()) { // new parser - NewModelBuilder modelBuilder = new NewModelBuilder((TranslationUnit)getElement()); - Parser parser = new Parser(in, modelBuilder, true); - parser.parse(); + CModelBuilder modelBuilder = new CModelBuilder((TranslationUnit)getElement()); + modelBuilder.parse(); + } else { // cdt 1.0 parser ModelBuilder modelBuilder= new ModelBuilder((TranslationUnit)getElement()); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TypeDef.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TypeDef.java index b2225698a4f..2e3b1a59184 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TypeDef.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TypeDef.java @@ -16,8 +16,24 @@ import org.eclipse.cdt.core.model.ITypeDef; public class TypeDef extends SourceManipulation implements ITypeDef{ + String typeName= ""; public TypeDef(ICElement parent, String name) { super(parent, name, CElement.C_TYPEDEF); } + /** + * Returns the typeName. + * @return String + */ + public String getTypeName() { + return typeName; + } + + /** + * Sets the typeName. + * @param typeName The typeName to set + */ + public void setTypeName(String typeName) { + this.typeName = typeName; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java index 45776ed32c0..465659c20ee 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java @@ -8,57 +8,14 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IVariable; -public class Variable extends SourceManipulation implements IVariable { +public class Variable extends VariableDeclaration implements IVariable { public Variable(ICElement parent, String name) { super(parent, name, CElement.C_VARIABLE); } - public String getTypeName() { - return getVariableInfo().getTypeName(); - } - - public void setTypeName(String type){ - getVariableInfo().setTypeName(type); - } - - public boolean isConst() { - return getVariableInfo().isConst(); - } - - public void setConst(boolean isConst) { - getVariableInfo().setConst(isConst); - } - - public boolean isVolatile() { - return getVariableInfo().isVolatile(); - } - - public void setVolatile(boolean isVolatile) { - getVariableInfo().setVolatile(isVolatile); - } - - public boolean isStatic() { - return getVariableInfo().isStatic(); - } - - public void setStatic(boolean isStatic) { - getVariableInfo().setStatic(isStatic); - } - public String getInitializer() { return ""; } - public int getAccessControl() { - return getVariableInfo().getAccessControl(); - } - - protected VariableInfo getVariableInfo() { - return (VariableInfo)getElementInfo(); - } - - protected CElementInfo createElementInfo () { - return new VariableInfo(this); - } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableDeclaration.java index f9834d73333..76c455ddaa6 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableDeclaration.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableDeclaration.java @@ -14,6 +14,10 @@ public class VariableDeclaration extends SourceManipulation implements IVariable super(parent, name, CElement.C_VARIABLE_DECLARATION); } + public VariableDeclaration(ICElement parent, String name, int type) { + super(parent, name, type); + } + public int getAccessControl() { return getVariableInfo().getAccessControl(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java new file mode 100644 index 00000000000..4e8b86a90a4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java @@ -0,0 +1,464 @@ +package org.eclipse.cdt.internal.core.model; + + +/******************************************************************************* + * Copyright (c) 2001 Rational Software Corp. 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 implementation + ******************************************************************************/ + +import java.util.Iterator; +import java.util.List; + +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.INamespace; +import org.eclipse.cdt.core.model.IParent; +import org.eclipse.cdt.core.model.IStructure; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.internal.core.dom.ClassSpecifier; +import org.eclipse.cdt.internal.core.dom.DOMBuilder; +import org.eclipse.cdt.internal.core.dom.Declaration; +import org.eclipse.cdt.internal.core.dom.Declarator; +import org.eclipse.cdt.internal.core.dom.ElaboratedTypeSpecifier; +import org.eclipse.cdt.internal.core.dom.EnumerationSpecifier; +import org.eclipse.cdt.internal.core.dom.EnumeratorDefinition; +import org.eclipse.cdt.internal.core.dom.IOffsetable; +import org.eclipse.cdt.internal.core.dom.Inclusion; +import org.eclipse.cdt.internal.core.dom.Macro; +import org.eclipse.cdt.internal.core.dom.NamespaceDefinition; +import org.eclipse.cdt.internal.core.dom.ParameterDeclaration; +import org.eclipse.cdt.internal.core.dom.ParameterDeclarationClause; +import org.eclipse.cdt.internal.core.dom.PointerOperator; +import org.eclipse.cdt.internal.core.dom.SimpleDeclaration; +import org.eclipse.cdt.internal.core.dom.TranslationUnit; +import org.eclipse.cdt.internal.core.dom.TypeSpecifier; +import org.eclipse.cdt.internal.core.parser.Parser; +import org.eclipse.cdt.internal.core.parser.ParserException; +import org.eclipse.cdt.internal.core.parser.util.ClassKey; +import org.eclipse.cdt.internal.core.parser.util.DeclSpecifier; + +public class CModelBuilder { + + org.eclipse.cdt.internal.core.model.TranslationUnit translationUnit; + public CModelBuilder(org.eclipse.cdt.internal.core.model.TranslationUnit tu) { + this.translationUnit = tu ; + } + + public TranslationUnit parse() throws Exception { + DOMBuilder domBuilder = new DOMBuilder(); + String code = translationUnit.getBuffer().getContents(); + Parser parser = new Parser(code, domBuilder, true); + if( ! parser.parse() ) throw new ParserException( "Parse failure" ); + generateModelElements(domBuilder.getTranslationUnit()); + return domBuilder.getTranslationUnit(); + } + + protected void generateModelElements(TranslationUnit tu){ + List offsetables = tu.getOffsetables(); + Iterator i = offsetables.iterator(); + while (i.hasNext()){ + IOffsetable offsetable = (IOffsetable)i.next(); + if(offsetable instanceof Inclusion){ + createInclusion(translationUnit, (Inclusion) offsetable); + } + else if(offsetable instanceof Macro){ + createMacro(translationUnit, (Macro) offsetable); + }else if(offsetable instanceof Declaration){ + generateModelElements (translationUnit, (Declaration) offsetable); + } + } + } + + protected void generateModelElements (Parent parent, Declaration declaration){ + // Namespace + if(declaration instanceof NamespaceDefinition){ + NamespaceDefinition nsDef = (NamespaceDefinition) declaration; + IParent namespace = createNamespace(parent, nsDef); + List nsDeclarations = nsDef.getDeclarations(); + Iterator nsDecls = nsDeclarations.iterator(); + while (nsDecls.hasNext()){ + Declaration subNsDeclaration = (Declaration) nsDecls.next(); + generateModelElements((Parent)namespace, subNsDeclaration); + } + } + + if(declaration instanceof SimpleDeclaration){ + SimpleDeclaration simpleDeclaration = (SimpleDeclaration) declaration; + + /*------------------------------------------- + * Checking the type if it is a composite one + *-------------------------------------------*/ + TypeSpecifier typeSpec = simpleDeclaration.getTypeSpecifier(); + // Enumeration + if (typeSpec instanceof EnumerationSpecifier){ + EnumerationSpecifier enumSpecifier = (EnumerationSpecifier) typeSpec; + IParent enumElement = createEnumeration (parent, enumSpecifier); + } + // Structure + else if (typeSpec instanceof ClassSpecifier){ + ClassSpecifier classSpecifier = (ClassSpecifier) typeSpec; + IParent classElement = createClass (parent, simpleDeclaration, classSpecifier); + // create the sub declarations + List declarations = classSpecifier.getDeclarations(); + Iterator j = declarations.iterator(); + while (j.hasNext()){ + Declaration subDeclaration = (Declaration)j.next(); + generateModelElements((Parent)classElement, subDeclaration); + } + // TODO: create the declarators too here + } + + /*----------------------------------------- + * Create declarators of simple declaration + * ----------------------------------------*/ + + List declarators = simpleDeclaration.getDeclarators(); + Iterator d = declarators.iterator(); + while (d.hasNext()){ + Declarator declarator = (Declarator)d.next(); + // typedef + if(simpleDeclaration.getDeclSpecifier().isTypedef()){ + createTypeDef(parent, declarator, simpleDeclaration); + } else { + ParameterDeclarationClause pdc = declarator.getParms(); + if (pdc == null){ + createVariableSpecification(parent, simpleDeclaration, declarator); + } + else{ + createFunctionSpecification(parent, simpleDeclaration, declarator, pdc); + } + } + } // end while + } // end if SimpleDeclaration + } + + + + private void createInclusion(Parent parent, Inclusion inclusion){ + // create element + Include element = new Include((CElement)parent, inclusion.getName()); + // add to parent + parent.addChild((CElement) element); + // set position + element.setIdPos(inclusion.getNameOffset(), inclusion.getNameLength()); + element.setPos(inclusion.getStartingOffset(), inclusion.getTotalLength()); + } + + private void createMacro(Parent parent, Macro macro){ + // create element + org.eclipse.cdt.internal.core.model.Macro element = new org.eclipse.cdt.internal.core.model.Macro(parent, macro.getName()); + // add to parent + parent.addChild((CElement) element); + // set position + element.setIdPos(macro.getNameOffset(), macro.getNameLength()); + element.setPos(macro.getStartingOffset(), macro.getTotalLength()); + + } + + private IParent createNamespace(Parent parent, NamespaceDefinition nsDef){ + // create element + String nsName = (nsDef.getName() == null ) ? "" : nsDef.getName().toString(); + Namespace element = new Namespace ((ICElement)parent, nsName ); + // add to parent + parent.addChild((ICElement)element); + // set element position + if(nsDef.getName() != null){ + element.setIdPos(nsDef.getName().getStartOffset(), nsDef.getName().length()); + }else{ + element.setIdPos(nsDef.getStartToken().getOffset(), nsDef.getStartToken().getLength()); + } + element.setPos(nsDef.getStartingOffset(), nsDef.getTotalLength()); + element.setTypeName(nsDef.getStartToken().getImage()); + + return (IParent)element; + } + + private IParent createEnumeration(Parent parent, EnumerationSpecifier enumSpecifier){ + // create element + String enumName = (enumSpecifier.getName() == null ) ? "" : enumSpecifier.getName().toString(); + Enumeration enum = new Enumeration ((ICElement)parent, enumName ); + // add to parent + parent.addChild((ICElement)enum); + List enumItems = enumSpecifier.getEnumeratorDefinitions(); + Iterator i = enumItems.iterator(); + while (i.hasNext()){ + // create sub element + EnumeratorDefinition enumDef = (EnumeratorDefinition) i.next(); + Enumerator element = new Enumerator (enum, enumDef.getName().toString()); + // add to parent + enum.addChild(element); + // set enumerator position + element.setIdPos(enumDef.getName().getStartOffset(), enumDef.getName().length()); + element.setPos(enumDef.getStartingOffset(), enumDef.getTotalLength()); + } + + // set enumeration position + if(enumSpecifier.getName() != null ){ + enum.setIdPos(enumSpecifier.getName().getStartOffset(), enumSpecifier.getName().length()); + }else { + enum.setIdPos(enumSpecifier.getStartToken().getOffset(), enumSpecifier.getStartToken().getLength()); + } + enum.setPos(enumSpecifier.getStartingOffset(), enumSpecifier.getTotalLength()); + enum.setTypeName(enumSpecifier.getStartToken().getImage()); + + return (IParent)enum; + } + + private IParent createClass(Parent parent, SimpleDeclaration simpleDeclaration, ClassSpecifier classSpecifier){ + // create element + String className = (classSpecifier.getName() == null ) ? "" : classSpecifier.getName().toString(); + int kind; + switch( classSpecifier.getClassKey() ) + { + case ClassKey.t_class: + kind = ICElement.C_CLASS; + break; + case ClassKey.t_struct: + kind = ICElement.C_STRUCT; + break; + default: + kind = ICElement.C_UNION; + break; + } + + Structure classElement = new Structure( (CElement)parent, kind, className ); + + // add to parent + parent.addChild((ICElement) classElement); + String type; + // set element position + if( classSpecifier.getName() != null ) + { + type = simpleDeclaration.getDeclSpecifier().getTypeName(); + classElement.setIdPos( classSpecifier.getName().getStartOffset(), classSpecifier.getName().length() ); + } + else + { + type = classSpecifier.getClassKeyToken().getImage(); + classElement.setIdPos(classSpecifier.getClassKeyToken().getOffset(), classSpecifier.getClassKeyToken().getLength()); + + } + classElement.setTypeName( type ); + classElement.setPos(classSpecifier.getStartingOffset(), classSpecifier.getTotalLength()); + + return classElement; + } + + private void createTypeDef(Parent parent, Declarator declarator, SimpleDeclaration simpleDeclaration){ + // create the element + String declaratorName = declarator.getName().toString(); + TypeDef typedef = new TypeDef( parent, declaratorName ); + String type = getType(simpleDeclaration, declarator); + typedef.setTypeName(type); + + // add to parent + parent.addChild((CElement)typedef); + + // set positions + typedef.setIdPos(declarator.getName().getStartOffset(), declarator.getName().length()); + typedef.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength()); + } + + private void createVariableSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator){ + + String declaratorName = declarator.getName().toString(); + DeclSpecifier declSpecifier = simpleDeclaration.getDeclSpecifier(); + + VariableDeclaration element = null; + if(parent instanceof IStructure){ + // field + Field newElement = new Field( parent, declaratorName ); + newElement.setMutable(declSpecifier.isMutable()); + newElement.setVisibility(simpleDeclaration.getAccessSpecifier().getAccess()); + element = newElement; + } + else { + if(declSpecifier.isExtern()){ + // variableDeclaration + VariableDeclaration newElement = new VariableDeclaration( parent, declaratorName ); + element = newElement; + } + else { + // variable + Variable newElement = new Variable( parent, declaratorName ); + element = newElement; + } + } + element.setTypeName ( getType(simpleDeclaration, declarator) ); + element.setConst(declSpecifier.isConst()); + element.setVolatile(declSpecifier.isVolatile()); + element.setStatic(declSpecifier.isStatic()); + // add to parent + parent.addChild( element ); + + // set position + // hook up the offsets + element.setIdPos( declarator.getName().getStartOffset(), declarator.getName().length() ); + element.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength()); + + } + + private void createFunctionSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator, ParameterDeclarationClause pdc){ + String declaratorName = declarator.getName().toString(); + DeclSpecifier declSpecifier = simpleDeclaration.getDeclSpecifier(); + // getParameterTypes + List parameterList = pdc.getDeclarations(); + String[] parameterTypes = new String[parameterList.size()]; + FunctionDeclaration element = null; + for( int j = 0; j< parameterList.size(); ++j ) + { + ParameterDeclaration param = (ParameterDeclaration )parameterList.get(j); + Declarator paramDeclarator = (Declarator)param.getDeclarators().get(0); + parameterTypes[j] = new String(getType(param, paramDeclarator)); + } + + if( parent instanceof IStructure ) + { + if (simpleDeclaration.isFunctionDefinition()) + { + // method + Method newElement = new Method( parent, declaratorName ); + newElement.setVisibility(simpleDeclaration.getAccessSpecifier().getAccess()); + element = newElement; + } + else + { + // method declaration + MethodDeclaration newElement = new MethodDeclaration( parent, declaratorName ); + newElement.setVisibility(simpleDeclaration.getAccessSpecifier().getAccess()); + element = newElement; + } + } + else if(( parent instanceof ITranslationUnit ) + || ( parent instanceof INamespace )) + { + if (simpleDeclaration.isFunctionDefinition()) + { + // if it belongs to a class, then create a method + // else create a function + // this will not be known until we have cross reference information + + // function + Function newElement = new Function( parent, declaratorName ); + element = newElement; + } + else + { + // functionDeclaration + FunctionDeclaration newElement = new FunctionDeclaration( parent, declaratorName ); + element = newElement; + } + } + element.setParameterTypes(parameterTypes); + element.setReturnType( getType(simpleDeclaration, declarator) ); + element.setVolatile(declSpecifier.isVolatile()); + element.setStatic(declSpecifier.isStatic()); + element.setConst(declarator.isConst()); + + // add to parent + parent.addChild( element ); + + // hook up the offsets + element.setIdPos( declarator.getName().getStartOffset(), declarator.getName().length() ); + element.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength()); + + } + + private String getType(Declaration declaration, Declarator declarator){ + String type = ""; + // get type from declaration + type = getDeclarationType(declaration); + // add pointerr or reference from declarator if any + type += getDeclaratorPointerOperation(declarator); + return type; + } + + private String getDeclarationType(Declaration declaration){ + String type = ""; + if(declaration instanceof ParameterDeclaration){ + ParameterDeclaration paramDeclaration = (ParameterDeclaration) declaration; + if(paramDeclaration.getDeclSpecifier().isConst()) + type += "const "; + if(paramDeclaration.getDeclSpecifier().isVolatile()) + type += "volatile "; + TypeSpecifier typeSpecifier = paramDeclaration.getTypeSpecifier(); + if(typeSpecifier == null){ + type += paramDeclaration.getDeclSpecifier().getTypeName(); + } + else if(typeSpecifier instanceof ElaboratedTypeSpecifier){ + ElaboratedTypeSpecifier elab = (ElaboratedTypeSpecifier) typeSpecifier; + type += getElaboratedTypeSignature(elab); + } + } + + if(declaration instanceof SimpleDeclaration){ + SimpleDeclaration simpleDeclaration = (SimpleDeclaration) declaration; + if(simpleDeclaration.getDeclSpecifier().isConst()) + type += "const "; + if(simpleDeclaration.getDeclSpecifier().isVolatile()) + type += "volatile "; + TypeSpecifier typeSpecifier = simpleDeclaration.getTypeSpecifier(); + if(typeSpecifier == null){ + type += simpleDeclaration.getDeclSpecifier().getTypeName(); + } + else if(typeSpecifier instanceof ElaboratedTypeSpecifier){ + ElaboratedTypeSpecifier elab = (ElaboratedTypeSpecifier) typeSpecifier; + type += getElaboratedTypeSignature(elab); + } + } + + return type; + } + + private String getElaboratedTypeSignature(ElaboratedTypeSpecifier elab){ + String type = ""; + int t = elab.getClassKey(); + switch (t){ + case ClassKey.t_class: + type = "class"; + break; + case ClassKey.t_struct: + type = "struct"; + break; + case ClassKey.t_union: + type = "union"; + break; + case ClassKey.t_enum: + type = "enum"; + break; + }; + type += " "; + type += elab.getName().toString(); + return type; + } + + private String getDeclaratorPointerOperation(Declarator declarator){ + String pointerString = ""; + List pointerOperators = declarator.getPointerOperators(); + if(pointerOperators != null) { + Iterator i = pointerOperators.iterator(); + while(i.hasNext()){ + PointerOperator po = (PointerOperator) i.next(); + switch (po.getType()){ + case PointerOperator.t_pointer: + pointerString += "*"; + break; + case PointerOperator.t_reference: + pointerString += "&"; + break; + } + + if(po.isConst()) + pointerString += " const"; + if(po.isVolatile()) + pointerString += " volatile"; + } + } + return pointerString; + } +} diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java index faeed71f3cd..5066b9c5dfa 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java @@ -8,6 +8,8 @@ package org.eclipse.cdt.ui; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IFunctionDeclaration; +import org.eclipse.cdt.core.model.INamespace; +import org.eclipse.cdt.core.model.ITypeDef; import org.eclipse.cdt.core.model.IVariableDeclaration; import org.eclipse.cdt.internal.ui.CElementImageProvider; import org.eclipse.cdt.internal.ui.ErrorTickAdornmentProvider; @@ -65,17 +67,21 @@ public class CElementLabelProvider extends LabelProvider { case ICElement.C_VARIABLE_DECLARATION: IVariableDeclaration vDecl = (IVariableDeclaration) celem; name = vDecl.getElementName(); - name += " : "; - name += vDecl.getTypeName(); + if((vDecl.getTypeName() != null) &&(vDecl.getTypeName().length() > 0)){ + name += " : "; + name += vDecl.getTypeName(); + } break; case ICElement.C_FUNCTION: case ICElement.C_FUNCTION_DECLARATION: case ICElement.C_METHOD: case ICElement.C_METHOD_DECLARATION: IFunctionDeclaration fDecl = (IFunctionDeclaration) celem; - name = fDecl.getSignature(); - name += " : "; - name += fDecl.getReturnType(); + name = fDecl.getSignature(); + if((fDecl.getReturnType() != null) &&(fDecl.getReturnType().length() > 0)){ + name += " : "; + name += fDecl.getReturnType(); + } break; case ICElement.C_STRUCT: case ICElement.C_UNION: @@ -87,6 +93,22 @@ public class CElementLabelProvider extends LabelProvider { name = varDecl.getTypeName(); } break; + case ICElement.C_TYPEDEF: + ITypeDef tDecl = (ITypeDef) celem; + name = tDecl.getElementName(); + if((tDecl.getTypeName() != null) &&(tDecl.getTypeName().length() > 0)){ + name += " : "; + name += tDecl.getTypeName(); + } + break; + case ICElement.C_NAMESPACE: + if((celem.getElementName() != null) && (celem.getElementName().length() > 0)){ + name = celem.getElementName(); + } else if (celem instanceof INamespace) { + INamespace nDecl = (INamespace) celem; + name = nDecl.getTypeName(); + } + break; default: name= celem.getElementName(); break;