diff options
4 files changed, 93 insertions, 75 deletions
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 4dbc48a3fee..3de57ae75c3 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 @@ -6423,16 +6423,16 @@ public class AST2CPPTests extends AST2TestBase { assertEquals(0, ors.length); ors= ClassTypeHelper.findOverridden(m2, null); assertEquals(1, ors.length); - assertSame(ors[0], m1); + assertEquals(ors[0], m1); ors= ClassTypeHelper.findOverridden(m3, null); assertEquals(0, ors.length); ors= ClassTypeHelper.findOverridden(m4, null); assertEquals(2, ors.length); - assertSame(ors[0], m2); - assertSame(ors[1], m1); + assertEquals(ors[0], m2); + assertEquals(ors[1], m1); ors= ClassTypeHelper.findOverridden(m5, null); assertEquals(1, ors.length); - assertSame(ors[0], m1); + assertEquals(ors[0], m1); } // struct A { diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java index fbd58de8e21..36ca0e34bd2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPBindingResolutionTest.java @@ -47,6 +47,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.core.runtime.CoreException; /** @@ -1859,4 +1860,85 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti public void testNameLookupFromArrayModifier_435075() { checkBindings(); } + + // class NonVirt { + // void m(); + // }; + // class C1 : NonVirt { + // virtual void m(); + // }; + // class C2 : C1 { + // void m(); + // }; + // class C3 : C2 { + // void m(int); + // }; + // class C4 : C3 { + // void m(); + // }; + // class C5 : C1 { + // void m(); + // }; + + // void test(NonVirt* n, C1* c1, C2* c2, C3* c3, C4* c4, C5* c5) { + // n->m();//0 + // c1->m();//1 + // c2->m();//2 + // c3->m(0);//3 + // c4->m();//4 + // c5->m();//5 + // } + public void testOverridden_248846() throws Exception { + ICPPMethod m0= getBindingFromFirstIdentifier("m();//0"); + ICPPMethod m1= getBindingFromFirstIdentifier("m();//1"); + ICPPMethod m2= getBindingFromFirstIdentifier("m();//2"); + ICPPMethod m3= getBindingFromFirstIdentifier("m(0);"); + ICPPMethod m4= getBindingFromFirstIdentifier("m();//4"); + ICPPMethod m5= getBindingFromFirstIdentifier("m();//5"); + + assertFalse(ClassTypeHelper.isVirtual(m0)); + assertFalse(ClassTypeHelper.isVirtual(m3)); + assertTrue(ClassTypeHelper.isVirtual(m1)); + assertTrue(ClassTypeHelper.isVirtual(m2)); + assertTrue(ClassTypeHelper.isVirtual(m4)); + assertTrue(ClassTypeHelper.isVirtual(m5)); + + assertFalse(ClassTypeHelper.isOverrider(m0, m0)); + assertFalse(ClassTypeHelper.isOverrider(m1, m0)); + assertFalse(ClassTypeHelper.isOverrider(m2, m0)); + assertFalse(ClassTypeHelper.isOverrider(m3, m0)); + assertFalse(ClassTypeHelper.isOverrider(m4, m0)); + assertFalse(ClassTypeHelper.isOverrider(m5, m0)); + + assertFalse(ClassTypeHelper.isOverrider(m0, m1)); + assertFalse(ClassTypeHelper.isOverrider(m1, m1)); + assertFalse(ClassTypeHelper.isOverrider(m3, m1)); + assertTrue(ClassTypeHelper.isOverrider(m2, m1)); + assertTrue(ClassTypeHelper.isOverrider(m4, m1)); + assertTrue(ClassTypeHelper.isOverrider(m5, m1)); + + assertFalse(ClassTypeHelper.isOverrider(m0, m2)); + assertFalse(ClassTypeHelper.isOverrider(m1, m2)); + assertFalse(ClassTypeHelper.isOverrider(m2, m2)); + assertFalse(ClassTypeHelper.isOverrider(m3, m2)); + assertFalse(ClassTypeHelper.isOverrider(m5, m2)); + assertTrue(ClassTypeHelper.isOverrider(m4, m2)); + + ICPPMethod[] ors= ClassTypeHelper.findOverridden(m0, null); + assertEquals(0, ors.length); + ors= ClassTypeHelper.findOverridden(m1, null); + assertEquals(0, ors.length); + ors= ClassTypeHelper.findOverridden(m2, null); + assertEquals(1, ors.length); + assertEquals(ors[0], m1); + ors= ClassTypeHelper.findOverridden(m3, null); + assertEquals(0, ors.length); + ors= ClassTypeHelper.findOverridden(m4, null); + assertEquals(2, ors.length); + assertEquals(ors[0], m2); + assertEquals(ors[1], m1); + ors= ClassTypeHelper.findOverridden(m5, null); + assertEquals(1, ors.length); + assertEquals(ors[0], m1); + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java index c304a918c14..f89437355a4 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/ASTManager.java @@ -38,11 +38,8 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; -import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; -import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; -import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition; import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; @@ -55,7 +52,6 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfndefStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; -import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; @@ -80,12 +76,10 @@ import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope; import org.eclipse.cdt.core.dom.ast.c.ICFunctionPrototypeScope; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.c.ICScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNameSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -110,8 +104,6 @@ import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.corext.util.CModelUtil; @@ -672,59 +664,6 @@ public class ASTManager implements IDisposable { return CVisitor.getContainingScope(name); } - public static int isVirtualMethod(ICPPMethod method) throws DOMException { - IASTDeclaration decl= null; - if (method instanceof CPPMethod) { - decl = ((CPPMethod) method).getPrimaryDeclaration(); - } else if (method instanceof CPPImplicitMethod) { - decl = ((CPPImplicitMethod) method).getPrimaryDeclaration(); - } - - IASTDeclSpecifier spec= null; - if (decl instanceof IASTFunctionDefinition) { - IASTFunctionDefinition def = (IASTFunctionDefinition) decl; - spec= def.getDeclSpecifier(); - } else if (decl instanceof IASTSimpleDeclaration) { - IASTSimpleDeclaration sdecl = (IASTSimpleDeclaration) decl; - spec= sdecl.getDeclSpecifier(); - } - if (spec instanceof ICPPASTDeclSpecifier) { - ICPPASTDeclSpecifier cppSpec = (ICPPASTDeclSpecifier) spec; - if (cppSpec.isVirtual()) { - return TRUE; - } - } - - IScope scope= method.getScope(); - if (scope instanceof ICPPClassScope) { - ICPPClassScope classScope = (ICPPClassScope) scope; - ICPPClassType classType= classScope.getClassType(); - ICPPBase[] bases= classType.getBases(); - for (ICPPBase base : bases) { - if (!(base.getBaseClass() instanceof ICPPClassType)) - continue; - ICPPClassType baseType= (ICPPClassType) base.getBaseClass(); - if (baseType != null) { - IScope baseScope= baseType.getCompositeScope(); - if (baseScope != null) { - IBinding[] alternates= baseScope.find(method.getName()); - for (IBinding binding : alternates) { - if (binding instanceof CPPMethod) { - CPPMethod alternateMethod = (CPPMethod) binding; - if (hasSameSignature(method, alternateMethod) != FALSE) { - if (isVirtualMethod(alternateMethod) == TRUE) { - return TRUE; - } - } - } - } - } - } - } - } - return FALSE; - } - public static boolean isLocalVariable(IVariable v, IScope scope) { if (v instanceof IParameter) { return false; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRefactoringArgument.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRefactoringArgument.java index 12d4c99d411..c56fad98f28 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRefactoringArgument.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/refactoring/rename/CRefactoringArgument.java @@ -1,18 +1,18 @@ /******************************************************************************* - * Copyright (c) 2004, 2010 Wind River Systems, Inc. and others. + * Copyright (c) 2004, 2015 Wind River Systems, Inc. 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: - * Markus Schorn - initial API and implementation + * Markus Schorn - initial API and implementation + * Sergey Prigogin (Google) ******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.rename; import org.eclipse.core.resources.IFile; -import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; @@ -34,6 +34,8 @@ import org.eclipse.cdt.core.model.ISourceRange; import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; + /** * Represents the input to a refactoring. Important are file and offset, the rest * can be calculated from the AST. @@ -126,13 +128,8 @@ public class CRefactoringArgument { IFunction func= (IFunction) binding; if (binding instanceof ICPPMethod) { ICPPMethod method= (ICPPMethod) binding; - int isVirtual= ASTManager.UNKNOWN; - try { - isVirtual = ASTManager.isVirtualMethod(method); - } catch (DOMException e) { - } - if (isVirtual == ASTManager.TRUE) { - fKind= CRefactory.ARGUMENT_VIRTUAL_METHOD; + if (ClassTypeHelper.isVirtual(method)) { + fKind= CRefactory.ARGUMENT_VIRTUAL_METHOD; } } else { boolean isStatic= false; |