blob: 34c0778b4bebfa98c242dcb8b9f8387d866af7c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 SAP AG
*
* 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:
* Lazar Kirchev, SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.console.completion;
/**
* This class determines the last token in the command line. Completion should be made for this token.
*/
public class CommandLineParser {
private static final char[] delimiters = new char[] {'|', ';', '=', '{', '}', '(', ')', '$', '>', ']', ' '};
private static final String COMMENT_CHAR = "#";
private static final String HASH_MAP_DEF_START_CHAR = "<";
private static final String HASH_MAP_DEF_END_CHAR = ">";
private static final String LIST_DEF_START_CHAR = "[";
/**
* Determine the last token in the command line. The last token is the substring, starting from
* one of the characters, considered as delimiters
*
* @param commandLine whole command line
* @param cursor current position in the command line
* @return the current token
*/
public static String getCurrentToken(String commandLine, int cursor) {
String current = commandLine.substring(0, cursor);
int currentStartIdx = -1;
// determine the positioin of the last delimiter
for(char delimiter : delimiters) {
int idx = current.lastIndexOf(delimiter);
if (delimiter == '=' && idx > -1) {
// hash map is defined in a command with the syntax <key=value>; within this definition we do not want to
// make completion; determine if we are in such case
int startAngleBraceIdx = current.substring(0, idx).lastIndexOf(HASH_MAP_DEF_START_CHAR);
int endAngleBraceBeforeAssignmentIdx = current.substring(0, idx).lastIndexOf(HASH_MAP_DEF_END_CHAR);
int endAngleBraceAfterAssignmentIdx = current.substring(idx + 1).indexOf(HASH_MAP_DEF_END_CHAR);
if (startAngleBraceIdx > -1 && startAngleBraceIdx < idx && endAngleBraceBeforeAssignmentIdx == -1 && endAngleBraceAfterAssignmentIdx == -1) {
return null;
}
}
if (idx > currentStartIdx) {
currentStartIdx = idx;
}
}
if (currentStartIdx + 1 == current.length()) {
return "";
}
if (currentStartIdx + 1 > current.length()) {
return null;
}
String currentToken = current.substring(currentStartIdx + 1, current.length());
// if the current position is after the comment character, or within a hash map or list definition, do not do command completion
if (currentToken.contains(COMMENT_CHAR) || currentToken.contains(HASH_MAP_DEF_START_CHAR) || currentToken.contains(LIST_DEF_START_CHAR)) {
return null;
}
return currentToken;
}
}