src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java
author jlahoda
Mon, 01 Apr 2019 14:46:17 +0200
branchjlahoda-tree-builder
changeset 57298 72d5f7163f12
parent 57297 ad0be596956b
child 57300 c79e191854e4
permissions -rw-r--r--
Adding ability to supply code as text instead of Trees on some places.
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
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    26
import java.nio.CharBuffer;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    27
import java.util.function.Consumer;
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    28
import java.util.function.Function;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    29
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    30
import javax.tools.JavaFileObject;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    31
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    32
import com.sun.source.doctree.DocTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    33
import com.sun.source.tree.CompilationUnitTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    34
import com.sun.source.util.TreeBuilder;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    35
import com.sun.tools.javac.code.TypeTag;
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
    36
import com.sun.tools.javac.tree.JCTree;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    37
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    38
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    39
import com.sun.tools.javac.tree.JCTree.JCExpression;
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
    40
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    41
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    42
import com.sun.tools.javac.tree.JCTree.Tag;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    43
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    44
import com.sun.tools.javac.tree.TreeMaker;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    45
import com.sun.tools.javac.util.List;
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    46
import com.sun.tools.javac.main.JavaCompiler;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    47
import com.sun.tools.javac.parser.Parser;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    48
import com.sun.tools.javac.parser.ParserFactory;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    49
import com.sun.tools.javac.tree.JCTree.JCBlock;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    50
import com.sun.tools.javac.tree.JCTree.JCStatement;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    51
import com.sun.tools.javac.util.JCDiagnostic;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    52
import com.sun.tools.javac.util.Log.DiagnosticHandler;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    53
import com.sun.tools.javac.util.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
 * Implementation for TreeBuilder.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    57
 * Note: this is only a crude experiment.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    58
 */
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    59
public class TreeBuilderImpl implements TreeBuilder {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    60
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    61
    private final JavaCompiler compiler;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    62
    private final ParserFactory parserFactory;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    63
    private final TreeMaker make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    64
    private final Names names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    65
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    66
    public TreeBuilderImpl(JavaCompiler compiler, ParserFactory parserFactory, TreeMaker make, Names names) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    67
        this.compiler = compiler;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    68
        this.parserFactory = parserFactory;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    69
        this.make = make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    70
        this.names = names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    71
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    72
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    73
    @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    74
    public CompilationUnitTree createCompilationUnitTree(Consumer<CompilationUnit> unit) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    75
        CompilationUnitImpl cui = new CompilationUnitImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    76
        unit.accept(cui);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    77
        return cui.result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    78
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    79
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    80
    private final class CompilationUnitImpl implements CompilationUnit {
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
        private final JCCompilationUnit result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    83
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    84
        public CompilationUnitImpl() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    85
            this.result = make.TopLevel(List.nil());
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    86
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    87
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    88
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    89
        public CompilationUnit _package(String... qname) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    90
            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
    91
            for (int i = 1; i < qname.length; i++) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    92
                qualIdent = make.Select(qualIdent, names.fromString(qname[i]));
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
            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
    95
                          .prepend(make.PackageDecl(List.nil(), qualIdent));
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    96
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    97
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   100
        public CompilationUnit _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   101
            ClassImpl ci = new ClassImpl(name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   102
            clazz.accept(ci);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   103
            result.defs = result.defs.append(ci.result);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   104
            return this;
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
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   107
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   108
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   109
    private final class ClassImpl implements Class {
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
        private final JCClassDecl result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   112
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   113
        public ClassImpl(String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   114
            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
   115
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   116
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   117
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   118
        public Class superclass(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   119
            result.extending = visitType(sup); //TODO: check extending not filled!
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   120
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   121
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   122
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   123
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   124
        public Class superinterface(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   125
            result.implementing = result.implementing.append(visitType(sup));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   126
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   127
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   130
        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
   131
            TypeImpl ti = new TypeImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   132
            type.accept(ti);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   133
            if (ti.type == null) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   134
                throw new IllegalStateException("Type not provided!");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   135
            }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   136
            VariableImpl vi = new VariableImpl(ti.type, name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   137
            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
   138
            result.defs = result.defs.append(vi.result);
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   139
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   140
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   141
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   142
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   143
        public Class method(String name, Consumer<Type> restype, Consumer<Method> method) {
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   144
            TypeImpl ti = new TypeImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   145
            restype.accept(ti);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   146
            if (ti.type == null) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   147
                throw new IllegalStateException("Type not provided!");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   148
            }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   149
            MethodImpl vi = new MethodImpl(ti.type, name);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   150
            method.accept(vi);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   151
            result.defs = result.defs.append(vi.result);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   152
            return this;
57267
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
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   155
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   156
        public Class _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   157
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   158
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   159
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   160
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   161
        public Class modifiers(Consumer<Modifiers> modifiers) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   162
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   163
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   164
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   165
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   166
        public Class javadoc(DocTree doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   167
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   168
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   169
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   170
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   171
        public Class javadoc(String doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   172
            throw new UnsupportedOperationException("Not supported yet.");
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
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   175
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   176
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   177
    private final class TypeImpl implements Type {
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
        private JCExpression type;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   180
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   181
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   182
        public void _class(Consumer<QualifiedName> className, Consumer<TypeArguments> typeArguments) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   183
            JCExpression clazz = visitQualifiedName(className);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   184
            TypeArgumentsImpl ta = new TypeArgumentsImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   185
            typeArguments.accept(ta);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   186
            if (ta.types.isEmpty()) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   187
                type = clazz;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   188
            } else {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   189
                type = make.TypeApply(clazz, ta.types);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   190
            }
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   191
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   192
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   193
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   194
        public void _int() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   195
            //XXX: check empty!
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   196
            type = make.TypeIdent(TypeTag.INT);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   197
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   200
        public void _float() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   201
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   202
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   205
        public void _void() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   206
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   207
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   208
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   209
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   210
        public void type(String typeSpec) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   211
            type = parse(typeSpec, Parser::parseType);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   212
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   213
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   214
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   215
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   216
    private final class TypeArgumentsImpl implements TypeArguments {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   217
        private List<JCExpression> types = List.nil();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   218
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   219
        public TypeArguments type(Consumer<Type> t) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   220
            TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   221
            t.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   222
            types = types.append(type.type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   223
            return this;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   224
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   225
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   226
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   227
    private final class VariableImpl implements Variable {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   228
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   229
        private final JCVariableDecl result;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   230
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   231
        public VariableImpl(JCExpression type, String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   232
            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
   233
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   234
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   235
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   236
        public Variable init(Consumer<Expression> init) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   237
            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
   238
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   239
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   240
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   241
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   242
        public Variable modifiers(Consumer<Modifiers> modifiers) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   243
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   244
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   245
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   246
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   247
        public Variable javadoc(DocTree doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   248
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   249
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   250
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   251
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   252
        public Variable javadoc(String doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   253
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   254
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   255
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   256
    }
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
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   258
    private final class MethodImpl implements Method {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   259
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   260
        private final JCMethodDecl result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   261
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   262
        public MethodImpl(JCExpression restype, String name) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   263
            result = make.MethodDef(make.Modifiers(0), names.fromString(name), restype, List.nil(), List.nil(), List.nil(), null, null);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   264
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   265
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   266
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   267
        public Method parameter(Consumer<Type> type, Consumer<Parameter> parameter) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   268
            ParameterImpl paramImpl = new ParameterImpl(visitType(type));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   269
            parameter.accept(paramImpl);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   270
            result.params = result.params.append(paramImpl.result);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   271
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   272
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   273
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   274
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   275
        public Method body(Consumer<Block> statements) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   276
            BlockImpl block = new BlockImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   277
            statements.accept(block);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   278
            result.body = make.Block(0, block.statements);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   279
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   280
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   281
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   282
        @Override
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   283
        public Method body(String body) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   284
            JCStatement parsedBody = parse(body, Parser::parseStatement);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   285
            if (!parsedBody.hasTag(Tag.BLOCK)) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   286
                throw new IllegalArgumentException("Block not provided!");
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   287
            }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   288
            result.body = (JCBlock) parsedBody;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   289
            return this;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   290
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   291
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   292
        @Override
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   293
        public Method modifiers(Consumer<Modifiers> modifiers) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   294
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   295
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   296
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   297
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   298
        public Method javadoc(DocTree doc) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   299
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   300
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   301
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   302
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   303
        public Method javadoc(String doc) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   304
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   305
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   306
        
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   307
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   308
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   309
    private final class ParameterImpl implements Parameter {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   310
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   311
        private final JCVariableDecl result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   312
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   313
        public ParameterImpl(JCExpression type) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   314
            //TODO: infer name
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   315
            result = make.VarDef(make.Modifiers(0), null, type, null);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   316
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   317
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   318
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   319
        public Parameter modifiers(Consumer<Modifiers> modifiers) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   320
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   321
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   322
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   323
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   324
        public Parameter name(String name) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   325
            result.name = names.fromString(name); //XXX: check not set yet.
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   326
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   327
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   328
        
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   329
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   330
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   331
    private final class BlockImpl extends StatementBaseImpl<Block> implements Block {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   332
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   333
        private List<JCStatement> statements = List.nil();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   334
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   335
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   336
        protected Block addStatement(JCStatement stat) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   337
            statements = statements.append(stat);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   338
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   339
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   340
        
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   341
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   342
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   343
    private final class StatementImpl extends StatementBaseImpl<Void> implements Statement {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   344
        private JCStatement result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   345
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   346
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   347
        protected Void addStatement(JCStatement stat) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   348
            if (result != null) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   349
                throw new IllegalStateException();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   350
            }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   351
            result = stat;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   352
            return null;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   353
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   354
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   355
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   356
    private abstract class StatementBaseImpl<S> implements StatementBase<S> {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   357
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   358
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   359
        public S _if(Consumer<Expression> cond, Consumer<Statement> ifPart) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   360
            JCExpression expr = visitExpression(cond);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   361
            //TODO: should this automatic wrapping with parenthesized be here?
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   362
            expr = make.Parens(expr);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   363
            StatementImpl ifStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   364
            ifPart.accept(ifStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   365
            //TODO: check ifPart filled!
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   366
            return addStatement(make.If(expr, ifStatement.result, null));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   367
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   368
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   369
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   370
        public S _if(Consumer<Expression> cond, Consumer<Statement> ifPart, Consumer<Statement> elsePart) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   371
            JCExpression expr = visitExpression(cond);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   372
            //TODO: should this automatic wrapping with parenthesized be here?
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   373
            expr = make.Parens(expr);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   374
            StatementImpl ifStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   375
            ifPart.accept(ifStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   376
            //TODO: check ifPart filled!
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   377
            StatementImpl elseStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   378
            elsePart.accept(elseStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   379
            return addStatement(make.If(expr, ifStatement.result, elseStatement.result));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   380
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   381
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   382
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   383
        public S _return() {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   384
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   385
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   386
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   387
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   388
        public S _return(Consumer<Expression> expr) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   389
            return addStatement(make.Return(visitExpression(expr)));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   390
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   391
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   392
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   393
        public S expr(Consumer<Expression> expr) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   394
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   395
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   396
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   397
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   398
        public S skip() {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   399
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   400
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   401
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   402
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   403
        public S statement(String statement) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   404
            return addStatement(parse(statement, Parser::parseStatement));
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   405
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   406
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   407
        protected abstract S addStatement(JCStatement stat);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   408
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   409
    
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   410
    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
   411
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   412
        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
   413
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   414
        @Override
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   415
        public void equal_to(Consumer<Expression> lhs, Consumer<Expression> rhs) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   416
            expr = make.Binary(Tag.EQ,
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   417
                               visitExpression(lhs),
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   418
                               visitExpression(rhs));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   419
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   420
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   421
        @Override
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   422
        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
   423
            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
   424
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   425
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   426
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   427
        public void plus(Consumer<Expression> lhs, Consumer<Expression> rhs) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   428
            expr = make.Binary(Tag.PLUS,
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   429
                               visitExpression(lhs),
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   430
                               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
   431
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   432
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   433
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   434
        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
   435
            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
   436
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   437
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   438
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   439
        public void select(Consumer<Expression> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   440
            expr = make.Select(visitExpression(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   441
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   442
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   443
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   444
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   445
            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
   446
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   447
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   448
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   449
        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
   450
            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
   451
        }
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   452
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   453
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   454
        public void expression(String expression) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   455
            expr = parse(expression, Parser::parseExpression);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   456
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   457
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   458
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   459
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   460
    private final class QualifiedNameImpl implements QualifiedName {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   461
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   462
        private JCExpression expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   463
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   464
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   465
        public void select(Consumer<QualifiedName> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   466
            expr = make.Select(visitQualifiedName(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   467
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   468
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   469
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   470
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   471
            expr = make.Ident(names.fromString(ident));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   472
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   473
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   474
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   475
        public void ident(String... qnames) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   476
            expr = make.Ident(names.fromString(qnames[0]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   477
            for (int i = 1; i < qnames.length; i++) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   478
                expr = make.Select(expr, names.fromString(qnames[i]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   479
            }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   480
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   481
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   482
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   483
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   484
    private JCExpression visitExpression(Consumer<Expression> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   485
        ExpressionImpl expr = new ExpressionImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   486
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   487
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   488
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   489
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   490
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   491
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   492
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   493
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   494
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   495
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   496
    private JCExpression visitQualifiedName(Consumer<QualifiedName> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   497
        QualifiedNameImpl expr = new QualifiedNameImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   498
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   499
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   500
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   501
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   502
            throw new IllegalStateException("Name not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   503
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   504
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   505
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   506
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   507
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   508
    private JCExpression visitType(Consumer<Type> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   509
        TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   510
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   511
        c.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   512
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   513
        if (type.type == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   514
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   515
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   516
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   517
        return type.type;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   518
    }
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   519
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   520
    private <T extends JCTree> T parse(String toParse, Function<Parser, T> runParse) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   521
        if (toParse == null || toParse.equals(""))
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   522
            throw new IllegalArgumentException();
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   523
        JavaFileObject prev = compiler.log.useSource(null);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   524
        DiagnosticHandler h = null;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   525
        try {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   526
            h = new DiagnosticHandler() {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   527
                {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   528
                    install(compiler.log);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   529
                }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   530
                @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   531
                public void report(JCDiagnostic err) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   532
                    if (err.getKind() == JCDiagnostic.Kind.ERROR) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   533
                        throw new IllegalArgumentException("Cannot parse input: " + err.getMessage(null));
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   534
                    }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   535
                }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   536
            };
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   537
            CharBuffer buf = CharBuffer.wrap((toParse+"\u0000").toCharArray(), 0, toParse.length());
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   538
            Parser parser = parserFactory.newParser(buf, false, false, false);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   539
            return runParse.apply(parser);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   540
        } finally {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   541
            compiler.log.popDiagnosticHandler(h);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   542
            compiler.log.useSource(prev);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   543
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   544
    }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   545
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   546
}