/*******************************************************************************
* Copyright (c) 2000, 2008 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.wst.jsdt.internal.corext.refactoring.util;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.jsdt.core.IClassFile;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptProject;
import org.eclipse.wst.jsdt.core.ITypeRoot;
import org.eclipse.wst.jsdt.core.JavaScriptCore;
import org.eclipse.wst.jsdt.core.WorkingCopyOwner;
import org.eclipse.wst.jsdt.core.dom.ASTNode;
import org.eclipse.wst.jsdt.core.dom.ASTParser;
import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil;
import org.eclipse.wst.jsdt.internal.ui.javaeditor.ASTProvider;
public class RefactoringASTParser {
private ASTParser fParser;
public RefactoringASTParser(int level) {
fParser= ASTParser.newParser(level);
}
public JavaScriptUnit parse(ITypeRoot typeRoot, boolean resolveBindings) {
return parse(typeRoot, resolveBindings, null);
}
public JavaScriptUnit parse(ITypeRoot typeRoot, boolean resolveBindings, IProgressMonitor pm) {
return parse(typeRoot, null, resolveBindings, pm);
}
public JavaScriptUnit parse(ITypeRoot typeRoot, WorkingCopyOwner owner, boolean resolveBindings, IProgressMonitor pm) {
return parse(typeRoot, owner, resolveBindings, false, false, pm);
}
public JavaScriptUnit parse(ITypeRoot typeRoot, WorkingCopyOwner owner, boolean resolveBindings, boolean statementsRecovery, boolean bindingsRecovery, IProgressMonitor pm) {
fParser.setResolveBindings(resolveBindings);
fParser.setStatementsRecovery(statementsRecovery);
fParser.setBindingsRecovery(bindingsRecovery);
fParser.setSource(typeRoot);
if (owner != null)
fParser.setWorkingCopyOwner(owner);
fParser.setCompilerOptions(getCompilerOptions(typeRoot));
JavaScriptUnit result= (JavaScriptUnit) fParser.createAST(pm);
return result;
}
/**
* @param newCuSource the source
* @param originalCu the compilation unit to get the name and project from
* @param resolveBindings whether bindings are to be resolved
* @param statementsRecovery whether statements recovery should be enabled
* @param pm an {@link IProgressMonitor}, or <code>null</code>
* @return the parsed JavaScriptUnit
*/
public JavaScriptUnit parse(String newCuSource, IJavaScriptUnit originalCu, boolean resolveBindings, boolean statementsRecovery, IProgressMonitor pm) {
fParser.setResolveBindings(resolveBindings);
fParser.setStatementsRecovery(statementsRecovery);
fParser.setSource(newCuSource.toCharArray());
fParser.setUnitName(originalCu.getElementName());
fParser.setProject(originalCu.getJavaScriptProject());
fParser.setCompilerOptions(getCompilerOptions(originalCu));
JavaScriptUnit newCUNode= (JavaScriptUnit) fParser.createAST(pm);
return newCUNode;
}
/**
* @param newCfSource the source
* @param originalCf the class file to get the name and project from
* @param resolveBindings whether bindings are to be resolved
* @param statementsRecovery whether statements recovery should be enabled
* @param pm an {@link IProgressMonitor}, or <code>null</code>
* @return the parsed JavaScriptUnit
*/
public JavaScriptUnit parse(String newCfSource, IClassFile originalCf, boolean resolveBindings, boolean statementsRecovery, IProgressMonitor pm) {
fParser.setResolveBindings(resolveBindings);
fParser.setStatementsRecovery(statementsRecovery);
fParser.setSource(newCfSource.toCharArray());
String cfName= originalCf.getElementName();
fParser.setUnitName(cfName.substring(0, cfName.length() - 6) + JavaModelUtil.DEFAULT_CU_SUFFIX);
fParser.setProject(originalCf.getJavaScriptProject());
fParser.setCompilerOptions(getCompilerOptions(originalCf));
JavaScriptUnit newCUNode= (JavaScriptUnit) fParser.createAST(pm);
return newCUNode;
}
/**
* Tries to get the shared AST from the ASTProvider.
* If the shared AST is not available, parses the type root with a
* RefactoringASTParser that uses settings similar to the ASTProvider.
*
* @param typeRoot the type root
* @param resolveBindings TODO
* @param pm an {@link IProgressMonitor}, or <code>null</code>
* @return the parsed JavaScriptUnit
*/
public static JavaScriptUnit parseWithASTProvider(ITypeRoot typeRoot, boolean resolveBindings, IProgressMonitor pm) {
JavaScriptUnit cuNode= ASTProvider.getASTProvider().getAST(typeRoot, ASTProvider.WAIT_ACTIVE_ONLY, pm);
if (cuNode != null) {
return cuNode;
} else {
return new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(typeRoot, null, resolveBindings, ASTProvider.SHARED_AST_STATEMENT_RECOVERY, ASTProvider.SHARED_BINDING_RECOVERY, pm);
}
}
public static IJavaScriptUnit getCompilationUnit(ASTNode node) {
ASTNode root= node.getRoot();
if (root instanceof JavaScriptUnit) {
IJavaScriptElement cu= ((JavaScriptUnit) root).getJavaElement();
if (cu instanceof IJavaScriptUnit)
return (IJavaScriptUnit) cu;
}
return null;
}
public static Map getCompilerOptions(IJavaScriptElement element) {
IJavaScriptProject project= element.getJavaScriptProject();
Map options= project.getOptions(true);
// turn all errors and warnings into ignore. The customizable set of compiler
// options only contains additional Eclipse options. The standard JDK compiler
// options can't be changed anyway.
for (Iterator iter= options.keySet().iterator(); iter.hasNext();) {
String key= (String)iter.next();
String value= (String)options.get(key);
if ("error".equals(value) || "warning".equals(value)) { //$NON-NLS-1$//$NON-NLS-2$
// System.out.println("Ignoring - " + key);
options.put(key, "ignore"); //$NON-NLS-1$
}
}
options.put(JavaScriptCore.COMPILER_TASK_TAGS, ""); //$NON-NLS-1$
return options;
}
}