Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] [FIXED][78231][Parser] open declaration on elaborated type shouldn't jump to object hiding it


[FIXED][78231][Parser] open declaration on elaborated type shouldn't jump to object hiding it

Devin Steffler
IBM's Eclipse CDT
Ottawa (Palladium), Ontario, Canada


Index: parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java,v
retrieving revision 1.33
diff -u -r1.33 SelectionParseTest.java
--- parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java	18 Nov 2004 16:52:01 -0000	1.33
+++ parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java	24 Nov 2004 15:13:49 -0000
@@ -20,6 +20,7 @@
 import org.eclipse.cdt.core.parser.ast.IASTMethod;
 import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
 import org.eclipse.cdt.core.parser.ast.IASTNode;
+import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
 import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
 import org.eclipse.cdt.core.parser.ast.IASTVariable;
 import org.eclipse.cdt.internal.core.parser.ast.complete.ASTNamespaceDefinition;
@@ -705,5 +706,37 @@
 		assertEquals( n.getStartingLine(), 2 );
 	}
 
+	public void testBug78231A() throws Exception {
+		Writer writer = new StringWriter();
+		writer.write("struct Base {\n"); //$NON-NLS-1$
+		writer.write("int Data; // 1\n"); //$NON-NLS-1$
+		writer.write("struct Data; // 2\n};\n"); //$NON-NLS-1$
+		
+		String code = writer.toString();
+		int index = code.indexOf("struct Data;") + 7; //$NON-NLS-1$
+		IASTNode node = parse( code, index, index + 4 );
+		assertTrue(node instanceof IASTOffsetableNamedElement);
+		IASTOffsetableNamedElement n = (IASTOffsetableNamedElement)node;
+		assertEquals(n.getName(), "Data"); //$NON-NLS-1$
+		assertEquals(n.getNameOffset(), 36);
+		assertEquals(n.getStartingLine(), 3);
+	}
+	
+	public void testBug78231B() throws Exception {
+		Writer writer = new StringWriter();
+		writer.write("int Data;\n"); //$NON-NLS-1$
+		writer.write("struct Base {\n"); //$NON-NLS-1$
+		writer.write("int Data; // 1\n"); //$NON-NLS-1$
+		writer.write("struct Data; // 2\n};\n"); //$NON-NLS-1$
+		
+		String code = writer.toString();
+		int index = code.indexOf("struct Data;") + 7; //$NON-NLS-1$
+		IASTNode node = parse( code, index, index + 4 );
+		assertTrue(node instanceof IASTOffsetableNamedElement);
+		IASTOffsetableNamedElement n = (IASTOffsetableNamedElement)node;
+		assertEquals(n.getName(), "Data"); //$NON-NLS-1$
+		assertEquals(n.getNameOffset(), 46);
+		assertEquals(n.getStartingLine(), 4);
+	}
 }
 
Index: parser/org/eclipse/cdt/core/parser/ast/IASTAbstractTypeSpecifierDeclaration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ast/IASTAbstractTypeSpecifierDeclaration.java,v
retrieving revision 1.2
diff -u -r1.2 IASTAbstractTypeSpecifierDeclaration.java
--- parser/org/eclipse/cdt/core/parser/ast/IASTAbstractTypeSpecifierDeclaration.java	14 Apr 2004 20:43:00 -0000	1.2
+++ parser/org/eclipse/cdt/core/parser/ast/IASTAbstractTypeSpecifierDeclaration.java	24 Nov 2004 15:04:23 -0000
@@ -15,7 +15,7 @@
  *
  */
 public interface IASTAbstractTypeSpecifierDeclaration
-    extends IASTDeclaration, IASTTypeSpecifierOwner, IASTTemplatedDeclaration, IASTOffsetableElement
+    extends IASTDeclaration, IASTTypeSpecifierOwner, IASTTemplatedDeclaration, IASTOffsetableNamedElement
 {
 	public boolean isFriendDeclaration();
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTAbstractTypeSpecifierDeclaration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTAbstractTypeSpecifierDeclaration.java,v
retrieving revision 1.12
diff -u -r1.12 ASTAbstractTypeSpecifierDeclaration.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTAbstractTypeSpecifierDeclaration.java	7 Sep 2004 18:56:38 -0000	1.12
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTAbstractTypeSpecifierDeclaration.java	24 Nov 2004 15:04:23 -0000
@@ -12,6 +12,7 @@
 
 import org.eclipse.cdt.core.parser.ISourceElementRequestor;
 import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
+import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
 import org.eclipse.cdt.core.parser.ast.IASTTemplate;
 import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
 import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
@@ -151,5 +152,67 @@
 	 */
 	public char[] getFilename() {
 		return fn;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getName()
+	 */
+	public String getName() {
+		if (typeSpec instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpec).getName();
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameCharArray()
+	 */
+	public char[] getNameCharArray() {
+		if (typeSpec instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpec).getNameCharArray();
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameOffset()
+	 */
+	public int getNameOffset() {
+		if (typeSpec instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpec).getNameOffset();
+		
+		return 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameOffset(int)
+	 */
+	public void setNameOffset(int o) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameEndOffset()
+	 */
+	public int getNameEndOffset() {
+		if (typeSpec instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpec).getNameEndOffset();
+		
+		return 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameEndOffsetAndLineNumber(int, int)
+	 */
+	public void setNameEndOffsetAndLineNumber(int offset, int lineNumber) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameLineNumber()
+	 */
+	public int getNameLineNumber() {
+		if (typeSpec instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpec).getNameLineNumber();
+		
+		return 0;
 	}
 }
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java,v
retrieving revision 1.199
diff -u -r1.199 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	20 Nov 2004 17:48:48 -0000	1.199
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	24 Nov 2004 15:04:24 -0000
@@ -749,7 +749,7 @@
 		if( !CharArrayUtils.equals(newSymbolName, EMPTY_STRING) && !isTemplateId ){ 
 			try
 			{
-				classSymbol = currentScopeSymbol.lookupMemberForDefinition(newSymbolName);
+				classSymbol = currentScopeSymbol.lookupMemberForDefinition(newSymbolName, pstType);
 			}
 			catch (ParserSymbolTableException e)
 			{
@@ -791,7 +791,10 @@
         }
         catch (ParserSymbolTableException e2)
         {
-        	handleProblem( e2.createProblemID(), newSymbolName );
+        	if (e2.reason == ParserSymbolTableException.r_InvalidOverload)
+        		handleProblem( e2.createProblemID(), newSymbolName, nameOffset, nameEndOffset, nameLine, false ); // to fix 65569 for this patch
+        	else 
+        		handleProblem( e2.createProblemID(), newSymbolName, nameOffset, nameEndOffset, nameLine, true );
         }
 		
         if( name != null && name.getTemplateIdArgLists() != null  )
@@ -3287,8 +3290,10 @@
 					checkSymbol = ((IDerivableContainerSymbol) currentScopeSymbol)
 							.lookupForFriendship(newSymbolName);
 				} else {
-					checkSymbol = currentScopeSymbol.elaboratedLookup(pstType,
-							newSymbolName);
+					if (!isForewardDecl)
+						checkSymbol = currentScopeSymbol.elaboratedLookup(pstType, newSymbolName); // for using - goes outside scope with filter
+					else 
+						checkSymbol = currentScopeSymbol.lookupMemberForDefinition(newSymbolName, pstType); // for declaring - stays inside scope with filter  
 				}
 			} catch (ParserSymbolTableException e) {
 				handleProblem(e.createProblemID(), nameToken.getCharImage(),
Index: parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTAbstractTypeSpecifierDeclaration.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTAbstractTypeSpecifierDeclaration.java,v
retrieving revision 1.14
diff -u -r1.14 ASTAbstractTypeSpecifierDeclaration.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTAbstractTypeSpecifierDeclaration.java	7 Sep 2004 18:56:38 -0000	1.14
+++ parser/org/eclipse/cdt/internal/core/parser/ast/quick/ASTAbstractTypeSpecifierDeclaration.java	24 Nov 2004 15:04:24 -0000
@@ -12,6 +12,7 @@
 
 import org.eclipse.cdt.core.parser.ISourceElementRequestor;
 import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
+import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
 import org.eclipse.cdt.core.parser.ast.IASTScope;
 import org.eclipse.cdt.core.parser.ast.IASTTemplate;
 import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
@@ -150,5 +151,67 @@
     {
         return endingOffset;
     }
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getName()
+	 */
+	public String getName() {
+		if (typeSpecifier instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpecifier).getName();
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameCharArray()
+	 */
+	public char[] getNameCharArray() {
+		if (typeSpecifier instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpecifier).getNameCharArray();
+		
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameOffset()
+	 */
+	public int getNameOffset() {
+		if (typeSpecifier instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpecifier).getNameOffset();
+		
+		return 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameOffset(int)
+	 */
+	public void setNameOffset(int o) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameEndOffset()
+	 */
+	public int getNameEndOffset() {
+		if (typeSpecifier instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpecifier).getNameEndOffset();
+		
+		return 0;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#setNameEndOffsetAndLineNumber(int, int)
+	 */
+	public void setNameEndOffsetAndLineNumber(int offset, int lineNumber) {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement#getNameLineNumber()
+	 */
+	public int getNameLineNumber() {
+		if (typeSpecifier instanceof IASTOffsetableNamedElement)
+			return ((IASTOffsetableNamedElement)typeSpecifier).getNameLineNumber();
+		
+		return 0;
+	}
     
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java,v
retrieving revision 1.52
diff -u -r1.52 ContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	30 Sep 2004 19:45:57 -0000	1.52
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	24 Nov 2004 15:04:24 -0000
@@ -518,8 +518,17 @@
 	 * ie, We need a seperate lookup function for looking up the member names
 	 * for a definition.
 	 */
-	public ISymbol lookupMemberForDefinition( char[] name ) throws ParserSymbolTableException{
-		LookupData data = new LookupData( name );
+	public ISymbol lookupMemberForDefinition( char[] name, final ITypeInfo.eType type ) throws ParserSymbolTableException{
+		LookupData data = new LookupData( name ){
+			public TypeFilter getFilter() {
+				if( t == ITypeInfo.t_any ) return ANY_FILTER;
+				if( filter == null ) filter = new TypeFilter( t );
+				return filter;
+			}
+			private TypeFilter filter = null;
+			private final ITypeInfo.eType t = type;
+		};
+		
 		data.qualified = true;
 		
 		IContainerSymbol container = this;
@@ -538,6 +547,10 @@
 		return null;
 	}
 
+	public ISymbol lookupMemberForDefinition( char[] name ) throws ParserSymbolTableException {
+		return lookupMemberForDefinition(name, ITypeInfo.t_any);
+	}
+	
 	public IParameterizedSymbol lookupMethodForDefinition( char[] name, final List parameters ) throws ParserSymbolTableException{
 		LookupData data = new LookupData( name ){
 			public List getParameters() { return params; }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java,v
retrieving revision 1.24
diff -u -r1.24 IContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	30 Sep 2004 19:45:57 -0000	1.24
+++ parser/org/eclipse/cdt/internal/core/parser/pst/IContainerSymbol.java	24 Nov 2004 15:04:24 -0000
@@ -100,6 +100,7 @@
 	 */
 	public ISymbol elaboratedLookup( ITypeInfo.eType type, char[] name ) throws ParserSymbolTableException; 
 	public ISymbol lookup( char[] name ) throws ParserSymbolTableException;
+	public ISymbol lookupMemberForDefinition( char[] name, ITypeInfo.eType type ) throws ParserSymbolTableException;
 	public ISymbol lookupMemberForDefinition( char[] name ) throws ParserSymbolTableException;
 	public IParameterizedSymbol lookupMethodForDefinition( char[] name, List parameters ) throws ParserSymbolTableException;
 	public ISymbol lookupNestedNameSpecifier( char[] name ) throws ParserSymbolTableException;
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java,v
retrieving revision 1.94
diff -u -r1.94 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	18 Nov 2004 21:05:26 -0000	1.94
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	24 Nov 2004 15:04:25 -0000
@@ -854,7 +854,12 @@
 			( newType == ITypeInfo.t_type || (newType.compareTo( ITypeInfo.t_function ) >= 0 /*&& newType <= TypeInfo.typeMask*/) ) ){
 				
 			return true;
-		}
+		// 3.3.7-2 (in any order) same as above but with origType and newType reversed
+		} else if( (newType.compareTo(ITypeInfo.t_class) >= 0 && newType.compareTo(ITypeInfo.t_enumeration) <= 0) && //class name or enumeration ...
+			( origType == ITypeInfo.t_type || (origType.compareTo( ITypeInfo.t_function ) >= 0 /*&& newType <= TypeInfo.typeMask*/) ) ){
+			
+			return true;
+		}		
 		//if the origtype is not a class-name or enumeration name, then the only other
 		//allowable thing is if they are both functions.
 		if( origSymbol instanceof IParameterizedSymbol && newSymbol instanceof IParameterizedSymbol )
Index: parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java,v
retrieving revision 1.32
diff -u -r1.32 TemplateFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java	20 Oct 2004 17:59:54 -0000	1.32
+++ parser/org/eclipse/cdt/internal/core/parser/pst/TemplateFactory.java	24 Nov 2004 15:04:25 -0000
@@ -359,10 +359,10 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.parser.pst.ITemplateFactory#lookupMemberForDefinition(java.lang.String)
 	 */
-	public ISymbol lookupMemberForDefinition(char[] name) throws ParserSymbolTableException {
+	public ISymbol lookupMemberForDefinition(char[] name, ITypeInfo.eType type ) throws ParserSymbolTableException {
 		ISymbol look = null;
 		IContainerSymbol last = getLastSymbol();
-		if( last != null ){
+		if( last != null && last.isType(type)){
 			look = last.lookupMemberForDefinition( name );
 		} else {
 			look = getContainingSymbol().lookupMemberForDefinition( name );
@@ -371,6 +371,10 @@
 			return ((ITemplateSymbol)look).getTemplatedSymbol();
 		} 
 		return look;
+	}
+	
+	public ISymbol lookupMemberForDefinition(char[] name) throws ParserSymbolTableException {
+		return lookupMemberForDefinition(name, ITypeInfo.t_any);
 	}
 
 	/* (non-Javadoc)
Index: parser/org/eclipse/cdt/internal/core/parser/pst/UndefinedTemplateSymbol.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/UndefinedTemplateSymbol.java,v
retrieving revision 1.2
diff -u -r1.2 UndefinedTemplateSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/UndefinedTemplateSymbol.java	4 Oct 2004 19:14:16 -0000	1.2
+++ parser/org/eclipse/cdt/internal/core/parser/pst/UndefinedTemplateSymbol.java	24 Nov 2004 15:04:25 -0000
@@ -229,6 +229,13 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookupMemberForDefinition(char[])
 	 */
+	public ISymbol lookupMemberForDefinition(char[] name, ITypeInfo.eType type) throws ParserSymbolTableException {
+		return null;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookupMemberForDefinition(char[])
+	 */
 	public ISymbol lookupMemberForDefinition(char[] name) throws ParserSymbolTableException {
 		// TODO Auto-generated method stub
 		return null;

Back to the top