From 09f94f8e514aa5f14f83e60abcba7a50a57e9159 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 3 Dec 2008 17:47:34 +0000 Subject: [PATCH] Classification of names depending on template parameters, bug 234321. --- .../parser/tests/ast2/AST2CPPSpecTest.java | 46 ++++-- .../parser/tests/ast2/AST2TemplateTests.java | 71 ++++++++- .../ast/cpp/ICPPDeferredTemplateInstance.java | 13 +- .../parser/cpp/CPPDeferredClassInstance.java | 4 +- .../cpp/CPPDeferredFunctionInstance.java | 150 ------------------ .../cpp/CPPTemplateTemplateParameter.java | 5 +- .../parser/cpp/CPPTemplateTypeParameter.java | 4 +- .../dom/parser/cpp/CPPUnknownBinding.java | 6 +- .../core/dom/parser/cpp/CPPUnknownClass.java | 12 +- .../dom/parser/cpp/CPPUnknownFunction.java | 89 +++++++++++ .../parser/cpp/CPPUnknownFunctionType.java | 22 +++ .../core/dom/parser/cpp/CPPUnknownScope.java | 105 ++++++------ .../parser/cpp/ICPPDeferredClassInstance.java | 12 +- .../dom/parser/cpp/ICPPUnknownBinding.java | 2 +- .../dom/parser/cpp/ICPPUnknownClassType.java | 2 +- .../core/dom/parser/cpp/ICPPUnknownType.java | 20 +++ .../parser/cpp/semantics/CPPSemantics.java | 98 +++++++----- .../parser/cpp/semantics/CPPTemplates.java | 144 +++++++---------- .../dom/parser/cpp/semantics/CPPVisitor.java | 9 +- .../dom/parser/cpp/semantics/LookupData.java | 4 +- .../core/index/IIndexCPPBindingConstants.java | 1 - .../composite/cpp/CPPCompositesFactory.java | 11 +- .../CompositeCPPDeferredClassInstance.java | 2 +- .../CompositeCPPDeferredFunctionInstance.java | 57 ------- .../CompositeCPPTemplateTypeParameter.java | 5 +- .../cpp/CompositeCPPUnknownClassType.java | 2 +- .../cdt/internal/core/pdom/PDOMWriter.java | 4 +- .../internal/core/pdom/dom/PDOMBinding.java | 2 +- .../dom/cpp/PDOMCPPDeferredClassInstance.java | 2 +- .../cpp/PDOMCPPDeferredFunctionInstance.java | 52 ------ .../core/pdom/dom/cpp/PDOMCPPLinkage.java | 19 +-- .../dom/cpp/PDOMCPPTemplateTypeParameter.java | 5 +- .../pdom/dom/cpp/PDOMCPPUnknownClassType.java | 2 +- .../ui/indexview/IndexLabelProvider.java | 4 +- 34 files changed, 468 insertions(+), 518 deletions(-) delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunctionType.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownType.java delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java 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 4419936b960..df0da29acf3 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 @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IBasicType; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IType; @@ -33,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; /** @@ -3850,7 +3852,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // S a( f() ); // does not instantiate member template // } public void test12_8s3() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // void h(int()); @@ -4245,7 +4247,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // void* p = operator new(sizeof(int)*n); // } public void test13_5s4() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // struct B { @@ -4268,7 +4270,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // // D::operator=(const D&) // } public void test13_5_3s2() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // class X { @@ -4388,6 +4390,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(getAboveComment(), ParserLanguage.CPP, false, 0); } + // template class complex {}; // template class Array { // T* v; // int sz; @@ -4398,8 +4401,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // // ... // }; // Array v1(20); - // typedef complex dcomplex; // complex is a standard - // // library template + // typedef complex dcomplex; // Array v2(30); // Array v3(40); // void bar() { @@ -4407,7 +4409,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // v2[3] = v3.elem(4) = dcomplex(7,8); // } public void test14_3s1() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // template class X { @@ -4513,6 +4515,8 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(getAboveComment(), ParserLanguage.CPP, true, 0); } + + // void error(const char*); // template class Array { // T* v; // int sz; @@ -4528,7 +4532,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // return v[i]; // } public void test14_5_1_1s1() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // void test() { @@ -4562,7 +4566,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // // ... // } public void test14_5_2s1() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } @@ -4592,8 +4596,8 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // ip = a.operator int*(); // explicit call to template operator // // A::operator int*() // } - public void test14_5_2s5() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + public void _test14_5_2s5() throws Exception { + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // template class X { @@ -4978,10 +4982,11 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(getAboveComment(), ParserLanguage.CPP, true, 0); } + // template class Array {}; // template class X : public Array { }; // template class Y : public T { }; public void test14_6_1s3b() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + parse(getAboveComment(), ParserLanguage.CPP, true, 0); } // template class Y { @@ -5032,6 +5037,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { parse(getAboveComment(), ParserLanguage.CPP, false, 0); } + // template class B {}; // template struct X : B { // typename T::A* pa; // void f(B* pb) { @@ -5040,7 +5046,13 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // } // }; public void test14_6_2s2() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, false, 0); + final String code = getAboveComment(); + parse(code, ParserLanguage.CPP, true, 0); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + ICPPUnknownBinding unknown= bh.assertNonProblem("B", 4); + unknown= bh.assertNonProblem("T::A", 4); + unknown= bh.assertNonProblem("B::i", 7); + unknown= bh.assertNonProblem("j", 1); } // typedef double A; @@ -5050,7 +5062,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // template struct X : B { // A a; // a has type double // }; - public void test14_6_2s3() throws Exception { // TODO this doesn't compile via g++ ? + public void test14_6_2s3() throws Exception { final String content= getAboveComment(); IASTTranslationUnit tu= parse(content, ParserLanguage.CPP, true, 0); BindingAssertionHelper bh= new BindingAssertionHelper(content, true); @@ -5076,7 +5088,13 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest { // }; // Y ya; public void test14_6_2s4() throws Exception { - parse(getAboveComment(), ParserLanguage.CPP, true, 0); + final String content= getAboveComment(); + parse(content, ParserLanguage.CPP, true, 0); + BindingAssertionHelper bh= new BindingAssertionHelper(content, true); + IBinding b= bh.assertNonProblem("b;", 1); + assertEquals("Y", b.getOwner().getName()); + b= bh.assertNonProblem("a = i", 1); + assertNull(b.getOwner()); } // void g(double); 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 f0f0d8c2690..a04cc646121 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 @@ -1596,8 +1596,7 @@ public class AST2TemplateTests extends AST2BaseTest { ICPPFunctionTemplate f = (ICPPFunctionTemplate) col.getName(1).resolveBinding(); ICPPFunction f2 = (ICPPFunction) col.getName(8).resolveBinding(); - assertTrue(f2 instanceof ICPPTemplateInstance); - assertSame(((ICPPTemplateInstance)f2).getTemplateDefinition(), f); + assertTrue(f2 instanceof ICPPUnknownBinding); } // template < class T > class A {}; @@ -3414,4 +3413,72 @@ public class AST2TemplateTests extends AST2BaseTest { assertInstance(a1, ICPPField.class); assertSame(a1, a2); } + + // void f(int); void f(char); + // void g(int); + // template void h(T); + // template struct A { + // void m(int); void m(char); + // void m() { + // typename T::B b; + // b.func(); b.var; + // f(b); g(b); h(b); m(b); + // } + // }; + public void testUnknownReferences_Bug257186() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + + bh.assertNonProblem("func();", 4, ICPPUnknownBinding.class); + bh.assertNonProblem("var;", 3, ICPPUnknownBinding.class); + bh.assertNonProblem("f(b)", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("h(b)", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("m(b)", 1, ICPPUnknownBinding.class, IFunction.class); + IFunction g= bh.assertNonProblem("g(b)", 1); + assertFalse(g instanceof ICPPUnknownBinding); + } + + // template struct A { + // void m() { + // T::b.c; + // T::b.f(); + // T::b.f().d; + // T::f1(); + // } + // }; + public void testTypeOfUnknownReferences_Bug257186a() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + + bh.assertNonProblem("b.c", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("c;", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("f();", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("f().", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("d;", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("f1();", 2, ICPPUnknownBinding.class, IFunction.class); + } + + // template struct A { + // void m() { + // T::b->c; + // T::b->f(); + // T::b->f()->d; + // T::f1(); + // } + // }; + public void testTypeOfUnknownReferences_Bug257186b() throws Exception { + final String code = getAboveComment(); + parseAndCheckBindings(code, ParserLanguage.CPP); + BindingAssertionHelper bh= new BindingAssertionHelper(code, true); + + bh.assertNonProblem("b->c", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("c;", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("f();", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("f()->", 1, ICPPUnknownBinding.class, IFunction.class); + bh.assertNonProblem("d;", 1, ICPPUnknownBinding.class); + bh.assertNonProblem("f1();", 2, ICPPUnknownBinding.class, IFunction.class); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java index ea326cf4b3b..14f643f2d28 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPDeferredTemplateInstance.java @@ -11,16 +11,11 @@ *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; + /** - * Interface for deferred instances. A deferred instance is not actually instantiated yet, - * because the correct template cannot be selected until all information is available. + * @deprecated use {@link ICPPDeferredClassInstance} instead. */ +@Deprecated public interface ICPPDeferredTemplateInstance extends ICPPTemplateInstance { - - /** - * Returns an empty map, because template parameters cannot be mapped until - * all of the arguments are resolved. - * @since 5.1 - */ - public ICPPTemplateParameterMap getTemplateParameterMap(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java index 839da9d2285..360b5c22d02 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredClassInstance.java @@ -111,11 +111,11 @@ public class CPPDeferredClassInstance extends CPPUnknownClass implements ICPPDef } @Override - public ICPPScope getUnknownScope() throws DOMException { + public ICPPScope asScope() throws DOMException { if (fLookupScope != null) return fLookupScope; - return super.getUnknownScope(); + return super.asScope(); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java deleted file mode 100644 index 3ca58de0d5a..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDeferredFunctionInstance.java +++ /dev/null @@ -1,150 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2005, 2008 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Andrew Niefer (IBM Corporation) - initial API and implementation - * Markus Schorn (Wind River Systems) - *******************************************************************************/ -package org.eclipse.cdt.internal.core.dom.parser.cpp; - -import org.eclipse.cdt.core.dom.ast.DOMException; -import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; -import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IFunction; -import org.eclipse.cdt.core.dom.ast.IFunctionType; -import org.eclipse.cdt.core.dom.ast.IParameter; -import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; -import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; - -/** - * The deferred function instance collects information about the instantiation until it can - * be carried out. - */ -public class CPPDeferredFunctionInstance extends CPPUnknownBinding implements ICPPFunction, ICPPInternalFunction, ICPPDeferredTemplateInstance { - private ICPPTemplateArgument[] fArguments; - private ICPPFunctionTemplate fFunctionTemplate; - - private IParameter [] fParameters; - private IFunctionType fFunctionType; - - public CPPDeferredFunctionInstance(ICPPFunctionTemplate template, ICPPTemplateArgument[] arguments) throws DOMException { - super(template.getOwner(), new CPPASTName(template.getNameCharArray())); - fArguments= arguments; - fFunctionTemplate= template; - } - - public ICPPTemplateDefinition getTemplateDefinition() { - return fFunctionTemplate; - } - - public IBinding getSpecializedBinding() { - return fFunctionTemplate; - } - - @Deprecated - public ObjectMap getArgumentMap() { - return ObjectMap.EMPTY_MAP; - } - - public ICPPTemplateParameterMap getTemplateParameterMap() { - return CPPTemplateParameterMap.EMPTY; - } - - @Deprecated - public IType[] getArguments() { - return CPPTemplates.getArguments(getTemplateArguments()); - } - - public ICPPTemplateArgument[] getTemplateArguments() { - return fArguments; - } - - public IParameter[] getParameters() throws DOMException { - if( fParameters == null ){ - IParameter [] params = ((ICPPFunction)getTemplateDefinition()).getParameters(); - fParameters = new IParameter[ params.length ]; - for (int i = 0; i < params.length; i++) { - fParameters[i] = new CPPParameterSpecialization( (ICPPParameter)params[i], null, CPPTemplateParameterMap.EMPTY); - } - } - return fParameters; - } - - public IScope getFunctionScope() { - return null; - } - - public IFunctionType getType() throws DOMException { - if( fFunctionType == null ){ - IFunctionType ft = ((ICPPFunction)getTemplateDefinition()).getType(); - IType returnType = ft.getReturnType(); - returnType = CPPTemplates.instantiateType(returnType, getTemplateParameterMap(), null); - fFunctionType = CPPVisitor.createImplicitFunctionType( returnType, getParameters(), null); - } - return fFunctionType; - } - - - public boolean isStatic() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isStatic(); - } - - public boolean isMutable() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isMutable(); - } - - public boolean isInline() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isInline(); - } - - public boolean isExternC() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isExternC(); - } - - public boolean isExtern() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isExtern(); - } - - public boolean isAuto() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isAuto(); - } - - public boolean isRegister() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).isRegister(); - } - - public boolean takesVarArgs() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).takesVarArgs(); - } - - public boolean isStatic( boolean resolveAll) { - try { - return ASTInternal.isStatic((IFunction) getTemplateDefinition(), resolveAll); - } catch (DOMException e) { - return false; - } - } - - public IBinding resolveParameter(IASTParameterDeclaration param) { - return null; - } - - public IType[] getExceptionSpecification() throws DOMException { - return ((ICPPFunction)getTemplateDefinition()).getExceptionSpecification(); - } -} 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 45bce8c5564..72a8acb7633 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 @@ -44,7 +44,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; * @author aniefer */ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implements - ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPUnknownBinding { + ICPPTemplateTemplateParameter, ICPPClassType, ICPPInternalTemplate, ICPPUnknownBinding, + ICPPUnknownType { private ICPPTemplateParameter[] templateParameters; private ObjectMap instances; @@ -57,7 +58,7 @@ public class CPPTemplateTemplateParameter extends CPPTemplateParameter implement super(name); } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (unknownScope == null) { IASTName n = null; IASTNode[] nodes = getDeclarations(); 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 a7debcbf46a..f0ae2205dac 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 @@ -27,14 +27,14 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; * The standard template parameter (template or template). */ public class CPPTemplateTypeParameter extends CPPTemplateParameter implements - ICPPTemplateTypeParameter, IType, ICPPUnknownBinding { + ICPPTemplateTypeParameter, ICPPUnknownType, ICPPUnknownBinding { private ICPPScope unknownScope; public CPPTemplateTypeParameter(IASTName name) { super(name); } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (unknownScope == null) { IASTName n = null; IASTNode[] nodes = getDeclarations(); 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 index 21789e12a36..0c6cc4043b6 100644 --- 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 @@ -29,7 +29,7 @@ import org.eclipse.core.runtime.PlatformObject; /** * Represents a binding that is unknown because it depends on template arguments. */ -public abstract class CPPUnknownBinding extends PlatformObject +public class CPPUnknownBinding extends PlatformObject implements ICPPUnknownBinding, ICPPInternalBinding, Cloneable { protected IBinding fOwner; private ICPPScope unknownScope; @@ -80,7 +80,7 @@ public abstract class CPPUnknownBinding extends PlatformObject public IScope getScope() throws DOMException { if (fOwner instanceof ICPPUnknownBinding) { - return ((ICPPUnknownBinding) fOwner).getUnknownScope(); + return ((ICPPUnknownBinding) fOwner).asScope(); } else if (fOwner instanceof ICPPClassType) { return ((ICPPClassType) fOwner).getCompositeScope(); } else if (fOwner instanceof ICPPNamespace) { @@ -91,7 +91,7 @@ public abstract class CPPUnknownBinding extends PlatformObject return null; } - public ICPPScope getUnknownScope() throws DOMException { + public ICPPScope asScope() throws DOMException { if (unknownScope == null) { unknownScope = new CPPUnknownScope(this, name); } 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 index 922826e360d..2f6bd4a5db6 100644 --- 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 @@ -6,11 +6,10 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Corporation - initial API and implementation + * Andrew Niefer (IBM Corporation) - initial API and implementation * Sergey Prigogin (Google) * Markus Schorn (Wind River Systems) *******************************************************************************/ - package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -29,11 +28,12 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; /** * Represents a C++ class, declaration of which is not yet available. - * - * @author aniefer */ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownClassType { - + public static CPPUnknownClass createUnnamedInstance() { + return new CPPUnknownClass(null, new CPPASTName()); + } + public CPPUnknownClass(IBinding binding, IASTName name) { super(binding, name); } @@ -79,7 +79,7 @@ public class CPPUnknownClass extends CPPUnknownBinding implements ICPPUnknownCla } public final IScope getCompositeScope() throws DOMException { - return getUnknownScope(); + return asScope(); } public boolean isSameType(IType type) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java new file mode 100644 index 00000000000..b862bd1accf --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunction.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +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.IFunction; +import org.eclipse.cdt.core.dom.ast.IFunctionType; +import org.eclipse.cdt.core.dom.ast.IParameter; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; + +/** + * Represents a reference to a (member) function (instance), which cannot be resolved because + * it depends on a template parameter. A compiler would resolve it during instantiation. + */ +public class CPPUnknownFunction extends CPPUnknownBinding implements ICPPFunction { + + public static IFunction createForSample(IFunction sample, IASTName name) throws DOMException { + return new CPPUnknownFunction(sample.getOwner(), name.getLastName()); + } + + private IFunctionType fType; + + public CPPUnknownFunction(IBinding owner, IASTName name) { + super(owner, name); + } + + public IType[] getExceptionSpecification() throws DOMException { + return null; + } + + public boolean isExternC() throws DOMException { + return false; + } + + public boolean isInline() throws DOMException { + return false; + } + + public boolean isMutable() throws DOMException { + return false; + } + + public IScope getFunctionScope() throws DOMException { + return asScope(); + } + + public IParameter[] getParameters() throws DOMException { + return IParameter.EMPTY_PARAMETER_ARRAY; + } + + public IFunctionType getType() throws DOMException { + if (fType == null) { + fType= new CPPUnknownFunctionType(); + } + return fType; + } + + public boolean isAuto() throws DOMException { + return false; + } + + public boolean isExtern() throws DOMException { + return false; + } + + public boolean isRegister() throws DOMException { + return false; + } + + public boolean isStatic() throws DOMException { + return false; + } + + public boolean takesVarArgs() throws DOMException { + return false; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunctionType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunctionType.java new file mode 100644 index 00000000000..3e437589fcd --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownFunctionType.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.IType; + +/** + * Models the type of an unknown function. + */ +public class CPPUnknownFunctionType extends CPPFunctionType implements ICPPUnknownType { + CPPUnknownFunctionType() { + super(CPPUnknownClass.createUnnamedInstance(), IType.EMPTY_TYPE_ARRAY); + } +} 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 index 3f7b9bff4a5..e08eebf7bfc 100644 --- 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 @@ -16,19 +16,21 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.EScopeKind; +import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; 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.ICPPASTConstructorChainInitializer; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.index.IIndexFileSet; -import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; -import org.eclipse.cdt.core.parser.util.CharArrayUtils; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; /** * Models the scope represented by an unknown binding such (e.g.: template type parameter). Used within @@ -100,55 +102,68 @@ public class CPPUnknownScope implements ICPPScope, ICPPInternalUnknownScope { /* (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, IIndexFileSet fileSet) { + public IBinding getBinding(final IASTName name, boolean resolve, IIndexFileSet fileSet) { + boolean type= false; + boolean function= false; + + if (name.getPropertyInParent() == CPPSemantics.STRING_LOOKUP_PROPERTY) { + type= true; + } else { + IASTName n= name; + IASTNode parent= name.getParent(); + if (parent instanceof ICPPASTTemplateId) { + n= (IASTName) parent; + parent= n.getParent(); + } + if (parent instanceof ICPPASTQualifiedName) { + ICPPASTQualifiedName qname= (ICPPASTQualifiedName) parent; + if (qname.getLastName() != n) { + type= true; + } else { + parent= qname.getParent(); + } + } + if (!type) { + if (parent instanceof ICPPASTNamedTypeSpecifier || + parent instanceof ICPPASTBaseSpecifier || + parent instanceof ICPPASTConstructorChainInitializer) { + type= true; + } else if (parent.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) { + function= true; + } + } + } + if (map == null) map = new CharArrayObjectMap(2); char[] c = name.toCharArray(); - if (map.containsKey(c)) { - return (IBinding) map.get(c); + IBinding[] o= (IBinding[]) map.get(c); + if (o == null) { + o= new IBinding[3]; + map.put(c, o); } - - IBinding b; - IASTNode parent = name.getParent(); - if (parent instanceof ICPPASTTemplateId) { - try { - ICPPTemplateArgument[] arguments = CPPTemplates.createTemplateArgumentArray((ICPPASTTemplateId) parent); - b = new CPPUnknownClassInstance(binding, name, arguments); - } catch (DOMException e) { - return e.getProblem(); - } - } else { - b = new CPPUnknownClass(binding, name); + + int idx= type ? 0 : function ? 1 : 2; + IBinding result= o[idx]; + if (result == null) { + if (type) { + result= new CPPUnknownClass(binding, name.getLastName()); + } else if (function) { + result= new CPPUnknownFunction(binding, name.getLastName()); + } else { + result= new CPPUnknownBinding(binding, name.getLastName()); + } + o[idx]= result; } - - name.setBinding(b); - map.put(c, b); - return b; + return result; } - public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup, - IIndexFileSet fileSet) { - if (map == null) - map = new CharArrayObjectMap(2); - - char[] c = name.toCharArray(); - - IBinding[] result = null; - if (prefixLookup) { - Object[] keys = map.keyArray(); - for (Object key2 : keys) { - char[] key = (char[]) key2; - if (CharArrayUtils.equals(key, 0, c.length, c, true)) { - result = (IBinding[]) ArrayUtil.append(IBinding.class, result, map.get(key)); - } - } - } else { - result = new IBinding[] { (IBinding) map.get(c) }; - } - - result = (IBinding[]) ArrayUtil.trim(IBinding.class, result); - return result; + public IBinding[] getBindings(IASTName name, boolean resolve, boolean prefixLookup, IIndexFileSet fileSet) { + if (prefixLookup) + return IBinding.EMPTY_BINDING_ARRAY; + + return new IBinding[] {getBinding(name, resolve, fileSet)}; } /* (non-Javadoc) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java index 492ccbf8516..67b126f8e33 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPDeferredClassInstance.java @@ -12,15 +12,23 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; /** * Interface for deferred class template instances. */ -public interface ICPPDeferredClassInstance extends ICPPUnknownClassType, ICPPDeferredTemplateInstance { +public interface ICPPDeferredClassInstance extends ICPPUnknownClassType, ICPPTemplateInstance { /** * Returns the class template for the deferred instantiation. */ ICPPClassTemplate getClassTemplate(); + + /** + * Returns an empty map, because template parameters cannot be mapped until + * all of the arguments are resolved. + * @since 5.1 + */ + public ICPPTemplateParameterMap getTemplateParameterMap(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java index c2b1334e1e1..205286015e0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownBinding.java @@ -24,7 +24,7 @@ public interface ICPPUnknownBinding extends ICPPBinding { * Returns the scope this binding represents. * @throws DOMException */ - public ICPPScope getUnknownScope() throws DOMException; + public ICPPScope asScope() throws DOMException; /** * Returns a the name of the unknown binding that has to be searched in the parent scope. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java index 0e01b38bd60..910da0448ec 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownClassType.java @@ -19,6 +19,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; * This interface should be made public. * @since 5.0 */ -public interface ICPPUnknownClassType extends ICPPUnknownBinding, ICPPClassType { +public interface ICPPUnknownClassType extends ICPPUnknownBinding, ICPPUnknownType, ICPPClassType { } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownType.java new file mode 100644 index 00000000000..341a26c7496 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPUnknownType.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.IType; + +/** + * Marks types that depend on a template parameter and are thus unknown. + */ +public interface ICPPUnknownType extends IType { + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index c05a62c8e60..fbe60386d28 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -100,7 +100,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; @@ -144,13 +143,16 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNamespace; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPQualifierType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPReferenceType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUsingDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUsingDirective; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.index.IIndexScope; @@ -303,7 +305,7 @@ public class CPPSemantics { ICPPASTTemplateId id = (ICPPASTTemplateId) data.astName; ICPPTemplateArgument[] args = CPPTemplates.createTemplateArgumentArray(id); IBinding inst= CPPTemplates.instantiate((ICPPClassTemplate) cls, args); - cls = inst instanceof ICPPClassType && !(inst instanceof ICPPDeferredTemplateInstance) ? (ICPPClassType)inst : cls; + cls = inst instanceof ICPPClassType && !(inst instanceof ICPPDeferredClassInstance) ? (ICPPClassType)inst : cls; } } if (cls != null) { @@ -339,8 +341,12 @@ public class CPPSemantics { } // if the lookup in base-classes ran into a deferred instance, use the computed unknown binding. - if (binding == null && data.unknownBinding != null) { - binding= data.unknownBinding; + if (binding == null && data.skippedScope != null) { + if (data.functionParameters != null) { + binding= new CPPUnknownFunction(data.skippedScope, name.getLastName()); + } else { + binding= new CPPUnknownBinding(data.skippedScope, name.getLastName()); + } } if (binding != null) { @@ -737,7 +743,7 @@ public class CPPSemantics { } if (!data.usingDirectivesOnly && scope instanceof ICPPClassScope) { - mergeResults(data, lookupInParents(data, scope), true); + mergeResults(data, lookupInParents(data, scope, ((ICPPClassScope) scope).getClassType()), true); } if (!data.contentAssist && (data.problem != null || data.hasResults())) @@ -794,7 +800,7 @@ public class CPPSemantics { return (ICPPScope) parentScope; } - private static Object lookupInParents(LookupData data, ICPPScope lookIn) throws DOMException{ + private static Object lookupInParents(LookupData data, ICPPScope lookIn, ICPPClassType overallScope) throws DOMException{ if (lookIn instanceof ICPPClassScope == false) return null; @@ -826,44 +832,46 @@ public class CPPSemantics { continue; IBinding b = base.getBaseClass(); - if (b instanceof ICPPClassType == false) + if (!(b instanceof ICPPClassType)) { + // 14.6.2.3 scope is not examined + if (b instanceof ICPPUnknownBinding) { + if (data.skippedScope == null) + data.skippedScope= overallScope; + } continue; + } inherited = null; final ICPPClassType cls = (ICPPClassType) b; - if (cls instanceof ICPPUnknownBinding) { - if (data.unknownBinding == null) { - data.unknownBinding= cls; - } + final ICPPScope classScope = (ICPPScope) cls.getCompositeScope(); + if (classScope == null || classScope instanceof ICPPInternalUnknownScope) { + // 14.6.2.3 scope is not examined + if (data.skippedScope == null) + data.skippedScope= overallScope; continue; } - - final ICPPScope parent = (ICPPScope) cls.getCompositeScope(); - if (parent == null || parent instanceof CPPUnknownScope) - continue; - - if (!base.isVirtual() || !data.visited.containsKey(parent)) { + if (!base.isVirtual() || !data.visited.containsKey(classScope)) { if (base.isVirtual()) { - data.visited.put(parent); + data.visited.put(classScope); } //if the inheritanceChain already contains the parent, then that //is circular inheritance - if (!data.inheritanceChain.containsKey(parent)) { + if (!data.inheritanceChain.containsKey(classScope)) { //is this name define in this scope? - if (ASTInternal.isFullyCached(parent)) { + if (ASTInternal.isFullyCached(classScope)) { if (data.astName != null && !data.contentAssist) { - inherited = parent.getBinding(data.astName, true); + inherited = classScope.getBinding(data.astName, true); } else if (data.astName != null) { - inherited = parent.getBindings(data.astName, true, data.prefixLookup); + inherited = classScope.getBindings(data.astName, true, data.prefixLookup); } } else { - inherited = lookupInScope(data, parent, null); + inherited = lookupInScope(data, classScope, null); } if (inherited == null || data.contentAssist) { - Object temp = lookupInParents(data, parent); + Object temp = lookupInParents(data, classScope, overallScope); if (inherited != null) { inherited = mergePrefixResults(null, inherited, true); inherited = mergePrefixResults((CharArrayObjectMap)inherited, (CharArrayObjectMap)temp, true); @@ -1863,6 +1871,13 @@ public class CPPSemantics { functions[i]= null; continue; } + if (function instanceof ICPPUnknownBinding) { + if (def) { + functions[i]= null; + } + continue; + } + num = function.getParameters().length; // if there are m arguments in the list, all candidate functions having m parameters @@ -1981,21 +1996,27 @@ public class CPPSemantics { // Reduce our set of candidate functions to only those who have the right number of parameters reduceToViable(data, fns); - // deferred function instances cannot be disambiguated. - boolean deferredOnly= true; - for (int i = 0; deferredOnly && i < fns.length; i++) { - final IFunction f = fns[i]; - if (f != null && !(f instanceof ICPPDeferredTemplateInstance)) { - deferredOnly= false; - } - } - if (deferredOnly || data.forFunctionDeclaration()) { - for (IFunction fn : fns) { - if (fn != null) { - return fn; + int viableCount= 0; + IFunction firstViable= null; + for (IFunction f : fns) { + if (f != null) { + if (++viableCount == 1) { + firstViable= f; } } + } + if (firstViable == null) return null; + if (data.forFunctionDeclaration()) + return firstViable; + + + final IType[] sourceParameters = getSourceParameterTypes(data.functionParameters); // the parameters the function is being called with + if (CPPTemplates.containsDependentType(sourceParameters)) { + if (viableCount == 1) + return firstViable; + + return CPPUnknownFunction.createForSample(firstViable, data.astName); } IFunction bestFn = null; // the best function @@ -2016,7 +2037,6 @@ public class CPPSemantics { boolean currHasAmbiguousParam = false; // currFn has an ambiguous parameter conversion (ok if not bestFn) boolean bestHasAmbiguousParam = false; // bestFn has an ambiguous parameter conversion (not ok, ambiguous) - final IType[] sourceParameters = getSourceParameterTypes(data.functionParameters); // the parameters the function is being called with final boolean sourceVoid = (data.functionParameters == null || data.functionParameters.length == 0); final IType impliedObjectType = data.getImpliedObjectArgument(); @@ -2400,7 +2420,7 @@ public class CPPSemantics { IASTExpression owner = fieldReference.getFieldOwner(); IType result= CPPVisitor.getExpressionType(owner); - if (fieldReference.isPointerDereference()) { + if (fieldReference.isPointerDereference() && !(result instanceof ICPPUnknownType)) { IType type= getUltimateTypeUptoPointers(result); boolean needCheckClassMemberAccessOperator= true; if (type instanceof IPointerType) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index a2e0a3f246a..681bc0f17b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -103,7 +103,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPConstructorInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPConstructorSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPConstructorTemplateSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredClassInstance; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPDeferredFunctionInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFieldSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionSpecialization; @@ -126,6 +125,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedefSpecialization; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClassInstance; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownFunction; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPASTInternalTemplateDeclaration; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; @@ -135,6 +135,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalClassTemplate; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassInstance; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownClassType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; /** * Collection of static methods to perform template instantiation, member specialization and @@ -312,70 +313,25 @@ public class CPPTemplates { private static IBinding instantiateFunctionTemplate(ICPPFunctionTemplate template, ICPPTemplateArgument[] arguments) throws DOMException { - ICPPTemplateParameter[] parameters= template.getTemplateParameters(); - if (parameters == null || parameters.length == 0) - return null; - - final int numParams= parameters.length; - int numArgs = arguments.length; - - CPPTemplateParameterMap map = new CPPTemplateParameterMap(numParams); - ICPPTemplateParameter param = null; - ICPPTemplateArgument arg = null; - ICPPTemplateArgument[] actualArgs = new ICPPTemplateArgument[numParams]; - boolean argsContainDependentType = false; - - for (int i = 0; i < numParams; i++) { - arg= null; - param= parameters[i]; - - if (i < numArgs) { - arg= arguments[i]; - } else { - ICPPTemplateArgument defaultArg= param.getDefaultValue(); - if (defaultArg == null) { - return null; - } - arg= instantiateArgument(defaultArg, map, null); - } - - arg= CPPTemplates.matchTemplateParameterAndArgument(param, arg, map); - if (arg == null) - return null; - - if (!argIsParameter(arg, param)) { - map.put(param, arg); - } - actualArgs[i] = arg; - if (CPPTemplates.isDependentArgument(arg)) { - argsContainDependentType = true; - } - } - - if (argsContainDependentType) { - return deferredInstance(template, actualArgs); - } - ICPPTemplateInstance instance= getInstance(template, arguments); if (instance != null) { return instance; } - IBinding owner= template.getOwner(); - instance = CPPTemplates.createInstance(owner, template, map, actualArgs); - addInstance(template, actualArgs, instance); - return instance; - } + final int length = arguments.length; + ICPPTemplateParameter[] parameters= template.getTemplateParameters(); + if (parameters.length != length) + return null; - private static boolean argIsParameter(ICPPTemplateArgument arg, ICPPTemplateParameter param) { - if (param instanceof ICPPTemplateNonTypeParameter) { - return arg.isNonTypeValue() && Value.isTemplateParameter(arg.getNonTypeValue()) == param.getParameterID(); + CPPTemplateParameterMap map = new CPPTemplateParameterMap(length); + for (int i = 0; i < length; i++) { + map.put(parameters[i], arguments[i]); } - if (param instanceof IType) { - return arg.isTypeValue() && ((IType) param).isSameType(arg.getTypeValue()); - } - assert false; - return false; + + IBinding owner= template.getOwner(); + instance = CPPTemplates.createInstance(owner, template, map, arguments); + addInstance(template, arguments, instance); + return instance; } /** @@ -397,22 +353,14 @@ public class CPPTemplates { } } - private static IBinding deferredInstance(ICPPTemplateDefinition template, ICPPTemplateArgument[] arguments) throws DOMException { + private static IBinding deferredInstance(ICPPClassTemplate template, ICPPTemplateArgument[] arguments) throws DOMException { ICPPTemplateInstance instance= getInstance(template, arguments); if (instance != null) return instance; - if (template instanceof ICPPClassTemplate) { - instance = new CPPDeferredClassInstance((ICPPClassTemplate) template, arguments); - addInstance(template, arguments, instance); - return instance; - } - if (template instanceof ICPPFunctionTemplate) { - instance = new CPPDeferredFunctionInstance((ICPPFunctionTemplate) template, arguments); - addInstance(template, arguments, instance); - return instance; - } - return null; + instance = new CPPDeferredClassInstance(template, arguments); + addInstance(template, arguments, instance); + return instance; } /** @@ -603,14 +551,18 @@ public class CPPTemplates { IBinding result= null; IASTName templateName = id.getTemplateName(); IBinding template = templateName.resolveBinding(); - if (template instanceof ICPPUnknownClassInstance) { - // mstodo we should not get here, rather than that an unknown class - // should be made to an unknown class instance here - return template; - } + if (template instanceof ICPPConstructor) { template= template.getOwner(); } + + if (template instanceof ICPPUnknownClassType) { + IBinding owner= template.getOwner(); + if (owner instanceof ICPPUnknownBinding) { + ICPPTemplateArgument[] args= createTemplateArgumentArray(id); + return new CPPUnknownClassInstance((ICPPUnknownBinding) template.getOwner(), id, args); + } + } if (!(template instanceof ICPPClassTemplate) || template instanceof ICPPClassTemplatePartialSpecialization) return new ProblemBinding(id, IProblemBinding.SEMANTIC_INVALID_TYPE, templateName.toCharArray()); @@ -698,6 +650,7 @@ public class CPPTemplates { if (tmplArg == null) return null; + tmplArg= SemanticUtil.getSimplifiedArgument(tmplArg); map.put(tmplParam, tmplArg); result[i]= tmplArg; } @@ -1423,14 +1376,19 @@ public class CPPTemplates { return null; ICPPTemplateArgument[] templateArguments = ICPPTemplateArgument.EMPTY_ARGUMENTS; - if (name instanceof ICPPASTTemplateId) { - try { - templateArguments = createTemplateArgumentArray((ICPPASTTemplateId) name); - } catch (DOMException e) { - return new IFunction[0]; - } - } final IType[] fnArgs= createTypeArray(functionArguments); + try { + if (containsDependentType(fnArgs)) + return new IFunction[] {CPPUnknownFunction.createForSample(templates.keyAt(0), name)}; + + if (name instanceof ICPPASTTemplateId) { + templateArguments = createTemplateArgumentArray((ICPPASTTemplateId) name); + if (hasDependentArgument(templateArguments)) + return new IFunction[] {CPPUnknownFunction.createForSample(templates.keyAt(0), name)}; + } + } catch (DOMException e) { + return new IFunction[0]; + } IFunction[] instances= null; final int size = templates.size(); @@ -2042,18 +2000,24 @@ public class CPPTemplates { return Value.isDependentValue(arg.getNonTypeValue()); } + public static boolean containsDependentType(IType[] ts) { + for (IType t : ts) { + if (isDependentType(t)) + return true; + } + return false; + } + public static boolean isDependentType(IType t) { try { while (true) { - if (t instanceof ICPPTemplateParameter || t instanceof ICPPUnknownBinding) + if (t instanceof ICPPUnknownType) return true; + if (t instanceof ICPPFunctionType) { final ICPPFunctionType ft = (ICPPFunctionType) t; - IType[] types= ft.getParameterTypes(); - for (IType type : types) { - if (isDependentType(type)) - return true; - } + if (containsDependentType(ft.getParameterTypes())) + return true; t= ft.getReturnType(); } else if (t instanceof ICPPPointerToMemberType) { ICPPPointerToMemberType ptmt= (ICPPPointerToMemberType) t; @@ -2132,10 +2096,8 @@ public class CPPTemplates { } if (unknown instanceof ICPPUnknownClassInstance && result instanceof ICPPTemplateDefinition) { ICPPTemplateArgument[] newArgs = CPPTemplates.instantiateArguments(((ICPPUnknownClassInstance) unknown).getArguments(), tpMap, within); - if (result instanceof ICPPClassTemplate) + if (result instanceof ICPPClassTemplate) { result = instantiate((ICPPClassTemplate) result, newArgs); - else if (result instanceof ICPPFunctionTemplate) { - result= instantiateFunctionTemplate((ICPPFunctionTemplate) result, newArgs); } } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index 6a3fa8898c2..beb81cd9d42 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -173,6 +173,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPQualifierType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPReferenceType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTypedef; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownClass; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPPointerToMemberType; @@ -946,7 +947,7 @@ public class CPPVisitor extends ASTQueries { } else if (binding instanceof ICPPNamespace) { scope= ((ICPPNamespace)binding).getNamespaceScope(); } else if (binding instanceof ICPPUnknownBinding) { - scope= ((ICPPUnknownBinding)binding).getUnknownScope(); + scope= ((ICPPUnknownBinding)binding).asScope(); } else if (binding instanceof IProblemBinding) { if (binding instanceof ICPPScope) scope= (IScope) binding; @@ -971,6 +972,8 @@ public class CPPVisitor extends ASTQueries { } if (type instanceof ICPPClassType) { return ((ICPPClassType) type).getCompositeScope(); + } else if (type instanceof ICPPUnknownBinding) { + return ((ICPPUnknownBinding) type).asScope(); } } else if (parent instanceof IASTGotoStatement || parent instanceof IASTLabelStatement) { while (!(parent instanceof IASTFunctionDefinition)) { @@ -1786,6 +1789,8 @@ public class CPPVisitor extends ASTQueries { return ((ICPPTemplateNonTypeParameter) binding).getType(); } else if (binding instanceof ICPPClassType) { return ((ICPPClassType) binding); + } else if (binding instanceof ICPPUnknownBinding) { + return CPPUnknownClass.createUnnamedInstance(); } } catch (DOMException e) { return e.getProblem(); @@ -2004,6 +2009,8 @@ public class CPPVisitor extends ASTQueries { return ((IFunction)binding).getType(); else if (binding instanceof IEnumerator) return ((IEnumerator)binding).getType(); + else if (binding instanceof ICPPUnknownBinding) + return CPPUnknownClass.createUnnamedInstance(); } catch (DOMException e) { return e.getProblem(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index 7aafa326c8c..c7a2b55a519 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -33,7 +33,6 @@ import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTypeId; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; @@ -56,6 +55,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; @@ -95,7 +95,7 @@ class LookupData { public boolean typesOnly = false; public boolean considerConstructors = false; - public IBinding unknownBinding= null; + public ICPPClassType skippedScope; public Object foundItems = null; public Object[] functionParameters; public ICPPASTTemplateId templateId; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java index f88f4d3e8e5..4023700b25c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexCPPBindingConstants.java @@ -38,7 +38,6 @@ public interface IIndexCPPBindingConstants { int CPP_FUNCTION_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 21; int CPP_METHOD_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 22; int CPP_CONSTRUCTOR_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 23; - int CPP_DEFERRED_FUNCTION_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 24; int CPP_CLASS_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 25; int CPP_DEFERRED_CLASS_INSTANCE= IIndexBindingConstants.LAST_CONSTANT + 26; int CPP_PARAMETER_SPECIALIZATION= IIndexBindingConstants.LAST_CONSTANT + 27; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java index 9d35f19a1f3..8b447b8a946 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java @@ -29,7 +29,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; @@ -183,14 +182,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory { result = null; } else if (binding instanceof ICPPSpecialization) { if (binding instanceof ICPPTemplateInstance) { - if (binding instanceof ICPPDeferredTemplateInstance) { - if (binding instanceof ICPPDeferredClassInstance) { - return new CompositeCPPDeferredClassInstance(this, (ICPPDeferredClassInstance) findOneBinding(binding)); - } else if (binding instanceof ICPPFunction) { - return new CompositeCPPDeferredFunctionInstance(this, (ICPPFunction) binding); - } else { - throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ - } + if (binding instanceof ICPPDeferredClassInstance) { + return new CompositeCPPDeferredClassInstance(this, (ICPPDeferredClassInstance) findOneBinding(binding)); } else { if (binding instanceof ICPPClassType) { return new CompositeCPPClassInstance(this, (ICPPClassType) findOneBinding(binding)); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java index 1b45cdc1cc8..2e07eeca398 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredClassInstance.java @@ -57,7 +57,7 @@ public class CompositeCPPDeferredClassInstance extends CompositeCPPClassType imp return ((ICPPDeferredClassInstance) rbinding).getUnknownName(); } - public ICPPScope getUnknownScope() throws DOMException { + public ICPPScope asScope() throws DOMException { if (unknownScope == null) { unknownScope= new CompositeCPPUnknownScope(this, getUnknownName()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java deleted file mode 100644 index 893570d68c3..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPDeferredFunctionInstance.java +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2008 Symbian Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Andrew Ferguson (Symbian) - Initial implementation - * Markus Schorn (Wind River Systems) - *******************************************************************************/ -package org.eclipse.cdt.internal.core.index.composite.cpp; - -import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; -import org.eclipse.cdt.core.parser.util.ObjectMap; -import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; - -public class CompositeCPPDeferredFunctionInstance extends CompositeCPPFunction - implements ICPPDeferredTemplateInstance { - - public CompositeCPPDeferredFunctionInstance(ICompositesFactory cf, ICPPFunction rbinding) { - super(cf, rbinding); - } - - public ICPPTemplateDefinition getTemplateDefinition() { - return TemplateInstanceUtil.getTemplateDefinition(cf, rbinding); - } - - public IBinding getSpecializedBinding() { - return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); - } - - public ICPPTemplateArgument[] getTemplateArguments() { - return TemplateInstanceUtil.getTemplateArguments(cf, (ICPPTemplateInstance) rbinding); - } - - public ICPPTemplateParameterMap getTemplateParameterMap() { - return TemplateInstanceUtil.getTemplateParameterMap(cf, (ICPPTemplateInstance) rbinding); - } - - @Deprecated - public IType[] getArguments() { - return TemplateInstanceUtil.getArguments(cf, (ICPPTemplateInstance) rbinding); - } - - @Deprecated - public ObjectMap getArgumentMap() { - return TemplateInstanceUtil.getArgumentMap(cf, rbinding); - } -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java index 7c936536bb7..4096cffbba1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTemplateTypeParameter.java @@ -20,11 +20,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding - implements ICPPTemplateTypeParameter, ICPPUnknownBinding, IIndexType { + implements ICPPTemplateTypeParameter, ICPPUnknownBinding, ICPPUnknownType, IIndexType { private ICPPScope unknownScope; @@ -58,7 +59,7 @@ public class CompositeCPPTemplateTypeParameter extends CompositeCPPBinding fail(); return null; } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (unknownScope == null) { unknownScope= new CompositeCPPUnknownScope(this, getUnknownName()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java index 0b4a5c44e3e..bafff9b2c47 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPUnknownClassType.java @@ -125,7 +125,7 @@ class CompositeCPPUnknownClassType extends CompositeCPPBinding implements ICPPUn return ((ICPPClassType) rbinding).isSameType(type); } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (unknownScope == null) { unknownScope= new CompositeCPPUnknownScope(this, getUnknownName()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java index d905da1cf09..7298c6be8ae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMWriter.java @@ -39,7 +39,6 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; @@ -47,6 +46,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.index.IIndexFragmentFile; import org.eclipse.cdt.internal.core.index.IWritableIndex; import org.eclipse.cdt.internal.core.index.IWritableIndex.IncludeInformation; @@ -251,7 +251,7 @@ abstract public class PDOMWriter { } } else if (name.isReference()) { if (binding instanceof ICPPTemplateParameter || - binding instanceof ICPPDeferredTemplateInstance || + binding instanceof ICPPUnknownBinding || ((fSkipReferences & SKIP_TYPE_REFERENCES) != 0 && isTypeReferenceBinding(binding))) { if (!isRequiredReference(name)) { na[0]= null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java index c042be1da4b..8b410215ed4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java @@ -205,7 +205,7 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IPDOMBinding if (parent instanceof ICPPClassType) { return (IIndexScope) ((ICPPClassType) parent).getCompositeScope(); } else if (parent instanceof ICPPUnknownBinding) { - return (IIndexScope) ((ICPPUnknownBinding) parent).getUnknownScope(); + return (IIndexScope) ((ICPPUnknownBinding) parent).asScope(); } if (parent instanceof IIndexScope) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java index 90d31339d92..269a2e19d94 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredClassInstance.java @@ -170,7 +170,7 @@ class PDOMCPPDeferredClassInstance extends PDOMCPPSpecialization implements ICPP @Override public Object clone() {fail();return null;} - public ICPPScope getUnknownScope() throws DOMException { + public ICPPScope asScope() throws DOMException { if (unknownScope == null) { unknownScope= new PDOMCPPUnknownScope(this, getUnknownName()); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java deleted file mode 100644 index 356829ccb50..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPDeferredFunctionInstance.java +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007 QNX Software Systems and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * QNX - Initial API and implementation - *******************************************************************************/ -package org.eclipse.cdt.internal.core.pdom.dom.cpp; - -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; -import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; -import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; -import org.eclipse.core.runtime.CoreException; - -/** - * @author Bryan Wilkinson - * - */ -class PDOMCPPDeferredFunctionInstance extends PDOMCPPFunctionInstance - implements ICPPDeferredTemplateInstance { - - /** - * The size in bytes of a PDOMCPPDeferredFunctionInstance record in the database. - */ - @SuppressWarnings("hiding") - protected static final int RECORD_SIZE = PDOMCPPFunctionInstance.RECORD_SIZE + 0; - - public PDOMCPPDeferredFunctionInstance(PDOM pdom, PDOMNode parent, ICPPFunction function, PDOMBinding instantiated) - throws CoreException { - super(pdom, parent, function, instantiated); - } - - public PDOMCPPDeferredFunctionInstance(PDOM pdom, int bindingRecord) { - super(pdom, bindingRecord); - } - - @Override - protected int getRecordSize() { - return RECORD_SIZE; - } - - @Override - public int getNodeType() { - return IIndexCPPBindingConstants.CPP_DEFERRED_FUNCTION_INSTANCE; - } -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index bdc16ae0005..71747bd3b2d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -44,7 +44,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; 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.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; @@ -385,10 +384,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { private PDOMBinding createSpecialization(PDOMNode parent, PDOMBinding orig, IBinding special) throws CoreException { PDOMBinding result= null; - if (special instanceof ICPPDeferredTemplateInstance) { - if (special instanceof ICPPFunction && orig instanceof ICPPFunctionTemplate) { - result= new PDOMCPPDeferredFunctionInstance(pdom, parent, (ICPPFunction) special, orig); - } else if (special instanceof ICPPDeferredClassInstance && orig instanceof ICPPClassTemplate) { + if (special instanceof ICPPDeferredClassInstance) { + if (orig instanceof ICPPClassTemplate) { result= new PDOMCPPDeferredClassInstance(pdom, parent, (ICPPDeferredClassInstance) special, orig); } } else if (special instanceof ICPPTemplateInstance) { @@ -476,14 +473,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { @Override public int getBindingType(IBinding binding) { if (binding instanceof ICPPSpecialization) { - if (binding instanceof ICPPDeferredTemplateInstance) { - if (binding instanceof ICPPFunction) { - return CPP_DEFERRED_FUNCTION_INSTANCE; - } else if (binding instanceof ICPPClassType) { + if (binding instanceof ICPPTemplateInstance) { + if (binding instanceof ICPPDeferredClassInstance) { return CPP_DEFERRED_CLASS_INSTANCE; - } - } else if (binding instanceof ICPPTemplateInstance) { - if (binding instanceof ICPPConstructor) { + } else if (binding instanceof ICPPConstructor) { return CPP_CONSTRUCTOR_INSTANCE; } else if (binding instanceof ICPPMethod) { return CPP_METHOD_INSTANCE; @@ -800,8 +793,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants { return new PDOMCPPMethodInstance(pdom, record); case CPP_CONSTRUCTOR_INSTANCE: return new PDOMCPPConstructorInstance(pdom, record); - case CPP_DEFERRED_FUNCTION_INSTANCE: - return new PDOMCPPDeferredFunctionInstance(pdom, record); case CPP_CLASS_INSTANCE: return new PDOMCPPClassInstance(pdom, record); case CPP_DEFERRED_CLASS_INSTANCE: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java index c41d3410c9c..0c89c031f45 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTemplateTypeParameter.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTName; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -39,7 +40,7 @@ import org.eclipse.core.runtime.CoreException; * Binding for template type parameters in the index. */ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMemberOwner, - ICPPTemplateTypeParameter, ICPPUnknownBinding, IIndexType { + ICPPTemplateTypeParameter, ICPPUnknownBinding, ICPPUnknownType, IIndexType { private static final int DEFAULT_TYPE = PDOMCPPBinding.RECORD_SIZE + 0; private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 4; @@ -161,7 +162,7 @@ class PDOMCPPTemplateTypeParameter extends PDOMCPPBinding implements IPDOMMember public Object clone() { fail(); return null; } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (fUnknownScope == null) { fUnknownScope= new PDOMCPPUnknownScope(this, new CPPASTName(getNameCharArray())); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java index 6d6de0badb9..81bca2dac65 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPUnknownClassType.java @@ -122,7 +122,7 @@ class PDOMCPPUnknownClassType extends PDOMCPPBinding implements ICPPClassScope, return this; } - public ICPPScope getUnknownScope() { + public ICPPScope asScope() { if (unknownScope == null) { unknownScope= new PDOMCPPUnknownScope(this, getUnknownName()); } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java index a937a22ceee..77a50c6f3eb 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/indexview/IndexLabelProvider.java @@ -32,7 +32,6 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument; @@ -43,6 +42,7 @@ import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.ui.CUIPlugin; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; @@ -93,7 +93,7 @@ public class IndexLabelProvider extends LabelProvider { if (element instanceof ICPPTemplateInstance) { StringBuffer buffer = null; - if (element instanceof ICPPDeferredTemplateInstance) { + if (element instanceof ICPPDeferredClassInstance) { buffer = new StringBuffer("Dfrd: "); //$NON-NLS-1$ } else { buffer = new StringBuffer("Inst: "); //$NON-NLS-1$