2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4 * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7 * Other names may be trademarks of their respective owners.
9 * The contents of this file are subject to the terms of either the GNU
10 * General Public License Version 2 only ("GPL") or the Common
11 * Development and Distribution License("CDDL") (collectively, the
12 * "License"). You may not use this file except in compliance with the
13 * License. You can obtain a copy of the License at
14 * http://www.netbeans.org/cddl-gplv2.html
15 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16 * specific language governing permissions and limitations under the
17 * License. When distributing the software, include this License Header
18 * Notice in each file and include the License file at
19 * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
20 * particular file as subject to the "Classpath" exception as provided
21 * by Oracle in the GPL Version 2 section of the License file that
22 * accompanied this code. If applicable, add the following below the
23 * License Header, with the fields enclosed by brackets [] replaced by
24 * your own identifying information:
25 * "Portions Copyrighted [year] [name of copyright owner]"
29 * The Original Software is NetBeans. The Initial Developer of the Original
30 * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
32 * If you wish your version of this file to be governed by only the CDDL
33 * or only the GPL Version 2, indicate your decision by adding
34 * "[Contributor] elects to include this software in this distribution
35 * under the [CDDL or GPL Version 2] license." If you do not indicate a
36 * single choice of license, a recipient has the option to distribute
37 * your version of this file under either the CDDL, the GPL Version 2 or
38 * to extend the choice of license to its licensees as provided above.
39 * However, if you add GPL Version 2 code and therefore, elected the GPL
40 * Version 2 license, then the option applies only if the new code is
41 * made subject to such option by the copyright holder.
43 package org.netbeans.html.boot.impl;
48 * @author Jaroslav Tulach
50 abstract class JsCallback {
51 final String parse(String body) {
52 StringBuilder sb = new StringBuilder();
55 int next = body.indexOf(".@", pos);
57 sb.append(body.substring(pos));
63 if (!Character.isJavaIdentifierPart(body.charAt(--ident))) {
68 String refId = body.substring(ident, next);
70 sb.append(body.substring(pos, ident));
72 int sigBeg = body.indexOf('(', next);
73 int sigEnd = body.indexOf(')', sigBeg);
74 int colon4 = body.indexOf("::", next);
75 if (sigBeg == -1 || sigEnd == -1 || colon4 == -1) {
76 throw new IllegalStateException(
77 "Wrong format of instance callback. "
78 + "Should be: 'inst.@pkg.Class::method(Ljava/lang/Object;)(param)':\n"
82 String fqn = body.substring(next + 2, colon4);
83 String method = body.substring(colon4 + 2, sigBeg);
84 String params = body.substring(sigBeg, sigEnd + 1);
86 int paramBeg = body.indexOf('(', sigEnd + 1);
88 throw new IllegalStateException(
89 "Wrong format of instance callback. "
90 + "Should be: 'inst.@pkg.Class::method(Ljava/lang/Object;)(param)':\n"
95 sb.append(callMethod(refId, fqn, method, params));
96 if (body.charAt(paramBeg + 1) != (')')) {
104 int next = body.indexOf("@", pos);
109 sb.append(body.substring(pos));
110 return sb.toString();
113 sb = new StringBuilder();
116 sb.append(body.substring(pos, next));
118 int sigBeg = body.indexOf('(', next);
119 int sigEnd = body.indexOf(')', sigBeg);
120 int colon4 = body.indexOf("::", next);
121 int paramBeg = body.indexOf('(', sigEnd + 1);
122 if (sigBeg == -1 || sigEnd == -1 || colon4 == -1 || paramBeg == -1) {
123 throw new IllegalStateException(
124 "Wrong format of static callback. "
125 + "Should be: '@pkg.Class::staticMethod(Ljava/lang/Object;)(param)':\n"
129 String fqn = body.substring(next + 1, colon4);
130 String method = body.substring(colon4 + 2, sigBeg);
131 String params = body.substring(sigBeg, sigEnd + 1);
134 sb.append(callMethod(null, fqn, method, params));
139 protected abstract CharSequence callMethod(
140 String ident, String fqn, String method, String params
143 static String mangle(String fqn, String method, String params) {
144 if (params.startsWith("(")) {
145 params = params.substring(1);
147 if (params.endsWith(")")) {
148 params = params.substring(0, params.length() - 1);
151 replace(fqn) + "$" + replace(method) + "$" + replace(params);
154 private static String replace(String orig) {
155 return orig.replace("_", "_1").
158 replace('.', '_').replace('/', '_');