/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.codeassist.select; /* * Scanner aware of a selection range. If finding an identifier which source range is exactly * the same, then will record it so that the parser can make use of it. * * Source positions are zero-based and inclusive. */ import org.eclipse.jdt.internal.compiler.parser.Scanner; public class SelectionScanner extends Scanner { public char[] selectionIdentifier; public int selectionStart, selectionEnd; /* * Truncate the current identifier if it is containing the cursor location. Since completion is performed * on an identifier prefix. * */ public SelectionScanner(long sourceLevel) { super(false /*comment*/, false /*whitespace*/, false /*nls*/, sourceLevel, null /*taskTags*/, null/*taskPriorities*/, true/*taskCaseSensitive*/); } public char[] getCurrentIdentifierSource() { if (this.selectionIdentifier == null){ if (this.selectionStart == this.startPosition && this.selectionEnd == this.currentPosition-1){ if (this.withoutUnicodePtr != 0){ // check unicode scenario System.arraycopy(this.withoutUnicodeBuffer, 1, this.selectionIdentifier = new char[this.withoutUnicodePtr], 0, this.withoutUnicodePtr); } else { int length = this.currentPosition - this.startPosition; // no char[] sharing around completionIdentifier, we want it to be unique so as to use identity checks System.arraycopy(this.source, this.startPosition, (this.selectionIdentifier = new char[length]), 0, length); } return this.selectionIdentifier; } } return super.getCurrentIdentifierSource(); } /* * In case we actually read a keyword which corresponds to the selected * range, we pretend we read an identifier. */ public int scanIdentifierOrKeyword() { int id = super.scanIdentifierOrKeyword(); // convert completed keyword into an identifier if (id != TokenNameIdentifier && this.startPosition == this.selectionStart && this.currentPosition == this.selectionEnd+1){ return TokenNameIdentifier; } return id; } }