Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHansruedi Patzen2018-05-29 13:46:44 +0000
committerThomas Corbat2018-06-20 06:49:00 +0000
commit4c66f7c8f3e2f839e6152f522054616b15baa45a (patch)
treee57002c54424ec3d88f7a28248b5c4097360ca09 /core/org.eclipse.cdt.core/parser/org
parent29ed1fa6c40998edd13cbb39348e7ede951843f5 (diff)
downloadorg.eclipse.cdt-4c66f7c8f3e2f839e6152f522054616b15baa45a.tar.gz
org.eclipse.cdt-4c66f7c8f3e2f839e6152f522054616b15baa45a.tar.xz
org.eclipse.cdt-4c66f7c8f3e2f839e6152f522054616b15baa45a.zip
Bug 535274: Allow attributes on namespace definitions
Implementation and tests. Change-Id: I0cca9dea8630ae66b005856338342b4173c48216 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/org')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java7
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java3
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java4
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java11
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclarationWriter.java1
5 files changed, 21 insertions, 5 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java
index b5159d86f0b..1b5fa011750 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java
@@ -2439,8 +2439,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
return null;
IASTAttributeList result = nodeFactory.newGCCAttributeList();
- final int startOffset = consume().getOffset();
- int endOffset = startOffset;
+ final int startOffset = LA().getOffset();
+ int endOffset = consume().getEndOffset();
if (LT(1) == IToken.tLPAREN) {
consume();
consume(IToken.tLPAREN);
@@ -2464,8 +2464,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
consumeOrEOC(IToken.tRPAREN);
endOffset = consumeOrEOC(IToken.tRPAREN).getEndOffset();
}
- setRange(result, startOffset, endOffset);
- return result;
+ return setRange(result, startOffset, endOffset);
}
protected IASTAttribute singleAttribute() throws EndOfFileException, BacktrackException {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java
index 92ac1a80778..524e14ff1d3 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java
@@ -125,6 +125,9 @@ public class CPPASTNamespaceDefinition extends CPPASTAttributeOwner implements I
}
}
+ if (!acceptByCPPAttributeSpecifiers(action))
+ return false;
+
if (fName != null && !fName.accept(action))
return false;
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 4cde7a50c3e..0be1add28c3 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
@@ -2676,6 +2676,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
consume(IToken.t_namespace);
+ List<IASTAttributeSpecifier> attributeSpecifiers = attributeSpecifierSeq();
+
// optional name
ICPPASTName name = null;
if (LT(1) == IToken.tIDENTIFIER) {
@@ -2686,7 +2688,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
// bug 195701, gcc 4.2 allows visibility attribute for namespaces.
- List<IASTAttributeSpecifier> attributeSpecifiers = __attribute_decl_seq(true, false);
+ attributeSpecifiers = CollectionUtils.merge(attributeSpecifiers, __attribute_decl_seq(true, false));
if (LT(1) == IToken.tLBRACE) {
ICPPASTNamespaceDefinition outer = null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java
index 370a74566f1..f71a7bb68df 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java
@@ -3088,4 +3088,15 @@ public class CPPVisitor extends ASTQueries {
ArrayUtil.reverse(operands);
return operands;
}
+
+ /**
+ * Determines whether the given {@code namespace} definition denotes
+ * an anonymous namespace.
+ * @param namespace
+ * @return {@code true} if the {@code namespace} is anonymous, false otherwise
+ */
+ public static boolean isAnonymousNamespace(ICPPASTNamespaceDefinition namespace) {
+ IASTName name = namespace.getName();
+ return name == null || name.toString().isEmpty();
+ }
}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclarationWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclarationWriter.java
index 27aada07f67..e1eb2150158 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclarationWriter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclarationWriter.java
@@ -207,6 +207,7 @@ public class DeclarationWriter extends NodeWriter {
scribe.printStringSpace(Keywords.INLINE);
}
scribe.printStringSpace(Keywords.NAMESPACE);
+ writeCPPAttributes(namespaceDefinition, EnumSet.of(SpaceLocation.AFTER));
namespaceDefinition.getName().accept(visitor);
writeGCCAttributes(namespaceDefinition, EnumSet.of(SpaceLocation.BEFORE));
if (!hasTrailingComments(namespaceDefinition.getName())) {

Back to the top