/* * 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(); }