blob: 80194b601443ea1c26222f36a154e43c773e4a78 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 BEA Systems, 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
*
* Contributors:
* mkaufman@bea.com - initial API and implementation
*
*******************************************************************************/
package org.eclipse.jdt.apt.core.internal.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.apt.core.internal.AptPlugin;
import org.eclipse.jdt.apt.core.internal.env.BuildEnv;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.compiler.ITerminalSymbols;
import org.eclipse.jdt.core.compiler.InvalidInputException;
public class ScannerUtil {
/**
* scan the source code to see if there are any annotation tokens
*/
public static boolean hasAnnotationInstance( IFile f ) {
InputStreamReader reader = null;
InputStream input = null;
try {
AnnotationScanner scanner;
// If this is a single byte encoding, we can deal directly
// with the bytes, which is *much* faster
if (SINGLE_BYTE_ENCODINGS.contains(f.getCharset())) {
input = BuildEnv.getInputStream(f);
scanner = new InputStreamAnnotationScanner(input);
}
else {
reader = BuildEnv.getFileReader( f );
scanner = new ReaderAnnotationScanner(reader);
}
return scanner.containsAnnotations();
}
catch( Exception ioe ) {
return false;
}
finally {
if (reader != null) { try {reader.close();} catch (IOException ioe) {} }
if (input != null) { try {input.close();} catch (IOException ioe) {} }
}
}
public static boolean hasAnnotationInstance( ICompilationUnit cu ) {
try {
IBuffer b = cu.getBuffer();
if ( b == null )
return false;
char[] source = b.getCharacters();
return hasAnnotationInstance( source );
}
catch( JavaModelException jme ) {
return false;
}
}
public static boolean hasAnnotationInstance( char[] source ) {
try {
if ( source == null )
return false;
IScanner scanner = ToolFactory.createScanner(
false, false, false, JavaCore.VERSION_1_5 );
scanner.setSource( source );
int token = scanner.getNextToken();
while ( token != ITerminalSymbols.TokenNameEOF ) {
token = scanner.getNextToken();
if ( token == ITerminalSymbols.TokenNameAT )
{
//
// found an @ sign, see if next token is "interface"
// @interface is an annotation decl and not an annotation
// instance.
//
token = scanner.getNextToken();
if ( token != ITerminalSymbols.TokenNameinterface )
return true;
}
}
return false;
}
catch( InvalidInputException iie )
{
// lex error, so report false
return false;
}
catch( Exception e )
{
AptPlugin.log(e, "Failure scanning source: \n" + new String(source)); //$NON-NLS-1$
// TODO: deal with this exception
return false;
}
}
private static final String[] SINGLE_BYTE_ENCODING_ARRAY = {
"ASCII", //$NON-NLS-1$
"Cp1250", //$NON-NLS-1$
"Cp1251", //$NON-NLS-1$
"Cp1252", //$NON-NLS-1$
"Cp1253", //$NON-NLS-1$
"Cp1254", //$NON-NLS-1$
"Cp1257", //$NON-NLS-1$
"ISO8859_1", //$NON-NLS-1$
"ISO8859_2", //$NON-NLS-1$
"ISO8859_4", //$NON-NLS-1$
"ISO8859_5", //$NON-NLS-1$
"ISO8859_7", //$NON-NLS-1$
"ISO8859_9", //$NON-NLS-1$
"ISO8859_13", //$NON-NLS-1$
"ISO8859_15", //$NON-NLS-1$
"UTF8" //$NON-NLS-1$
};
private static final Set<String> SINGLE_BYTE_ENCODINGS =
new HashSet<String>(SINGLE_BYTE_ENCODING_ARRAY.length);
static {
for (String encoding : SINGLE_BYTE_ENCODING_ARRAY) {
SINGLE_BYTE_ENCODINGS.add(encoding);
}
}
}