From 88a41df6979c2ff8c30179d4ec5256def4a413c9 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Thu, 8 Nov 2012 14:48:06 -0800 Subject: [PATCH] Preservation of typedefs in template arguments. --- .../cdt/core/parser/tests/ast2/AST2CPPTests.java | 6 ++++-- .../org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java | 3 ++- .../core/dom/ast/cpp/ICPPTemplateArgument.java | 11 ++++++++++- .../parser/cpp/CPPTemplateNonTypeArgument.java | 5 +++++ .../dom/parser/cpp/CPPTemplateTypeArgument.java | 15 +++++++++++++-- .../dom/parser/cpp/semantics/SemanticUtil.java | 2 +- .../org/eclipse/cdt/internal/core/pdom/PDOM.java | 1 + .../internal/core/pdom/db/TypeMarshalBuffer.java | 5 ++++- .../text/contentassist2/CompletionTests.java | 4 ++-- 9 files changed, 42 insertions(+), 10 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 33d4ff663f6..e96b9aa9d58 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -4801,14 +4801,16 @@ public class AST2CPPTests extends AST2BaseTest { // const_iterator begin() const; // }; // - // void test(const vector& v) { + // typedef int Element; + // + // void test(const vector& v) { // auto it = v.begin(); // } public void testTypedefPreservation_380498_2() throws Exception { BindingAssertionHelper ba= getAssertionHelper(); ICPPVariable it = ba.assertNonProblem("it =", "it", ICPPVariable.class); assertTrue(it.getType() instanceof ITypedef); - assertEquals("vector::const_iterator", ASTTypeUtil.getType(it.getType(), false)); + assertEquals("vector::const_iterator", ASTTypeUtil.getType(it.getType(), false)); } // int f() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java index 7e7bf4c563c..9ee61237749 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTTypeUtil.java @@ -183,7 +183,8 @@ public class ASTTypeUtil { if (val != null) { buf.append(val.getSignature()); } else { - appendType(arg.getTypeValue(), normalize, buf); + IType type = normalize ? arg.getTypeValue() : arg.getOriginalTypeValue(); + appendType(type, normalize, buf); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java index 9b7df3fb1c5..95e8872e130 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPTemplateArgument.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2009 Wind River Systems, Inc. and others. + * Copyright (c) 2008, 2012 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 @@ -7,6 +7,7 @@ * * Contributors: * Markus Schorn - initial API and implementation + * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.core.dom.ast.cpp; @@ -40,9 +41,17 @@ public interface ICPPTemplateArgument { * If this is a type value (suitable for a template type and template template parameters), * the type used as a value is returned. * For non-type values, null is returned. + * The returned type has all typedefs resolved. */ IType getTypeValue(); + /** + * Similar to {@link #getTypeValue()} but returns the original type value before typedef + * resolution. + * @noreference This method is not intended to be referenced by clients. + */ + IType getOriginalTypeValue(); + /** * If this is a non-type value (suitable for a template non-type parameters), * the evaluation object is returned. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java index bcc2bc0ff19..73129221962 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateNonTypeArgument.java @@ -48,6 +48,11 @@ public class CPPTemplateNonTypeArgument implements ICPPTemplateArgument { return false; } + @Override + public IType getOriginalTypeValue() { + return null; + } + @Override public boolean isNonTypeValue() { return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java index 1806a7d99ec..74ba0fd6340 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateTypeArgument.java @@ -22,10 +22,16 @@ import org.eclipse.core.runtime.Assert; */ public class CPPTemplateTypeArgument implements ICPPTemplateArgument { private final IType fType; + private final IType fOriginalType; public CPPTemplateTypeArgument(IType type) { - Assert.isNotNull(type); - fType= type; + this(type, type); + } + + public CPPTemplateTypeArgument(IType simplifiedType, IType originalType) { + Assert.isNotNull(simplifiedType); + fType= simplifiedType; + fOriginalType= originalType; } @Override @@ -43,6 +49,11 @@ public class CPPTemplateTypeArgument implements ICPPTemplateArgument { return fType; } + @Override + public IType getOriginalTypeValue() { + return fOriginalType; + } + @Override public ICPPEvaluation getNonTypeEvaluation() { return null; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java index e3aa691c27c..6921ea4348d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/SemanticUtil.java @@ -515,7 +515,7 @@ public class SemanticUtil { final IType type= arg.getTypeValue(); final IType newType= getSimplifiedType(type); if (newType != type) { - return new CPPTemplateTypeArgument(newType); + return new CPPTemplateTypeArgument(newType, arg.getOriginalTypeValue()); } } return arg; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index c5565175311..747b26cef37 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -217,6 +217,7 @@ public class PDOM extends PlatformObject implements IPDOM { * 123.0 - Combined file size and encoding hash code. * 124.0 - GCC attributes and NO_RETURN flag for functions. * #125.0# - Indexes for unresolved includes and files indexed with I/O errors. <> +<<<<<<< cdt_8_1 <<<<<<< cdt_8_1 * 126.0 - Dependent expressions, bug 299911. * 127.0 - Explicit virtual overrides, bug 380623. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java index ec1c02b650e..82ff86be4ba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/TypeMarshalBuffer.java @@ -190,6 +190,7 @@ public class TypeMarshalBuffer implements ITypeMarshalBuffer { arg.getNonTypeEvaluation().marshal(this, true); } else { marshalType(arg.getTypeValue()); + marshalType(arg.getOriginalTypeValue()); } } @@ -200,7 +201,9 @@ public class TypeMarshalBuffer implements ITypeMarshalBuffer { return new CPPTemplateNonTypeArgument((ICPPEvaluation) unmarshalEvaluation(), null); } else { fPos--; - return new CPPTemplateTypeArgument(unmarshalType()); + IType type = unmarshalType(); + IType originalType = unmarshalType(); + return new CPPTemplateTypeArgument(type, originalType); } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index 0bcba3b64f0..49b0c3e24b3 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2011 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2012 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 @@ -1328,7 +1328,7 @@ public class CompletionTests extends AbstractContentAssistTest { // v.push_back(/*cursor*/); // } public void testTypedefSpecialization_Bug307818() throws Exception { - final String[] expected= { "push_back(const vector::value_type & value) : void" }; + final String[] expected= { "push_back(const vector::value_type & value) : void" }; assertParameterHint(expected); }