src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java
author jlahoda
Fri, 29 Mar 2019 10:12:18 +0100
branchjlahoda-tree-builder
changeset 57296 464cc8d22d94
parent 57295 5497ee9d40f4
child 57297 ad0be596956b
permissions -rw-r--r--
Experimenting with types modelling.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     1
/*
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     4
 *
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    10
 *
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    15
 * accompanied this code).
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    16
 *
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    20
 *
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    23
 * questions.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    24
 */package com.sun.tools.javac.api;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    25
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    26
import java.util.function.Consumer;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    27
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    28
import com.sun.source.doctree.DocTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    29
import com.sun.source.tree.CompilationUnitTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    30
import com.sun.source.util.TreeBuilder;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    31
import com.sun.tools.javac.code.TypeTag;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    32
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    33
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    34
import com.sun.tools.javac.tree.JCTree.JCExpression;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    35
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    36
import com.sun.tools.javac.tree.JCTree.Tag;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    37
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    38
import com.sun.tools.javac.tree.TreeMaker;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    39
import com.sun.tools.javac.util.List;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    40
import com.sun.tools.javac.util.Names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    41
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    42
/**
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    43
 * Implementation for TreeBuilder.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    44
 * Note: this is only a crude experiment.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    45
 */
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    46
public class TreeBuilderImpl implements TreeBuilder {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    47
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    48
    private final TreeMaker make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    49
    private final Names names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    50
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    51
    public TreeBuilderImpl(TreeMaker make, Names names) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    52
        this.make = make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    53
        this.names = names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    54
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    55
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    56
    @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    57
    public CompilationUnitTree createCompilationUnitTree(Consumer<CompilationUnit> unit) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    58
        CompilationUnitImpl cui = new CompilationUnitImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    59
        unit.accept(cui);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    60
        return cui.result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    61
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    62
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    63
    private final class CompilationUnitImpl implements CompilationUnit {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    64
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    65
        private final JCCompilationUnit result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    66
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    67
        public CompilationUnitImpl() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    68
            this.result = make.TopLevel(List.nil());
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    69
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    70
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    71
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    72
        public CompilationUnit _package(String... qname) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    73
            JCExpression qualIdent = make.Ident(names.fromString(qname[0])); //XXX: should check qname.length > 0!
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    74
            for (int i = 1; i < qname.length; i++) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    75
                qualIdent = make.Select(qualIdent, names.fromString(qname[i]));
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    76
            }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    77
            result.defs = result.defs.stream().filter(t -> !t.hasTag(Tag.PACKAGEDEF)).collect(List.collector()) //XXX: what should be the behavior if already filled?
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    78
                          .prepend(make.PackageDecl(List.nil(), qualIdent));
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    79
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    80
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    81
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    82
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    83
        public CompilationUnit _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    84
            ClassImpl ci = new ClassImpl(name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    85
            clazz.accept(ci);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    86
            result.defs = result.defs.append(ci.result);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    87
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    88
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    89
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    90
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    91
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    92
    private final class ClassImpl implements Class {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    93
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    94
        private final JCClassDecl result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    95
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    96
        public ClassImpl(String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    97
            this.result = make.ClassDef(make.Modifiers(0), names.fromString(name), List.nil(), null, List.nil(), List.nil());
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    98
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    99
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   100
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   101
        public Class superclass(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   102
            result.extending = visitType(sup); //TODO: check extending not filled!
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   103
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   104
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   105
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   106
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   107
        public Class superinterface(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   108
            result.implementing = result.implementing.append(visitType(sup));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   109
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   110
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   111
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   112
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   113
        public Class field(String name, Consumer<Type> type, Consumer<Variable> field) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   114
            TypeImpl ti = new TypeImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   115
            type.accept(ti);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   116
            if (ti.type == null) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   117
                throw new IllegalStateException("Type not provided!");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   118
            }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   119
            VariableImpl vi = new VariableImpl(ti.type, name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   120
            field.accept(vi);
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   121
            result.defs = result.defs.append(vi.result);
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   122
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   123
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   124
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   125
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   126
        public Class method(String name, Consumer<Type> restype, Consumer<Method> method) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   127
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   128
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   129
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   130
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   131
        public Class _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   132
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   133
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   134
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   135
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   136
        public Class modifiers(Consumer<Modifiers> modifiers) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   137
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   138
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   139
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   140
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   141
        public Class javadoc(DocTree doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   142
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   143
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   144
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   145
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   146
        public Class javadoc(String doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   147
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   148
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   149
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   150
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   151
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   152
    private final class TypeImpl implements Type {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   153
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   154
        private JCExpression type;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   155
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   156
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   157
        public void _class(Consumer<QualifiedName> className, Consumer<TypeArguments> typeArguments) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   158
            JCExpression clazz = visitQualifiedName(className);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   159
            TypeArgumentsImpl ta = new TypeArgumentsImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   160
            typeArguments.accept(ta);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   161
            if (ta.types.isEmpty()) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   162
                type = clazz;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   163
            } else {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   164
                type = make.TypeApply(clazz, ta.types);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   165
            }
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   166
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   167
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   168
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   169
        public void _int() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   170
            //XXX: check empty!
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   171
            type = make.TypeIdent(TypeTag.INT);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   172
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   173
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   174
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   175
        public void _float() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   176
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   177
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   178
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   179
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   180
        public void _void() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   181
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   182
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   183
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   184
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   185
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   186
    private final class TypeArgumentsImpl implements TypeArguments {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   187
        private List<JCExpression> types = List.nil();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   188
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   189
        public TypeArguments type(Consumer<Type> t) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   190
            TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   191
            t.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   192
            types = types.append(type.type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   193
            return this;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   194
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   195
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   196
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   197
    private final class VariableImpl implements Variable {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   198
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   199
        private final JCVariableDecl result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   200
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   201
        public VariableImpl(JCExpression type, String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   202
            result = make.VarDef(make.Modifiers(0), names.fromString(name), type, null);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   203
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   204
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   205
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   206
        public Variable init(Consumer<Expression> init) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   207
            result.init = visitExpression(init);
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   208
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   209
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   210
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   211
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   212
        public Variable modifiers(Consumer<Modifiers> modifiers) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   213
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   214
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   215
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   216
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   217
        public Variable javadoc(DocTree doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   218
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   219
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   220
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   221
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   222
        public Variable javadoc(String doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   223
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   224
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   225
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   226
    }
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   227
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   228
    private final class ExpressionImpl implements Expression {
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   229
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   230
        private JCExpression expr;
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   231
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   232
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   233
        public void minusminus(Consumer<Expression> expr) {
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   234
            throw new UnsupportedOperationException("Not supported yet.");
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   235
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   236
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   237
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   238
        public void plus(Consumer<Expression> lhs, Consumer<Expression> rhs) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   239
            expr = make.Binary(Tag.PLUS,
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   240
                               visitExpression(lhs),
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   241
                               visitExpression(rhs));
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   242
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   243
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   244
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   245
        public void cond(Consumer<Expression> cond, Consumer<Expression> truePart, Consumer<Expression> falsePart) {
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   246
            throw new UnsupportedOperationException("Not supported yet.");
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   247
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   248
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   249
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   250
        public void select(Consumer<Expression> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   251
            expr = make.Select(visitExpression(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   252
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   253
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   254
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   255
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   256
            expr = make.Ident(names.fromString(ident)); //XXX
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   257
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   258
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   259
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   260
        public void literal(Object value) {
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   261
            expr = make.Literal(value);
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   262
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   263
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   264
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   265
    private final class QualifiedNameImpl implements QualifiedName {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   266
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   267
        private JCExpression expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   268
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   269
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   270
        public void select(Consumer<QualifiedName> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   271
            expr = make.Select(visitQualifiedName(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   272
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   273
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   274
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   275
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   276
            expr = make.Ident(names.fromString(ident));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   277
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   278
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   279
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   280
        public void ident(String... qnames) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   281
            expr = make.Ident(names.fromString(qnames[0]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   282
            for (int i = 1; i < qnames.length; i++) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   283
                expr = make.Select(expr, names.fromString(qnames[i]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   284
            }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   285
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   286
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   287
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   288
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   289
    private JCExpression visitExpression(Consumer<Expression> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   290
        ExpressionImpl expr = new ExpressionImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   291
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   292
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   293
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   294
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   295
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   296
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   297
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   298
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   299
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   300
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   301
    private JCExpression visitQualifiedName(Consumer<QualifiedName> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   302
        QualifiedNameImpl expr = new QualifiedNameImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   303
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   304
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   305
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   306
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   307
            throw new IllegalStateException("Name not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   308
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   309
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   310
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   311
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   312
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   313
    private JCExpression visitType(Consumer<Type> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   314
        TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   315
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   316
        c.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   317
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   318
        if (type.type == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   319
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   320
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   321
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   322
        return type.type;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   323
    }
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   324
}