src/jdk.compiler/share/classes/com/sun/tools/javac/api/TreeBuilderImpl.java
author jlahoda
Tue, 02 Apr 2019 16:51:25 +0200
branchjlahoda-tree-builder
changeset 57300 c79e191854e4
parent 57298 72d5f7163f12
permissions -rw-r--r--
Adding support for modifiers.
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
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
    30
import javax.lang.model.element.Modifier;
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    31
import javax.tools.JavaFileObject;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    32
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    33
import com.sun.source.doctree.DocTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    34
import com.sun.source.tree.CompilationUnitTree;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    35
import com.sun.source.util.TreeBuilder;
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
    36
import com.sun.tools.javac.code.Flags;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    37
import com.sun.tools.javac.code.TypeTag;
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
    38
import com.sun.tools.javac.tree.JCTree;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    39
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    40
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    41
import com.sun.tools.javac.tree.JCTree.JCExpression;
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
    42
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
    43
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    44
import com.sun.tools.javac.tree.JCTree.Tag;
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
import com.sun.tools.javac.tree.TreeMaker;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    47
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
    48
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
    49
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
    50
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
    51
import com.sun.tools.javac.tree.JCTree.JCBlock;
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
    52
import com.sun.tools.javac.tree.JCTree.JCModifiers;
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    53
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
    54
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
    55
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
    56
import com.sun.tools.javac.util.Names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    57
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
 * Implementation for TreeBuilder.
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    60
 * Note: this is only a crude experiment.
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
public class TreeBuilderImpl implements TreeBuilder {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    63
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    64
    private final JavaCompiler compiler;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    65
    private final ParserFactory parserFactory;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    66
    private final TreeMaker make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    67
    private final Names names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    68
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    69
    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
    70
        this.compiler = compiler;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
    71
        this.parserFactory = parserFactory;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    72
        this.make = make;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    73
        this.names = names;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    74
    }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    75
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    76
    @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    77
    public CompilationUnitTree createCompilationUnitTree(Consumer<CompilationUnit> unit) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    78
        CompilationUnitImpl cui = new CompilationUnitImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    79
        unit.accept(cui);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    80
        return cui.result;
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
    
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    83
    private final class CompilationUnitImpl implements CompilationUnit {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    84
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    85
        private final JCCompilationUnit result;
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
        public CompilationUnitImpl() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    88
            this.result = make.TopLevel(List.nil());
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    92
        public CompilationUnit _package(String... qname) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    93
            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
    94
            for (int i = 1; i < qname.length; i++) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    95
                qualIdent = make.Select(qualIdent, names.fromString(qname[i]));
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    96
            }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    97
            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
    98
                          .prepend(make.PackageDecl(List.nil(), qualIdent));
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
    99
            return this;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   100
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   101
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   102
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   103
        public CompilationUnit _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   104
            ClassImpl ci = new ClassImpl(name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   105
            clazz.accept(ci);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   106
            result.defs = result.defs.append(ci.result);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   107
            return this;
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
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
    private final class ClassImpl implements Class {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   113
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   114
        private final JCClassDecl result;
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
        public ClassImpl(String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   117
            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
   118
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   119
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   120
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   121
        public Class superclass(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   122
            result.extending = visitType(sup); //TODO: check extending not filled!
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   123
            return this;
57267
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
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   126
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   127
        public Class superinterface(Consumer<Type> sup) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   128
            result.implementing = result.implementing.append(visitType(sup));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   129
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   130
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   131
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   132
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   133
        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
   134
            TypeImpl ti = new TypeImpl();
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   135
            type.accept(ti);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   136
            if (ti.type == null) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   137
                throw new IllegalStateException("Type not provided!");
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
            VariableImpl vi = new VariableImpl(ti.type, name);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   140
            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
   141
            result.defs = result.defs.append(vi.result);
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   142
            return this;
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 method(String name, Consumer<Type> restype, Consumer<Method> method) {
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   147
            TypeImpl ti = new TypeImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   148
            restype.accept(ti);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   149
            if (ti.type == null) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   150
                throw new IllegalStateException("Type not provided!");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   151
            }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   152
            MethodImpl vi = new MethodImpl(ti.type, name);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   153
            method.accept(vi);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   154
            result.defs = result.defs.append(vi.result);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   155
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   156
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   157
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   158
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   159
        public Class _class(String name, Consumer<Class> clazz) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   160
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   161
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   162
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   163
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   164
        public Class modifiers(Consumer<Modifiers> modifiers) {
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   165
            modifiers.accept(new ModifiersImpl(result.mods));
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   166
            return this;
57267
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
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   169
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   170
        public Class javadoc(DocTree doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   171
            throw new UnsupportedOperationException("Not supported yet.");
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 Class javadoc(String doc) {
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
    }
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
    private final class TypeImpl implements Type {
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
        private JCExpression type;
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   184
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   185
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   186
        public void _class(Consumer<QualifiedName> className, Consumer<TypeArguments> typeArguments) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   187
            JCExpression clazz = visitQualifiedName(className);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   188
            TypeArgumentsImpl ta = new TypeArgumentsImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   189
            typeArguments.accept(ta);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   190
            if (ta.types.isEmpty()) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   191
                type = clazz;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   192
            } else {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   193
                type = make.TypeApply(clazz, ta.types);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   194
            }
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   195
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   196
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   197
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   198
        public void _int() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   199
            //XXX: check empty!
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   200
            type = make.TypeIdent(TypeTag.INT);
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   201
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   204
        public void _float() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   205
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   206
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   209
        public void _void() {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   210
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   211
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   212
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   213
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   214
        public void type(String typeSpec) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   215
            type = parse(typeSpec, Parser::parseType);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   216
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   217
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   218
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   219
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   220
    private final class TypeArgumentsImpl implements TypeArguments {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   221
        private List<JCExpression> types = List.nil();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   222
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   223
        public TypeArguments type(Consumer<Type> t) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   224
            TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   225
            t.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   226
            types = types.append(type.type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   227
            return this;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   228
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   229
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   230
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   231
    private final class VariableImpl implements Variable {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   232
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   233
        private final JCVariableDecl result;
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
        public VariableImpl(JCExpression type, String name) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   236
            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
   237
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   238
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   239
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   240
        public Variable init(Consumer<Expression> init) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   241
            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
   242
            return this;
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   243
        }
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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   246
        public Variable modifiers(Consumer<Modifiers> modifiers) {
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   247
            modifiers.accept(new ModifiersImpl(result.mods));
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   248
            return this;
57267
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(DocTree 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
        @Override
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   257
        public Variable javadoc(String doc) {
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   258
            throw new UnsupportedOperationException("Not supported yet.");
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   259
        }
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   260
        
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   261
    }
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   262
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   263
    private final class MethodImpl implements Method {
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
        private final JCMethodDecl result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   266
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   267
        public MethodImpl(JCExpression restype, String name) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   268
            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
   269
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   270
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   271
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   272
        public Method parameter(Consumer<Type> type, Consumer<Parameter> parameter) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   273
            ParameterImpl paramImpl = new ParameterImpl(visitType(type));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   274
            parameter.accept(paramImpl);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   275
            result.params = result.params.append(paramImpl.result);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   276
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   277
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   278
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   279
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   280
        public Method body(Consumer<Block> statements) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   281
            BlockImpl block = new BlockImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   282
            statements.accept(block);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   283
            result.body = make.Block(0, block.statements);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   284
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   285
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   286
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   287
        @Override
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   288
        public Method body(String body) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   289
            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
   290
            if (!parsedBody.hasTag(Tag.BLOCK)) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   291
                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
   292
            }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   293
            result.body = (JCBlock) parsedBody;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   294
            return this;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   295
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   296
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   297
        @Override
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   298
        public Method modifiers(Consumer<Modifiers> modifiers) {
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   299
            modifiers.accept(new ModifiersImpl(result.mods));
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   300
            return this;
57297
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
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   303
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   304
        public Method javadoc(DocTree doc) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   305
            throw new UnsupportedOperationException("Not supported yet.");
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
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   309
        public Method javadoc(String doc) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   310
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   311
        }
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
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   314
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   315
    private final class ParameterImpl implements Parameter {
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
        private final JCVariableDecl result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   318
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   319
        public ParameterImpl(JCExpression type) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   320
            //TODO: infer name
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   321
            result = make.VarDef(make.Modifiers(0), null, type, null);
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
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   324
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   325
        public Parameter modifiers(Consumer<Modifiers> modifiers) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   326
            throw new UnsupportedOperationException("Not supported yet.");
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
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   330
        public Parameter name(String name) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   331
            result.name = names.fromString(name); //XXX: check not set yet.
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   332
            return this;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   333
        }
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
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   336
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   337
    private final class BlockImpl extends StatementBaseImpl<Block> implements Block {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   338
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   339
        private List<JCStatement> statements = List.nil();
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
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   342
        protected Block addStatement(JCStatement stat) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   343
            statements = statements.append(stat);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   344
            return this;
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
        
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   347
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   348
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   349
    private final class StatementImpl extends StatementBaseImpl<Void> implements Statement {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   350
        private JCStatement result;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   351
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   352
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   353
        protected Void addStatement(JCStatement stat) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   354
            if (result != null) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   355
                throw new IllegalStateException();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   356
            }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   357
            result = stat;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   358
            return null;
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   359
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   360
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   361
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   362
    private abstract class StatementBaseImpl<S> implements StatementBase<S> {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   363
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   364
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   365
        public S _if(Consumer<Expression> cond, Consumer<Statement> ifPart) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   366
            JCExpression expr = visitExpression(cond);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   367
            //TODO: should this automatic wrapping with parenthesized be here?
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   368
            expr = make.Parens(expr);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   369
            StatementImpl ifStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   370
            ifPart.accept(ifStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   371
            //TODO: check ifPart filled!
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   372
            return addStatement(make.If(expr, ifStatement.result, null));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   373
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   374
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   375
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   376
        public S _if(Consumer<Expression> cond, Consumer<Statement> ifPart, Consumer<Statement> elsePart) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   377
            JCExpression expr = visitExpression(cond);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   378
            //TODO: should this automatic wrapping with parenthesized be here?
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   379
            expr = make.Parens(expr);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   380
            StatementImpl ifStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   381
            ifPart.accept(ifStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   382
            //TODO: check ifPart filled!
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   383
            StatementImpl elseStatement = new StatementImpl();
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   384
            elsePart.accept(elseStatement);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   385
            return addStatement(make.If(expr, ifStatement.result, elseStatement.result));
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
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   388
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   389
        public S _return() {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   390
            throw new UnsupportedOperationException("Not supported yet.");
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
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   393
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   394
        public S _return(Consumer<Expression> expr) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   395
            return addStatement(make.Return(visitExpression(expr)));
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
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   398
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   399
        public S expr(Consumer<Expression> expr) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   400
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   401
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   402
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   403
        @Override
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   404
        public S skip() {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   405
            throw new UnsupportedOperationException("Not supported yet.");
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   406
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   407
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   408
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   409
        public S statement(String statement) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   410
            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
   411
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   412
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   413
        protected abstract S addStatement(JCStatement stat);
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   414
    }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   415
    
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   416
    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
   417
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   418
        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
   419
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   420
        @Override
57297
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   421
        public void equal_to(Consumer<Expression> lhs, Consumer<Expression> rhs) {
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   422
            expr = make.Binary(Tag.EQ,
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   423
                               visitExpression(lhs),
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   424
                               visitExpression(rhs));
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   425
        }
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   426
ad0be596956b Adding basic support for method bodies.
jlahoda
parents: 57296
diff changeset
   427
        @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
   428
        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
   429
            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
   430
        }
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
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   433
        public void plus(Consumer<Expression> lhs, Consumer<Expression> rhs) {
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   434
            expr = make.Binary(Tag.PLUS,
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   435
                               visitExpression(lhs),
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   436
                               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
   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
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   439
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   440
        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
   441
            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
   442
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   443
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   444
        @Override
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   445
        public void select(Consumer<Expression> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   446
            expr = make.Select(visitExpression(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   447
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   448
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   449
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   450
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   451
            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
   452
        }
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   453
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   454
        @Override
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   455
        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
   456
            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
   457
        }
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   458
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   459
        @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   460
        public void expression(String expression) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   461
            expr = parse(expression, Parser::parseExpression);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   462
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   463
57295
5497ee9d40f4 Adding a prototype of CodeBuilder to build a sequence of TreeBuilder calls to construct a given AST.
jlahoda
parents: 57267
diff changeset
   464
    }
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   465
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   466
    private final class QualifiedNameImpl implements QualifiedName {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   467
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   468
        private JCExpression expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   469
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   470
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   471
        public void select(Consumer<QualifiedName> selected, String name) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   472
            expr = make.Select(visitQualifiedName(selected), names.fromString(name));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   473
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   474
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   475
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   476
        public void ident(String ident) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   477
            expr = make.Ident(names.fromString(ident));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   478
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   479
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   480
        @Override
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   481
        public void ident(String... qnames) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   482
            expr = make.Ident(names.fromString(qnames[0]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   483
            for (int i = 1; i < qnames.length; i++) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   484
                expr = make.Select(expr, names.fromString(qnames[i]));
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   485
            }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   486
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   487
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   488
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   489
57300
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   490
    private final class ModifiersImpl implements Modifiers {
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   491
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   492
        private final JCModifiers mods;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   493
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   494
        public ModifiersImpl(JCModifiers mods) {
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   495
            this.mods = mods;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   496
        }
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   497
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   498
        @Override
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   499
        public Modifiers modifier(Modifier modifier) {
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   500
            long flag;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   501
            switch (modifier) {
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   502
                case PUBLIC: flag = Flags.PUBLIC; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   503
                case PROTECTED: flag = Flags.PROTECTED; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   504
                case PRIVATE: flag = Flags.PRIVATE; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   505
                case ABSTRACT: flag = Flags.ABSTRACT; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   506
                case STATIC: flag = Flags.STATIC; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   507
                case FINAL: flag = Flags.FINAL; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   508
                case TRANSIENT: flag = Flags.TRANSIENT; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   509
                case VOLATILE: flag = Flags.VOLATILE; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   510
                case SYNCHRONIZED: flag = Flags.SYNCHRONIZED; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   511
                case NATIVE: flag = Flags.NATIVE; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   512
                case STRICTFP: flag = Flags.STRICTFP; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   513
                case DEFAULT: flag = Flags.DEFAULT; break;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   514
                default:
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   515
                    throw new IllegalArgumentException("Unknown modifier: " + modifier);
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   516
            }
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   517
            mods.flags |= flag;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   518
            return this;
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   519
        }
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   520
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   521
        @Override
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   522
        public Modifiers annotation(Consumer<Annotation> annotation) {
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   523
            throw new UnsupportedOperationException("Not supported yet.");
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   524
        }
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   525
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   526
    }
c79e191854e4 Adding support for modifiers.
jlahoda
parents: 57298
diff changeset
   527
57296
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   528
    private JCExpression visitExpression(Consumer<Expression> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   529
        ExpressionImpl expr = new ExpressionImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   530
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   531
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   532
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   533
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   534
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   535
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   536
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   537
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   538
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   539
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   540
    private JCExpression visitQualifiedName(Consumer<QualifiedName> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   541
        QualifiedNameImpl expr = new QualifiedNameImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   542
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   543
        c.accept(expr);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   544
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   545
        if (expr.expr == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   546
            throw new IllegalStateException("Name not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   547
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   548
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   549
        return expr.expr;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   550
    }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   551
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   552
    private JCExpression visitType(Consumer<Type> c) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   553
        TypeImpl type = new TypeImpl();
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   554
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   555
        c.accept(type);
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   556
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   557
        if (type.type == null) {
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   558
            throw new IllegalStateException("Expression not provided!");
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   559
        }
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   560
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   561
        return type.type;
464cc8d22d94 Experimenting with types modelling.
jlahoda
parents: 57295
diff changeset
   562
    }
57298
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   563
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   564
    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
   565
        if (toParse == null || toParse.equals(""))
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   566
            throw new IllegalArgumentException();
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   567
        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
   568
        DiagnosticHandler h = null;
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   569
        try {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   570
            h = new DiagnosticHandler() {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   571
                {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   572
                    install(compiler.log);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   573
                }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   574
                @Override
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   575
                public void report(JCDiagnostic err) {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   576
                    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
   577
                        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
   578
                    }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   579
                }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   580
            };
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   581
            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
   582
            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
   583
            return runParse.apply(parser);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   584
        } finally {
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   585
            compiler.log.popDiagnosticHandler(h);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   586
            compiler.log.useSource(prev);
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   587
        }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   588
    }
72d5f7163f12 Adding ability to supply code as text instead of Trees on some places.
jlahoda
parents: 57297
diff changeset
   589
57267
97aaf02ed830 A first very crude experiment on a tree builder for javac.
jlahoda
parents:
diff changeset
   590
}