blob: 23e01968f021a200a8fd9cd438eccfb48d507a84 [file] [log] [blame]
/*
* Copyright 2015 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;
import com.google.gwt.dev.javac.JsInteropUtil;
import java.beans.Introspector;
/**
* Abstracts JsInterop information for the AST nodes.
*/
public interface HasJsInfo extends HasJsName, CanBeJsNative {
/**
* Indicates type of JsMember.
*/
enum JsMemberType {
/**
* Not a js member.
*/
NONE {
@Override
public String computeName(JMember member) {
return null;
}
},
/**
* A JsConstructor.
*/
CONSTRUCTOR {
@Override
public String computeName(JMember member) {
return "";
}
},
/**
* A JsMethod.
*/
METHOD,
/**
* A JsProperty.
*/
PROPERTY,
/**
* A getter JsProperty accessor. Usually in the form of getX()/isX().
*/
GETTER("get") {
@Override
public String computeName(JMember member) {
String methodName = member.getName();
if (startsWithCamelCase(methodName, "get")) {
return Introspector.decapitalize(methodName.substring(3));
}
if (startsWithCamelCase(methodName, "is")) {
return Introspector.decapitalize(methodName.substring(2));
}
return JsInteropUtil.INVALID_JSNAME;
}
@Override
public boolean isPropertyAccessor() {
return true;
}
},
/**
* A setter JsProperty accessor. Usually in the form of setX(x).
*/
SETTER("set") {
@Override
public String computeName(JMember member) {
String methodName = member.getName();
if (startsWithCamelCase(methodName, "set")) {
return Introspector.decapitalize(methodName.substring(3));
}
return JsInteropUtil.INVALID_JSNAME;
}
@Override
public boolean isPropertyAccessor() {
return true;
}
},
/**
* A property accessor but doesn't match setter/getter patterns.
*/
UNDEFINED_ACCESSOR;
private String accessorKey;
private JsMemberType() { }
private JsMemberType(String accessorKey) {
this.accessorKey = accessorKey;
}
public String getPropertyAccessorKey() {
return accessorKey;
}
public boolean isPropertyAccessor() {
return getPropertyAccessorKey() != null;
}
public String computeName(JMember member) {
return member.getName();
}
private static boolean startsWithCamelCase(String string, String prefix) {
return string.length() > prefix.length() && string.startsWith(prefix)
&& Character.isUpperCase(string.charAt(prefix.length()));
}
}
void setJsMemberInfo(JsMemberType type, String namespace, String name, boolean exported);
void setJsOverlay();
JsMemberType getJsMemberType();
boolean isJsMethodVarargs();
boolean isJsOverlay();
boolean canBeReferencedExternally();
boolean canBeImplementedExternally();
boolean isJsInteropEntryPoint();
}