langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java
author mcimadamore
Fri, 02 Oct 2015 13:27:57 +0100
changeset 32911 6ee3c12d2d18
parent 30404 952a476681b2
child 34474 14deea5f86f1
permissions -rw-r--r--
8137269: Add better support for local caching in ArgumentAttr Summary: ArgumentAttr should support local caches when results of speculative attribution might be thrown away Reviewed-by: jlahoda
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     1
/*
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     4
 *
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    10
 *
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    15
 * accompanied this code).
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    16
 *
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    20
 *
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    23
 * questions.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    24
 */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    25
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    26
package com.sun.tools.javac.comp;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    27
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    28
import com.sun.source.tree.LambdaExpressionTree;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    29
import com.sun.tools.javac.code.Source;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    30
import com.sun.tools.javac.code.Type;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    31
import com.sun.tools.javac.code.Types;
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
    32
import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    33
import com.sun.tools.javac.tree.JCTree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    34
import com.sun.tools.javac.tree.JCTree.JCBlock;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    35
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    36
import com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    37
import com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    38
import com.sun.tools.javac.tree.JCTree.JCForLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    39
import com.sun.tools.javac.tree.JCTree.JCIf;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    40
import com.sun.tools.javac.tree.JCTree.JCLambda;
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    41
import com.sun.tools.javac.tree.JCTree.JCLambda.ParameterKind;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    42
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    43
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    44
import com.sun.tools.javac.tree.JCTree.JCNewClass;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    45
import com.sun.tools.javac.tree.JCTree.JCStatement;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    46
import com.sun.tools.javac.tree.JCTree.JCSwitch;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    47
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    48
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    49
import com.sun.tools.javac.tree.JCTree.JCWhileLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    50
import com.sun.tools.javac.tree.JCTree.Tag;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    51
import com.sun.tools.javac.tree.TreeCopier;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    52
import com.sun.tools.javac.tree.TreeInfo;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    53
import com.sun.tools.javac.tree.TreeMaker;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    54
import com.sun.tools.javac.tree.TreeScanner;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    55
import com.sun.tools.javac.util.Context;
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    56
import com.sun.tools.javac.util.DefinedBy;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    57
import com.sun.tools.javac.util.DefinedBy.Api;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    58
import com.sun.tools.javac.util.JCDiagnostic;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    59
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    60
import com.sun.tools.javac.util.List;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    61
import com.sun.tools.javac.util.ListBuffer;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    62
import com.sun.tools.javac.util.Log;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    63
import com.sun.tools.javac.util.Names;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    64
import com.sun.tools.javac.util.Options;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    65
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    66
import java.util.EnumSet;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    67
import java.util.HashMap;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    68
import java.util.Map;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    69
import java.util.function.Predicate;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    70
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    71
import static com.sun.tools.javac.code.Flags.GENERATEDCONSTR;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    72
import static com.sun.tools.javac.code.Flags.SYNTHETIC;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    73
import static com.sun.tools.javac.code.TypeTag.CLASS;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    74
import static com.sun.tools.javac.tree.JCTree.Tag.APPLY;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    75
import static com.sun.tools.javac.tree.JCTree.Tag.METHODDEF;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    76
import static com.sun.tools.javac.tree.JCTree.Tag.NEWCLASS;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    77
import static com.sun.tools.javac.tree.JCTree.Tag.TYPEAPPLY;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    78
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    79
/**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    80
 * Helper class for defining custom code analysis, such as finding instance creation expression
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    81
 * that can benefit from diamond syntax.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    82
 */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    83
public class Analyzer {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    84
    protected static final Context.Key<Analyzer> analyzerKey = new Context.Key<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    85
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    86
    final Types types;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    87
    final Log log;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    88
    final Attr attr;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    89
    final DeferredAttr deferredAttr;
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
    90
    final ArgumentAttr argumentAttr;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    91
    final TreeMaker make;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    92
    final Names names;
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
    93
    private final boolean allowDiamondWithAnonymousClassCreation;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    94
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    95
    final EnumSet<AnalyzerMode> analyzerModes;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    96
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    97
    public static Analyzer instance(Context context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    98
        Analyzer instance = context.get(analyzerKey);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    99
        if (instance == null)
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   100
            instance = new Analyzer(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   101
        return instance;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   102
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   103
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   104
    protected Analyzer(Context context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   105
        context.put(analyzerKey, this);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   106
        types = Types.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   107
        log = Log.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   108
        attr = Attr.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   109
        deferredAttr = DeferredAttr.instance(context);
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   110
        argumentAttr = ArgumentAttr.instance(context);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   111
        make = TreeMaker.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   112
        names = Names.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   113
        Options options = Options.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   114
        String findOpt = options.get("find");
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   115
        //parse modes
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   116
        Source source = Source.instance(context);
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
   117
        allowDiamondWithAnonymousClassCreation = source.allowDiamondWithAnonymousClassCreation();
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   118
        analyzerModes = AnalyzerMode.getAnalyzerModes(findOpt, source);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   119
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   120
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   121
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   122
     * This enum defines supported analyzer modes, as well as defining the logic for decoding
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   123
     * the {@code -XDfind} option.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   124
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   125
    enum AnalyzerMode {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   126
        DIAMOND("diamond", Source::allowDiamond),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   127
        LAMBDA("lambda", Source::allowLambda),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   128
        METHOD("method", Source::allowGraphInference);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   129
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   130
        final String opt;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   131
        final Predicate<Source> sourceFilter;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   132
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   133
        AnalyzerMode(String opt, Predicate<Source> sourceFilter) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   134
            this.opt = opt;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   135
            this.sourceFilter = sourceFilter;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   136
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   137
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   138
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   139
         * This method is used to parse the {@code find} option.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   140
         * Possible modes are separated by colon; a mode can be excluded by
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   141
         * prepending '-' to its name. Finally, the special mode 'all' can be used to
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   142
         * add all modes to the resulting enum.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   143
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   144
        static EnumSet<AnalyzerMode> getAnalyzerModes(String opt, Source source) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   145
            if (opt == null) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   146
                return EnumSet.noneOf(AnalyzerMode.class);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   147
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   148
            List<String> modes = List.from(opt.split(","));
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   149
            EnumSet<AnalyzerMode> res = EnumSet.noneOf(AnalyzerMode.class);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   150
            if (modes.contains("all")) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   151
                res = EnumSet.allOf(AnalyzerMode.class);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   152
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   153
            for (AnalyzerMode mode : values()) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   154
                if (modes.contains(mode.opt)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   155
                    res.add(mode);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   156
                } else if (modes.contains("-" + mode.opt) || !mode.sourceFilter.test(source)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   157
                    res.remove(mode);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   158
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   159
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   160
            return res;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   161
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   162
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   163
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   164
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   165
     * A statement analyzer is a work-unit that matches certain AST nodes (of given type {@code S}),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   166
     * rewrites them to different AST nodes (of type {@code T}) and then generates some meaningful
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   167
     * messages in case the analysis has been successful.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   168
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   169
    abstract class StatementAnalyzer<S extends JCTree, T extends JCTree> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   170
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   171
        AnalyzerMode mode;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   172
        JCTree.Tag tag;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   173
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   174
        StatementAnalyzer(AnalyzerMode mode, Tag tag) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   175
            this.mode = mode;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   176
            this.tag = tag;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   177
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   178
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   179
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   180
         * Is this analyzer allowed to run?
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   181
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   182
        boolean isEnabled() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   183
            return analyzerModes.contains(mode);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   184
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   185
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   186
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   187
         * Should this analyzer be rewriting the given tree?
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   188
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   189
        abstract boolean match(S tree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   190
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   191
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   192
         * Rewrite a given AST node into a new one
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   193
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   194
        abstract T map(S oldTree, S newTree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   195
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   196
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   197
         * Entry-point for comparing results and generating diagnostics.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   198
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   199
        abstract void process(S oldTree, T newTree, boolean hasErrors);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   200
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   201
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   202
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   203
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   204
     * This analyzer checks if generic instance creation expression can use diamond syntax.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   205
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   206
    class DiamondInitializer extends StatementAnalyzer<JCNewClass, JCNewClass> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   207
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   208
        DiamondInitializer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   209
            super(AnalyzerMode.DIAMOND, NEWCLASS);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   210
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   211
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   212
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   213
        boolean match(JCNewClass tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   214
            return tree.clazz.hasTag(TYPEAPPLY) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   215
                    !TreeInfo.isDiamond(tree) &&
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
   216
                    (tree.def == null || allowDiamondWithAnonymousClassCreation);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   217
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   218
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   219
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   220
        JCNewClass map(JCNewClass oldTree, JCNewClass newTree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   221
            if (newTree.clazz.hasTag(TYPEAPPLY)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   222
                ((JCTypeApply)newTree.clazz).arguments = List.nil();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   223
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   224
            return newTree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   225
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   226
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   227
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   228
        void process(JCNewClass oldTree, JCNewClass newTree, boolean hasErrors) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   229
            if (!hasErrors) {
30404
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   230
                List<Type> inferredArgs, explicitArgs;
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   231
                if (oldTree.def != null) {
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   232
                    inferredArgs = newTree.def.implementing.nonEmpty()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   233
                                      ? newTree.def.implementing.get(0).type.getTypeArguments()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   234
                                      : newTree.def.extending.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   235
                    explicitArgs = oldTree.def.implementing.nonEmpty()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   236
                                      ? oldTree.def.implementing.get(0).type.getTypeArguments()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   237
                                      : oldTree.def.extending.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   238
                } else {
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   239
                    inferredArgs = newTree.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   240
                    explicitArgs = oldTree.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   241
                }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   242
                for (Type t : inferredArgs) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   243
                    if (!types.isSameType(t, explicitArgs.head)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   244
                        log.warning(oldTree.clazz, "diamond.redundant.args.1",
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   245
                                oldTree.clazz.type, newTree.clazz.type);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   246
                        return;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   247
                    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   248
                    explicitArgs = explicitArgs.tail;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   249
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   250
                //exact match
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   251
                log.warning(oldTree.clazz, "diamond.redundant.args");
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   252
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   253
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   254
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   255
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   256
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   257
     * This analyzer checks if anonymous instance creation expression can replaced by lambda.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   258
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   259
    class LambdaAnalyzer extends StatementAnalyzer<JCNewClass, JCLambda> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   260
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   261
        LambdaAnalyzer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   262
            super(AnalyzerMode.LAMBDA, NEWCLASS);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   263
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   264
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   265
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   266
        boolean match (JCNewClass tree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   267
            Type clazztype = tree.clazz.type;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   268
            return tree.def != null &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   269
                    clazztype.hasTag(CLASS) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   270
                    types.isFunctionalInterface(clazztype.tsym) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   271
                    decls(tree.def).length() == 1;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   272
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   273
        //where
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   274
            private List<JCTree> decls(JCClassDecl decl) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   275
                ListBuffer<JCTree> decls = new ListBuffer<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   276
                for (JCTree t : decl.defs) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   277
                    if (t.hasTag(METHODDEF)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   278
                        JCMethodDecl md = (JCMethodDecl)t;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   279
                        if ((md.getModifiers().flags & GENERATEDCONSTR) == 0) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   280
                            decls.add(md);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   281
                        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   282
                    } else {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   283
                        decls.add(t);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   284
                    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   285
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   286
                return decls.toList();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   287
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   288
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   289
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   290
        JCLambda map (JCNewClass oldTree, JCNewClass newTree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   291
            JCMethodDecl md = (JCMethodDecl)decls(newTree.def).head;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   292
            List<JCVariableDecl> params = md.params;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   293
            JCBlock body = md.body;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   294
            return make.Lambda(params, body);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   295
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   296
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   297
        void process (JCNewClass oldTree, JCLambda newTree, boolean hasErrors){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   298
            if (!hasErrors) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   299
                log.warning(oldTree.def, "potential.lambda.found");
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   300
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   301
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   302
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   303
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   304
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   305
     * This analyzer checks if generic method call has redundant type arguments.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   306
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   307
    class RedundantTypeArgAnalyzer extends StatementAnalyzer<JCMethodInvocation, JCMethodInvocation> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   308
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   309
        RedundantTypeArgAnalyzer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   310
            super(AnalyzerMode.METHOD, APPLY);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   311
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   312
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   313
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   314
        boolean match (JCMethodInvocation tree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   315
            return tree.typeargs != null &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   316
                    tree.typeargs.nonEmpty();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   317
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   318
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   319
        JCMethodInvocation map (JCMethodInvocation oldTree, JCMethodInvocation newTree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   320
            newTree.typeargs = List.nil();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   321
            return newTree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   322
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   323
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   324
        void process (JCMethodInvocation oldTree, JCMethodInvocation newTree, boolean hasErrors){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   325
            if (!hasErrors) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   326
                //exact match
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   327
                log.warning(oldTree, "method.redundant.typeargs");
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   328
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   329
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   330
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   331
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   332
    @SuppressWarnings({"unchecked", "rawtypes"})
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   333
    StatementAnalyzer<JCTree, JCTree>[] analyzers = new StatementAnalyzer[] {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   334
            new DiamondInitializer(),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   335
            new LambdaAnalyzer(),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   336
            new RedundantTypeArgAnalyzer()
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   337
    };
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   338
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   339
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   340
     * Analyze an AST node if needed.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   341
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   342
    void analyzeIfNeeded(JCTree tree, Env<AttrContext> env) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   343
        if (!analyzerModes.isEmpty() &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   344
                !env.info.isSpeculative &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   345
                TreeInfo.isStatement(tree)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   346
            JCStatement stmt = (JCStatement)tree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   347
            analyze(stmt, env);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   348
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   349
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   350
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   351
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   352
     * Analyze an AST node; this involves collecting a list of all the nodes that needs rewriting,
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   353
     * and speculatively type-check the rewritten code to compare results against previously attributed code.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   354
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   355
    void analyze(JCStatement statement, Env<AttrContext> env) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   356
        AnalysisContext context = new AnalysisContext();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   357
        StatementScanner statementScanner = new StatementScanner(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   358
        statementScanner.scan(statement);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   359
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   360
        if (!context.treesToAnalyzer.isEmpty()) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   361
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   362
            //add a block to hoist potential dangling variable declarations
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   363
            JCBlock fakeBlock = make.Block(SYNTHETIC, List.of(statement));
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   364
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   365
            TreeMapper treeMapper = new TreeMapper(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   366
            //TODO: to further refine the analysis, try all rewriting combinations
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   367
            LocalCacheContext localCacheContext = argumentAttr.withLocalCacheContext();
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   368
            try {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   369
                deferredAttr.attribSpeculative(fakeBlock, env, attr.statInfo, treeMapper,
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   370
                        t -> new AnalyzeDeferredDiagHandler(context));
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   371
            } finally {
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   372
                localCacheContext.leave();
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   373
            }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   374
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   375
            context.treeMap.entrySet().forEach(e -> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   376
                context.treesToAnalyzer.get(e.getKey())
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   377
                        .process(e.getKey(), e.getValue(), context.errors.nonEmpty());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   378
            });
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   379
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   380
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   381
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   382
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   383
     * Simple deferred diagnostic handler which filters out all messages and keep track of errors.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   384
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   385
    class AnalyzeDeferredDiagHandler extends Log.DeferredDiagnosticHandler {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   386
        AnalysisContext context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   387
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   388
        public AnalyzeDeferredDiagHandler(AnalysisContext context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   389
            super(log, d -> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   390
                if (d.getType() == DiagnosticType.ERROR) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   391
                    context.errors.add(d);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   392
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   393
                return true;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   394
            });
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   395
            this.context = context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   396
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   397
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   398
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   399
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   400
     * This class is used to pass around contextual information bewteen analyzer classes, such as
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   401
     * trees to be rewritten, errors occurred during the speculative attribution step, etc.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   402
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   403
    class AnalysisContext {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   404
        /** Map from trees to analyzers. */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   405
        Map<JCTree, StatementAnalyzer<JCTree, JCTree>> treesToAnalyzer = new HashMap<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   406
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   407
        /** Map from original AST nodes to rewritten AST nodes */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   408
        Map<JCTree, JCTree> treeMap = new HashMap<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   409
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   410
        /** Errors in rewritten tree */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   411
        ListBuffer<JCDiagnostic> errors = new ListBuffer<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   412
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   413
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   414
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   415
     * Subclass of {@link com.sun.tools.javac.tree.TreeScanner} which visit AST-nodes w/o crossing
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   416
     * statement boundaries.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   417
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   418
    class StatementScanner extends TreeScanner {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   419
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   420
        /** context */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   421
        AnalysisContext context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   422
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   423
        StatementScanner(AnalysisContext context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   424
            this.context = context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   425
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   426
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   427
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   428
        @SuppressWarnings("unchecked")
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   429
        public void scan(JCTree tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   430
            if (tree != null) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   431
                for (StatementAnalyzer<JCTree, JCTree> analyzer : analyzers) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   432
                    if (analyzer.isEnabled() &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   433
                            tree.hasTag(analyzer.tag) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   434
                            analyzer.match(tree)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   435
                        context.treesToAnalyzer.put(tree, analyzer);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   436
                        break; //TODO: cover cases where multiple matching analyzers are found
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   437
                    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   438
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   439
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   440
            super.scan(tree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   441
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   442
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   443
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   444
        public void visitClassDef(JCClassDecl tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   445
            //do nothing (prevents seeing same stuff twice
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   446
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   447
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   448
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   449
        public void visitMethodDef(JCMethodDecl tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   450
            //do nothing (prevents seeing same stuff twice
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   451
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   452
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   453
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   454
        public void visitBlock(JCBlock tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   455
            //do nothing (prevents seeing same stuff twice
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   456
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   457
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   458
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   459
        public void visitSwitch(JCSwitch tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   460
            scan(tree.getExpression());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   461
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   462
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   463
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   464
        public void visitForLoop(JCForLoop tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   465
            scan(tree.getInitializer());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   466
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   467
            scan(tree.getUpdate());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   468
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   469
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   470
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   471
        public void visitForeachLoop(JCEnhancedForLoop tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   472
            scan(tree.getExpression());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   473
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   474
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   475
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   476
        public void visitWhileLoop(JCWhileLoop tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   477
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   478
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   479
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   480
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   481
        public void visitDoLoop(JCDoWhileLoop tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   482
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   483
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   484
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   485
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   486
        public void visitIf(JCIf tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   487
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   488
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   489
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   490
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   491
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   492
     * Subclass of TreeCopier that maps nodes matched by analyzers onto new AST nodes.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   493
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   494
    class TreeMapper extends TreeCopier<Void> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   495
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   496
        AnalysisContext context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   497
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   498
        TreeMapper(AnalysisContext context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   499
            super(make);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   500
            this.context = context;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   501
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   502
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   503
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   504
        @SuppressWarnings("unchecked")
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   505
        public <Z extends JCTree> Z copy(Z tree, Void _unused) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   506
            Z newTree = super.copy(tree, _unused);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   507
            StatementAnalyzer<JCTree, JCTree> analyzer = context.treesToAnalyzer.get(tree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   508
            if (analyzer != null) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   509
                newTree = (Z)analyzer.map(tree, newTree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   510
                context.treeMap.put(tree, newTree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   511
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   512
            return newTree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   513
        }
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   514
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   515
        @Override @DefinedBy(Api.COMPILER_TREE)
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   516
        public JCTree visitLambdaExpression(LambdaExpressionTree node, Void _unused) {
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   517
            JCLambda oldLambda = (JCLambda)node;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   518
            JCLambda newLambda = (JCLambda)super.visitLambdaExpression(node, _unused);
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   519
            if (oldLambda.paramKind == ParameterKind.IMPLICIT) {
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   520
                //reset implicit lambda parameters (whose type might have been set during attr)
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   521
                newLambda.paramKind = ParameterKind.IMPLICIT;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   522
                newLambda.params.forEach(p -> p.vartype = null);
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   523
            }
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   524
            return newLambda;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   525
        }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   526
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   527
}