| /******************************************************************************* |
| * 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$ |
| |
| } |
| |
| } |