[
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;