blob: daf5a78e4cb4c562b3ecc52c2d3a128edc6aa55e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 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.c;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.parser.util.CharArrayMap;
/**
* Utility to map index bindings to ast bindings.
*/
public class CStructMapper {
private class Visitor extends ASTVisitor {
Visitor() {
shouldVisitDeclarations= true;
}
@Override
public int visit(IASTDeclaration declaration) {
if (declaration instanceof IASTSimpleDeclaration) {
IASTDeclSpecifier declspec = ((IASTSimpleDeclaration) declaration).getDeclSpecifier();
if (declspec instanceof IASTCompositeTypeSpecifier) {
IASTCompositeTypeSpecifier cts= (IASTCompositeTypeSpecifier) declspec;
final IASTName name = cts.getName();
final char[] nameChars = name.toCharArray();
if (nameChars.length > 0) {
fStructs.put(nameChars, name);
}
return PROCESS_CONTINUE;
}
}
return PROCESS_SKIP;
}
}
private final IASTTranslationUnit fTranslationUnit;
protected CharArrayMap<IASTName> fStructs;
public CStructMapper(IASTTranslationUnit tu) {
fTranslationUnit= tu;
}
public ICompositeType mapToAST(ICompositeType type) {
if (fStructs == null) {
fStructs= new CharArrayMap<IASTName>();
fTranslationUnit.accept(new Visitor());
}
IASTName name= fStructs.get(type.getNameCharArray());
if (name != null) {
IBinding b= name.resolveBinding();
if (b instanceof ICompositeType) {
final ICompositeType mapped = (ICompositeType) b;
if (mapped.isSameType(type)) {
return mapped;
}
}
}
return type;
}
}