diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 00cb7c33a1d..94fc0824ce5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -10266,4 +10266,56 @@ public class AST2CPPTests extends AST2TestBase { assertEquals(NamespaceNS.getNamespaceScope(), Inner.getScope()); } + + // class AClass { + // int defaultMemberVariable; + // void defaultMemberFunction(); + // class defaultNestedClass {}; + // public: + // int publicMemberVariable; + // void publicMemberFunction(); + // class publicNestedClass {}; + // protected: + // int protectedMemberVariable; + // void protectedMemberFunction(); + // class protectedNestedClass {}; + // private: + // int privateMemberVariable; + // void privateMemberFunction(); + // class privateNestedClass {}; + // }; + public void testMemberAccessibilities() throws Exception { + String code = getAboveComment(); + BindingAssertionHelper bh = new BindingAssertionHelper(code, true); + + ICPPClassType aClass = bh.assertNonProblem("AClass", 6); + + ICPPField defaultMemberVariable = bh.assertNonProblem("defaultMemberVariable", 21); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(defaultMemberVariable)); + ICPPMethod defaultMemberFunction = bh.assertNonProblem("defaultMemberFunction", 21); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(defaultMemberFunction)); + ICPPClassType defaultNestedClass = bh.assertNonProblem("defaultNestedClass", 18); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(defaultNestedClass)); + + ICPPField publicMemberVariable = bh.assertNonProblem("publicMemberVariable", 20); + assertAccessibility(ICPPClassType.a_public, aClass.getAccessibility(publicMemberVariable)); + ICPPMethod publicMemberFunction = bh.assertNonProblem("publicMemberFunction", 20); + assertAccessibility(ICPPClassType.a_public, aClass.getAccessibility(publicMemberFunction)); + ICPPClassType publicNestedClass = bh.assertNonProblem("publicNestedClass", 17); + assertAccessibility(ICPPClassType.a_public, aClass.getAccessibility(publicNestedClass)); + + ICPPField protectedMemberVariable = bh.assertNonProblem("protectedMemberVariable", 23); + assertAccessibility(ICPPClassType.a_protected, aClass.getAccessibility(protectedMemberVariable)); + ICPPMethod protectedMemberFunction = bh.assertNonProblem("protectedMemberFunction", 23); + assertAccessibility(ICPPClassType.a_protected, aClass.getAccessibility(protectedMemberFunction)); + ICPPClassType protectedNestedClass = bh.assertNonProblem("protectedNestedClass", 20); + assertAccessibility(ICPPClassType.a_protected, aClass.getAccessibility(protectedNestedClass)); + + ICPPField privateMemberVariable = bh.assertNonProblem("privateMemberVariable", 21); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(privateMemberVariable)); + ICPPMethod privateMemberFunction = bh.assertNonProblem("privateMemberFunction", 21); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(privateMemberFunction)); + ICPPClassType privateNestedClass = bh.assertNonProblem("privateNestedClass", 18); + assertAccessibility(ICPPClassType.a_private, aClass.getAccessibility(privateNestedClass)); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 54fd097093f..858f7b62782 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -7610,4 +7610,67 @@ public class AST2TemplateTests extends AST2TestBase { public void testTemplateBaseClassConstructorCall_402602() throws Exception { parseAndCheckBindings(); } + + // template + // class ATemplate { + // int defaultMemberVariable; + // public: + // int publicMemberVariable; + // protected: + // int protectedMemberVariable; + // private: + // int privateMemberVariable; + // }; + public void testTemplateMemberAccessibilities() throws Exception { + String code = getAboveComment(); + BindingAssertionHelper bh = new BindingAssertionHelper(code, true); + + ICPPClassTemplate aTemplate = bh.assertNonProblem("ATemplate", 9); + + ICPPField defaultMemberVariable = bh.assertNonProblem("defaultMemberVariable", 21); + assertAccessibility(ICPPClassType.a_private, aTemplate.getAccessibility(defaultMemberVariable)); + + ICPPField publicMemberVariable = bh.assertNonProblem("publicMemberVariable", 20); + assertAccessibility(ICPPClassType.a_public, aTemplate.getAccessibility(publicMemberVariable)); + + ICPPField protectedMemberVariable = bh.assertNonProblem("protectedMemberVariable", 23); + assertAccessibility(ICPPClassType.a_protected, aTemplate.getAccessibility(protectedMemberVariable)); + + ICPPField privateMemberVariable = bh.assertNonProblem("privateMemberVariable", 21); + assertAccessibility(ICPPClassType.a_private, aTemplate.getAccessibility(privateMemberVariable)); + } + + // template + // class ATemplate {}; + // + // class A{}; + // + // template<> + // class ATemplate { + // int specializedDefaultVariable; + // public: + // int specializedPublicVariable; + // protected: + // int specializedProtectedVariable; + // private: + // int specializedPrivateVariable; + // }; + public void testTemplateSpecializationMemberAccessibilities() throws Exception { + String code = getAboveComment(); + BindingAssertionHelper bh = new BindingAssertionHelper(code, true); + + ICPPClassSpecialization aTemplateSpecialization = bh.assertNonProblem("ATemplate", 12); + + ICPPField defaultMemberVariable = bh.assertNonProblem("specializedDefaultVariable", 26); + assertAccessibility(ICPPClassType.a_private, aTemplateSpecialization.getAccessibility(defaultMemberVariable)); + + ICPPField publicMemberVariable = bh.assertNonProblem("specializedPublicVariable", 25); + assertAccessibility(ICPPClassType.a_public, aTemplateSpecialization.getAccessibility(publicMemberVariable)); + + ICPPField protectedMemberVariable = bh.assertNonProblem("specializedProtectedVariable", 28); + assertAccessibility(ICPPClassType.a_protected, aTemplateSpecialization.getAccessibility(protectedMemberVariable)); + + ICPPField privateMemberVariable = bh.assertNonProblem("specializedPrivateVariable", 26); + assertAccessibility(ICPPClassType.a_private, aTemplateSpecialization.getAccessibility(privateMemberVariable)); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java index fa6c2a07227..f36628312e6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TestBase.java @@ -62,6 +62,7 @@ import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration; @@ -865,4 +866,26 @@ public class AST2TestBase extends BaseTestCase { assertInstance(stmt, IASTExpressionStatement.class); return (T) ((IASTExpressionStatement) stmt).getExpression(); } + + protected void assertAccessibility(int expected, int actual) { + String expectedAccessibility = accessibilityName(expected); + String actualAccessibility = accessibilityName(actual); + String message = "Expected access specifier:<" + expectedAccessibility + "> but was:<" + actualAccessibility + "> -"; + assertEquals(message, expected, actual); + } + + private String accessibilityName(int expected) { + switch(expected){ + case ICPPClassType.a_private: + return "private"; + case ICPPClassType.a_protected: + return "protected"; + case ICPPClassType.a_public: + return "public"; + case ICPPClassType.a_unspecified: + return "unspecified"; + default: + return "illegal access specifier"; + } + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java index dbe1cf3855f..2c9b5ed19fd 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/CPPFieldTests.java @@ -79,19 +79,19 @@ public class CPPFieldTests extends PDOMTestBase { } public void testDefaultPrivateField() throws Exception { - assertVisibility(pdom, "Class1::defaultField", ICPPMember.v_private); + assertAccessibility(pdom, "Class1::defaultField", ICPPMember.v_private); } public void testPrivateField() throws Exception { - assertVisibility(pdom, "Class1::privateField", ICPPMember.v_private); + assertAccessibility(pdom, "Class1::privateField", ICPPMember.v_private); } public void testProtectedField() throws Exception { - assertVisibility(pdom, "Class1::protectedField", ICPPMember.v_protected); + assertAccessibility(pdom, "Class1::protectedField", ICPPMember.v_protected); } public void testPublicField() throws Exception { - assertVisibility(pdom, "Class1::publicField", ICPPMember.v_public); + assertAccessibility(pdom, "Class1::publicField", ICPPMember.v_public); } public void testMutableField() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java index e47de9c7eaa..14aede08bd6 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/MethodTests.java @@ -163,19 +163,19 @@ public class MethodTests extends PDOMTestBase { } public void testDefaultPrivateMethod() throws Exception { - assertVisibility(pdom, "Class3::defaultMethod", ICPPMember.v_private); + assertAccessibility(pdom, "Class3::defaultMethod", ICPPMember.v_private); } public void testPrivateMethod() throws Exception { - assertVisibility(pdom, "Class3::privateMethod", ICPPMember.v_private); + assertAccessibility(pdom, "Class3::privateMethod", ICPPMember.v_private); } public void testProtectedMethod() throws Exception { - assertVisibility(pdom, "Class3::protectedMethod", ICPPMember.v_protected); + assertAccessibility(pdom, "Class3::protectedMethod", ICPPMember.v_protected); } public void testPublicMethod() throws Exception { - assertVisibility(pdom, "Class3::publicMethod", ICPPMember.v_public); + assertAccessibility(pdom, "Class3::publicMethod", ICPPMember.v_public); } public void testInlineMethod() throws Exception { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java index 26cce84ea6c..83a6c3f293d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTestBase.java @@ -202,11 +202,11 @@ public class PDOMTestBase extends BaseTestCase { assertTrue(c.isAssignableFrom(bindings[0].getClass())); } - protected void assertVisibility(PDOM pdom, String name, int visibility) throws CoreException, DOMException { + protected void assertAccessibility(PDOM pdom, String name, int accessibility) throws CoreException, DOMException { IBinding[] bindings = findQualifiedName(pdom, name); assertEquals(1, bindings.length); ICPPMember member = (ICPPMember) bindings[0]; - assertEquals(visibility, member.getVisibility()); + assertEquals(accessibility, member.getVisibility()); } public static final void assertFunctionRefCount(PDOM pdom, Class[] args, IBinding[] bindingPool, int refCount) throws CoreException { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java index 3640bbe7339..f2c92db17b5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMTests.java @@ -50,6 +50,7 @@ public class PDOMTests extends TestSuite { suite.addTest(CPPFunctionTemplateTests.suite()); suite.addTest(MethodTests.suite()); suite.addTest(NamespaceTests.suite()); + suite.addTest(AccessibilityTests.suite()); suite.addTest(CFunctionTests.suite()); suite.addTest(CVariableTests.suite()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassType.java index 6001441179a..96ade2b73f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPClassType.java @@ -11,6 +11,9 @@ ******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; +import java.util.HashMap; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IField; @@ -24,6 +27,26 @@ import org.eclipse.cdt.core.dom.ast.IField; public interface ICPPClassType extends ICompositeType, ICPPBinding { public static final ICPPClassType[] EMPTY_CLASS_ARRAY = {}; public static final int k_class = ICPPASTCompositeTypeSpecifier.k_class; + /** + * @since 5.5 + */ + public static final Map EMPTY_ACCESSIBILITY_MAP = new HashMap(); + /** + * @since 5.5 + */ + public static final int a_unspecified = 0; + /** + * @since 5.5 + */ + public static final int a_public = 1; + /** + * @since 5.5 + */ + public static final int a_protected = 2; + /** + * @since 5.5 + */ + public static final int a_private = 3; /** * Returns an array of base class relationships. The returned array is empty if there @@ -107,4 +130,27 @@ public interface ICPPClassType extends ICompositeType, ICPPBinding { * @since 5.5 */ public boolean isFinal(); + + /** + * Gets the access specifier of the member. + * + * @param member The binding of the member to get the accessibility for. + * + * @return Returns the accessibility of the specified member. If + * member is not a member of this type ICPPClassType.v_unspecified + * is returned. + * + * @since 5.5 + */ + public int getAccessibility(IBinding member); + + /** + * Gets the access specifiers of all the class members. + * + * @return Returns a map of all the class members to their corresponding + * accessibility. + * + * @since 5.5 + */ + public Map getMemberAccessibilities(); } 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 6aa3c0be5c7..c475335fc32 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 @@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import java.util.HashSet; +import java.util.Map; import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; @@ -447,4 +448,18 @@ public class CPPClassSpecialization extends CPPSpecialization } return false; } + + @Override + public int getAccessibility(IBinding member) { + Map memberAccessibilities = ClassTypeHelper.getMemberAccessibilities(this); + if(memberAccessibilities.containsKey(member)){ + return memberAccessibilities.get(member); + } + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return ClassTypeHelper.getMemberAccessibilities(this); + } } 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 aab5db64108..c9d9c612926 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 @@ -14,6 +14,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -254,4 +256,18 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements ICPPClass } return false; } + + @Override + public int getAccessibility(IBinding member) { + Map memberAccessibilities = ClassTypeHelper.getMemberAccessibilities(this); + if(memberAccessibilities.containsKey(member)){ + return memberAccessibilities.get(member); + } + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return ClassTypeHelper.getMemberAccessibilities(this); + } } 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 d5cee05e031..153a6730f28 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 @@ -14,6 +14,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; @@ -109,6 +111,14 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp public boolean isFinal() { return false; } + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } } private IASTName definition; @@ -412,4 +422,18 @@ public class CPPClassType extends PlatformObject implements ICPPInternalClassTyp } return name; } + + @Override + public int getAccessibility(IBinding member) { + Map memberAccessibilities = ClassTypeHelper.getMemberAccessibilities(this); + if(memberAccessibilities.containsKey(member)){ + return memberAccessibilities.get(member); + } + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return ClassTypeHelper.getMemberAccessibilities(this); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java index 979cc8fd7b3..4fd027a65f2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClosureType.java @@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IName; @@ -344,6 +345,16 @@ public class CPPClosureType extends PlatformObject implements ICPPClassType, ICP return false; } + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } + private final class ClassScope implements ICPPClassScope { @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index 605f88708d9..6b2659e7a6a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -12,6 +12,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -246,4 +248,14 @@ public class CPPDeferredClassInstance extends CPPUnknownBinding implements ICPPD } return new PDOMCPPDeferredClassInstance(fragment, (ICPPClassTemplate) template, args); } + + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } } 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 88d0455d02b..f645baf81f0 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 @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; @@ -246,4 +248,14 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement public boolean isFinal() { return false; } + + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java index 51231b0fa12..087df5cda2d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; @@ -133,4 +135,14 @@ public class CPPUnknownMemberClass extends CPPUnknownMember implements ICPPUnkno public boolean isFinal() { return false; } + + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 615bb1a3eb8..79a90c692e6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -47,6 +47,7 @@ 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.ICPPASTTemplateDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -882,6 +883,58 @@ public class ClassTypeHelper { return resultArray; } + + /** + * Collects the accessibility specifiers for the declarations in a class. + * + * @param host The class to get the members accessibility specifiers of. + * @return A map containing all members of the class and their corresponding accessibility. + */ + public static Map getMemberAccessibilities(ICPPInternalClassTypeMixinHost host) { + if (host.getDefinition() == null) { + host.checkForDefinition(); + if (host.getDefinition() == null) { + ICPPClassType backup = getBackupDefinition(host); + if (backup != null) { + return backup.getMemberAccessibilities(); + } + return new HashMap(); + } + } + + Map accessibilities = new HashMap(); + int accessibility = host.getKey() == ICPPClassType.k_class ? ICPPClassType.a_private + : ICPPClassType.a_public; + + IASTDeclaration[] members = host.getCompositeTypeSpecifier().getMembers(); + for (IASTDeclaration member : members) { + if (member instanceof ICPPASTVisibilityLabel) { + accessibility = ((ICPPASTVisibilityLabel) member).getVisibility(); + } + if (member instanceof IASTSimpleDeclaration) { + IASTSimpleDeclaration memberDeclaration = (IASTSimpleDeclaration) member; + for (IASTDeclarator memberDeclarator : memberDeclaration.getDeclarators()) { + IBinding memberBinding = ASTQueries.findInnermostDeclarator(memberDeclarator) + .getName().resolveBinding(); + accessibilities.put(memberBinding, accessibility); + } + + IASTDeclSpecifier declSpec = memberDeclaration.getDeclSpecifier(); + if (declSpec instanceof ICPPASTCompositeTypeSpecifier) { + IBinding memberBinding = ((ICPPASTCompositeTypeSpecifier) declSpec).getName() + .resolveBinding(); + accessibilities.put(memberBinding, accessibility); + } else if (declSpec instanceof ICPPASTElaboratedTypeSpecifier + && memberDeclaration.getDeclarators().length == 0) { + IBinding memberBinding = ((ICPPASTElaboratedTypeSpecifier) declSpec).getName() + .resolveBinding(); + accessibilities.put(memberBinding, accessibility); + } + } + } + return accessibilities; + } + private static Map> collectPureVirtualMethods(ICPPClassType classType, Map>> cache, IASTNode point) { Map> result = cache.get(classType); 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 ed9cb9031c8..3aa2669d241 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 @@ -17,6 +17,7 @@ import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUti import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getNestedType; import java.util.Arrays; +import java.util.Map; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -215,4 +216,14 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType public boolean isFinal() { return ((ICPPClassType) rbinding).isFinal(); } + + @Override + public int getAccessibility(IBinding member) { + return ((ICPPClassType) rbinding).getAccessibility(member); + } + + @Override + public Map getMemberAccessibilities() { + return ((ICPPClassType) rbinding).getMemberAccessibilities(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTemplateParameter.java index 6bc1614d334..3b96e27565e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTemplateParameter.java @@ -12,6 +12,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite.cpp; +import java.util.Map; + import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IField; @@ -179,4 +181,14 @@ public class CompositeCPPTemplateTemplateParameter extends CompositeCPPBinding public boolean isFinal() { return false; } + + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } } 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 0ea282443f2..2fdfd41cf9e 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 @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; +import java.util.Map; + import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; @@ -621,6 +623,16 @@ public class PDOMASTAdapter { public boolean isFinal() { return false; } + + @Override + public int getAccessibility(IBinding member) { + return ((ICPPClassType) fDelegate).getAccessibility(member); + } + + @Override + public Map getMemberAccessibilities() { + return ((ICPPClassType) fDelegate).getMemberAccessibilities(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPClassType.java index 6767e35d127..34cfd6b8dbb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/IPDOMCPPClassType.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.index.IIndexName; @@ -33,4 +34,11 @@ public interface IPDOMCPPClassType extends ICPPClassType, IPDOMBinding, IIndexTy * Returns the scope name, for use in {@link IScope#getScopeName()} */ IIndexName getScopeName(); + + /** + * Sets the accessibility specifier of a given member. + * @param member The binding specifying the member. + * @param accessibility The accessibility of the member. + */ + void setAccessibility(IBinding member, int accessibility); } 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 70207f3a2ff..a6cde2b9d68 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 @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.eclipse.cdt.core.CCorePlugin; @@ -43,7 +44,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; @@ -57,14 +57,14 @@ import org.eclipse.core.runtime.CoreException; class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements ICPPClassSpecialization, IPDOMMemberOwner, IPDOMCPPClassType { private static final int FIRST_BASE = PDOMCPPSpecialization.RECORD_SIZE + 0; - private static final int MEMBER_LIST = PDOMCPPSpecialization.RECORD_SIZE + 4; - private static final int FINAL = PDOMCPPSpecialization.RECORD_SIZE + 8; // byte + private static final int MEMBERLIST = FIRST_BASE + 4; + private static final int FINAL = MEMBERLIST + PDOMCPPMemberBlock.RECORD_SIZE; // byte /** * The size in bytes of a PDOMCPPClassSpecialization record in the database. */ @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 9; + protected static final int RECORD_SIZE = FINAL + 1; private volatile ICPPClassScope fScope; private ObjectMap specializationMap; // Obtained from the synchronized PDOM cache @@ -442,14 +442,14 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements @Override public void addChild(PDOMNode member) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + MEMBER_LIST); - list.addMember(member); + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + members.addMember(member); } @Override public void acceptUncached(IPDOMVisitor visitor) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + MEMBER_LIST); - list.accept(visitor); + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + members.accept(visitor); } @Override @@ -475,4 +475,36 @@ class PDOMCPPClassSpecialization extends PDOMCPPSpecialization implements private void setFinal(ICPPClassType ct) throws CoreException { getDB().putByte(record + FINAL, (byte) (ct.isFinal() ? 1 : 0)); } + + @Override + public void setAccessibility(IBinding member, int accessibility) { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + members.setAccessibility(member, accessibility); + } catch(CoreException e) { + CCorePlugin.log(e); + } + } + + @Override + public int getAccessibility(IBinding member) { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + return members.getAccessibility(member); + } catch(CoreException e) { + CCorePlugin.log(e); + return ICPPClassType.a_unspecified; + } + } + + @Override + public Map getMemberAccessibilities() { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + return members.getAccessibilities(); + } catch(CoreException e) { + CCorePlugin.log(e); + return EMPTY_ACCESSIBILITY_MAP; + } + } } 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 e9779d0127f..200da907712 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 @@ -15,6 +15,11 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; @@ -35,29 +40,24 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; -import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * @author Doug Schaefer */ 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 FIRSTFRIEND = PDOMCPPBinding.RECORD_SIZE + 8; - private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 12; // byte - private static final int ANONYMOUS= PDOMCPPBinding.RECORD_SIZE + 13; // byte - private static final int FINAL = PDOMCPPBinding.RECORD_SIZE + 14; // byte + private static final int FIRSTBASE = PDOMCPPBinding.RECORD_SIZE; + private static final int MEMBERLIST = FIRSTBASE + 4; + private static final int FIRSTFRIEND = MEMBERLIST + PDOMCPPMemberBlock.RECORD_SIZE; + private static final int KEY = FIRSTFRIEND + 4; // byte + private static final int ANONYMOUS = KEY + 1; // byte + private static final int FINAL = ANONYMOUS + 1; // byte @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 15; + protected static final int RECORD_SIZE = FINAL + 1; private PDOMCPPClassScope fScope; // No need for volatile, all fields of PDOMCPPClassScope are final. @@ -111,14 +111,14 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO public boolean mayHaveChildren() { return true; } - + @Override public final void addChild(PDOMNode member) throws CoreException { - PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + MEMBERLIST); - list.addMember(member); + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + members.addMember(member); PDOMCPPClassScope.updateCache(this, member); } - + @Override public void accept(IPDOMVisitor visitor) throws CoreException { PDOMCPPClassScope.acceptViaCache(this, visitor, false); @@ -130,7 +130,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO @Override public void acceptUncached(IPDOMVisitor visitor) throws CoreException { super.accept(visitor); - PDOMNodeLinkedList list = new PDOMNodeLinkedList(getLinkage(), record + MEMBERLIST); + PDOMCPPMemberBlock list = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); list.accept(visitor); } @@ -143,7 +143,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO long rec = base != null ? base.getRecord() : 0; getDB().putRecPtr(record + FIRSTBASE, rec); } - + public void addBases(PDOMName classDefName, ICPPBase[] bases) throws CoreException { getPDOM().removeCachedResult(record + PDOMCPPLinkage.CACHE_BASES); final PDOMLinkage linkage = getLinkage(); @@ -192,7 +192,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO } } } - + public void addFriend(PDOMCPPFriend friend) throws CoreException { PDOMCPPFriend firstFriend = getFirstFriend(); friend.setNextFriend(firstFriend); @@ -255,7 +255,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO return getDB().getByte(record + ANONYMOUS) != 0; } catch (CoreException e) { CCorePlugin.log(e); - return false; + return false; } } @@ -263,7 +263,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO public boolean isFinal() { try { return getDB().getByte(record + FINAL) != 0; - } catch (CoreException e){ + } catch (CoreException e) { CCorePlugin.log(e); return false; } @@ -309,7 +309,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO ICPPBase[] bases= (ICPPBase[]) getPDOM().getCachedResult(key); if (bases != null) return bases; - + try { List list = new ArrayList(); for (PDOMCPPBase base = getFirstBase(); base != null; base = base.getNextBase()) @@ -388,7 +388,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO } @Override - public ICPPMethod[] getMethods() { + public ICPPMethod[] getMethods() { return ClassTypeHelper.getMethods(this, null); } @@ -396,23 +396,55 @@ class PDOMCPPClassType extends PDOMCPPBinding implements IPDOMCPPClassType, IPDO public ICPPMethod[] getAllDeclaredMethods() { return ClassTypeHelper.getAllDeclaredMethods(this, null); } - + @Override public IField[] getFields() { return ClassTypeHelper.getFields(this, null); } - + @Override public IField findField(String name) { return ClassTypeHelper.findField(this, name); } @Override - public Object clone() { + public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { } return null; } + + @Override + public void setAccessibility(IBinding member, int visibility) { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + members.setAccessibility(member, visibility); + } catch(CoreException e) { + CCorePlugin.log(e); + } + } + + @Override + public int getAccessibility(IBinding member) { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + return members.getAccessibility(member); + } catch(CoreException e) { + CCorePlugin.log(e); + return ICPPClassType.a_unspecified; + } + } + + @Override + public Map getMemberAccessibilities() { + try { + PDOMCPPMemberBlock members = new PDOMCPPMemberBlock(getLinkage(), record + MEMBERLIST); + return members.getAccessibilities(); + } catch(CoreException e) { + CCorePlugin.log(e); + return EMPTY_ACCESSIBILITY_MAP; + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 0f1c7b116a1..526cd829198 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -361,7 +361,12 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { if (inputBinding instanceof CPPClosureType) { addImplicitMethods(pdomBinding, (ICPPClassType) binding, fromName); } - + else if (parent instanceof IPDOMCPPClassType) { + IBinding bindingOwner = binding.getOwner(); + if(bindingOwner instanceof ICPPClassType){ + ((IPDOMCPPClassType) parent).setAccessibility(pdomBinding, ((ICPPClassType) bindingOwner).getAccessibility(binding)); + } + } // Synchronize the tags associated with the persistent binding to match // the set that is associated with the input binding. TagManager.getInstance().syncTags(pdomBinding, inputBinding); @@ -573,6 +578,9 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { PDOMBinding pdomBinding= adaptBinding(method); if (pdomBinding == null) { pdomBinding = createBinding(type, method, fileLocalRec); + if (type instanceof IPDOMCPPClassType) { + ((IPDOMCPPClassType) type).setAccessibility(pdomBinding, ICPPClassType.a_public); + } } else if (!getPDOM().hasLastingDefinition(pdomBinding)) { pdomBinding.update(this, method); old.remove(pdomBinding); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java index 8f4ab194471..aebf6908fc1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTemplateParameter.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.Map; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -365,4 +367,14 @@ public class PDOMCPPTemplateTemplateParameter extends PDOMCPPBinding public ICPPDeferredClassInstance asDeferredInstance() { return null; } + + @Override + public int getAccessibility(IBinding member) { + return a_unspecified; + } + + @Override + public Map getMemberAccessibilities() { + return EMPTY_ACCESSIBILITY_MAP; + } }