blob: db505960fed1ad73be3b20b5af913dfebc2493ad [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.refactoring.convertToJava;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod;
import com.intellij.util.containers.hash.HashMap;
import com.intellij.util.containers.hash.HashSet;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
import java.util.*;
class ExpressionContext implements Cloneable {
List<String> myStatements = new ArrayList<String>();
Set<String> myUsedVarNames;
LocalVarAnalyzer.Result analyzedVars = LocalVarAnalyzer.initialResult();
TypeProvider typeProvider;
Project project;
private final Map<String, Boolean> myProps = new HashMap<String, Boolean>();
private static final String myShouldInsertCurlyBrackets = "shouldInsertCurly";
private static final String myInAnonymousContext = "inAnonymousContext";
private Ref<String> myRefSetterName = new Ref<String>(null);
private final Map<PsiMethod, String> setters;
private final Set<PsiClass> myClasses;
private ExpressionContext(Project project, Set<String> usedVarNames, Map<PsiMethod, String> setters, Set<PsiClass> myClasses) {
this.project = project;
myUsedVarNames = usedVarNames;
this.setters = setters;
this.myClasses = myClasses;
}
ExpressionContext(Project project, GroovyFile[] filesToConvert) {
this(project, new HashSet<String>(), new HashMap<PsiMethod, String>(), new HashSet<PsiClass>());
typeProvider = new TypeProvider();
for (GroovyFile groovyFile : filesToConvert) {
myClasses.addAll(Arrays.asList(groovyFile.getClasses()));
}
}
@Override
public Object clone() {
return copy();
}
ExpressionContext copy() {
final ExpressionContext expressionContext = new ExpressionContext(project, myUsedVarNames, setters, myClasses);
expressionContext.myProps.putAll(myProps);
expressionContext.analyzedVars = analyzedVars;
expressionContext.typeProvider = typeProvider;
expressionContext.myRefSetterName = myRefSetterName;
return expressionContext;
}
ExpressionContext extend() {
final HashSet<String> usedVarNames = new HashSet<String>();
usedVarNames.addAll(myUsedVarNames);
final ExpressionContext expressionContext = new ExpressionContext(project, usedVarNames, setters, myClasses);
expressionContext.myProps.putAll(myProps);
expressionContext.analyzedVars = analyzedVars;
expressionContext.typeProvider = typeProvider;
expressionContext.myRefSetterName = myRefSetterName;
return expressionContext;
}
public void setInsertCurlyBrackets() {
myProps.put(myShouldInsertCurlyBrackets, true);
}
private boolean getProp(String name) {
final Boolean aBoolean = myProps.get(name);
return aBoolean != null && aBoolean.booleanValue();
}
public boolean shouldInsertCurlyBrackets() {
return getProp(myShouldInsertCurlyBrackets);
}
public boolean isInAnonymousContext() {
return getProp(myInAnonymousContext);
}
public void setInAnonymousContext(boolean inAnonymousContext) {
myProps.put(myInAnonymousContext, inAnonymousContext);
}
public void searchForLocalVarsToWrap(GroovyPsiElement root) {
analyzedVars = LocalVarAnalyzer.searchForVarsToWrap(root, analyzedVars, this);
}
public String getRefSetterName() {
return myRefSetterName.get();
}
public String getRefSetterName(GroovyPsiElement context) {
if (myRefSetterName.isNull()) {
myRefSetterName.set(GenerationUtil.suggestMethodName(context, "setGroovyRef", this));
}
return myRefSetterName.get();
}
public String getSetterName(PsiMethod setter, GroovyPsiElement place) {
String name = setters.get(setter);
if (name != null) return name;
name = GenerationUtil.suggestMethodName(place, setter.getName(), this);
setters.put(setter, name);
return name;
}
public Map<PsiMethod, String> getSetters() {
return Collections.unmodifiableMap(setters);
}
public boolean isClassConverted(PsiClass aClass) {
if (aClass == null) return false;
return myClasses.contains(aClass);
}
}