/*******************************************************************************
* Copyright (c) 2005, 2015 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:
* IBM Rational Software - 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.IASTAlignmentSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
/**
* @author jcamelon
*/
public abstract class CASTBaseDeclSpecifier extends ASTNode
implements ICASTDeclSpecifier, IASTAmbiguityParent {
protected int storageClass;
protected boolean isConst;
protected boolean isVolatile;
protected boolean isRestrict;
protected boolean isInline;
protected IASTAlignmentSpecifier[] alignmentSpecifiers =
IASTAlignmentSpecifier.EMPTY_ALIGNMENT_SPECIFIER_ARRAY;
@Override
public boolean isRestrict() {
return isRestrict;
}
@Override
public int getStorageClass() {
return storageClass;
}
@Override
public boolean isConst() {
return isConst;
}
@Override
public boolean isVolatile() {
return isVolatile;
}
@Override
public boolean isInline() {
return isInline;
}
@Override
public IASTAlignmentSpecifier[] getAlignmentSpecifiers() {
return alignmentSpecifiers;
}
@Override
public void setStorageClass(int storageClass) {
assertNotFrozen();
this.storageClass = storageClass;
}
@Override
public void setConst(boolean value) {
assertNotFrozen();
this.isConst = value;
}
@Override
public void setVolatile(boolean value) {
assertNotFrozen();
this.isVolatile = value;
}
@Override
public void setRestrict(boolean value) {
assertNotFrozen();
this.isRestrict = value;
}
@Override
public void setInline(boolean value) {
assertNotFrozen();
this.isInline = value;
}
@Override
public void setAlignmentSpecifiers(IASTAlignmentSpecifier[] alignmentSpecifiers) {
assertNotFrozen();
for (IASTAlignmentSpecifier specifier : alignmentSpecifiers) {
specifier.setParent(this);
specifier.setPropertyInParent(ALIGNMENT_SPECIFIER);
}
this.alignmentSpecifiers = alignmentSpecifiers;
}
protected <T extends CASTBaseDeclSpecifier> T copy(T copy, CopyStyle style) {
copy.storageClass = storageClass;
copy.isConst = isConst;
copy.isVolatile = isVolatile;
copy.isRestrict = isRestrict;
copy.isInline = isInline;
copy.alignmentSpecifiers = new IASTAlignmentSpecifier[alignmentSpecifiers.length];
for (int i = 0; i < alignmentSpecifiers.length; ++i) {
copy.alignmentSpecifiers[i] = alignmentSpecifiers[i].copy(style);
copy.alignmentSpecifiers[i].setParent(copy);
}
return super.copy(copy, style);
}
protected boolean visitAlignmentSpecifiers(ASTVisitor visitor) {
for (IASTAlignmentSpecifier specifier : alignmentSpecifiers) {
if (!specifier.accept(visitor)) {
return false;
}
}
return true;
}
@Override
public void replace(IASTNode child, IASTNode other) {
if (child instanceof IASTAlignmentSpecifier && other instanceof IASTAlignmentSpecifier) {
for (int i = 0; i < alignmentSpecifiers.length; ++i) {
if (alignmentSpecifiers[i] == child) {
alignmentSpecifiers[i] = (IASTAlignmentSpecifier) other;
other.setParent(child.getParent());
other.setPropertyInParent(child.getPropertyInParent());
return;
}
}
}
}
}