/* * Copyright (c) 2014 Google Inc. * * 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 */ package com.google.eclipse.protobuf.ui.grammar; import static com.google.eclipse.protobuf.grammar.CommonKeyword.CLOSING_BRACKET; import static com.google.eclipse.protobuf.grammar.CommonKeyword.DEFAULT; import static com.google.eclipse.protobuf.grammar.CommonKeyword.EQUAL; import static com.google.eclipse.protobuf.grammar.CommonKeyword.OPENING_BRACKET; import static com.google.eclipse.protobuf.grammar.CommonKeyword.SEMICOLON; import static com.google.eclipse.protobuf.util.CommonWords.space; import com.google.eclipse.protobuf.grammar.CommonKeyword; import com.google.eclipse.protobuf.model.util.Syntaxes; /** * Element composed of one or more keywords. * * @author alruiz@google.com (Alex Ruiz) */ public enum CompoundElement { DEFAULT_EQUAL(joinWithWhitespace(DEFAULT, EQUAL, "")), DEFAULT_EQUAL_IN_BRACKETS(inBrackets(DEFAULT_EQUAL)), QUOTE("\""), EMPTY_STRING(join(QUOTE, QUOTE)), DEFAULT_EQUAL_STRING(joinWithWhitespace(DEFAULT_EQUAL, EMPTY_STRING)), DEFAULT_EQUAL_STRING_IN_BRACKETS(inBrackets(DEFAULT_EQUAL_STRING)), PROTO2_IN_QUOTES(join(QUOTE, Syntaxes.PROTO2, QUOTE, SEMICOLON)), EQUAL_PROTO2_IN_QUOTES(joinWithWhitespace(EQUAL, PROTO2_IN_QUOTES)), PROTO3_IN_QUOTES(join(QUOTE, Syntaxes.PROTO3, QUOTE, SEMICOLON)), EQUAL_PROTO3_IN_QUOTES(joinWithWhitespace(EQUAL, PROTO2_IN_QUOTES)); private final String value; private static String join(Object...objects) { StringBuilder buffer = new StringBuilder(); int count = objects.length; for (int i = 0; i < count; i++) { buffer.append(objects[i].toString()); } return buffer.toString(); } private static String joinWithWhitespace(Object...objects) { StringBuilder buffer = new StringBuilder(); int count = objects.length; for (int i = 0; i < count; i++) { String s = objects[i].toString(); buffer.append(s); if (i < count - 1 && !s.endsWith(space())) { buffer.append(space()); } } return buffer.toString(); } private static String inBrackets(CompoundElement element) { return OPENING_BRACKET + element.value + CLOSING_BRACKET; } private CompoundElement(String value) { this.value = value; } /** * Indicates whether the value of this compound element is equal to the given {@code String}. * @param s the value to compare to. * @return {@code true} if the value of this compound element is equal to the given {@code String}, {@code false} * otherwise. */ public boolean hasValue(String s) { return value.equals(s); } /** * Returns the number of characters in this compound element (similar to calling {@code toString().length()}.) * @return the number of characters in this compound element. */ public int charCount() { return value.length(); } /** * Returns the index within this compound element of the first occurrence of the value of the specified keyword * (similar to calling {@code toString().indexOf(keyword.toString())}. * @param keyword the given keyword. * @return the index within this compound element of the first occurrence of the value of the specified keyword; -1 * if the value of the given keyword is not found. */ public int indexOf(CommonKeyword keyword) { return value.indexOf(keyword.toString()); } /** * Returns the textual value of this compound element. * @return the textual value of this compound element. */ @Override public String toString() { return value; } }