blob: d4c9c6cf304facfabd4740e02148198323e6b21d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.lrparser.c99.action.deprecated;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.bindings.C99PointerType;
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
import lpg.lpgjavaruntime.IToken;
/**
* Represents a frame on the declaration stack used by the resolver actions.
*
* TODO: document this class better
*
* @author Mike Kucera
*/
@SuppressWarnings("restriction")
public class DeclaratorFrame {
private DeclSpec declSpec;
//IBinding declarator;
private IToken declaratorName;
private boolean isDeclaratorBracketed;
private boolean isFunctionDeclarator = false;
// temporary storage for pointer modifiers
private LinkedList<LinkedList<C99PointerType>> pointerModifiers = new LinkedList<>();
// stores pointer and array modifiers that are applied to the declarator
private LinkedList<ITypeContainer> typeModifiers = new LinkedList<>();
private LinkedList<IBinding> nestedDeclarations = new LinkedList<>();
public DeclaratorFrame() {
}
public DeclaratorFrame(DeclSpec declSpec) {
this.declSpec = declSpec;
}
public DeclSpec getDeclSpec() {
if (declSpec == null)
declSpec = new DeclSpec();
return declSpec;
}
public IType getDeclaratorType() {
// the declSpec may be null, so use getDeclSpec()
IType baseType = getDeclSpec().getType();
if (typeModifiers.isEmpty())
return baseType;
IType type = typeModifiers.get(0);
// link the types together
for (int i = 1; i < typeModifiers.size(); i++) {
ITypeContainer t1 = typeModifiers.get(i - 1);
ITypeContainer t2 = typeModifiers.get(i);
t1.setType(t2);
}
ITypeContainer last = typeModifiers.get(typeModifiers.size() - 1);
last.setType(baseType);
return type;
}
public IToken getDeclaratorName() {
return declaratorName;
}
public void setDeclaratorName(IToken declaratorName) {
this.declaratorName = declaratorName;
}
public boolean isDeclaratorBracketed() {
return isDeclaratorBracketed;
}
public void setDeclaratorBracketed(boolean isDeclaratorBracketed) {
this.isDeclaratorBracketed = isDeclaratorBracketed;
}
public boolean isFunctionDeclarator() {
return isFunctionDeclarator;
}
public void setFunctionDeclarator(boolean isFunctionDeclarator) {
this.isFunctionDeclarator = isFunctionDeclarator;
}
public List<IBinding> getNestedDeclarations() {
return nestedDeclarations;
}
public void addNestedDeclaration(IBinding binding) {
nestedDeclarations.add(binding);
}
public void removeLastNestedDeclaration() {
nestedDeclarations.removeLast();
}
public void addTypeModifier(ITypeContainer x) {
typeModifiers.add(x);
}
public void removeLastTypeModifier() {
typeModifiers.removeLast();
}
public void addPointerModifier(C99PointerType x) {
pointerModifiers.getLast().add(x);
}
public void removeLastPointerModifier() {
pointerModifiers.getLast().removeLast();
}
public void openPointerModifierScope() {
pointerModifiers.add(new LinkedList<C99PointerType>());
}
public void openPointerModifierScope(LinkedList<C99PointerType> scope) {
pointerModifiers.add(scope);
}
public LinkedList<C99PointerType> closePointerModifierScope() {
return pointerModifiers.removeLast();
}
}