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

Bug 321972 - DeclarationGenerator discards basic type qualifiers ( Tomasz Wesolowski)

This commit is contained in:
Alena Laskavaia 2010-08-11 02:30:49 +00:00
parent 2828f69a77
commit 78fdb615a6

View file

@ -1,309 +1,316 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2010 Tomasz Wesolowski * Copyright (c) 2010 Tomasz Wesolowski
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Tomasz Wesolowski - initial API and implementation * Tomasz Wesolowski - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.rewrite; package org.eclipse.cdt.internal.core.dom.rewrite;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointer; import org.eclipse.cdt.core.dom.ast.IASTPointer;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.INodeFactory;
import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IQualifierType; import org.eclipse.cdt.core.dom.ast.IQualifierType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPPointerToMemberType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.rewrite.DeclarationGenerator; import org.eclipse.cdt.core.dom.rewrite.DeclarationGenerator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/** /**
* *
* @author Tomasz Wesolowski * @author Tomasz Wesolowski
* *
*/ */
public class DeclarationGeneratorImpl extends DeclarationGenerator { public class DeclarationGeneratorImpl extends DeclarationGenerator {
private INodeFactory factory; private INodeFactory factory;
/** /**
* Creates a new generator using the given factory. * Creates a new generator using the given factory.
* *
* @param factory * @param factory
* a factory to use. If a C++ type is requested, it has to be an instance of * a factory to use. If a C++ type is requested, it has to be an instance of
* {@link ICPPNodeFactory}. * {@link ICPPNodeFactory}.
*/ */
public DeclarationGeneratorImpl(INodeFactory factory) { public DeclarationGeneratorImpl(INodeFactory factory) {
this.factory = factory; this.factory = factory;
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see * @see
* org.eclipse.cdt.core.dom.rewrite.IDeclarationGenerator#createDeclSpecFromType(org.eclipse.cdt.core. * org.eclipse.cdt.core.dom.rewrite.IDeclarationGenerator#createDeclSpecFromType(org.eclipse.cdt.core.
* dom.ast.IType) * dom.ast.IType)
*/ */
@Override @Override
public IASTDeclSpecifier createDeclSpecFromType(IType type) { public IASTDeclSpecifier createDeclSpecFromType(IType type) {
IASTDeclSpecifier returnedDeclSpec = null; IASTDeclSpecifier returnedDeclSpec = null;
if (type instanceof IPointerType) { if (type instanceof IPointerType) {
IType inner = ((IPointerType) type).getType(); IType inner = ((IPointerType) type).getType();
returnedDeclSpec = createDeclSpecFromType(inner); returnedDeclSpec = createDeclSpecFromType(inner);
} else if (type instanceof ICPPReferenceType) { } else if (type instanceof ICPPReferenceType) {
IType inner = ((ICPPReferenceType) type).getType(); IType inner = ((ICPPReferenceType) type).getType();
returnedDeclSpec = createDeclSpecFromType(inner); returnedDeclSpec = createDeclSpecFromType(inner);
} else if (type instanceof IArrayType) { } else if (type instanceof IArrayType) {
IType inner = ((IArrayType) type).getType(); IType inner = ((IArrayType) type).getType();
returnedDeclSpec = createDeclSpecFromType(inner); returnedDeclSpec = createDeclSpecFromType(inner);
} else if (type instanceof IFunctionType) { } else if (type instanceof IFunctionType) {
IType inner = ((IFunctionType) type).getReturnType(); IType inner = ((IFunctionType) type).getReturnType();
returnedDeclSpec = createDeclSpecFromType(inner); returnedDeclSpec = createDeclSpecFromType(inner);
} else if (type instanceof IQualifierType) { } else if (type instanceof IQualifierType) {
IType inner = ((IQualifierType) type).getType(); IType inner = ((IQualifierType) type).getType();
returnedDeclSpec = createDeclSpecFromType(inner); returnedDeclSpec = createDeclSpecFromType(inner);
if (((IQualifierType) type).isConst()) { if (((IQualifierType) type).isConst()) {
returnedDeclSpec.setConst(true); returnedDeclSpec.setConst(true);
} }
if (((IQualifierType) type).isVolatile()) { if (((IQualifierType) type).isVolatile()) {
returnedDeclSpec.setVolatile(true); returnedDeclSpec.setVolatile(true);
} }
} else if (type instanceof IBasicType) { } else if (type instanceof IBasicType) {
Kind kind = ((IBasicType) type).getKind(); IBasicType basicType = (IBasicType) type;
IASTSimpleDeclSpecifier declSpec = factory.newSimpleDeclSpecifier(); IASTSimpleDeclSpecifier declSpec = factory.newSimpleDeclSpecifier();
declSpec.setType(kind); declSpec.setType(basicType.getKind());
returnedDeclSpec = declSpec; declSpec.setComplex(basicType.isComplex());
} else if (type instanceof IBinding) { /* ITypedef, ICompositeType... */ declSpec.setImaginary(basicType.isImaginary());
// BTW - we need to distinguish (and fail explicitly) on literal composites like: declSpec.setShort(basicType.isShort());
// struct { } aSingleInstance; declSpec.setLong(basicType.isLong());
returnedDeclSpec = getDeclSpecForBinding((IBinding) type); declSpec.setLongLong(basicType.isLongLong());
} declSpec.setSigned(basicType.isSigned());
declSpec.setUnsigned(basicType.isUnsigned());
// Fallback... returnedDeclSpec = declSpec;
if (returnedDeclSpec == null) { } else if (type instanceof IBinding) { /* ITypedef, ICompositeType... */
IASTSimpleDeclSpecifier specifier = factory.newSimpleDeclSpecifier(); // BTW - we need to distinguish (and fail explicitly) on literal composites like:
specifier.setType(Kind.eVoid); // struct { } aSingleInstance;
returnedDeclSpec = specifier; returnedDeclSpec = getDeclSpecForBinding((IBinding) type);
} }
return returnedDeclSpec;
} // Fallback...
if (returnedDeclSpec == null) {
/* IASTSimpleDeclSpecifier specifier = factory.newSimpleDeclSpecifier();
* (non-Javadoc) specifier.setType(Kind.eVoid);
* returnedDeclSpec = specifier;
* @see }
* org.eclipse.cdt.core.dom.rewrite.IDeclarationGenerator#createDeclaratorFromType(org.eclipse.cdt.core return returnedDeclSpec;
* .dom.ast.IType, char[]) }
*/
@Override /*
public IASTDeclarator createDeclaratorFromType(IType type, char[] name) { * (non-Javadoc)
*
IASTDeclarator returnedDeclarator = null; * @see
* org.eclipse.cdt.core.dom.rewrite.IDeclarationGenerator#createDeclaratorFromType(org.eclipse.cdt.core
try { * .dom.ast.IType, char[])
*/
// Addition of pointer operators has to be in reverse order, so it's deferred until the end @Override
Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap = new HashMap<IASTDeclarator, LinkedList<IASTPointerOperator>>(); public IASTDeclarator createDeclaratorFromType(IType type, char[] name) {
IASTName newName = (name != null) ? factory.newName(name) : factory.newName(); IASTDeclarator returnedDeclarator = null;
// If the type is an array of something, create a declaration of a pointer to something instead try {
// (to allow assignment, etc)
// Addition of pointer operators has to be in reverse order, so it's deferred until the end
boolean replaceInitialArrayWithPointer = true; Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap = new HashMap<IASTDeclarator, LinkedList<IASTPointerOperator>>();
// If the type is a function, create a declaration of a pointer to this function IASTName newName = (name != null) ? factory.newName(name) : factory.newName();
// (shorthand notation for function address)
// If the type is an array of something, create a declaration of a pointer to something instead
boolean changeInitialFunctionToFuncPtr = true; // (to allow assignment, etc)
while (typeNeedsNontrivialDeclarator(type)) { boolean replaceInitialArrayWithPointer = true;
if (replaceInitialArrayWithPointer && type instanceof IArrayType) {
returnedDeclarator = factory.newDeclarator(newName); // If the type is a function, create a declaration of a pointer to this function
returnedDeclarator.addPointerOperator(factory.newPointer()); // (shorthand notation for function address)
type = ((IArrayType) type).getType();
} else if (changeInitialFunctionToFuncPtr && type instanceof IFunctionType) { boolean changeInitialFunctionToFuncPtr = true;
returnedDeclarator = factory.newDeclarator(newName);
returnedDeclarator.addPointerOperator(factory.newPointer()); while (typeNeedsNontrivialDeclarator(type)) {
// leave type as it is, next iteration will handle the function if (replaceInitialArrayWithPointer && type instanceof IArrayType) {
} else if (type instanceof IArrayType) { returnedDeclarator = factory.newDeclarator(newName);
IArrayType arrayType = (IArrayType) type; returnedDeclarator.addPointerOperator(factory.newPointer());
IASTArrayDeclarator arrayDeclarator = factory.newArrayDeclarator(null); type = ((IArrayType) type).getType();
if (returnedDeclarator == null) { } else if (changeInitialFunctionToFuncPtr && type instanceof IFunctionType) {
arrayDeclarator.setName(newName); returnedDeclarator = factory.newDeclarator(newName);
} else { returnedDeclarator.addPointerOperator(factory.newPointer());
arrayDeclarator.setNestedDeclarator(returnedDeclarator); // leave type as it is, next iteration will handle the function
arrayDeclarator.setName(factory.newName()); } else if (type instanceof IArrayType) {
} IArrayType arrayType = (IArrayType) type;
// consume all immediately following array expressions IASTArrayDeclarator arrayDeclarator = factory.newArrayDeclarator(null);
while (type instanceof IArrayType) { if (returnedDeclarator == null) {
arrayType = (IArrayType) type; arrayDeclarator.setName(newName);
IASTExpression arraySizeExpression = arrayType.getArraySizeExpression(); } else {
arrayDeclarator.addArrayModifier(factory.newArrayModifier(arraySizeExpression == null arrayDeclarator.setNestedDeclarator(returnedDeclarator);
? null : arraySizeExpression.copy())); arrayDeclarator.setName(factory.newName());
type = arrayType.getType(); }
} // consume all immediately following array expressions
returnedDeclarator = arrayDeclarator; while (type instanceof IArrayType) {
} else if (isPtrOrRefType(type)) { arrayType = (IArrayType) type;
if (returnedDeclarator == null) { IASTExpression arraySizeExpression = arrayType.getArraySizeExpression();
returnedDeclarator = factory.newDeclarator(newName); arrayDeclarator.addArrayModifier(factory.newArrayModifier(arraySizeExpression == null
} ? null : arraySizeExpression.copy()));
IASTPointerOperator ptrOp = createPointerOperator(type); type = arrayType.getType();
addPointerOperatorDeferred(pointerOperatorMap, returnedDeclarator, ptrOp); }
type = getPtrOrRefSubtype(type); returnedDeclarator = arrayDeclarator;
} else if (type instanceof IFunctionType) { } else if (isPtrOrRefType(type)) {
IFunctionType funcType = (IFunctionType) type; if (returnedDeclarator == null) {
IASTStandardFunctionDeclarator func = factory.newFunctionDeclarator(null); returnedDeclarator = factory.newDeclarator(newName);
for (IType paramType : funcType.getParameterTypes()) { }
IASTDeclSpecifier declspec = createDeclSpecFromType(paramType); IASTPointerOperator ptrOp = createPointerOperator(type);
IASTDeclarator declarator = null; addPointerOperatorDeferred(pointerOperatorMap, returnedDeclarator, ptrOp);
if (typeNeedsNontrivialDeclarator(paramType)) { type = getPtrOrRefSubtype(type);
declarator = createDeclaratorFromType(paramType, null); } else if (type instanceof IFunctionType) {
} else { IFunctionType funcType = (IFunctionType) type;
declarator = factory.newDeclarator(factory.newName()); IASTStandardFunctionDeclarator func = factory.newFunctionDeclarator(null);
} for (IType paramType : funcType.getParameterTypes()) {
IASTParameterDeclaration parameterDeclaration = factory.newParameterDeclaration( IASTDeclSpecifier declspec = createDeclSpecFromType(paramType);
declspec, declarator); IASTDeclarator declarator = null;
func.addParameterDeclaration(parameterDeclaration); if (typeNeedsNontrivialDeclarator(paramType)) {
} declarator = createDeclaratorFromType(paramType, null);
if (returnedDeclarator == null) { } else {
func.setName(newName); declarator = factory.newDeclarator(factory.newName());
} else { }
func.setNestedDeclarator(returnedDeclarator); IASTParameterDeclaration parameterDeclaration = factory.newParameterDeclaration(
func.setName(factory.newName()); declspec, declarator);
} func.addParameterDeclaration(parameterDeclaration);
returnedDeclarator = func; }
type = funcType.getReturnType(); if (returnedDeclarator == null) {
} func.setName(newName);
replaceInitialArrayWithPointer = false; } else {
changeInitialFunctionToFuncPtr = false; func.setNestedDeclarator(returnedDeclarator);
} func.setName(factory.newName());
}
finalizePointerOperators(pointerOperatorMap); returnedDeclarator = func;
type = funcType.getReturnType();
} catch (DOMException e) { }
e.printStackTrace(); replaceInitialArrayWithPointer = false;
} changeInitialFunctionToFuncPtr = false;
}
// Fallback
if (returnedDeclarator == null) { finalizePointerOperators(pointerOperatorMap);
returnedDeclarator = factory.newDeclarator(factory.newName(name));
} } catch (DOMException e) {
e.printStackTrace();
return returnedDeclarator; }
}
// Fallback
private void finalizePointerOperators( if (returnedDeclarator == null) {
Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap) { returnedDeclarator = factory.newDeclarator(factory.newName(name));
for (IASTDeclarator declarator : pointerOperatorMap.keySet()) { }
LinkedList<IASTPointerOperator> list = pointerOperatorMap.get(declarator);
for (IASTPointerOperator op : list) { return returnedDeclarator;
declarator.addPointerOperator(op); }
}
} private void finalizePointerOperators(
} Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap) {
for (IASTDeclarator declarator : pointerOperatorMap.keySet()) {
private void addPointerOperatorDeferred( LinkedList<IASTPointerOperator> list = pointerOperatorMap.get(declarator);
Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap, for (IASTPointerOperator op : list) {
IASTDeclarator returnedDeclarator, IASTPointerOperator ptrOp) { declarator.addPointerOperator(op);
LinkedList<IASTPointerOperator> list; }
if (!pointerOperatorMap.containsKey(returnedDeclarator)) { }
list = new LinkedList<IASTPointerOperator>(); }
pointerOperatorMap.put(returnedDeclarator, list);
} else { private void addPointerOperatorDeferred(
list = pointerOperatorMap.get(returnedDeclarator); Map<IASTDeclarator, LinkedList<IASTPointerOperator>> pointerOperatorMap,
} IASTDeclarator returnedDeclarator, IASTPointerOperator ptrOp) {
list.addFirst(ptrOp); LinkedList<IASTPointerOperator> list;
} if (!pointerOperatorMap.containsKey(returnedDeclarator)) {
list = new LinkedList<IASTPointerOperator>();
private IType getPtrOrRefSubtype(IType type) { pointerOperatorMap.put(returnedDeclarator, list);
if (type instanceof IPointerType) { } else {
return ((IPointerType) type).getType(); list = pointerOperatorMap.get(returnedDeclarator);
} else { }
return ((ICPPReferenceType) type).getType(); list.addFirst(ptrOp);
} }
}
private IType getPtrOrRefSubtype(IType type) {
private IASTPointerOperator createPointerOperator(IType type) { if (type instanceof IPointerType) {
if (type instanceof ICPPPointerToMemberType) { return ((IPointerType) type).getType();
String classStr = ASTTypeUtil.getType(((ICPPPointerToMemberType) type).getMemberOfClass()); } else {
IASTName newName = factory.newName((classStr + "::").toCharArray()); //$NON-NLS-1$ return ((ICPPReferenceType) type).getType();
// any better way of getting class name from ICPPPointerToMemberType? }
}
ICPPASTPointerToMember member = ((ICPPNodeFactory) factory).newPointerToMember(newName);
member.setConst(((ICPPPointerToMemberType) type).isConst()); private IASTPointerOperator createPointerOperator(IType type) {
member.setVolatile(((ICPPPointerToMemberType) type).isVolatile()); if (type instanceof ICPPPointerToMemberType) {
return member; String classStr = ASTTypeUtil.getType(((ICPPPointerToMemberType) type).getMemberOfClass());
} else if (type instanceof IPointerType) { IASTName newName = factory.newName((classStr + "::").toCharArray()); //$NON-NLS-1$
IASTPointer pointer = factory.newPointer(); // any better way of getting class name from ICPPPointerToMemberType?
pointer.setConst(((IPointerType) type).isConst());
pointer.setVolatile(((IPointerType) type).isVolatile()); ICPPASTPointerToMember member = ((ICPPNodeFactory) factory).newPointerToMember(newName);
return pointer; member.setConst(((ICPPPointerToMemberType) type).isConst());
} else { member.setVolatile(((ICPPPointerToMemberType) type).isVolatile());
ICPPReferenceType refType = (ICPPReferenceType) type; return member;
ICPPASTReferenceOperator op = ((ICPPNodeFactory) factory).newReferenceOperator(refType } else if (type instanceof IPointerType) {
.isRValueReference()); IASTPointer pointer = factory.newPointer();
return op; pointer.setConst(((IPointerType) type).isConst());
} pointer.setVolatile(((IPointerType) type).isVolatile());
} return pointer;
} else {
private boolean isPtrOrRefType(IType type) { ICPPReferenceType refType = (ICPPReferenceType) type;
return type instanceof IPointerType || type instanceof ICPPReferenceType; ICPPASTReferenceOperator op = ((ICPPNodeFactory) factory).newReferenceOperator(refType
} .isRValueReference());
return op;
private boolean typeNeedsNontrivialDeclarator(IType type) { }
return isPtrOrRefType(type) || type instanceof IArrayType || type instanceof IFunctionType; }
}
private boolean isPtrOrRefType(IType type) {
private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) { return type instanceof IPointerType || type instanceof ICPPReferenceType;
}
char[][] qualifiedNameCharArray = CPPVisitor.getQualifiedNameCharArray(binding);
if (qualifiedNameCharArray.length > 1) { private boolean typeNeedsNontrivialDeclarator(IType type) {
return isPtrOrRefType(type) || type instanceof IArrayType || type instanceof IFunctionType;
ICPPASTQualifiedName name = ((ICPPNodeFactory) factory).newQualifiedName(); }
for (char[] cs : qualifiedNameCharArray) {
name.addName(factory.newName(cs)); private IASTNamedTypeSpecifier getDeclSpecForBinding(IBinding binding) {
}
return factory.newTypedefNameSpecifier(name); char[][] qualifiedNameCharArray = CPPVisitor.getQualifiedNameCharArray(binding);
if (qualifiedNameCharArray.length > 1) {
} else if (qualifiedNameCharArray.length == 1) {
IASTName name = factory.newName(qualifiedNameCharArray[0]); ICPPASTQualifiedName name = ((ICPPNodeFactory) factory).newQualifiedName();
return factory.newTypedefNameSpecifier(name); for (char[] cs : qualifiedNameCharArray) {
} else { name.addName(factory.newName(cs));
IASTName name = factory.newName(binding.getName().toCharArray()); }
return factory.newTypedefNameSpecifier(name); return factory.newTypedefNameSpecifier(name);
}
} } else if (qualifiedNameCharArray.length == 1) {
IASTName name = factory.newName(qualifiedNameCharArray[0]);
return factory.newTypedefNameSpecifier(name);
} else {
IASTName name = factory.newName(binding.getName().toCharArray());
return factory.newTypedefNameSpecifier(name);
}
}
} }