/*
* Copyright 2013 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.core.ext.soyc.coderef;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
import java.util.Collections;
import java.util.Set;
/**
* Represents a method. Its goal is to keep as minimal information as possible and track
* dependencies between them. The signature is in jsni format, including the return type and the
* parameter types.
*
*/
public class MethodDescriptor extends MemberDescriptor {
/**
* Creates a method descriptor from a JMethod with its original signature, and set its enclosing
* class.
*/
public static MethodDescriptor from(ClassDescriptor classDescriptor, JMethod method,
String signature) {
MethodDescriptor methodDescriptor = new MethodDescriptor(classDescriptor, signature);
methodDescriptor.methodReferences.add(method);
return methodDescriptor;
}
private final Set<MethodDescriptor> dependentMethods = Sets.newIdentityHashSet();
private int uniqueId;
private final String paramTypes;
private final Set<JMethod> methodReferences = Sets.newIdentityHashSet();
private MethodDescriptor(ClassDescriptor owner, String[] signatureComponents) {
super(owner, signatureComponents[0]);
this.paramTypes = signatureComponents[1];
// fix for wrong jsni signature for constructors in JMethod.getSignature()
this.type = normalizeMethodSignature(signatureComponents[2]);
}
private static final String CONSTRUCTOR_POSTFIX = " <init>";
public static String normalizeMethodSignature(String methodSignature) {
if (methodSignature.endsWith(CONSTRUCTOR_POSTFIX)) {
return methodSignature.substring(0,
methodSignature.length() - CONSTRUCTOR_POSTFIX.length()) + "V";
}
return methodSignature;
}
public MethodDescriptor(ClassDescriptor owner, String jsniSignature) {
this(owner, jsniSignature.split("\\(|\\)"));
}
public void addDependant(MethodDescriptor methodDescriptor) {
dependentMethods.add(methodDescriptor);
}
public void addReference(JMethod methodRef) {
methodReferences.add(methodRef);
}
/**
* Returns the dependent list ids.
*/
public int[] getDependentPointers() {
int[] ps = new int[dependentMethods.size()];
int c = 0;
for (MethodDescriptor dependant : dependentMethods) {
ps[c++] = dependant.getUniqueId();
}
return ps;
}
public Set<MethodDescriptor> getDependentMethods() {
return Collections.unmodifiableSet(dependentMethods);
}
@Override
public String getJsniSignature() {
return name + "(" + paramTypes + ")" + type;
}
public String getParamTypes() {
return paramTypes;
}
/**
* Returns the set of JMethods that share the same signature.
*/
public Set<JMethod> getMethodReferences() {
return Collections.unmodifiableSet(methodReferences);
}
public int getUniqueId() {
return uniqueId;
}
public void setUniqueId(int uniqueId) {
this.uniqueId = uniqueId;
}
}