/*******************************************************************************
 * Copyright (c) 2000, 2012 IBM Corporation and others.
 *
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.debug.ui;


import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Region;

import com.ibm.icu.text.UTF16;

/**
 * Contains a static helper method to search documents for the 'word' that encloses the current
 * selection.
 */
public class JavaWordFinder {

	/**
	 * Returns the IRegion containing the java identifier ("word") enclosing the specified offset or
	 * <code>null</code> if the document or offset is invalid.  Checks characters before and after the
	 * offset to see if they are allowed java identifier characters until a separator character (period,
	 * space, etc) is found.
	 *
	 * @param document The document to search
	 * @param offset The offset to start looking for the word
	 * @return IRegion containing the word or <code>null</code>
	 */
	public static IRegion findWord(IDocument document, int offset) {

		if (document == null){
			return null;
		}

		int start= -2;
		int end= -1;


		try {

			int pos= offset;
			char c;

			while (pos >= 0) {
				c= document.getChar(pos);
				if (!Character.isJavaIdentifierPart(c)) {
					// Check for surrogates
					if (UTF16.isSurrogate(c)) {
						/*
						 * XXX: Here we should create the code point and test whether it is a Java
						 * identifier part. Currently this is not possible because
						 * java.lang.Character in 1.4 does not support surrogates and because
						 * com.ibm.icu.lang.UCharacter.isJavaIdentifierPart(int) is not correctly
						 * implemented.
						 */
					} else {
						break;
					}
				}
				--pos;
			}

			start= pos;

			pos= offset;
			int length= document.getLength();

			while (pos < length) {
				c= document.getChar(pos);
				if (!Character.isJavaIdentifierPart(c))
					break;
				++pos;
			}

			end= pos;

		} catch (BadLocationException x) {
		}

		if (start >= -1 && end > -1) {
			if (start == offset && end == offset)
				return new Region(offset, 0);
			else if (start == offset)
				return new Region(start, end - start);
			else
				return new Region(start + 1, end - start - 1);
		}

		return null;
	}
}
