1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

start of support for template parameter qualified types

This commit is contained in:
Andrew Niefer 2005-05-04 20:40:04 +00:00
parent 037b93c764
commit 641fbeb7a6
14 changed files with 671 additions and 4 deletions

View file

@ -9506,7 +9506,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
buffer.append("typename T::X x; // illformed: finds the data member X\n"); //$NON-NLS-1$ buffer.append("typename T::X x; // illformed: finds the data member X\n"); //$NON-NLS-1$
buffer.append("// not the member type X\n"); //$NON-NLS-1$ buffer.append("// not the member type X\n"); //$NON-NLS-1$
buffer.append("}\n"); //$NON-NLS-1$ buffer.append("}\n"); //$NON-NLS-1$
parse(buffer.toString(), ParserLanguage.CPP, true, 2); parse(buffer.toString(), ParserLanguage.CPP, true, 0);
} }
/** /**

View file

@ -1174,4 +1174,65 @@ public class AST2TemplateTests extends AST2BaseTest {
assertTrue( x4 instanceof ICPPSpecialization ); assertTrue( x4 instanceof ICPPSpecialization );
assertEquals( ((ICPPSpecialization)x4).getSpecializedBinding(), x2 ); assertEquals( ((ICPPSpecialization)x4).getSpecializedBinding(), x2 );
} }
public void testTemplateParameterQualifiedType_1() throws Exception {
StringBuffer buffer = new StringBuffer();
buffer.append("template <class T> class A { \n"); //$NON-NLS-1$
buffer.append(" typedef typename T::X _xx; \n"); //$NON-NLS-1$
buffer.append(" _xx s; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("class B {}; \n"); //$NON-NLS-1$
buffer.append("template < class T > class C { \n"); //$NON-NLS-1$
buffer.append(" typedef T X; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
buffer.append("void f() { \n"); //$NON-NLS-1$
buffer.append(" A< C<B> > a; a.s; \n"); //$NON-NLS-1$
buffer.append("}; \n"); //$NON-NLS-1$
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ICPPTemplateTypeParameter T = (ICPPTemplateTypeParameter) col.getName(0).resolveBinding();
ICPPClassTemplate A = (ICPPClassTemplate) col.getName(1).resolveBinding();
IBinding T1 = col.getName(3).resolveBinding();
assertSame( T1, T );
ICPPClassType X = (ICPPClassType) col.getName(4).resolveBinding();
ITypedef _xx = (ITypedef) col.getName(5).resolveBinding();
IBinding _xx2 = col.getName(6).resolveBinding();
assertSame( _xx, _xx2 );
assertSame( _xx.getType(), X );
ICPPField s = (ICPPField) col.getName(7).resolveBinding();
ICPPClassType B = (ICPPClassType) col.getName(8).resolveBinding();
ITypedef X2 = (ITypedef) col.getName(12).resolveBinding();
ICPPClassType Acb = (ICPPClassType) col.getName(14).resolveBinding();
assertTrue( Acb instanceof ICPPTemplateInstance );
assertSame( ((ICPPTemplateInstance)Acb).getTemplateDefinition(), A );
ICPPField s2 = (ICPPField) col.getName(21).resolveBinding();
assertTrue( s2 instanceof ICPPSpecialization );
assertSame( ((ICPPSpecialization)s2).getSpecializedBinding(), s );
IType t = s2.getType();
// assertTrue( t instanceof ITypedef );
// assertTrue( t instanceof ICPPSpecialization );
// assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), _xx );
t = ((ITypedef)t).getType();
assertTrue( t instanceof ICPPSpecialization );
assertSame( ((ICPPSpecialization)t).getSpecializedBinding(), X2 );
t = ((ITypedef)t).getType();
assertSame( t, B );
}
} }

View file

@ -14,7 +14,7 @@ package org.eclipse.cdt.core.dom.ast;
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public interface IBinding { public interface IBinding {
public static final IBinding[] EMPTY_BINDING_ARRAY = new IBinding[0];
/** /**
* The name of the binding. * The name of the binding.
* *

View file

@ -15,4 +15,6 @@ package org.eclipse.cdt.core.dom.ast;
*/ */
public interface IField extends IVariable { public interface IField extends IVariable {
public static final IField[] EMPTY_FIELD_ARRAY = new IField[0];
} }

View file

@ -16,5 +16,6 @@ import org.eclipse.cdt.core.dom.ast.IField;
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public interface ICPPField extends IField, ICPPMember, ICPPVariable { public interface ICPPField extends IField, ICPPMember, ICPPVariable {
public static final ICPPField [] EMPTY_CPPFIELD_ARRAY = new ICPPField[0];
} }

View file

@ -31,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
@ -42,10 +43,11 @@ import org.eclipse.cdt.core.parser.util.ObjectMap;
* @author aniefer * @author aniefer
*/ */
public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements
ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate { ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPInternalUnknown {
private ICPPTemplateParameter [] templateParameters = null; private ICPPTemplateParameter [] templateParameters = null;
private ObjectMap instances = null; private ObjectMap instances = null;
private ICPPScope unknownScope = null;
/** /**
* @param name * @param name
@ -55,6 +57,13 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
// TODO Auto-generated constructor stub // TODO Auto-generated constructor stub
} }
public ICPPScope getUnknownScope() {
if( unknownScope == null ) {
unknownScope = new CPPUnknownScope( this, null );
}
return unknownScope;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter#getTemplateParameters() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter#getTemplateParameters()
*/ */
@ -288,4 +297,12 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement
instances = new ObjectMap( 2 ); instances = new ObjectMap( 2 );
instances.put( types, spec ); instances.put( types, spec );
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap)
*/
public IBinding resolveUnknown( ObjectMap argMap ) {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -16,17 +16,21 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.parser.util.ObjectMap;
/** /**
* @author aniefer * @author aniefer
*/ */
public class CPPTemplateTypeParameter extends CPPTemplateParameter implements public class CPPTemplateTypeParameter extends CPPTemplateParameter implements
ICPPTemplateTypeParameter, IType { ICPPTemplateTypeParameter, IType, ICPPInternalUnknown {
private ICPPScope unknownScope = null;
/** /**
* @param name * @param name
*/ */
@ -34,6 +38,12 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements
super(name); super(name);
} }
public ICPPScope getUnknownScope() {
if( unknownScope == null ) {
unknownScope = new CPPUnknownScope( this, null );
}
return unknownScope;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter#getDefault() * @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter#getDefault()
*/ */
@ -62,4 +72,12 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements
return ((ITypedef)type).isSameType( this ); return ((ITypedef)type).isSameType( this );
return false; return false;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap)
*/
public IBinding resolveUnknown( ObjectMap argMap ) {
// TODO Auto-generated method stub
return null;
}
} }

View file

@ -38,6 +38,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IQualifierType; import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
@ -542,6 +543,8 @@ public class CPPTemplates {
spec = new CPPMethodSpecialization( decl, scope, argMap ); spec = new CPPMethodSpecialization( decl, scope, argMap );
} else if( decl instanceof ICPPFunction ) { } else if( decl instanceof ICPPFunction ) {
spec = new CPPFunctionSpecialization( decl, scope, argMap ); spec = new CPPFunctionSpecialization( decl, scope, argMap );
} else if( decl instanceof ITypedef ){
spec = new CPPTypedefSpecialization( decl, scope, argMap );
} }
return spec; return spec;
} }
@ -588,6 +591,15 @@ public class CPPTemplates {
newType = (IType) argMap.get( type ); newType = (IType) argMap.get( type );
} else if( type instanceof CPPDeferredClassInstance ){ } else if( type instanceof CPPDeferredClassInstance ){
newType = ((CPPDeferredClassInstance)type).instantiate( argMap ); newType = ((CPPDeferredClassInstance)type).instantiate( argMap );
} else if( type instanceof ICPPInternalUnknown ){
IBinding binding;
try {
binding = ((ICPPInternalUnknown)type).resolveUnknown( argMap );
} catch ( DOMException e ) {
binding = e.getProblem();
}
if( binding instanceof IType )
newType = (IType) binding;
} }
return newType; return newType;

View file

@ -0,0 +1,103 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on May 3, 2005
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedef.CPPTypedefDelegate;
/**
* @author aniefer
*/
public class CPPTypedefSpecialization extends CPPSpecialization implements
ITypedef {
private IType type = null;
/**
* @param specialized
* @param scope
* @param argumentMap
*/
public CPPTypedefSpecialization( IBinding specialized, ICPPScope scope,
ObjectMap argumentMap ) {
super( specialized, scope, argumentMap );
}
private ITypedef getTypedef() {
return (ITypedef) getSpecializedBinding();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ITypedef#getType()
*/
public IType getType() throws DOMException {
if( type == null ){
type = CPPTemplates.instantiateType( getTypedef().getType(), argumentMap );
}
return type;
}
/* (non-Javadoc)
* @see java.lang.Object#clone()
*/
public Object clone() {
// IType t = null;
// try {
// t = (IType) super.clone();
// } catch ( CloneNotSupportedException e ) {
// //not going to happen
// }
return this;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
*/
public boolean isSameType( IType o ) {
if( o == this )
return true;
if( o instanceof ITypedef )
try {
IType t = getType();
if( t != null )
return t.isSameType( ((ITypedef)o).getType());
return false;
} catch ( DOMException e ) {
return false;
}
try {
IType t = getType();
if( t != null )
return t.isSameType( o );
} catch ( DOMException e ) {
return false;
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public ICPPDelegate createDelegate( IASTName name ) {
return new CPPTypedefDelegate( name, this );
}
}

View file

@ -0,0 +1,161 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on May 3, 2005
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.ObjectMap;
/**
* @author aniefer
*/
public class CPPUnknownBinding implements ICPPInternalUnknown {
private ICPPScope unknownScope = null;
private IBinding scopeBinding = null;
private ICPPScope scope = null;
private IASTName name = null;
/**
*
*/
public CPPUnknownBinding( ICPPScope scope, IBinding scopeBinding, IASTName name ) {
super();
this.scope = scope;
this.name = name;
this.scopeBinding = scopeBinding;
}
/* (non-Javadoc)```
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#getUnknownScope()
*/
public ICPPScope getUnknownScope() {
if( unknownScope == null ){
unknownScope = new CPPUnknownScope( this, name );
}
return unknownScope;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDeclarations()
*/
public IASTNode[] getDeclarations() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
*/
public IASTNode getDefinition() {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#createDelegate(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public ICPPDelegate createDelegate( IASTName name ) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
public void addDefinition( IASTNode node ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
public void addDeclaration( IASTNode node ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#removeDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
*/
public void removeDeclaration( IASTNode node ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
*/
public String[] getQualifiedName() throws DOMException {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedNameCharArray()
*/
public char[][] getQualifiedNameCharArray() throws DOMException {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isGloballyQualified()
*/
public boolean isGloballyQualified() throws DOMException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
*/
public String getName() {
return name.toString();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
*/
public char[] getNameCharArray() {
return name.toCharArray();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
*/
public IScope getScope() {
return scope;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknown#resolveUnknown(org.eclipse.cdt.core.parser.util.ObjectMap)
*/
public IBinding resolveUnknown( ObjectMap argMap ) throws DOMException {
IBinding result = this;
if( argMap.containsKey( scopeBinding ) ){
IType t = (IType) argMap.get( scopeBinding );
t = CPPSemantics.getUltimateType( t, false );
if( t instanceof ICPPClassType ){
IScope s = ((ICPPClassType)t).getCompositeScope();
if( s.isFullyCached() )
result = s.getBinding( name, true );
// CPPSemantics.LookupData data = CPPSemantics.createLookupData( name, false );
// CPPSemantics.lookup( data, s );
// IBinding result = CPPSemantics.resolveAmbiguities( data, name );
return result;
}
}
return result;
}
}

View file

@ -0,0 +1,133 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on May 3, 2005
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
/**
* @author aniefer
*/
public class CPPUnknownClass extends CPPUnknownBinding implements ICPPClassType {
/**
* @param scope
* @param name
*/
public CPPUnknownClass( ICPPScope scope, IBinding scopeBinding, IASTName name ) {
super( scope, scopeBinding, name );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getBases()
*/
public ICPPBase[] getBases() {
return ICPPBase.EMPTY_BASE_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getFields()
*/
public IField[] getFields() {
return IField.EMPTY_FIELD_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#findField(java.lang.String)
*/
public IField findField( String name ) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredFields()
*/
public ICPPField[] getDeclaredFields() {
return ICPPField.EMPTY_CPPFIELD_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getMethods()
*/
public ICPPMethod[] getMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getAllDeclaredMethods()
*/
public ICPPMethod[] getAllDeclaredMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getDeclaredMethods()
*/
public ICPPMethod[] getDeclaredMethods() {
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getConstructors()
*/
public ICPPConstructor[] getConstructors() {
return ICPPConstructor.EMPTY_CONSTRUCTOR_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType#getFriends()
*/
public IBinding[] getFriends() {
return IBinding.EMPTY_BINDING_ARRAY;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getKey()
*/
public int getKey() {
return 0;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.ICompositeType#getCompositeScope()
*/
public IScope getCompositeScope() {
return getUnknownScope();
}
/* (non-Javadoc)
* @see java.lang.Object#clone()
*/
public Object clone() {
return this;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
*/
public boolean isSameType( IType type ) {
return type == this;
}
}

View file

@ -0,0 +1,123 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on May 3, 2005
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
/**
* @author aniefer
*/
public class CPPUnknownScope implements ICPPScope {
private ICPPScope parentScope = null;
private IBinding binding = null;
private IASTName scopeName = null;
private CharArrayObjectMap map = null;
/**
*
*/
public CPPUnknownScope( IBinding binding, IASTName name ) {
super();
this.scopeName = name;
this.binding = binding;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getScopeName()
*/
public IASTName getScopeName() {
return scopeName;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getParent()
*/
public IScope getParent() throws DOMException {
return binding.getScope();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String)
*/
public IBinding[] find( String name ) {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getPhysicalNode()
*/
public IASTNode getPhysicalNode() {
return scopeName;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#addName(org.eclipse.cdt.core.dom.ast.IASTName)
*/
public void addName( IASTName name ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#removeBinding(org.eclipse.cdt.core.dom.ast.IBinding)
*/
public void removeBinding( IBinding binding ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#getBinding(org.eclipse.cdt.core.dom.ast.IASTName, boolean)
*/
public IBinding getBinding( IASTName name, boolean resolve ) {
if( map == null )
map = new CharArrayObjectMap(2);
char [] c = name.toCharArray();
if( map.containsKey( c ) ){
return (IBinding) map.get( c );
}
IBinding b = new CPPUnknownClass( this, binding, name );
name.setBinding( b );
map.put( c, b );
return b;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#setFullyCached(boolean)
*/
public void setFullyCached( boolean b ) {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#isFullyCached()
*/
public boolean isFullyCached() {
return true;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IScope#flushCache()
*/
public void flushCache() {
}
}

View file

@ -712,6 +712,8 @@ public class CPPVisitor {
return ((ICPPClassType)binding).getCompositeScope(); return ((ICPPClassType)binding).getCompositeScope();
} else if( binding instanceof ICPPNamespace ){ } else if( binding instanceof ICPPNamespace ){
return ((ICPPNamespace)binding).getNamespaceScope(); return ((ICPPNamespace)binding).getNamespaceScope();
} else if( binding instanceof ICPPInternalUnknown ){
return ((ICPPInternalUnknown)binding).getUnknownScope();
} else if( binding instanceof IProblemBinding ){ } else if( binding instanceof IProblemBinding ){
if( binding instanceof ICPPScope ) if( binding instanceof ICPPScope )
return (IScope) binding; return (IScope) binding;

View file

@ -0,0 +1,34 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on May 3, 2005
*/
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
import org.eclipse.cdt.core.parser.util.ObjectMap;
/**
* @author aniefer
*/
public interface ICPPInternalUnknown extends ICPPInternalBinding {
public ICPPScope getUnknownScope();
/**
* @param argMap
* @return
* @throws DOMException
*/
public IBinding resolveUnknown( ObjectMap argMap ) throws DOMException;
}