blob: 0c2fcc4c0e611ff3916dc44e870795dcb65f7707 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* 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 com.google.gwt.dev.jjs.ast.js;
import com.google.gwt.dev.jjs.SourceInfo;
import com.google.gwt.dev.jjs.ast.Context;
import com.google.gwt.dev.jjs.ast.JAbstractMethodBody;
import com.google.gwt.dev.jjs.ast.JVisitor;
import com.google.gwt.dev.js.ast.JsContext;
import com.google.gwt.dev.js.ast.JsFunction;
import com.google.gwt.dev.js.ast.JsStringLiteral;
import com.google.gwt.dev.js.ast.JsVisitor;
import com.google.gwt.dev.util.collect.HashSet;
import com.google.gwt.dev.util.collect.Lists;
import com.google.gwt.dev.util.collect.Sets;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* Represents a the body of a method. Can be Java or JSNI.
*/
public class JsniMethodBody extends JAbstractMethodBody {
private List<JsniClassLiteral> classRefs = Collections.emptyList();
private JsFunction jsFunction = null;
private List<JsniFieldRef> jsniFieldRefs = Collections.emptyList();
private List<JsniMethodRef> jsniMethodRefs = Collections.emptyList();
private Set<String> stringLiterals = Collections.emptySet();
public JsniMethodBody(SourceInfo info) {
super(info);
}
/**
* Adds a reference from this method to a Java class literal.
*/
public void addClassRef(JsniClassLiteral ref) {
classRefs = Lists.add(classRefs, ref);
}
/**
* Adds a reference from this method to a Java field.
*/
public void addJsniRef(JsniFieldRef ref) {
jsniFieldRefs = Lists.add(jsniFieldRefs, ref);
}
/**
* Adds a reference from this method to a Java method.
*/
public void addJsniRef(JsniMethodRef ref) {
jsniMethodRefs = Lists.add(jsniMethodRefs, ref);
}
/**
* Return this method's references to Java class literals.
*/
public List<JsniClassLiteral> getClassRefs() {
return classRefs;
}
public JsFunction getFunc() {
assert (this.jsFunction != null);
return jsFunction;
}
/**
* Return this method's references to Java fields.
*/
public List<JsniFieldRef> getJsniFieldRefs() {
return jsniFieldRefs;
}
/**
* Return this method's references to Java methods.
*/
public List<JsniMethodRef> getJsniMethodRefs() {
return jsniMethodRefs;
}
public Set<String> getUsedStrings() {
return stringLiterals;
}
@Override
public boolean isNative() {
return true;
}
public void setFunc(JsFunction jsFunction) {
assert (this.jsFunction == null);
this.jsFunction = jsFunction;
final Set<String> result = new HashSet<String>();
class RecordStrings extends JsVisitor {
@Override
public void endVisit(JsStringLiteral lit, JsContext ctx) {
result.add(lit.getValue());
}
}
(new RecordStrings()).accept(jsFunction);
stringLiterals = Sets.normalize(result);
}
public void traverse(JVisitor visitor, Context ctx) {
if (visitor.visit(this, ctx)) {
classRefs = visitor.acceptImmutable(classRefs);
jsniFieldRefs = visitor.acceptImmutable(jsniFieldRefs);
jsniMethodRefs = visitor.acceptImmutable(jsniMethodRefs);
}
visitor.endVisit(this, ctx);
}
}