1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 14:55:41 +02:00

Patch for Devin Steffler.

Fixed 78231 - [Parser] open declaration on elaborated type shouldn't jump to object hiding it
This commit is contained in:
John Camelon 2004-11-24 21:15:16 +00:00
parent d5a0e947ff
commit 5946594715
10 changed files with 204 additions and 10 deletions

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTMethod; import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTNode; 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.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTVariable; import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTNamespaceDefinition; import org.eclipse.cdt.internal.core.parser.ast.complete.ASTNamespaceDefinition;
@ -705,5 +706,37 @@ public class SelectionParseTest extends SelectionParseBaseTest {
assertEquals( n.getStartingLine(), 2 ); 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);
}
} }

View file

@ -15,7 +15,7 @@ package org.eclipse.cdt.core.parser.ast;
* *
*/ */
public interface IASTAbstractTypeSpecifierDeclaration public interface IASTAbstractTypeSpecifierDeclaration
extends IASTDeclaration, IASTTypeSpecifierOwner, IASTTemplatedDeclaration, IASTOffsetableElement extends IASTDeclaration, IASTTypeSpecifierOwner, IASTTemplatedDeclaration, IASTOffsetableNamedElement
{ {
public boolean isFriendDeclaration(); public boolean isFriendDeclaration();
} }

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete;
import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; 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.IASTTemplate;
import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol;
@ -152,4 +153,66 @@ public class ASTAbstractTypeSpecifierDeclaration
public char[] getFilename() { public char[] getFilename() {
return fn; 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;
}
} }

View file

@ -749,7 +749,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( !CharArrayUtils.equals(newSymbolName, EMPTY_STRING) && !isTemplateId ){ if( !CharArrayUtils.equals(newSymbolName, EMPTY_STRING) && !isTemplateId ){
try try
{ {
classSymbol = currentScopeSymbol.lookupMemberForDefinition(newSymbolName); classSymbol = currentScopeSymbol.lookupMemberForDefinition(newSymbolName, pstType);
} }
catch (ParserSymbolTableException e) catch (ParserSymbolTableException e)
{ {
@ -791,7 +791,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
} }
catch (ParserSymbolTableException e2) 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 ) if( name != null && name.getTemplateIdArgLists() != null )
@ -3287,8 +3290,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
checkSymbol = ((IDerivableContainerSymbol) currentScopeSymbol) checkSymbol = ((IDerivableContainerSymbol) currentScopeSymbol)
.lookupForFriendship(newSymbolName); .lookupForFriendship(newSymbolName);
} else { } else {
checkSymbol = currentScopeSymbol.elaboratedLookup(pstType, if (!isForewardDecl)
newSymbolName); 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) { } catch (ParserSymbolTableException e) {
handleProblem(e.createProblemID(), nameToken.getCharImage(), handleProblem(e.createProblemID(), nameToken.getCharImage(),

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.ast.quick;
import org.eclipse.cdt.core.parser.ISourceElementRequestor; import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration; 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.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTTemplate; import org.eclipse.cdt.core.parser.ast.IASTTemplate;
import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
@ -151,4 +152,66 @@ public class ASTAbstractTypeSpecifierDeclaration
return endingOffset; 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;
}
} }

View file

@ -518,8 +518,17 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
* ie, We need a seperate lookup function for looking up the member names * ie, We need a seperate lookup function for looking up the member names
* for a definition. * for a definition.
*/ */
public ISymbol lookupMemberForDefinition( char[] name ) throws ParserSymbolTableException{ public ISymbol lookupMemberForDefinition( char[] name, final ITypeInfo.eType type ) throws ParserSymbolTableException{
LookupData data = new LookupData( name ); 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; data.qualified = true;
IContainerSymbol container = this; IContainerSymbol container = this;
@ -538,6 +547,10 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol {
return null; 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{ public IParameterizedSymbol lookupMethodForDefinition( char[] name, final List parameters ) throws ParserSymbolTableException{
LookupData data = new LookupData( name ){ LookupData data = new LookupData( name ){
public List getParameters() { return params; } public List getParameters() { return params; }

View file

@ -100,6 +100,7 @@ public interface IContainerSymbol extends ISymbol {
*/ */
public ISymbol elaboratedLookup( ITypeInfo.eType type, char[] name ) throws ParserSymbolTableException; public ISymbol elaboratedLookup( ITypeInfo.eType type, char[] name ) throws ParserSymbolTableException;
public ISymbol lookup( 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 ISymbol lookupMemberForDefinition( char[] name ) throws ParserSymbolTableException;
public IParameterizedSymbol lookupMethodForDefinition( char[] name, List parameters ) throws ParserSymbolTableException; public IParameterizedSymbol lookupMethodForDefinition( char[] name, List parameters ) throws ParserSymbolTableException;
public ISymbol lookupNestedNameSpecifier( char[] name ) throws ParserSymbolTableException; public ISymbol lookupNestedNameSpecifier( char[] name ) throws ParserSymbolTableException;

View file

@ -853,6 +853,11 @@ public class ParserSymbolTable {
if( (origType.compareTo(ITypeInfo.t_class) >= 0 && origType.compareTo(ITypeInfo.t_enumeration) <= 0) && //class name or enumeration ... if( (origType.compareTo(ITypeInfo.t_class) >= 0 && origType.compareTo(ITypeInfo.t_enumeration) <= 0) && //class name or enumeration ...
( newType == ITypeInfo.t_type || (newType.compareTo( ITypeInfo.t_function ) >= 0 /*&& newType <= TypeInfo.typeMask*/) ) ){ ( 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; return true;
} }
//if the origtype is not a class-name or enumeration name, then the only other //if the origtype is not a class-name or enumeration name, then the only other

View file

@ -359,10 +359,10 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.pst.ITemplateFactory#lookupMemberForDefinition(java.lang.String) * @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; ISymbol look = null;
IContainerSymbol last = getLastSymbol(); IContainerSymbol last = getLastSymbol();
if( last != null ){ if( last != null && last.isType(type)){
look = last.lookupMemberForDefinition( name ); look = last.lookupMemberForDefinition( name );
} else { } else {
look = getContainingSymbol().lookupMemberForDefinition( name ); look = getContainingSymbol().lookupMemberForDefinition( name );
@ -373,6 +373,10 @@ public class TemplateFactory extends ExtensibleSymbol implements ITemplateFactor
return look; return look;
} }
public ISymbol lookupMemberForDefinition(char[] name) throws ParserSymbolTableException {
return lookupMemberForDefinition(name, ITypeInfo.t_any);
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#elaboratedLookup(org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType, java.lang.String) * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#elaboratedLookup(org.eclipse.cdt.internal.core.parser.pst.TypeInfo.eType, java.lang.String)
*/ */

View file

@ -226,6 +226,13 @@ public class UndefinedTemplateSymbol extends BasicSymbol implements ITemplateSym
return found; return found;
} }
/* (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) /* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookupMemberForDefinition(char[]) * @see org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol#lookupMemberForDefinition(char[])
*/ */