/*******************************************************************************
 * Copyright (c) 2007, 2011 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.corext.refactoring.rename;

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.compiler.ITerminalSymbols;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.core.search.SearchMatch;

import org.eclipse.jdt.internal.corext.refactoring.CuCollectingSearchRequestor;
import org.eclipse.jdt.internal.corext.refactoring.base.ReferencesInBinaryContext;

public class TypeOccurrenceCollector extends CuCollectingSearchRequestor {

	private final String fOldName;
	private final String fOldQualifiedName;

	public TypeOccurrenceCollector(IType type) {
		this(type, null);
	}

	public TypeOccurrenceCollector(IType type, ReferencesInBinaryContext binaryRefs) {
		super(binaryRefs);
		fOldName= type.getElementName();
		fOldQualifiedName= type.getFullyQualifiedName('.');
	}

	@Override
	public void acceptSearchMatch(ICompilationUnit unit, SearchMatch match) throws CoreException {
		collectMatch(acceptSearchMatch2(unit, match));
	}

	public SearchMatch acceptSearchMatch2(ICompilationUnit unit, SearchMatch match) throws CoreException {
		int start= match.getOffset();
		int length= match.getLength();

		//unqualified:
		String matchText= unit.getBuffer().getText(start, length);
		if (fOldName.equals(matchText)) {
			return match;
		}

		//(partially) qualified:
		if (fOldQualifiedName.endsWith(matchText)) {
			//e.g. rename B and p.A.B ends with match A.B
			int simpleNameLenght= fOldName.length();
			match.setOffset(start + length - simpleNameLenght);
			match.setLength(simpleNameLenght);
			return match;
		}

		//Not a standard reference -- use scanner to find last identifier token:
		IScanner scanner= getScanner(unit);
		scanner.setSource(matchText.toCharArray());
		int simpleNameStart= -1;
		int simpleNameEnd= -1;
		try {
			int token = scanner.getNextToken();
			while (token != ITerminalSymbols.TokenNameEOF) {
				if (token == ITerminalSymbols.TokenNameIdentifier) {
					simpleNameStart= scanner.getCurrentTokenStartPosition();
					simpleNameEnd= scanner.getCurrentTokenEndPosition();
				}
				token = scanner.getNextToken();
			}
		} catch (InvalidInputException e){
			//ignore
		}
		if (simpleNameStart != -1) {
			match.setOffset(start + simpleNameStart);
			match.setLength(simpleNameEnd + 1 - simpleNameStart);
		}
		return match;
	}
}