1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 02:06:01 +02:00

Fixed Bug 84371 - AST problems with ICPPASTQualifiedName ::f

This commit is contained in:
John Camelon 2005-02-08 14:56:05 +00:00
parent 30277a9b62
commit cc8d114f90
7 changed files with 1137 additions and 1055 deletions

View file

@ -498,7 +498,7 @@ public class CompleteParser2Tests extends TestCase {
CPPNameCollector col = new CPPNameCollector();
CPPVisitor.visitTranslationUnit( tu, col );
assertEquals( col.size(), 13 );
assertEquals( col.size(), 12 );
ICPPNamespace N = (ICPPNamespace) col.getName(0).resolveBinding();
IFunction foo = (IFunction) col.getName(1).resolveBinding();
ICPPClassType A = (ICPPClassType) col.getName(3).resolveBinding();
@ -1682,13 +1682,13 @@ public class CompleteParser2Tests extends TestCase {
CPPNameCollector col = new CPPNameCollector();
CPPVisitor.visitTranslationUnit( tu, col );
assertEquals( col.size(), 11 );
assertEquals( col.size(), 10 );
ICPPClassType s = (ICPPClassType) col.getName(0).resolveBinding();
ICPPClassType s2 = (ICPPClassType) col.getName(3).resolveBinding();
ICPPClassType ref1 = (ICPPClassType) col.getName(5).resolveBinding();
ICPPClassType ref2 = (ICPPClassType) col.getName( 9 ).resolveBinding();
ICPPClassType ref2 = (ICPPClassType) col.getName( 8 ).resolveBinding();
assertSame( s, ref2 );
assertSame( s2, ref1 );

View file

@ -21,4 +21,7 @@ public interface ICPPASTQualifiedName extends IASTName {
public static final ASTNodeProperty SEGMENT_NAME = new ASTNodeProperty( "Segment"); //$NON-NLS-1$
public void addName( IASTName name );
public IASTName [] getNames();
public boolean isFullyQualified();
public void setFullyQualified( boolean value );
}

View file

@ -95,6 +95,7 @@ public class CPPASTQualifiedName extends CPPASTNode implements ICPPASTQualifiedN
private int currentIndex = 0;
private IASTName [] names = null;
private static final int DEFAULT_NAMES_LIST_SIZE = 4;
private boolean value;
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#getNames()
@ -138,5 +139,19 @@ public class CPPASTQualifiedName extends CPPASTNode implements ICPPASTQualifiedN
return nameArray;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#isFullyQualified()
*/
public boolean isFullyQualified() {
return value;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName#setFullyQualified(boolean)
*/
public void setFullyQualified(boolean value) {
this.value = value;
}
}

View file

@ -79,7 +79,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.core.parser.util.ObjectMap;
@ -316,17 +315,20 @@ public class CPPSemantics {
}
}
static protected IBinding resolveBinding( IASTName name ){
if( name.toCharArray().length == 2 && CharArrayUtils.equals( name.toCharArray(), Keywords.cpCOLONCOLON ) ){
IASTNode node = name.getParent();
if( node instanceof ICPPASTQualifiedName ){
ICPPASTQualifiedName qname = (ICPPASTQualifiedName) node;
if( qname.getNames()[0] == name ){
//translation unit
return ((ICPPASTTranslationUnit)node.getTranslationUnit()).resolveBinding();
}
}
return null;
}
if( name instanceof ICPPASTQualifiedName && ((ICPPASTQualifiedName)name).isFullyQualified() )
return ((ICPPASTTranslationUnit)name.getTranslationUnit()).resolveBinding();
// if( name.toCharArray().length == 2 && CharArrayUtils.equals( name.toCharArray(), Keywords.cpCOLONCOLON ) ){
// IASTNode node = name.getParent();
// if( node instanceof ICPPASTQualifiedName ){
// ICPPASTQualifiedName qname = (ICPPASTQualifiedName) node;
// if( qname.getNames()[0] == name ){
// //translation unit
// return ((ICPPASTTranslationUnit)node.getTranslationUnit()).resolveBinding();
// }
// }
// return null;
// }
//1: get some context info off of the name to figure out what kind of lookup we want
LookupData data = createLookupData( name );

View file

@ -519,6 +519,10 @@ public class CPPVisitor {
return ((ICPPNamespace)binding).getNamespaceScope();
}
}
else if( ((ICPPASTQualifiedName)parent).isFullyQualified() )
{
return parent.getTranslationUnit().getScope();
}
} else if( parent instanceof ICPPASTFieldReference ){
IASTExpression owner = ((ICPPASTFieldReference)parent).getFieldOwner();
IType type = CPPSemantics.getUltimateType( getExpressionType( owner ) );

View file

@ -2487,11 +2487,21 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
result.setOffsetAndLength(duple.getStartOffset(), duple.getEndOffset()
- duple.getStartOffset());
ITokenDuple[] segments = duple.getSegments();
for (int i = 0; i < segments.length; ++i) {
int startingValue = 0;
if( segments.length > 0 &&
segments[0] instanceof IToken &&
((IToken)segments[0]).getType() == IToken.tCOLONCOLON )
{
++startingValue;
result.setFullyQualified(true);
}
for (int i = startingValue; i < segments.length; ++i) {
IASTName subName = null;
// take each name and add it to the result
if (segments[i] instanceof IToken)
{
subName = createName((IToken) segments[i]);
}
else if (segments[i].getTemplateIdArgLists() == null)
subName = createName(segments[i]);
else
@ -2503,7 +2513,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
segments[i].getEndOffset() - segments[i].getStartOffset());
result.addName(subName);
}
return result;
}