blob: 8cb003fc9dab6694f3f0ebef7684d0d676cba70e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Ericsson
*
* All rights reserved. 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
*******************************************************************************/
package org.eclipse.tracecompass.internal.ctf.core.event.metadata.tsdl.enumeration;
import org.antlr.runtime.tree.CommonTree;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.tracecompass.ctf.core.event.metadata.DeclarationScope;
import org.eclipse.tracecompass.ctf.core.event.types.IDeclaration;
import org.eclipse.tracecompass.ctf.core.event.types.IntegerDeclaration;
import org.eclipse.tracecompass.ctf.core.trace.CTFTrace;
import org.eclipse.tracecompass.internal.ctf.core.event.metadata.AbstractScopedCommonTreeParser;
import org.eclipse.tracecompass.internal.ctf.core.event.metadata.ParseException;
import org.eclipse.tracecompass.internal.ctf.core.event.metadata.tsdl.TypeSpecifierListParser;
/**
* This parses the internal type of the enum
*
* @author Matthew Khouzam - Initial implementation and API
*
*/
public final class EnumContainerParser extends AbstractScopedCommonTreeParser {
/**
* Parameter object with a trace and scope
*
* @author Matthew Khouzam
*/
@NonNullByDefault
public static final class Param implements ICommonTreeParserParameter {
private final DeclarationScope fCurrentScope;
private final CTFTrace fTrace;
/**
* Constructor
*
* @param trace
* the trace
* @param currentScope
* the scope
*/
public Param(CTFTrace trace, DeclarationScope currentScope) {
fTrace = trace;
fCurrentScope = currentScope;
}
}
/**
* The instance
*/
public static final EnumContainerParser INSTANCE = new EnumContainerParser();
private EnumContainerParser() {
}
/**
* Parses an enum container type node and returns the corresponding integer
* type.
*
* @param enumContainerType
* An ENUM_CONTAINER_TYPE node.
*
* @return An integer declaration corresponding to the container type.
* @throws ParseException
* If the type does not parse correctly or if it is not an
* integer type.
*/
@Override
public IntegerDeclaration parse(CommonTree enumContainerType, ICommonTreeParserParameter param) throws ParseException {
if (!(param instanceof Param)) {
throw new IllegalArgumentException("Param must be a " + Param.class.getCanonicalName()); //$NON-NLS-1$
}
Param parameter = (Param) param;
DeclarationScope scope = parameter.fCurrentScope;
/* Get the child, which should be a type specifier list */
CommonTree typeSpecifierList = (CommonTree) enumContainerType.getChild(0);
CTFTrace trace = ((Param) param).fTrace;
/* Parse it and get the corresponding declaration */
IDeclaration decl = TypeSpecifierListParser.INSTANCE.parse(typeSpecifierList, new TypeSpecifierListParser.Param(trace, null, null, scope));
/* If is is an integer, return it, else throw an error */
if (decl instanceof IntegerDeclaration) {
return (IntegerDeclaration) decl;
}
throw new ParseException("enum container type must be an integer"); //$NON-NLS-1$
}
}