From 1c2c0848b7bc67874fac302bf66075fb95918e7c Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 28 Jul 2008 14:42:42 +0000 Subject: [PATCH] Complete support for members of anonymous unions, bug 206450. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 18 ++++++++ .../tests/IndexCPPBindingResolutionBugs.java | 6 +++ .../eclipse/cdt/core/dom/ast/IBinding.java | 5 ++- .../cdt/core/dom/ast/ICompositeType.java | 16 +++++++- .../core/dom/parser/c/CStructure.java | 28 ++++++++++++- .../parser/cpp/CPPClassSpecialization.java | 19 +++++++++ .../core/dom/parser/cpp/CPPClassTemplate.java | 4 ++ .../core/dom/parser/cpp/CPPClassType.java | 19 +++++++++ .../cpp/CPPTemplateTemplateParameter.java | 4 ++ .../core/dom/parser/cpp/CPPUnknownClass.java | 4 ++ .../composite/c/CompositeCStructure.java | 8 +++- .../composite/cpp/CompositeCPPClassType.java | 7 +++- .../cpp/CompositeCPPUnknownClassType.java | 4 ++ .../eclipse/cdt/internal/core/pdom/PDOM.java | 1 + .../core/pdom/dom/PDOMASTAdapter.java | 8 ++++ .../core/pdom/dom/c/PDOMCStructure.java | 41 ++++++++++++++++--- .../core/pdom/dom/cpp/PDOMCPPClassScope.java | 7 +++- .../dom/cpp/PDOMCPPClassSpecialization.java | 4 ++ .../core/pdom/dom/cpp/PDOMCPPClassType.java | 31 +++++++++++--- .../dom/cpp/PDOMCPPDeferredClassInstance.java | 4 ++ .../pdom/dom/cpp/PDOMCPPUnknownClassType.java | 4 ++ .../text/contentassist2/CompletionTests.java | 2 +- .../CompletionTests_PlainC.java | 4 +- .../lrparser/c99/bindings/C99Structure.java | 4 ++ 24 files changed, 230 insertions(+), 22 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 2332410b4e1..8fee9d8a9bd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -5244,4 +5244,22 @@ public class AST2Tests extends AST2BaseTest { parseAndCheckBindings(getAboveComment(), lang, true); } } + + // struct Outer { + // struct {int a1;}; + // struct {int a2;} a3; + // }; + // void test() { + // struct Outer o; + // o.a1=0; o.a2=0; o.a3=0; + // } + public void testAnonymousUnionMember() throws Exception { + final boolean[] isCpps= {false, true}; + for (boolean isCpp : isCpps) { + BindingAssertionHelper bh= new BindingAssertionHelper(getAboveComment(), isCpp); + bh.assertNonProblem("a1=", 2); + bh.assertProblem("a2=", 2); + bh.assertNonProblem("a3=", 2); + } + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java index 8b1590f3034..7ca51ad3aba 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionBugs.java @@ -728,12 +728,16 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas // struct { // int var1; // }; + // struct { + // int var2; + // } hide; // }; // #include "header.h" // void test() { // union outer x; // x.var1=1; + // x.var2= 2; // must be a problem // } public void testAnonymousStruct_Bug216791() throws DOMException { // struct @@ -743,6 +747,8 @@ public class IndexCPPBindingResolutionBugs extends IndexBindingResolutionTestBas IScope outer= f.getCompositeTypeOwner().getScope(); assertTrue(outer instanceof ICPPClassScope); assertEquals("outer", outer.getScopeName().toString()); + + getProblemFromASTName("var2=", 4); } // namespace ns { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java index 58adac386c2..4da4022543a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.ast; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; @@ -53,8 +54,10 @@ public interface IBinding extends IAdaptable { * declared else where). *

Possible owners are: *
{@link IFunction}: for parameters, local types, variables, enumerators, labels and using declarations; - *
{@link ICompositeType}: for class-, struct- and union-members, even if the composite type is anonymous; + *
{@link ICPPClassType}: for class-, struct- and union-members, even if the composite type is anonymous; * also for enumerators and using declarations; + *
{@link ICompositeType}: for struct- and union-members, even if the composite type is anonymous; + * also for anonymous structs or unions found within another struct; *
{@link ICPPNamespace}: for global types, functions, variables, enumerators, namespaces and using declarations; *
null: for types, functions, variables, enumerators, namespaces and using declarations; * @since 5.1 diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ICompositeType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ICompositeType.java index 509f4ceb3b3..849107ee4dd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ICompositeType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ICompositeType.java @@ -12,7 +12,9 @@ package org.eclipse.cdt.core.dom.ast; /** - * @author Doug Schaefer + * Interface for all composite types: classes, structs or unions. + * + * @noimplement This interface is not intended to be implemented by clients. */ public interface ICompositeType extends IBinding, IType { @@ -23,6 +25,18 @@ public interface ICompositeType extends IBinding, IType { */ public int getKey() throws DOMException; + /** + * Returns whether the type is anonymous or not. A type for which objects or + * pointers are declared is not considered an anonymous type. + *

 struct Outer {
+	 *    struct {int a;}; // anonymous
+	 *    struct {int b;} c; // not anonymous
+	 * }
+	 * 
+ * @since 5.1 + */ + boolean isAnonymous() throws DOMException; + /** * Returns the fields for this type. * diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java index 6c0ef9e7c60..427f729b041 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java @@ -59,6 +59,9 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte public int getKey() throws DOMException { throw new DOMException( this ); } + public boolean isAnonymous() throws DOMException { + throw new DOMException( this ); + } } private IASTName [] declarations = null; @@ -281,6 +284,29 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte node= declarations[0]; } } - return CVisitor.findEnclosingFunction(node); // local or global + IBinding result= CVisitor.findEnclosingFunction(node); // local or global + if (result != null) + return result; + + if (definition != null && isAnonymous()) { + return CVisitor.findDeclarationOwner(definition, false); + } + return null; + } + + public boolean isAnonymous() throws DOMException { + if (getNameCharArray().length > 0 || definition == null) + return false; + + IASTCompositeTypeSpecifier spec= ((IASTCompositeTypeSpecifier)definition.getParent()); + if (spec != null) { + IASTNode node= spec.getParent(); + if (node instanceof IASTSimpleDeclaration) { + if (((IASTSimpleDeclaration) node).getDeclarators().length == 0) { + return true; + } + } + } + return false; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 698852e6cbe..211652f8877 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -309,4 +309,23 @@ public class CPPClassSpecialization extends CPPSpecialization implements ICPPCla public ICPPClassType[] getNestedClasses() throws DOMException { return ICPPClassType.EMPTY_CLASS_ARRAY; } + + + public boolean isAnonymous() throws DOMException { + if (getNameCharArray().length > 0) + return false; + + ICPPASTCompositeTypeSpecifier spec= getCompositeTypeSpecifier(); + if (spec == null) { + return getSpecializedBinding().isAnonymous(); + } + + IASTNode node= spec.getParent(); + if (node instanceof IASTSimpleDeclaration) { + if (((IASTSimpleDeclaration) node).getDeclarators().length == 0) { + return true; + } + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index 5c9432c0c1d..9446e62a105 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -252,4 +252,8 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements public String toString() { return ASTTypeUtil.getType(this); } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java index 5da70a16c00..0e07fff09f0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java @@ -138,6 +138,9 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp public ICPPClassType[] getNestedClasses() throws DOMException { throw new DOMException( this ); } + public boolean isAnonymous() throws DOMException { + throw new DOMException( this ); + } } private class FindDefinitionAction extends CPPASTVisitor { @@ -462,4 +465,20 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp public IBinding getOwner() throws DOMException { return CPPVisitor.findDeclarationOwner(definition != null ? definition : declarations[0], true); } + + public boolean isAnonymous() throws DOMException { + if (getNameCharArray().length > 0) + return false; + + ICPPASTCompositeTypeSpecifier spec= getCompositeTypeSpecifier(); + if (spec != null) { + IASTNode node= spec.getParent(); + if (node instanceof IASTSimpleDeclaration) { + if (((IASTSimpleDeclaration) node).getDeclarators().length == 0) { + return true; + } + } + } + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index a8567bf9c4e..843766eca14 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -223,4 +223,8 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement public IASTName getUnknownName() { return new CPPASTName(getNameCharArray()); } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java index 12cc831600c..922826e360d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java @@ -110,4 +110,8 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownCla public ICPPClassType[] getNestedClasses() { return ICPPClassType.EMPTY_CLASS_ARRAY; } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/c/CompositeCStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/c/CompositeCStructure.java index 6748c8fc2e9..f0c646b30c7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/c/CompositeCStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/c/CompositeCStructure.java @@ -1,12 +1,12 @@ /******************************************************************************* - * Copyright (c) 2007 Symbian Software Systems and others. + * Copyright (c) 2007, 2008 Symbian Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.c; @@ -51,4 +51,8 @@ class CompositeCStructure extends CompositeCBinding implements ICompositeType, I @Override public Object clone() {fail(); return null;} + + public boolean isAnonymous() throws DOMException { + return ((ICompositeType)rbinding).isAnonymous(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java index 55f68c99766..4a1707a81e1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation + * Andrew Ferguson (Symbian) - Initial implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; @@ -174,4 +175,8 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType public boolean isSameType(IType type) { return ((ICPPClassType)rbinding).isSameType(type); } + + public boolean isAnonymous() throws DOMException { + return ((ICPPClassType)rbinding).isAnonymous(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java index 196db2a224f..0b4a5c44e3e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java @@ -135,4 +135,8 @@ class CompositeCPPUnknownClassType extends CompositeCPPBinding implements ICPPUn public IASTName getUnknownName() { return ((ICPPUnknownClassType) rbinding).getUnknownName(); } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 2d8ae2e09ce..12a0c60c160 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -177,6 +177,7 @@ public class PDOM extends PlatformObject implements IPDOM { * #61.0# - properly insert macro undef statements into macro-containers (bug 234591) - <> * * 70.0 - cleaned up templates, fixes bug 236197 + * 71.0 - proper support for anonymous unions, bug 206450 */ public static final int LINKAGES = Database.DATA_AREA; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java index c9d6add921d..12410f7b182 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMASTAdapter.java @@ -279,6 +279,10 @@ public class PDOMASTAdapter { public IBinding getOwner() throws DOMException { return fDelegate.getOwner(); } + + public boolean isAnonymous() throws DOMException { + return fDelegate.isAnonymous(); + } } private static class AnonymousCPPBinding implements ICPPBinding { @@ -413,6 +417,10 @@ public class PDOMASTAdapter { public boolean isSameType(IType type) { return ((ICPPClassType) fDelegate).isSameType(type); } + + public boolean isAnonymous() throws DOMException { + return ((ICPPClassType) fDelegate).isAnonymous(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java index 9d91f04fc73..c5114da4e87 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java @@ -53,12 +53,14 @@ import org.eclipse.core.runtime.Status; public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCompositeTypeScope, IPDOMMemberOwner, IIndexType, IIndexScope { private static final int MEMBERLIST = PDOMBinding.RECORD_SIZE; private static final int KEY = MEMBERLIST + 4; // byte + private static final int ANONYMOUS= MEMBERLIST + 5; @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8; + protected static final int RECORD_SIZE = MEMBERLIST + 6; public PDOMCStructure(PDOM pdom, PDOMNode parent, ICompositeType compType) throws CoreException { super(pdom, parent, compType.getNameCharArray()); setKind(compType); + setAnonymous(compType); // linked list is initialized by malloc zeroing allocated storage } @@ -71,6 +73,7 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom if (newBinding instanceof ICompositeType) { ICompositeType ct= (ICompositeType) newBinding; setKind(ct); + setAnonymous(ct); super.update(linkage, newBinding); } } @@ -82,6 +85,15 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom throw new CoreException(Util.createStatus(e)); } } + + private void setAnonymous(ICompositeType ct) throws CoreException { + try { + pdom.getDB().putByte(record + ANONYMOUS, (byte) (ct.isAnonymous() ? 1 : 0)); + } catch (DOMException e) { + throw new CoreException(Util.createStatus(e)); + } + } + @Override public void accept(IPDOMVisitor visitor) throws CoreException { @@ -107,6 +119,15 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom return ICompositeType.k_struct; // or something } } + + public boolean isAnonymous() throws DOMException { + try { + return pdom.getDB().getByte(record + ANONYMOUS) != 0; + } catch (CoreException e) { + CCorePlugin.log(e); + return false; + } + } private static class GetFields implements IPDOMVisitor { private List fields = new ArrayList(); @@ -116,6 +137,13 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom if (IndexFilter.ALL_DECLARED_OR_IMPLICIT.acceptBinding(field)) { fields.add(node); } + } else if (node instanceof ICompositeType) { + try { + if (((ICompositeType) node).isAnonymous()) { + return true; // visit children + } + } catch (DOMException e) { + } } return false; } @@ -151,11 +179,12 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, ICCom throw new CoreException(Status.OK_STATUS); } } - } - else if (node instanceof ICompositeType) { - char[] nchars= ((ICompositeType) node).getNameCharArray(); - if (nchars.length > 0 && nchars[0] == '{') { - return true; // visit children + } else if (node instanceof ICompositeType) { + try { + if (((ICompositeType) node).isAnonymous()) { + return true; // visit children + } + } catch (DOMException e) { } } return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java index 689e7a0de3e..ffd5d3ad582 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassScope.java @@ -167,8 +167,11 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { } list.add(binding); - if (binding instanceof ICompositeType && nchars.length > 0 && nchars[0] == '{') { - return true; // visit children + try { + if (binding instanceof ICompositeType && ((ICompositeType) binding).isAnonymous()) { + return true; // visit children + } + } catch (DOMException e) { } } return false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java index c231194f82a..3554ea3f769 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassSpecialization.java @@ -343,4 +343,8 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements result+=" <"+map.keyAt(i)+"=>"+getArgumentMap().getAt(i)+">"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ return result; } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 0934e610c56..f5cb62cd49b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -56,12 +56,14 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDOMMemberOwner { private static final int FIRSTBASE = PDOMCPPBinding.RECORD_SIZE + 0; + + private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; + + private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 8; // byte + private static final int ANONYMOUS= PDOMCPPBinding.RECORD_SIZE + 9; // byte - private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 4; // byte - - private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 8; @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12; + protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 10; private ICPPClassScope fScope; @@ -70,6 +72,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO super(pdom, parent, classType.getNameCharArray()); setKind(classType); + setAnonymous(classType); // linked list is initialized by storage being zero'd by malloc } @@ -82,6 +85,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO if (newBinding instanceof ICPPClassType) { ICPPClassType ct= (ICPPClassType) newBinding; setKind(ct); + setAnonymous(ct); super.update(linkage, newBinding); } } @@ -93,7 +97,15 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO throw new CoreException(Util.createStatus(e)); } } - + + private void setAnonymous(ICPPClassType ct) throws CoreException { + try { + pdom.getDB().putByte(record + ANONYMOUS, (byte) (ct.isAnonymous() ? 1 : 0)); + } catch (DOMException e) { + throw new CoreException(Util.createStatus(e)); + } + } + @Override public void addChild(PDOMNode member) throws CoreException { pdom.removeCachedResult(record+PDOMCPPLinkage.CACHE_MEMBERS); @@ -329,6 +341,15 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO } } + public boolean isAnonymous() throws DOMException { + try { + return pdom.getDB().getByte(record + ANONYMOUS) != 0; + } catch (CoreException e) { + CCorePlugin.log(e); + return false; + } + } + @Override public boolean isGloballyQualified() throws DOMException { try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 732636d6d6a..6a2d26c622e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -233,4 +233,8 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP return IType.EMPTY_TYPE_ARRAY; } } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index f580e665062..adb6e17b101 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -270,4 +270,8 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, public IASTName getUnknownName() { return new CPPASTName(getNameCharArray()); } + + public boolean isAnonymous() { + return false; + } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index acce9a2dd9b..b8e79b58def 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -1164,7 +1164,7 @@ public class CompletionTests extends AbstractContentAssistTest { } // void test() {struct s206450 x; x./*cursor*/ - public void _testNestedAnonymousStructs_Bug206450() throws Exception { + public void testNestedAnonymousStructs_Bug206450() throws Exception { final String[] expected= {"a1", "a2", "u1", "u2", "a4", "b", "s206450"}; assertCompletionResults(expected); } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java index 324b31a2649..40f3a784b9f 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java @@ -661,7 +661,7 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest { //void f() {e/*cursor*/ public void testEnums_FunctionScope() throws Exception { final String[] expected= { - "e11", "e12" + "e11", "e12", "e21", "e22" }; assertCompletionResults(expected); } @@ -950,7 +950,7 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest { } // void test() {struct s206450 x; x./*cursor*/ - public void _testNestedAnonymousStructs_Bug206450() throws Exception { + public void testNestedAnonymousStructs_Bug206450() throws Exception { final String[] expected= {"a1", "a2", "u1", "u2", "a4", "b"}; assertCompletionResults(expected); } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/old/org/eclipse/cdt/internal/core/dom/lrparser/c99/bindings/C99Structure.java b/lrparser/org.eclipse.cdt.core.lrparser/old/org/eclipse/cdt/internal/core/dom/lrparser/c99/bindings/C99Structure.java index fc43d3667e6..57db1054b06 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/old/org/eclipse/cdt/internal/core/dom/lrparser/c99/bindings/C99Structure.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/old/org/eclipse/cdt/internal/core/dom/lrparser/c99/bindings/C99Structure.java @@ -154,4 +154,8 @@ public class C99Structure extends PlatformObject implements IC99Binding, ICompos } return null; } + + public boolean isAnonymous() { + return name == null || name.length() == 0; + } }