blob: ce54bb2bc4827f753f6cc4153b070d4affe8d3ce [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;
import java.util.List;
import org.antlr.runtime.tree.CommonTree;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.ctf.parser.CTFParser;
import org.eclipse.tracecompass.internal.ctf.core.event.metadata.ParseException;
/**
* TSDL utils, this class provides some simple verifications for a common tree.
* These are useful before parsing.
*
* @author Matthew Khouzam
*
*/
public final class TsdlUtils {
private static final UnaryStringParser STRING_PARSER = UnaryStringParser.INSTANCE;
private TsdlUtils() {
}
/**
* Is the tree a unary string
*
* @param node
* The node to check.
* @return True if the given node is an unary string.
*/
public static boolean isUnaryString(CommonTree node) {
return ((node.getType() == CTFParser.UNARY_EXPRESSION_STRING));
}
/**
* Is the tree a unary string or a quoted string
*
* @param node
* The node to check.
* @return True if the given node is any type of unary string (no quotes,
* quotes, etc).
*/
public static boolean isAnyUnaryString(CommonTree node) {
return (isUnaryString(node) || (node.getType() == CTFParser.UNARY_EXPRESSION_STRING_QUOTES));
}
/**
* Is the tree a unary integer
*
* @param node
* The node to check.
* @return True if the given node is an unary integer.
*/
public static boolean isUnaryInteger(CommonTree node) {
return ((node.getType() == CTFParser.UNARY_EXPRESSION_DEC) ||
(node.getType() == CTFParser.UNARY_EXPRESSION_HEX) || (node.getType() == CTFParser.UNARY_EXPRESSION_OCT));
}
/**
* Concatenates a list of unary strings separated by arrows (->) or dots.
*
* @param strings
* A list, first element being an unary string, subsequent
* elements being ARROW or DOT nodes with unary strings as child.
* @return The string representation of the unary string chain.
* @throws ParseException
* If the strings list contains a non-string element
*/
public static @NonNull String concatenateUnaryStrings(List<CommonTree> strings) throws ParseException {
StringBuilder sb = new StringBuilder();
CommonTree first = strings.get(0);
sb.append(STRING_PARSER.parse(first, null));
boolean isFirst = true;
for (CommonTree ref : strings) {
if (isFirst) {
isFirst = false;
continue;
}
CommonTree id = (CommonTree) ref.getChild(0);
if (ref.getType() == CTFParser.ARROW) {
sb.append("->"); //$NON-NLS-1$
} else { /* DOT */
sb.append('.');
}
sb.append(STRING_PARSER.parse(id, null));
}
return sb.toString();
}
/**
* Throws a ParseException stating that the parent-child relation between
* the given node and its parent is not valid. It means that the shape of
* the AST is unexpected.
*
* @param child
* The invalid child node.
* @return ParseException with details
*/
public static ParseException childTypeError(CommonTree child) {
CommonTree parent = (CommonTree) child.getParent();
String error = "Parent " + CTFParser.tokenNames[parent.getType()] //$NON-NLS-1$
+ " can't have a child of type " //$NON-NLS-1$
+ CTFParser.tokenNames[child.getType()] + "."; //$NON-NLS-1$
return new ParseException(error);
}
}