diff options
author | Hansruedi Patzen | 2018-05-29 13:46:44 +0000 |
---|---|---|
committer | Thomas Corbat | 2018-06-20 06:49:00 +0000 |
commit | 4c66f7c8f3e2f839e6152f522054616b15baa45a (patch) | |
tree | e57002c54424ec3d88f7a28248b5c4097360ca09 /core/org.eclipse.cdt.core/parser/org | |
parent | 29ed1fa6c40998edd13cbb39348e7ede951843f5 (diff) | |
download | org.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')
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())) { |