langtools/test/tools/javadoc/sampleapi/lib/sampleapi/generator/PackageGenerator.java
author ksrini
Wed, 20 Apr 2016 17:17:56 -0700
changeset 37641 6949903ba85a
parent 33919 e9fccc09cfc6
permissions -rw-r--r--
8151777: Add "@index" tag to the sampleapi generator Reviewed-by: ksrini, bpatel Contributed-by: oleg.barbashov@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33919
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     1
/*
37641
6949903ba85a 8151777: Add "@index" tag to the sampleapi generator
ksrini
parents: 33919
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
33919
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     4
 *
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     7
 * published by the Free Software Foundation.
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     8
 *
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    13
 * accompanied this code).
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    14
 *
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    18
 *
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    21
 * questions.
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    22
 */
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    23
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    24
package sampleapi.generator;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    25
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    26
import java.io.File;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    27
import java.io.FileWriter;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    28
import java.io.InputStream;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    29
import java.io.FileInputStream;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    30
import java.io.IOException;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    31
import java.util.ArrayList;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    32
import java.util.Hashtable;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    33
import javax.xml.parsers.DocumentBuilderFactory;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    34
import javax.xml.parsers.DocumentBuilder;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    35
import javax.xml.parsers.ParserConfigurationException;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    36
import org.xml.sax.SAXException;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    37
import org.w3c.dom.Document;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    38
import org.w3c.dom.Element;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    39
import org.w3c.dom.Text;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    40
import org.w3c.dom.Node;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    41
import org.w3c.dom.NodeList;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    42
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    43
import com.sun.source.util.JavacTask;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    44
import com.sun.tools.javac.api.JavacTool;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    45
import com.sun.tools.javac.api.JavacTaskImpl;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    46
import com.sun.tools.javac.util.Context;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    47
import com.sun.tools.javac.util.Name;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    48
import com.sun.tools.javac.util.Names;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    49
import com.sun.tools.javac.util.List;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    50
import com.sun.tools.javac.util.ListBuffer;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    51
import com.sun.tools.javac.tree.TreeMaker;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    52
import com.sun.tools.javac.tree.JCTree;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    53
import com.sun.tools.javac.tree.JCTree.*;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    54
import com.sun.tools.javac.code.Flags;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    55
import com.sun.tools.javac.code.Type;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    56
import com.sun.tools.javac.code.TypeTag;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    57
import com.sun.tools.javac.code.TypeMetadata;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    58
import com.sun.tools.javac.code.Symbol;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    59
import com.sun.tools.javac.code.Symtab;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    60
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    61
import sampleapi.util.*;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    62
import sampleapi.SampleApi.Fault;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    63
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    64
public class PackageGenerator {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    65
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    66
    String packageName;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    67
    String packageDirName;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    68
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    69
    ArrayList<JCCompilationUnit> topLevels;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    70
    Hashtable<String, Integer> nameIndex;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    71
    Hashtable<String, JCClassDecl> idBases;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    72
    Hashtable<String, JCAnnotation> idAnnos;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    73
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    74
    TreeMaker make;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    75
    Names names;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    76
    Symtab syms;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    77
    DocumentBuilderFactory factory;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    78
    Documentifier documentifier;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    79
    boolean fx = false;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    80
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    81
    public PackageGenerator() {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    82
        JavacTool jt = JavacTool.create();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    83
        JavacTask task = jt.getTask(null, null, null, null, null, null);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    84
        Context ctx = ((JavacTaskImpl)task).getContext();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    85
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    86
        make = TreeMaker.instance(ctx);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    87
        names = Names.instance(ctx);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    88
        syms = Symtab.instance(ctx);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    89
        factory = DocumentBuilderFactory.newInstance();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    90
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    91
        documentifier = Documentifier.instance(ctx);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    92
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    93
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    94
    String dataSetName;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    95
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    96
    public void processDataSet(String dsName) throws Fault {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    97
        dataSetName = dsName;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    98
        topLevels = new ArrayList<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
    99
        nameIndex = new Hashtable<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   100
        idBases =  new Hashtable<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   101
        idAnnos =  new Hashtable<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   102
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   103
        String dsPath = "res/xml/" + dsName + ".xml";
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   104
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   105
        try {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   106
            InputStream is = getClass().getResourceAsStream("/" + dsPath);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   107
            if (is == null)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   108
                is = new FileInputStream(dsPath);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   109
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   110
            DocumentBuilder builder = factory.newDocumentBuilder();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   111
            Document document = builder.parse(is);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   112
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   113
            Element rootElement = document.getDocumentElement();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   114
            packageName = rootElement.getAttribute("package");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   115
            fx = "fx".equals(rootElement.getAttribute("style"));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   116
            packageDirName = packageName.replace('.', '/');
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   117
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   118
            // process nodes (toplevels)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   119
            NodeList nodeList = rootElement.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   120
            for (int i = 0; i < nodeList.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   121
                Node node = nodeList.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   122
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   123
                if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   124
                    continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   125
                processTopLevel((Element)node);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   126
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   127
        } catch (ParserConfigurationException | SAXException | IOException e) {
37641
6949903ba85a 8151777: Add "@index" tag to the sampleapi generator
ksrini
parents: 33919
diff changeset
   128
            throw new Fault("Error parsing dataset " + dsName, e);
33919
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   129
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   130
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   131
        fx = false;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   132
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   133
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   134
    public void generate(File outDir) throws Fault {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   135
        if (dataSetName == null)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   136
            throw new Fault("No Data Set processed");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   137
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   138
        try {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   139
            File pkgDir = new File(outDir, packageDirName);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   140
            pkgDir.mkdirs();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   141
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   142
            for (JCCompilationUnit decl : topLevels) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   143
                JCClassDecl classDecl = (JCClassDecl)decl.getTypeDecls().get(0);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   144
                File outFile = new File(pkgDir,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   145
                                        classDecl.getSimpleName().toString() + ".java");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   146
                FileWriter writer = new FileWriter(outFile);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   147
                writer.write(decl.toString());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   148
                writer.flush();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   149
                writer.close();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   150
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   151
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   152
            // package-info
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   153
            File outFile = new File(pkgDir, "package-info.java");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   154
            FileWriter writer = new FileWriter(outFile);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   155
            writer.write("/**\n");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   156
            writer.write(documentifier.getDocGenerator().getPackageComment());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   157
            writer.write("*/\n");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   158
            writer.write("package " + packageName + ";");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   159
            writer.flush();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   160
            writer.close();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   161
        } catch (IOException e) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   162
            throw new Fault("Error writing output");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   163
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   164
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   165
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   166
    // levels' processing methods
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   167
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   168
    void processTopLevel(Element tlTag) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   169
        String kind = tlTag.getTagName();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   170
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   171
        if (kind.equals("annodecl")) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   172
            // decls stored separately, does not affect bases
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   173
            String declId = tlTag.getAttribute("id");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   174
            if (!declId.startsWith("@"))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   175
                declId = "@" + declId;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   176
            idAnnos.put(declId, processAnnoDecl(tlTag));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   177
            return;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   178
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   179
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   180
        ListBuffer<JCTree>[] bases = processBases(tlTag, null);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   181
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   182
        for (JCTree base : bases[0]) { // [0] - bases namely
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   183
            JCPackageDecl pkg = make.PackageDecl(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   184
                                    List.<JCAnnotation>nil(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   185
                                    make.QualIdent(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   186
                                        new Symbol.PackageSymbol(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   187
                                            names.fromString(packageName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   188
                                            null)));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   189
            ListBuffer<JCTree> topLevelParts = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   190
            topLevelParts.append(pkg);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   191
            topLevelParts.appendList(bases[1]); // [1] imports
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   192
            topLevelParts.append(base);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   193
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   194
            JCCompilationUnit topLevel = make.TopLevel(topLevelParts.toList());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   195
            documentifier.documentify(topLevel, fx);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   196
            topLevels.add(topLevel);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   197
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   198
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   199
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   200
    ListBuffer<JCTree>[] processBases(Element baseTag, Hashtable<String, Integer> scope) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   201
        String kind = baseTag.getTagName();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   202
        String baseName = baseTag.getAttribute("basename");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   203
        String typeParam = baseTag.getAttribute("tparam");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   204
        String baseId = baseTag.getAttribute("id");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   205
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   206
        long kindFlag = 0;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   207
        switch (kind) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   208
            case "class":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   209
                // no flags for class
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   210
                break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   211
            case "interface":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   212
                kindFlag |= Flags.INTERFACE;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   213
                break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   214
            case "enum":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   215
                kindFlag |= Flags.ENUM;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   216
                break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   217
            case "annotation":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   218
                kindFlag |= Flags.ANNOTATION | Flags.INTERFACE;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   219
                break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   220
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   221
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   222
        // go through other nodes; add modifiers to multiplier
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   223
        NodeList nodes = baseTag.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   224
        ListBuffer<JCTree> bases = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   225
        ListBuffer<JCTree> members = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   226
        ListBuffer<JCTree> imports = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   227
        JCExpression extType = null;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   228
        ListBuffer<JCExpression> implTypes = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   229
        SimpleMultiplier multiply = new SimpleMultiplier();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   230
        for (int i = 0; i < nodes.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   231
            Node node = nodes.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   232
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   233
            if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   234
                continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   235
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   236
            switch (((Element)node).getTagName()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   237
                case "modifier":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   238
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   239
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   240
                case "anno":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   241
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   242
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   243
                case "member":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   244
                    // process members here
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   245
                    members.appendList(processMembers((Element)node, baseName, kind));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   246
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   247
                case "extend":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   248
                    String classId = ((Element)node).getAttribute("id");   // this pkg
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   249
                    String classRef = ((Element)node).getAttribute("ref"); // external
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   250
                    if (classId.length() !=0 &&
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   251
                        idBases.containsKey(classId)) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   252
                        // if have base, take methods from base members
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   253
                        JCClassDecl baseDecl = idBases.get(classId);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   254
                        extType = make.Type(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   255
                                      getTypeByName(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   256
                                          baseDecl.getSimpleName().toString()));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   257
                        members.appendList(processMethods(baseDecl.getMembers(), false));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   258
                    } else if (classRef.length() !=0) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   259
                        extType = make.Type(getTypeByName(classRef));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   260
                    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   261
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   262
                case "implement":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   263
                    String interfaceId = ((Element)node).getAttribute("id");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   264
                    String interfaceRef = ((Element)node).getAttribute("ref");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   265
                    if (interfaceId.length() != 0 &&
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   266
                        idBases.containsKey(interfaceId)) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   267
                        JCClassDecl baseDecl = idBases.get(interfaceId);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   268
                        implTypes.add(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   269
                            make.Type(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   270
                                getTypeByName(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   271
                                    baseDecl.getSimpleName().toString())));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   272
                        members.appendList(processMethods(baseDecl.getMembers(), true));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   273
                    } else if (interfaceRef.length() != 0) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   274
                        implTypes.add(make.Type(getTypeByName(interfaceRef)));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   275
                    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   276
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   277
                case "import":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   278
                    imports.append(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   279
                        make.Import(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   280
                            make.Ident(names.fromString(((Element)node).getTextContent())),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   281
                            false));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   282
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   283
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   284
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   285
        // process modifiers through multiplier
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   286
        multiply.initIterator();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   287
        while (multiply.hasNext()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   288
            ArrayList<String> tuple = multiply.getNext();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   289
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   290
            long declFlags = kindFlag;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   291
            ListBuffer<JCAnnotation> annos = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   292
            for (String modifier : tuple) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   293
                if (modifier.startsWith("@") && idAnnos.containsKey(modifier))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   294
                    annos.add(idAnnos.get(modifier)); // it's anno
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   295
                else
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   296
                    declFlags |= getFlagByName(modifier); // it's modifier
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   297
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   298
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   299
            String declName = (scope == null)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   300
                                  ? getUniqName(baseName)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   301
                                  : baseName + getUniqIndex(scope, baseName);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   302
            JCClassDecl baseDecl = make.ClassDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   303
                                       make.Modifiers(declFlags, annos.toList()),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   304
                                       names.fromString(declName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   305
                                       processTypeParams(typeParam), // type params
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   306
                                       extType,                      // ext
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   307
                                       implTypes.toList(),           // impl
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   308
                                       members.toList());            // members
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   309
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   310
            // fix constructors names
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   311
            fixConstructorNames(baseDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   312
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   313
            bases.append(baseDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   314
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   315
            // for non-empty ids store first base occurence from multiplied sequence
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   316
            if (baseId.length() != 0) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   317
                idBases.put(baseId, baseDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   318
                baseId = "";
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   319
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   320
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   321
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   322
        return new ListBuffer[] { bases, imports };
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   323
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   324
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   325
    List<JCTypeParameter> processTypeParams(String typeParams) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   326
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   327
        if (typeParams == null || typeParams.length() == 0)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   328
            return List.<JCTypeParameter>nil(); // empty
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   329
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   330
        String[] typeVarsArr = typeParams.split(",");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   331
        ListBuffer<JCTypeParameter> typeParamsDecls = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   332
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   333
        for (String typeVar : typeVarsArr) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   334
            typeParamsDecls.add(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   335
                make.TypeParameter(names.fromString(typeVar),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   336
                                    List.<JCExpression>nil()));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   337
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   338
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   339
        return typeParamsDecls.toList();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   340
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   341
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   342
    ListBuffer<JCTree> processMembers(Element memberTag, String name, String kind) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   343
        ListBuffer<JCTree> members = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   344
        NodeList nodes = memberTag.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   345
        Hashtable<String, Integer> scope = new Hashtable<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   346
        for (int i = 0; i < nodes.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   347
            Node node = nodes.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   348
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   349
            if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   350
                continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   351
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   352
            switch (((Element)node).getTagName()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   353
                case "field":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   354
                    members.appendList(processFields((Element)node, scope));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   355
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   356
                case "serialfield":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   357
                    members.append(processSerialFields((Element)node));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   358
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   359
                case "constant":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   360
                    members.appendList(processConstants((Element)node, scope));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   361
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   362
                case "constructor":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   363
                    members.appendList(processMethods((Element)node, scope, true, true));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   364
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   365
                case "method":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   366
                    boolean needBody = kind.equals("class") || kind.equals("enum");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   367
                    members.appendList(processMethods((Element)node, scope, needBody, false));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   368
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   369
                case "class":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   370
                case "interface":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   371
                case "enum":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   372
                case "annotation":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   373
                    members.appendList(processBases((Element)node, scope)[0]);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   374
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   375
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   376
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   377
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   378
        return members;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   379
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   380
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   381
    ListBuffer<JCTree> processFields(Element fieldsNode, Hashtable<String, Integer> scope) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   382
        String kind = fieldsNode.getTagName();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   383
        String baseName = fieldsNode.getAttribute("basename");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   384
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   385
        ListBuffer<JCTree> fields = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   386
        NodeList nodes = fieldsNode.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   387
        SimpleMultiplier multiply = new SimpleMultiplier(); // for modifiers
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   388
        String[] types = new String[] {};
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   389
        for (int i = 0; i < nodes.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   390
            Node node = nodes.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   391
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   392
            if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   393
                continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   394
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   395
            // parse type and modifiers
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   396
            switch (((Element)node).getTagName()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   397
                case "modifier":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   398
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   399
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   400
                case "anno":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   401
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   402
                case "type":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   403
                    types = ((Element)node).getTextContent().split("\\|");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   404
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   405
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   406
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   407
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   408
        // process through modifiers and types
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   409
        multiply.initIterator();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   410
        while (multiply.hasNext()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   411
            ArrayList<String> tuple = multiply.getNext();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   412
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   413
            long declFlags = 0;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   414
            ListBuffer<JCAnnotation> annos = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   415
            for (String modifier : tuple) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   416
                if (modifier.startsWith("@") && idAnnos.containsKey(modifier))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   417
                    annos.add(idAnnos.get(modifier)); // it's anno
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   418
                else
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   419
                    declFlags |= getFlagByName(modifier); // it's modifier
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   420
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   421
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   422
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   423
            for (String type : types) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   424
                String declName = baseName + getUniqIndex(scope, baseName);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   425
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   426
                Type initType = getTypeByName(type);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   427
                JCExpression initExpr = null;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   428
                if ((declFlags & Flags.STATIC) != 0) // static to be initialized
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   429
                    initExpr = make.Literal(initType.isPrimitive() ?
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   430
                                             initType.getTag() :
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   431
                                             TypeTag.BOT,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   432
                                             "String".equals(type)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   433
                                                 ? new String("blah-blah-blah")
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   434
                                                 : new Integer(0));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   435
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   436
                JCVariableDecl fieldDecl = make.VarDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   437
                                               make.Modifiers(declFlags, annos.toList()),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   438
                                               names.fromString(declName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   439
                                               make.Type(getTypeByName(type)),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   440
                                               initExpr);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   441
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   442
                fields.append(fieldDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   443
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   444
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   445
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   446
        return fields;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   447
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   448
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   449
    JCTree processSerialFields(Element sfNode) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   450
        String baseName = sfNode.getAttribute("basename");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   451
        String[] fieldTypes = sfNode.getTextContent().split(",");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   452
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   453
        ListBuffer<JCExpression> serialFields = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   454
        Hashtable<String, Integer> scope = new Hashtable<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   455
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   456
        for (String fType : fieldTypes) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   457
            String fieldName = baseName + getUniqIndex(scope, baseName);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   458
            serialFields.add(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   459
                make.NewClass(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   460
                    null,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   461
                    null,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   462
                    make.Type(getTypeByName("ObjectStreamField")),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   463
                    List.from(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   464
                        new JCTree.JCExpression[] {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   465
                            make.Literal(fieldName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   466
                            make.Ident(names.fromString(fType + ".class"))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   467
                        }),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   468
                    null));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   469
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   470
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   471
        JCTree sfDecl = make.VarDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   472
                            make.Modifiers(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   473
                                Flags.PRIVATE | Flags.STATIC | Flags.FINAL),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   474
                            names.fromString("serialPersistentFields"),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   475
                            make.TypeArray(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   476
                                make.Type(getTypeByName("ObjectStreamField"))),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   477
                            make.NewArray(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   478
                                null,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   479
                                List.<JCExpression>nil(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   480
                                serialFields.toList()));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   481
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   482
        return sfDecl;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   483
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   484
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   485
    ListBuffer<JCTree> processConstants(Element constNode, Hashtable<String, Integer> scope) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   486
        String baseName = constNode.getAttribute("basename");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   487
        int count = 1;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   488
        try {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   489
            count = Integer.parseInt(constNode.getAttribute("count"));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   490
        } catch (Exception e) {} // nothing to do, will use count = 1
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   491
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   492
        long declFlags = Flags.PUBLIC | Flags.STATIC | Flags.FINAL | Flags.ENUM;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   493
        ListBuffer<JCTree> fields = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   494
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   495
        for (int i = 0; i < count; i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   496
            String declName = baseName +
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   497
                              ((count == 1) ? "" : getUniqIndex(scope, baseName));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   498
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   499
            JCVariableDecl constDecl = make.VarDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   500
                                           make.Modifiers(declFlags),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   501
                                           names.fromString(declName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   502
                                           null,  // no need for type in enum decl
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   503
                                           null); // no init
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   504
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   505
            fields.append(constDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   506
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   507
        return fields;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   508
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   509
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   510
    ListBuffer<JCTree> processMethods(Element methodsNode, Hashtable<String, Integer> scope, boolean needBody, boolean isConstructor) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   511
        String kind = methodsNode.getTagName();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   512
        String baseName = methodsNode.getAttribute("basename");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   513
        String name = methodsNode.getAttribute("name");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   514
        String methodTypeParam = methodsNode.getAttribute("tparam");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   515
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   516
        ListBuffer<JCTree> methods = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   517
        NodeList nodes = methodsNode.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   518
        SimpleMultiplier multiply = new SimpleMultiplier(); // for modifiers
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   519
        String[] types = new String[0];
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   520
        String[] params = new String[] { "none" }; // default - no params
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   521
        ListBuffer<Type> throwTypes = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   522
        for (int i = 0; i < nodes.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   523
            Node node = nodes.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   524
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   525
            if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   526
                continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   527
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   528
            // parse type and modifiers
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   529
            switch (((Element)node).getTagName()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   530
                case "modifier":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   531
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   532
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   533
                case "anno":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   534
                    multiply.addAxis(((Element)node).getTextContent());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   535
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   536
                case "type":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   537
                    types = ((Element)node).getTextContent().split("\\|");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   538
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   539
                case "param":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   540
                    params = ((Element)node).getTextContent().split("\\|");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   541
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   542
                case "throw":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   543
                    throwTypes.add(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   544
                        getTypeByName(((Element)node).getTextContent()));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   545
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   546
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   547
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   548
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   549
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   550
        // constructor?
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   551
        if (isConstructor) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   552
            baseName = "constructor";
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   553
            types = new String[] { "" };
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   554
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   555
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   556
        // direct name not indexed
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   557
        boolean isDirectName = false;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   558
        if (name.length() > 0) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   559
            baseName = name;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   560
            isDirectName = true;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   561
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   562
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   563
        // process through modifiers and types
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   564
        multiply.initIterator();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   565
        while (multiply.hasNext()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   566
            ArrayList<String> tuple = multiply.getNext();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   567
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   568
            long declFlags = 0;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   569
            ListBuffer<JCAnnotation> annos = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   570
            for (String modifier : tuple) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   571
                if (modifier.startsWith("@") && idAnnos.containsKey(modifier))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   572
                    annos.add(idAnnos.get(modifier)); // it's anno
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   573
                else
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   574
                    declFlags |= getFlagByName(modifier); // it's modifier
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   575
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   576
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   577
            for (String type : types) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   578
                String declName = baseName
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   579
                                  + ((isConstructor || isDirectName)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   580
                                     ? "" : getUniqIndex(scope, baseName));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   581
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   582
                JCBlock body = null;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   583
                if (needBody && (declFlags & Flags.ABSTRACT) == 0) { // create body
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   584
                    List<JCStatement> bodyStatements = List.<JCStatement>nil();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   585
                    if (!type.equals("") && !type.equals("void")) { // create return statement
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   586
                        Type retType = getTypeByName(type);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   587
                        bodyStatements = List.<JCStatement>of(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   588
                                             make.Return(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   589
                                                 make.Literal(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   590
                                                     retType.isPrimitive() ?
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   591
                                                         retType.getTag() :
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   592
                                                         TypeTag.BOT,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   593
                                                     new Integer(0))));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   594
                    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   595
                    body = make.Block(0, bodyStatements);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   596
                }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   597
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   598
                // same method by different params (if they exist)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   599
                for (String param : params) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   600
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   601
                    JCMethodDecl methodDecl =
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   602
                        make.MethodDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   603
                            make.Modifiers(declFlags, annos.toList()),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   604
                            names.fromString(declName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   605
                            isConstructor ? null : make.Type(getTypeByName(type)),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   606
                            processTypeParams(methodTypeParam), // type params
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   607
                            null,                               // no receiver
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   608
                            processParams(param),               // formal params
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   609
                            make.Types(throwTypes.toList()),   // throws
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   610
                            body,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   611
                            null);                              // no default value YET
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   612
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   613
                    methods.append(methodDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   614
                }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   615
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   616
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   617
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   618
        return methods;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   619
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   620
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   621
    JCAnnotation processAnnoDecl(Element annoDeclNode) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   622
        String annoId = annoDeclNode.getAttribute("id");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   623
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   624
        ListBuffer<JCExpression> args = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   625
        String className = "";
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   626
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   627
        NodeList nodes = annoDeclNode.getChildNodes();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   628
        for (int i = 0; i < nodes.getLength(); i++) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   629
            Node node = nodes.item(i);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   630
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   631
            if (!(node instanceof Element))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   632
                continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   633
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   634
            switch (((Element)node).getTagName()) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   635
                case "class":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   636
                    className = ((Element)node).getTextContent();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   637
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   638
                case "arg":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   639
                    String argName = ((Element)node).getAttribute("name");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   640
                    String argValue = ((Element)node).getAttribute("value");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   641
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   642
                    JCExpression arg;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   643
                    if (argName.length() == 0)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   644
                        arg = make.Ident(names.fromString(argValue));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   645
                    else
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   646
                        arg = make.Assign(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   647
                                  make.Ident(names.fromString(argName)),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   648
                                  make.Ident(names.fromString(argValue)));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   649
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   650
                    args.add(arg);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   651
                    break;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   652
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   653
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   654
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   655
        return make.Annotation(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   656
                   make.Ident(names.fromString(className)),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   657
                   args.toList());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   658
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   659
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   660
    ListBuffer<JCTree> processMethods(List<JCTree> tree, boolean needBody) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   661
        // for "extends" clause; returns methods only
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   662
        ListBuffer<JCTree> methods = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   663
        for (JCTree memberDecl : tree) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   664
            if (memberDecl instanceof JCMethodDecl) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   665
                JCMethodDecl methodDecl = (JCMethodDecl)memberDecl;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   666
                JCTree retTypeTree = methodDecl.getReturnType();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   667
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   668
                // skip constructors
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   669
                if (retTypeTree == null)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   670
                    continue;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   671
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   672
                if (needBody) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   673
                    // here we need to 'implement' interface declared methods
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   674
                    Type retType = retTypeTree.type;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   675
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   676
                    List<JCStatement> bodyStatements = List.<JCStatement>nil();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   677
                    if (retType.getTag() != TypeTag.VOID)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   678
                        bodyStatements = List.<JCStatement>of(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   679
                                             make.Return(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   680
                                                 make.Literal(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   681
                                                     retType.isPrimitive() ?
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   682
                                                         retType.getTag() :
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   683
                                                         TypeTag.BOT,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   684
                                                     new Integer(0))));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   685
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   686
                    JCBlock body = make.Block(0, bodyStatements);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   687
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   688
                    methodDecl = make.MethodDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   689
                                     methodDecl.getModifiers(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   690
                                     methodDecl.getName(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   691
                                     (JCExpression)methodDecl.getReturnType(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   692
                                     methodDecl.getTypeParameters(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   693
                                     methodDecl.getReceiverParameter(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   694
                                     methodDecl.getParameters(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   695
                                     methodDecl.getThrows(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   696
                                     body,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   697
                                     (JCExpression)methodDecl.getDefaultValue());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   698
                }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   699
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   700
                methods.add(methodDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   701
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   702
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   703
        return methods;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   704
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   705
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   706
    void fixConstructorNames(JCClassDecl baseDecl) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   707
        ListBuffer<JCTree> newMembers = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   708
        List<JCTree> members = baseDecl.getMembers();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   709
        Name name = baseDecl.getSimpleName();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   710
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   711
        for (JCTree memberDecl : members) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   712
            JCTree newDecl = memberDecl;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   713
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   714
            if (memberDecl instanceof JCMethodDecl) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   715
                JCMethodDecl methodDecl = (JCMethodDecl)memberDecl;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   716
                JCTree retTypeTree = methodDecl.getReturnType();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   717
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   718
                if (retTypeTree == null)
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   719
                    newDecl = make.MethodDef(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   720
                                  methodDecl.getModifiers(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   721
                                  name,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   722
                                  (JCExpression)methodDecl.getReturnType(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   723
                                  methodDecl.getTypeParameters(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   724
                                  methodDecl.getReceiverParameter(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   725
                                  methodDecl.getParameters(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   726
                                  methodDecl.getThrows(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   727
                                  methodDecl.getBody(),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   728
                                  (JCExpression)methodDecl.getDefaultValue());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   729
            }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   730
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   731
            newMembers.add(newDecl);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   732
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   733
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   734
        baseDecl.defs = newMembers.toList();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   735
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   736
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   737
    List<JCVariableDecl> processParams(String paramTypes) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   738
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   739
        if ("none".equals(paramTypes))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   740
            return List.<JCVariableDecl>nil(); // empty
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   741
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   742
        String[] typesArr = paramTypes.split(",(?!(\\w+,)*\\w+>)");
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   743
        ListBuffer<JCVariableDecl> paramsDecls = new ListBuffer<>();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   744
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   745
        int i = 0;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   746
        for (String typeName : typesArr) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   747
            String paramName = "param"
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   748
                               + (typesArr.length == 1 ? "" : String.valueOf(i));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   749
            paramsDecls.add(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   750
                make.VarDef(make.Modifiers(0),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   751
                             names.fromString(paramName),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   752
                             make.Type(getTypeByName(typeName)),
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   753
                             null));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   754
            i++;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   755
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   756
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   757
        return paramsDecls.toList();
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   758
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   759
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   760
    //
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   761
    // util methods
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   762
    //
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   763
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   764
    String getUniqName(String name) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   765
        if (!nameIndex.containsKey(name))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   766
            nameIndex.put(name, new Integer(0));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   767
        Integer index = nameIndex.get(name);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   768
        String uniqName = name + index;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   769
        nameIndex.put(name, index + 1);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   770
        return uniqName;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   771
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   772
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   773
    int getUniqIndex(Hashtable<String, Integer> scope, String name) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   774
        if (!scope.containsKey(name))
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   775
            scope.put(name, new Integer(0));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   776
        Integer index = scope.get(name);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   777
        scope.put(name, index + 1);
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   778
        return index;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   779
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   780
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   781
    long getFlagByName(String modifierName) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   782
        switch (modifierName) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   783
            case "public":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   784
                return Flags.PUBLIC;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   785
            case "private":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   786
                return Flags.PRIVATE;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   787
            case "protected":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   788
                return Flags.PROTECTED;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   789
            case "static":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   790
                return Flags.STATIC;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   791
            case "final":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   792
                return Flags.FINAL;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   793
            case "abstract":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   794
                return Flags.ABSTRACT;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   795
            case "strictfp":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   796
                return Flags.STRICTFP;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   797
            default:
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   798
                return 0;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   799
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   800
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   801
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   802
    Type getTypeByName(String typeName) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   803
        //check for primitive types
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   804
        switch (typeName) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   805
            case "void":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   806
                return syms.voidType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   807
            case "boolean":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   808
                return syms.booleanType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   809
            case "byte":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   810
                return syms.byteType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   811
            case "char":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   812
                return syms.charType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   813
            case "double":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   814
                return syms.doubleType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   815
            case "float":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   816
                return syms.floatType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   817
            case "int":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   818
                return syms.intType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   819
            case "long":
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   820
                return syms.longType;
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   821
            default:
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   822
                return getTypeByName(typeName, List.<Type>nil());
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   823
        }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   824
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   825
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   826
    Type getTypeByName(String typeName, List<Type> tparams) {
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   827
        return new Type.ClassType(
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   828
                   Type.noType,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   829
                   tparams,
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   830
                   new Symbol.ClassSymbol(0, names.fromString(typeName), null));
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   831
    }
e9fccc09cfc6 8130880: Create sampleapi regression test
ksrini
parents:
diff changeset
   832
}