Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHansruedi Patzen2018-05-29 11:21:41 +0000
committerThomas Corbat2018-06-20 10:40:31 +0000
commitbc4aa4597dc1c98b41f1ded9d2429115a4ff1268 (patch)
tree43dfb9f3e191471351e494d9ed3d2d278484f774 /core/org.eclipse.cdt.core/parser
parent4c66f7c8f3e2f839e6152f522054616b15baa45a (diff)
downloadorg.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.tar.gz
org.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.tar.xz
org.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.zip
Bug 535256: Rewrite removes attributes, key and base from C++ enum
Fix and tests. Change-Id: I1f5519f833563378d87b3c932b754e29c3e32b06 Signed-off-by: Hansruedi Patzen <hansruedi.patzen@hsr.ch> Signed-off-by: Thomas Corbat <tcorbat@hsr.ch>
Diffstat (limited to 'core/org.eclipse.cdt.core/parser')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java24
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java9
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java27
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java10
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java9
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java27
6 files changed, 96 insertions, 10 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java
index e419bdbda27..91de82621cd 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java
@@ -24,6 +24,15 @@ public interface ICPPASTEnumerationSpecifier extends IASTEnumerationSpecifier, I
public static final ASTNodeProperty BASE_TYPE = new ASTNodeProperty(
"ICPPASTEnumerationSpecifier.BASE_TYPE [ICPPASTDeclSpecifier]"); //$NON-NLS-1$
+ /**
+ * @since 6.5
+ */
+ public enum ScopeStyle {
+ CLASS,
+ STRUCT,
+ NONE
+ }
+
@Override
public ICPPASTEnumerationSpecifier copy();
@@ -35,8 +44,23 @@ public interface ICPPASTEnumerationSpecifier extends IASTEnumerationSpecifier, I
/**
* Not allowed on frozen AST.
+ * @deprecated Use setScopeToken instead
+ * If {@code isScoped == true} is passed, the {@code ScopeToken.CLASS} scope token is assumed.
*/
+ @Deprecated
public void setIsScoped(boolean isScoped);
+
+ /**
+ * Not allowed on frozen AST.
+ * @since 6.5
+ */
+ public void setScopeStyle(ScopeStyle scopeStyle);
+
+ /**
+ * @since 6.5
+ */
+ public ScopeStyle getScopeStyle();
+
/**
* An enum is scoped if it uses the enumeration head {@code enum class} or {@code enum struct}.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java
index 659b040f4d9..b33183bd746 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java
@@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IASTToken;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.INodeFactory;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation.Operator;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTArrayRangeDesignator;
import org.eclipse.cdt.core.dom.parser.cpp.ICPPASTAttributeSpecifier;
@@ -158,9 +159,17 @@ public interface ICPPNodeFactory extends INodeFactory {
/**
* @since 5.2
+ * @deprecated Use {@code newEnumerationSpecifier(ScopeToken, IASTName, ICPPASTDeclSpecifier)} instead.
+ * If {@code isScoped == true} is passed {@code ScopeToken.CLASS} is assumed.
*/
+ @Deprecated
public ICPPASTEnumerationSpecifier newEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType);
+ /**
+ * @since 6.5
+ */
+ public ICPPASTEnumerationSpecifier newEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name, ICPPASTDeclSpecifier baseType);
+
public ICPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiation(IASTDeclaration declaration);
@Override
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java
index 13016c30926..cec71154cee 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java
@@ -26,7 +26,7 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTInternalEnumerationSpecifier
*/
public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier
implements IASTInternalEnumerationSpecifier, ICPPASTEnumerationSpecifier {
- private boolean fIsScoped;
+ private ScopeStyle fScopeStyle;
private boolean fIsOpaque;
private IASTName fName;
private ICPPASTDeclSpecifier fBaseType;
@@ -40,12 +40,18 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier
public CPPASTEnumerationSpecifier() {
}
+ @Deprecated
public CPPASTEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType) {
- fIsScoped= isScoped;
+ this(isScoped ? ScopeStyle.CLASS : ScopeStyle.NONE, name, baseType);
+ }
+
+ public CPPASTEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name, ICPPASTDeclSpecifier baseType) {
+ setScopeStyle(scopeStyle);
setName(name);
setBaseType(baseType);
}
+
@Override
public CPPASTEnumerationSpecifier copy() {
return copy(CopyStyle.withoutLocations);
@@ -53,7 +59,7 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier
@Override
public CPPASTEnumerationSpecifier copy(CopyStyle style) {
- CPPASTEnumerationSpecifier copy = new CPPASTEnumerationSpecifier(fIsScoped,
+ CPPASTEnumerationSpecifier copy = new CPPASTEnumerationSpecifier(fScopeStyle,
fName == null ? null : fName.copy(style),
fBaseType == null ? null : fBaseType.copy(style));
copy.fIsOpaque = fIsOpaque;
@@ -154,14 +160,25 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier
}
@Override
+ @Deprecated
public void setIsScoped(boolean isScoped) {
+ setScopeStyle(isScoped ? ScopeStyle.CLASS : ScopeStyle.NONE);
+ }
+
+ @Override
+ public void setScopeStyle(ScopeStyle scopeStyle) {
assertNotFrozen();
- fIsScoped= isScoped;
+ fScopeStyle = scopeStyle;
+ }
+
+ @Override
+ public ScopeStyle getScopeStyle() {
+ return fScopeStyle;
}
@Override
public boolean isScoped() {
- return fIsScoped;
+ return fScopeStyle != ScopeStyle.NONE;
}
@Override
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java
index a95a3ebb0cb..a00303b0749 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java
@@ -78,6 +78,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpressionList;
@@ -381,14 +382,21 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory {
}
@Override
+ @Deprecated
public ICPPASTEnumerationSpecifier newEnumerationSpecifier(boolean isScoped, IASTName name,
ICPPASTDeclSpecifier baseType) {
return new CPPASTEnumerationSpecifier(isScoped, name, baseType);
}
@Override
+ public ICPPASTEnumerationSpecifier newEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name,
+ ICPPASTDeclSpecifier baseType) {
+ return new CPPASTEnumerationSpecifier(scopeStyle, name, baseType);
+ }
+
+ @Override
public ICPPASTEnumerationSpecifier newEnumerationSpecifier(IASTName name) {
- return new CPPASTEnumerationSpecifier(false, name, null);
+ return new CPPASTEnumerationSpecifier(ScopeStyle.NONE, name, null);
}
@Override
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
index 0be1add28c3..77552c119af 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java
@@ -95,6 +95,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldDeclarator;
@@ -3561,7 +3562,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
result= buildSimpleDeclSpec(storageClass, simpleType, options, isLong, typeofExpression, offset, endOffset);
}
addAttributeSpecifiers(attributes, result);
- attributesEndOffset(endOffset, attributes);
+ endOffset = attributesEndOffset(endOffset, attributes);
setRange(result, offset, endOffset);
} catch (BacktrackException e) {
if (returnToken != null) {
@@ -3628,6 +3629,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
final int offset= consume(IToken.t_enum).getOffset();
int endOffset= 0;
boolean isScoped= false;
+ ScopeStyle scopeStyle = ScopeStyle.NONE;
IASTName name= null;
ICPPASTDeclSpecifier baseType= null;
List<IASTAttributeSpecifier> attributes = null;
@@ -3635,7 +3637,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
try {
int lt1= LT(1);
if (lt1 == IToken.t_class || lt1 == IToken.t_struct) {
- isScoped= true;
+ scopeStyle = (lt1 == IToken.t_class) ? ScopeStyle.CLASS : ScopeStyle.STRUCT;
+ isScoped = true;
consume();
}
// if __attribute__ or __declspec occurs after struct/union/class and before the identifier
@@ -3676,7 +3679,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
name= getNodeFactory().newName();
}
- final ICPPASTEnumerationSpecifier result= getNodeFactory().newEnumerationSpecifier(isScoped, name, baseType);
+ final ICPPASTEnumerationSpecifier result= getNodeFactory().newEnumerationSpecifier(scopeStyle, name, baseType);
result.setIsOpaque(isOpaque);
if (lt1 == IToken.tLBRACE) {
endOffset= enumBody(result);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java
index d6fbf974f06..6e5799667dd 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java
@@ -34,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.parser.GCCKeywords;
@@ -225,8 +226,32 @@ public class DeclSpecWriter extends NodeWriter {
private void writeEnumSpec(IASTEnumerationSpecifier enumSpec) {
scribe.printStringSpace(Keywords.ENUM);
- writeAttributes(enumSpec, EnumSet.of(SpaceLocation.AFTER));
+ boolean isCppEnum = enumSpec instanceof ICPPASTEnumerationSpecifier;
+ if (isCppEnum) {
+ ICPPASTEnumerationSpecifier cppEnumSpec = (ICPPASTEnumerationSpecifier) enumSpec;
+ if (cppEnumSpec.isScoped()) {
+ switch (cppEnumSpec.getScopeStyle()) {
+ case CLASS:
+ scribe.printStringSpace(Keywords.CLASS);
+ break;
+ case STRUCT:
+ scribe.printStringSpace(Keywords.STRUCT);
+ break;
+ default:
+ break;
+ }
+ }
+ writeAttributes(cppEnumSpec, EnumSet.of(SpaceLocation.AFTER));
+ }
enumSpec.getName().accept(visitor);
+ if (isCppEnum) {
+ ICPPASTDeclSpecifier baseType = ((ICPPASTEnumerationSpecifier) enumSpec).getBaseType();
+ if (baseType != null) {
+ scribe.print(SPACE_COLON_SPACE);
+ writeDelcSpec(baseType);
+ scribe.printSpace();
+ }
+ }
scribe.print('{');
scribe.printSpace();
IASTEnumerator[] enums = enumSpec.getEnumerators();

Back to the top