diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java index fd71d9a9021..d405ffd7f4f 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPSpecTest.java @@ -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("// not the member type X\n"); //$NON-NLS-1$ buffer.append("}\n"); //$NON-NLS-1$ - parse(buffer.toString(), ParserLanguage.CPP, true, 2); + parse(buffer.toString(), ParserLanguage.CPP, true, 0); } /** diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index 0f285e18463..739ae6dda8e 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -1174,4 +1174,65 @@ public class AST2TemplateTests extends AST2BaseTest { assertTrue( x4 instanceof ICPPSpecialization ); assertEquals( ((ICPPSpecialization)x4).getSpecializedBinding(), x2 ); } + + public void testTemplateParameterQualifiedType_1() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("template 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 > 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 ); + } + + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java index 8edeced39b7..ff750b647ce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java @@ -14,7 +14,7 @@ package org.eclipse.cdt.core.dom.ast; * @author Doug Schaefer */ public interface IBinding { - + public static final IBinding[] EMPTY_BINDING_ARRAY = new IBinding[0]; /** * The name of the binding. * diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IField.java index 419e87a8e37..aa2d0cdfbfc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IField.java @@ -15,4 +15,6 @@ package org.eclipse.cdt.core.dom.ast; */ public interface IField extends IVariable { + public static final IField[] EMPTY_FIELD_ARRAY = new IField[0]; + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java index 4acdc0ecbb6..eef88e7b029 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPField.java @@ -16,5 +16,6 @@ import org.eclipse.cdt.core.dom.ast.IField; * @author Doug Schaefer */ public interface ICPPField extends IField, ICPPMember, ICPPVariable { + public static final ICPPField [] EMPTY_CPPFIELD_ARRAY = new ICPPField[0]; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java index 2a01faab389..862dc375a79 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTemplateParameter.java @@ -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.ICPPField; 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.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; @@ -42,10 +43,11 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; * @author aniefer */ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements - ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate { + ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPInternalUnknown { private ICPPTemplateParameter [] templateParameters = null; private ObjectMap instances = null; + private ICPPScope unknownScope = null; /** * @param name @@ -55,6 +57,13 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement // TODO Auto-generated constructor stub } + public ICPPScope getUnknownScope() { + if( unknownScope == null ) { + unknownScope = new CPPUnknownScope( this, null ); + } + return unknownScope; + } + /* (non-Javadoc) * @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.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; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java index c9d2373a822..47b0ac7bd61 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeParameter.java @@ -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.IASTNode; 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.ITypedef; 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.parser.util.ObjectMap; /** * @author aniefer */ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements - ICPPTemplateTypeParameter, IType { + ICPPTemplateTypeParameter, IType, ICPPInternalUnknown { + private ICPPScope unknownScope = null; /** * @param name */ @@ -34,6 +38,12 @@ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements super(name); } + public ICPPScope getUnknownScope() { + if( unknownScope == null ) { + unknownScope = new CPPUnknownScope( this, null ); + } + return unknownScope; + } /* (non-Javadoc) * @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 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; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java index 16ed7079932..dc17d7b6e35 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplates.java @@ -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.IScope; 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.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; @@ -542,6 +543,8 @@ public class CPPTemplates { spec = new CPPMethodSpecialization( decl, scope, argMap ); } else if( decl instanceof ICPPFunction ) { spec = new CPPFunctionSpecialization( decl, scope, argMap ); + } else if( decl instanceof ITypedef ){ + spec = new CPPTypedefSpecialization( decl, scope, argMap ); } return spec; } @@ -588,6 +591,15 @@ public class CPPTemplates { newType = (IType) argMap.get( type ); } else if( type instanceof CPPDeferredClassInstance ){ 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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java new file mode 100644 index 00000000000..cc863a7125b --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedefSpecialization.java @@ -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 ); + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java new file mode 100644 index 00000000000..d14eb3600de --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java @@ -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; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java new file mode 100644 index 00000000000..151b6f3f720 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownClass.java @@ -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; + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java new file mode 100644 index 00000000000..58d5be980a3 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java @@ -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() { + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 003f683f8e8..35326432ece 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -712,6 +712,8 @@ public class CPPVisitor { return ((ICPPClassType)binding).getCompositeScope(); } else if( binding instanceof ICPPNamespace ){ return ((ICPPNamespace)binding).getNamespaceScope(); + } else if( binding instanceof ICPPInternalUnknown ){ + return ((ICPPInternalUnknown)binding).getUnknownScope(); } else if( binding instanceof IProblemBinding ){ if( binding instanceof ICPPScope ) return (IScope) binding; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java new file mode 100644 index 00000000000..e4ed25fd2ad --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalUnknown.java @@ -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; +}