blob: 4732f31f9bb8d6f44c71da25d743580dda9da34e [file] [log] [blame]
/*
* Copyright 2010 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.javac;
import com.google.gwt.core.ext.typeinfo.JAbstractMethod;
import com.google.gwt.dev.javac.asm.CollectMethodData;
import com.google.gwt.dev.util.StringInterner;
import com.google.gwt.dev.util.collect.Maps;
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* Keeps track of method argument names that cannot be read from just the
* bytecode.
*/
public class MethodArgNamesLookup implements Serializable {
private Map<String, String[]> methodArgs;
public MethodArgNamesLookup() {
this.methodArgs = new HashMap<String, String[]>();
}
/**
* Prevent further modification to this object. Calls to
* {@link #store(String, AbstractMethodDeclaration)} or
* {@link #mergeFrom(MethodArgNamesLookup)} on this object will fail after
* this method is called.
*/
public void freeze() {
methodArgs = Maps.normalizeUnmodifiable(methodArgs);
}
/**
* Lookup the argument names for a given method.
*
* @param method TypeOracle method
* @param methodData method data collected from bytecode
* @return an array of the argument names, or null if unavailable
*/
public String[] lookup(JAbstractMethod method, CollectMethodData methodData) {
StringBuilder buf = new StringBuilder();
buf.append(method.getEnclosingType().getQualifiedBinaryName());
buf.append('.').append(method.getName());
buf.append(methodData.getDesc());
String key = buf.toString();
return methodArgs.get(key);
}
/**
* Merge argument names from another lookup map into this one.
*
* @param other
*/
public void mergeFrom(MethodArgNamesLookup other) {
methodArgs.putAll(other.methodArgs);
}
/**
* Store the argument names for a method.
* <p>
* <b>Note: method must have non-zero arguments.<b>
*
* @param enclosingType fully qualified binary name of the enclosing type
* @param method JDT method
*/
public void store(String enclosingType, AbstractMethodDeclaration method) {
if (method.binding == null) {
// Compile problem with this method, skip
return;
}
int n = method.arguments.length;
String[] argNames = new String[n];
for (int i = 0; i < n; ++i) {
argNames[i] = StringInterner.get().intern(
String.valueOf(method.arguments[i].name));
}
StringBuilder buf = new StringBuilder();
buf.append(enclosingType).append('.').append(method.selector);
buf.append(method.binding.signature());
String key = StringInterner.get().intern(buf.toString());
methodArgs.put(key, argNames);
}
/**
* For Unit Testing: returns an array of methods with arguments.
*/
String[] getMethods() {
return methodArgs.keySet().toArray(new String[0]);
}
/**
* For Unit Testing: returns an array of argument names for the specified
* method.
*/
String[] lookup(String methodName) {
return methodArgs.get(methodName);
}
}