From dcff673b3e21a27b9ed404f325a9d2fd3819a127 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Mon, 19 Feb 2007 08:42:34 +0000 Subject: [PATCH] Fix for Bug 72824 - [Content Assist] Content Assist erases code (Patch by Bryan Wilkinson) --- .../dom/parser/cpp/CPPASTQualifiedName.java | 53 +++++++++---------- .../core/dom/parser/cpp/CPPClassScope.java | 12 ++++- .../dom/parser/cpp/GNUCPPSourceParser.java | 2 +- .../core/pdom/dom/cpp/PDOMCPPClassType.java | 4 +- .../contentassist/ContentAssistTests.java | 4 +- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java index 38aae6ecf06..5528c43d242 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java @@ -21,12 +21,14 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.util.ArrayUtil; @@ -314,44 +316,41 @@ public class CPPASTQualifiedName extends CPPASTNode implements private IBinding[] findClassScopeBindings(ICPPClassType classType, char[] name, boolean isPrefix) { - List bindings = new ArrayList(); - - try { - IField[] fields = classType.getFields(); - for (int i = 0; i < fields.length; i++) { - if (fields[i].isStatic()) { - char[] potential = fields[i].getNameCharArray(); - if (nameMatches(potential, name, isPrefix)) { - bindings.add(fields[i]); - } - } - } - } catch (DOMException e) { - } - - try { - ICPPMethod[] methods = classType.getDeclaredMethods(); - for (int i = 0; i < methods.length; i++) { - char[] potential = methods[i].getNameCharArray(); - if (nameMatches(potential, name, isPrefix)) { - bindings.add(methods[i]); - } - } - } catch (DOMException e) { - } + List filtered = new ArrayList(); try { ICPPClassType[] nested = classType.getNestedClasses(); for (int i = 0; i < nested.length; i++) { char[] potential = nested[i].getNameCharArray(); if (nameMatches(potential, name, isPrefix)) { - bindings.add(nested[i]); + filtered.add(nested[i]); } } } catch (DOMException e) { } - return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + try { + IBinding[] bindings = classType.getCompositeScope().find(new String(name), isPrefix); + for (int i = 0; i < bindings.length; i++) { + if (bindings[i] instanceof ICPPMember) { + ICPPMember member = (ICPPMember) bindings[i]; + if (!classType.isSameType(member.getClassOwner())) continue; + + if (member instanceof IField) { + IField field = (IField) member; + if (!field.isStatic()) continue; + } else if (member instanceof ICPPMethod) { + ICPPMethod method = (ICPPMethod) member; + if (method.isImplicit()) continue; + } + } else if (!(bindings[i] instanceof IEnumerator)) continue; + + filtered.add(bindings[i]); + } + } catch(DOMException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); } private IBinding[] findNamespaceScopeBindings(ICPPNamespace namespace, diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java index a054eee5e9b..2caf32c34e6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java @@ -315,11 +315,19 @@ public class CPPClassScope extends CPPScope implements ICPPClassScope { IASTName [] ns = ((ICPPASTQualifiedName)compName).getNames(); compName = ns[ ns.length - 1 ]; } + + IBinding[] results = null; + if((prefixLookup && CharArrayUtils.equals(compName.toCharArray(), 0, n.length, n, false)) || (!prefixLookup && CharArrayUtils.equals(compName.toCharArray(), n))) { - return (IBinding[]) ArrayUtil.addAll( IBinding.class, null, getConstructors( bindings, true ) ); + results = (IBinding[]) ArrayUtil.addAll( IBinding.class, null, getConstructors( bindings, true ) ); + if (!prefixLookup) { + return results; + } } - return super.find( name, prefixLookup ); + + results = (IBinding[]) ArrayUtil.addAll( IBinding.class, results, super.find( name, prefixLookup )); + return results != null ? results : IBinding.EMPTY_BINDING_ARRAY; } public static boolean isConstructorReference( IASTName name ){ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 1800607c314..7790de72fc6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -3806,7 +3806,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { clause .setPropertyInParent(IASTInitializerList.NESTED_INITIALIZER); } - if (LT(1) == IToken.tRBRACE) + if (LT(1) == IToken.tRBRACE || LT(1) == IToken.tEOC) break; consume(IToken.tCOMMA); } 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 386a061606d..d3c2cd33466 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 @@ -9,6 +9,7 @@ * QNX - Initial API and implementation * Markus Schorn (Wind River Systems) * Andrew Ferguson (Symbian) + * Bryan Wilkinson (QNX) *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom.cpp; @@ -416,8 +417,7 @@ ICPPClassScope, IPDOMMemberOwner, IIndexType, IIndexScope { } public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof PDOMNamedNode && node instanceof IBinding - && !(node instanceof ICPPConstructor)) { + if (node instanceof PDOMNamedNode && node instanceof IBinding) { char[] n= ((PDOMNamedNode) node).getDBName().getChars(); if ((fPrefixLookup && CharArrayUtils.equals(n, 0, fName.length, fName, false)) || (!fPrefixLookup && CharArrayUtils.equals(n, fName))) { diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java index 5d331feb71b..c7e87dd0862 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/ContentAssistTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2006 IBM Corporation and others. + * Copyright (c) 2004, 2007 IBM Corporation 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 @@ -193,7 +193,7 @@ public class ContentAssistTests extends BaseUITestCase { assertEquals( "veryLongName : int", results[0].getDisplayString() ); //$NON-NLS-1$ } - public void _testBug72824() throws Exception { + public void testBug72824() throws Exception { StringWriter writer = new StringWriter(); writer.write( "class Strategy { \n"); //$NON-NLS-1$ writer.write( "public : \n"); //$NON-NLS-1$