mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-02 22:05:44 +02:00
Bug 377409 - Index lookup for fields of anonymous structs and unions
Change-Id: I8591e063303cbe30d44eaa0eb431fc1dd6031695 Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/37319 Tested-by: Hudson CI Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
parent
517b811599
commit
98ccf145c3
5 changed files with 74 additions and 31 deletions
|
@ -323,7 +323,7 @@ public abstract class IndexBindingResolutionTestBase extends BaseTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void checkBindings() throws Exception {
|
protected final void checkBindings() {
|
||||||
for (int i = 0; i < strategy.getAstCount(); i++) {
|
for (int i = 0; i < strategy.getAstCount(); i++) {
|
||||||
checkBindings(strategy.getAst(i));
|
checkBindings(strategy.getAst(i));
|
||||||
}
|
}
|
||||||
|
|
|
@ -412,4 +412,14 @@ public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase
|
||||||
public void testNameLookupFromArrayModifier_435075() throws Exception {
|
public void testNameLookupFromArrayModifier_435075() throws Exception {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static union {
|
||||||
|
// int a;
|
||||||
|
// int b;
|
||||||
|
// };
|
||||||
|
|
||||||
|
// int waldo = a;
|
||||||
|
public void testAnonymousUnion_377409() {
|
||||||
|
checkBindings();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -337,7 +337,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// void foo() {
|
// void foo() {
|
||||||
// f= g;
|
// f= g;
|
||||||
// }
|
// }
|
||||||
public void testPointerToFunction() throws Exception {
|
public void testPointerToFunction() {
|
||||||
IBinding b0 = getBindingFromASTName("f= g;", 1);
|
IBinding b0 = getBindingFromASTName("f= g;", 1);
|
||||||
IBinding b1 = getBindingFromASTName("g;", 1);
|
IBinding b1 = getBindingFromASTName("g;", 1);
|
||||||
|
|
||||||
|
@ -765,7 +765,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// decltype(A::waldo) A::waldo;
|
// decltype(A::waldo) A::waldo;
|
||||||
|
|
||||||
// A a;
|
// A a;
|
||||||
public void testDecltype_434150() throws Exception {
|
public void testDecltype_434150() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -834,6 +834,23 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
IBinding b2 = getBindingFromASTName("ER2; }", 3);
|
IBinding b2 = getBindingFromASTName("ER2; }", 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// static union {
|
||||||
|
// int a;
|
||||||
|
// int b;
|
||||||
|
// };
|
||||||
|
// namespace N {
|
||||||
|
// static union {
|
||||||
|
// int c;
|
||||||
|
// int d;
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
|
||||||
|
// int waldo1 = a;
|
||||||
|
// int waldo2 = N::d;
|
||||||
|
public void testAnonymousUnion_377409() {
|
||||||
|
checkBindings();
|
||||||
|
}
|
||||||
|
|
||||||
// void foo(int a=2, int b=3);
|
// void foo(int a=2, int b=3);
|
||||||
|
|
||||||
// void ref() { foo(); }
|
// void ref() { foo(); }
|
||||||
|
@ -1092,7 +1109,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// func(&C::m1);
|
// func(&C::m1);
|
||||||
// func(&C::m2);
|
// func(&C::m2);
|
||||||
// }
|
// }
|
||||||
public void testAddressOfConstMethod_233889() throws Exception {
|
public void testAddressOfConstMethod_233889() {
|
||||||
IBinding fn1= getBindingFromASTName("func(&C::m1", 4, ICPPFunction.class);
|
IBinding fn1= getBindingFromASTName("func(&C::m1", 4, ICPPFunction.class);
|
||||||
IBinding fn2= getBindingFromASTName("func(&C::m2", 4, ICPPFunction.class);
|
IBinding fn2= getBindingFromASTName("func(&C::m2", 4, ICPPFunction.class);
|
||||||
assertNotSame(fn1, fn2);
|
assertNotSame(fn1, fn2);
|
||||||
|
@ -1364,7 +1381,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// void test() {
|
// void test() {
|
||||||
// a(1);
|
// a(1);
|
||||||
// }
|
// }
|
||||||
public void testLegalConflictWithUsingDeclaration() throws Exception {
|
public void testLegalConflictWithUsingDeclaration() {
|
||||||
getBindingFromASTName("a(1)", 1);
|
getBindingFromASTName("a(1)", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1386,7 +1403,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// E e;
|
// E e;
|
||||||
// foo(e);
|
// foo(e);
|
||||||
// }
|
// }
|
||||||
public void testUserDefinedConversionOperator_224364() throws Exception {
|
public void testUserDefinedConversionOperator_224364() {
|
||||||
IBinding ca= getBindingFromASTName("C c;", 1);
|
IBinding ca= getBindingFromASTName("C c;", 1);
|
||||||
assertInstance(ca, ICPPClassType.class);
|
assertInstance(ca, ICPPClassType.class);
|
||||||
|
|
||||||
|
@ -1407,7 +1424,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// void ref() {
|
// void ref() {
|
||||||
// a; b; c; e0; e2; e3; e4; e5;
|
// a; b; c; e0; e2; e3; e4; e5;
|
||||||
// }
|
// }
|
||||||
public void testValues() throws Exception {
|
public void testValues() {
|
||||||
IVariable v= (IVariable) getBindingFromASTName("a;", 1);
|
IVariable v= (IVariable) getBindingFromASTName("a;", 1);
|
||||||
asserValueEquals(v.getInitialValue(), -4);
|
asserValueEquals(v.getInitialValue(), -4);
|
||||||
v= (IVariable) getBindingFromASTName("b;", 1);
|
v= (IVariable) getBindingFromASTName("b;", 1);
|
||||||
|
@ -1433,7 +1450,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// using namespace ns1::ns2;
|
// using namespace ns1::ns2;
|
||||||
|
|
||||||
// A a;
|
// A a;
|
||||||
public void testUsingDirectiveWithQualifiedName_269727() throws Exception {
|
public void testUsingDirectiveWithQualifiedName_269727() {
|
||||||
getBindingFromASTName("A a", 1, ICPPClassType.class);
|
getBindingFromASTName("A a", 1, ICPPClassType.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,7 +1461,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// int a[1], b[2];
|
// int a[1], b[2];
|
||||||
// f(a); f(b);
|
// f(a); f(b);
|
||||||
// }
|
// }
|
||||||
public void testArrayTypeWithSize_269926() throws Exception {
|
public void testArrayTypeWithSize_269926() {
|
||||||
IFunction f1= getBindingFromASTName("f(a)", 1, IFunction.class);
|
IFunction f1= getBindingFromASTName("f(a)", 1, IFunction.class);
|
||||||
IFunction f2= getBindingFromASTName("f(b)", 1, IFunction.class);
|
IFunction f2= getBindingFromASTName("f(b)", 1, IFunction.class);
|
||||||
assertFalse(f1.equals(f2));
|
assertFalse(f1.equals(f2));
|
||||||
|
@ -1464,7 +1481,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// new B(0);
|
// new B(0);
|
||||||
// B::m(0);
|
// B::m(0);
|
||||||
// }
|
// }
|
||||||
public void testNestedClass_284665() throws Exception {
|
public void testNestedClass_284665() {
|
||||||
ICPPClassType b0 = getBindingFromASTName("B {", 1, ICPPClassType.class);
|
ICPPClassType b0 = getBindingFromASTName("B {", 1, ICPPClassType.class);
|
||||||
assertFalse(b0 instanceof IIndexBinding);
|
assertFalse(b0 instanceof IIndexBinding);
|
||||||
ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class);
|
ICPPConstructor b1 = getBindingFromASTName("B(int x)", 1, ICPPConstructor.class);
|
||||||
|
@ -1481,7 +1498,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// void test(A a) {
|
// void test(A a) {
|
||||||
// m(a);
|
// m(a);
|
||||||
// }
|
// }
|
||||||
public void testInlineFriendFunction_284690() throws Exception {
|
public void testInlineFriendFunction_284690() {
|
||||||
getBindingFromASTName("m(a)", 1, IFunction.class);
|
getBindingFromASTName("m(a)", 1, IFunction.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1518,7 +1535,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// g(a);
|
// g(a);
|
||||||
// gb(a);
|
// gb(a);
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980a() throws Exception {
|
public void testInlineNamespace_305980a() {
|
||||||
IFunction f= getBindingFromASTName("fa(s)", 2);
|
IFunction f= getBindingFromASTName("fa(s)", 2);
|
||||||
f= getBindingFromASTName("fb(s)", 2);
|
f= getBindingFromASTName("fb(s)", 2);
|
||||||
f= getBindingFromASTName("f(s)", 1);
|
f= getBindingFromASTName("f(s)", 1);
|
||||||
|
@ -1561,7 +1578,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// g(a);
|
// g(a);
|
||||||
// gb(a);
|
// gb(a);
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980am() throws Exception {
|
public void testInlineNamespace_305980am() {
|
||||||
IFunction f= getBindingFromASTName("fa(s)", 2);
|
IFunction f= getBindingFromASTName("fa(s)", 2);
|
||||||
f= getBindingFromASTName("fb(s)", 2);
|
f= getBindingFromASTName("fb(s)", 2);
|
||||||
f= getBindingFromASTName("f(s)", 1);
|
f= getBindingFromASTName("f(s)", 1);
|
||||||
|
@ -1579,7 +1596,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// ns::m::a; //1
|
// ns::m::a; //1
|
||||||
// ns::a; //2
|
// ns::a; //2
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980b() throws Exception {
|
public void testInlineNamespace_305980b() {
|
||||||
IVariable v1= getBindingFromASTName("a; //1", 1);
|
IVariable v1= getBindingFromASTName("a; //1", 1);
|
||||||
IVariable v2= getBindingFromASTName("a; //2", 1);
|
IVariable v2= getBindingFromASTName("a; //2", 1);
|
||||||
assertEquals(v1, v2);
|
assertEquals(v1, v2);
|
||||||
|
@ -1601,7 +1618,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// ns::m::a; //3
|
// ns::m::a; //3
|
||||||
// ns::a; //4
|
// ns::a; //4
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980bm() throws Exception {
|
public void testInlineNamespace_305980bm() {
|
||||||
IVariable v1= getBindingFromASTName("a; //1", 1);
|
IVariable v1= getBindingFromASTName("a; //1", 1);
|
||||||
IVariable v2= getBindingFromASTName("a; //2", 1);
|
IVariable v2= getBindingFromASTName("a; //2", 1);
|
||||||
IVariable v3= getBindingFromASTName("a; //3", 1);
|
IVariable v3= getBindingFromASTName("a; //3", 1);
|
||||||
|
@ -1629,7 +1646,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// ::f(1);
|
// ::f(1);
|
||||||
// ::g(1);
|
// ::g(1);
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980c() throws Exception {
|
public void testInlineNamespace_305980c() {
|
||||||
IFunction ref= getBindingFromASTName("f(1)", 1);
|
IFunction ref= getBindingFromASTName("f(1)", 1);
|
||||||
assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
|
assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
|
||||||
getBindingFromASTName("g(1)", 1);
|
getBindingFromASTName("g(1)", 1);
|
||||||
|
@ -1656,7 +1673,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// ::f(1);
|
// ::f(1);
|
||||||
// ::g(1);
|
// ::g(1);
|
||||||
// }
|
// }
|
||||||
public void testInlineNamespace_305980cm() throws Exception {
|
public void testInlineNamespace_305980cm() {
|
||||||
IFunction ref= getBindingFromASTName("f(1)", 1);
|
IFunction ref= getBindingFromASTName("f(1)", 1);
|
||||||
assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
|
assertEquals("void (char)", ASTTypeUtil.getType(ref.getType()));
|
||||||
getBindingFromASTName("g(1)", 1);
|
getBindingFromASTName("g(1)", 1);
|
||||||
|
@ -1669,7 +1686,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// namespace alias = ns;
|
// namespace alias = ns;
|
||||||
// void alias::fun() {
|
// void alias::fun() {
|
||||||
// }
|
// }
|
||||||
public void testNamespaceAliasAsQualifier_356493a() throws Exception {
|
public void testNamespaceAliasAsQualifier_356493a() {
|
||||||
IFunction ref= getBindingFromASTName("fun", 0);
|
IFunction ref= getBindingFromASTName("fun", 0);
|
||||||
assertEquals("ns", ref.getOwner().getName());
|
assertEquals("ns", ref.getOwner().getName());
|
||||||
}
|
}
|
||||||
|
@ -1681,7 +1698,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
|
|
||||||
// void alias::fun() {
|
// void alias::fun() {
|
||||||
// }
|
// }
|
||||||
public void testNamespaceAliasAsQualifier_356493b() throws Exception {
|
public void testNamespaceAliasAsQualifier_356493b() {
|
||||||
IFunction ref= getBindingFromASTName("fun", 0);
|
IFunction ref= getBindingFromASTName("fun", 0);
|
||||||
assertEquals("ns", ref.getOwner().getName());
|
assertEquals("ns", ref.getOwner().getName());
|
||||||
}
|
}
|
||||||
|
@ -1698,7 +1715,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// f(a);
|
// f(a);
|
||||||
// g(b);
|
// g(b);
|
||||||
// }
|
// }
|
||||||
public void testStructClassMismatch_358282() throws Exception {
|
public void testStructClassMismatch_358282() {
|
||||||
getBindingFromASTName("f(a)", 1, ICPPFunction.class);
|
getBindingFromASTName("f(a)", 1, ICPPFunction.class);
|
||||||
getBindingFromASTName("g(b)", 1, ICPPFunction.class);
|
getBindingFromASTName("g(b)", 1, ICPPFunction.class);
|
||||||
}
|
}
|
||||||
|
@ -1709,7 +1726,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// A a;
|
// A a;
|
||||||
public void testAnonymousNamespace() throws Exception {
|
public void testAnonymousNamespace() {
|
||||||
getBindingFromFirstIdentifier("A", ICPPClassType.class);
|
getBindingFromFirstIdentifier("A", ICPPClassType.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1732,7 +1749,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
public void testAnonymousNamespaces_392577() throws Exception {
|
public void testAnonymousNamespaces_392577() {
|
||||||
getBindingFromFirstIdentifier("f(str)", ICPPFunction.class);
|
getBindingFromFirstIdentifier("f(str)", ICPPFunction.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1745,7 +1762,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// using ::ns::INT;
|
// using ::ns::INT;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
public void testAnonymousNamespaces_418130() throws Exception {
|
public void testAnonymousNamespaces_418130() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
// struct A {
|
// struct A {
|
||||||
|
@ -1761,7 +1778,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// int test() {
|
// int test() {
|
||||||
// foo(1);
|
// foo(1);
|
||||||
// }
|
// }
|
||||||
public void testInheritedConstructor() throws Exception {
|
public void testInheritedConstructor() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1779,7 +1796,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// int test() {
|
// int test() {
|
||||||
// foo(1);
|
// foo(1);
|
||||||
// }
|
// }
|
||||||
public void testInheritedConstructorFromTemplateInstance() throws Exception {
|
public void testInheritedConstructorFromTemplateInstance() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1797,7 +1814,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// int test() {
|
// int test() {
|
||||||
// foo(1);
|
// foo(1);
|
||||||
// }
|
// }
|
||||||
public void testInheritedConstructorFromUnknownClass() throws Exception {
|
public void testInheritedConstructorFromUnknownClass() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1806,7 +1823,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// constexpr int waldo = foo();
|
// constexpr int waldo = foo();
|
||||||
public void testNameLookupInDefaultArgument_432701() throws Exception {
|
public void testNameLookupInDefaultArgument_432701() {
|
||||||
IVariable waldo = getBindingFromASTName("waldo", 5);
|
IVariable waldo = getBindingFromASTName("waldo", 5);
|
||||||
assertEquals(42, waldo.getInitialValue().numericalValue().longValue());
|
assertEquals(42, waldo.getInitialValue().numericalValue().longValue());
|
||||||
}
|
}
|
||||||
|
@ -1823,7 +1840,7 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// int z;
|
// int z;
|
||||||
public void testLambdaOwnedByClass_409882() throws Exception {
|
public void testLambdaOwnedByClass_409882() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1832,14 +1849,14 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
||||||
// };
|
// };
|
||||||
|
|
||||||
// // No code in this file.
|
// // No code in this file.
|
||||||
public void testLambdaOwnedByClass_449099() throws Exception {
|
public void testLambdaOwnedByClass_449099() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
|
|
||||||
// extern char TableValue[10];
|
// extern char TableValue[10];
|
||||||
|
|
||||||
// char TableValue[sizeof TableValue];
|
// char TableValue[sizeof TableValue];
|
||||||
public void testNameLookupFromArrayModifier_435075() throws Exception {
|
public void testNameLookupFromArrayModifier_435075() {
|
||||||
checkBindings();
|
checkBindings();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,8 +128,16 @@ class PDOMCLinkage extends PDOMLinkage implements IIndexCBindingConstants {
|
||||||
|
|
||||||
PDOMNode insertIntoIndex= null;
|
PDOMNode insertIntoIndex= null;
|
||||||
if (binding instanceof IField) { // must be before IVariable
|
if (binding instanceof IField) { // must be before IVariable
|
||||||
if (parent instanceof IPDOMMemberOwner)
|
if (parent instanceof IPDOMMemberOwner) {
|
||||||
pdomBinding = new PDOMCField(this, (IPDOMMemberOwner)parent, (IField) binding);
|
pdomBinding = new PDOMCField(this, (IPDOMMemberOwner)parent, (IField) binding);
|
||||||
|
// If the field is inside an anonymous struct or union, add it to the parent node as well.
|
||||||
|
if (parent instanceof ICompositeType && ((ICompositeType) parent).isAnonymous()) {
|
||||||
|
insertIntoIndex = parent.getParentNode();
|
||||||
|
if (insertIntoIndex == null) {
|
||||||
|
insertIntoIndex = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (binding instanceof IVariable) {
|
} else if (binding instanceof IVariable) {
|
||||||
IVariable var= (IVariable) binding;
|
IVariable var= (IVariable) binding;
|
||||||
pdomBinding = new PDOMCVariable(this, parent, var);
|
pdomBinding = new PDOMCVariable(this, parent, var);
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||||
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||||
|
@ -507,6 +508,13 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
|
||||||
} else if (binding instanceof ICPPField) {
|
} else if (binding instanceof ICPPField) {
|
||||||
if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) {
|
if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) {
|
||||||
pdomBinding = new PDOMCPPField(this, parent, (ICPPField) binding);
|
pdomBinding = new PDOMCPPField(this, parent, (ICPPField) binding);
|
||||||
|
// If the field is inside an anonymous struct or union, add it to the parent node as well.
|
||||||
|
if (((ICompositeType) parent).isAnonymous()) {
|
||||||
|
parent2 = parent.getParentNode();
|
||||||
|
if (parent2 == null) {
|
||||||
|
parent2 = this;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (binding instanceof ICPPClassTemplate) {
|
} else if (binding instanceof ICPPClassTemplate) {
|
||||||
pdomBinding= new PDOMCPPClassTemplate(this, parent, (ICPPClassTemplate) binding);
|
pdomBinding= new PDOMCPPClassTemplate(this, parent, (ICPPClassTemplate) binding);
|
||||||
|
|
Loading…
Add table
Reference in a new issue