src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Analyzer.java
author jlahoda
Fri, 30 Aug 2019 12:24:16 +0200
changeset 57963 ed7eb20871c5
parent 51897 eb3e72f181af
child 58906 d58a21542c04
permissions -rw-r--r--
8230105: -XDfind=diamond crashes Summary: Avoiding side-effects in Analyzer's speculative attribution. Reviewed-by: mcimadamore, vromero
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
/*
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
     2
 * Copyright (c) 2014, 2018, 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
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    28
import java.util.ArrayDeque;
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
    29
import java.util.Arrays;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    30
import java.util.EnumSet;
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    31
import java.util.HashMap;
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    32
import java.util.Map;
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    33
import java.util.Queue;
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
    34
import java.util.stream.Collectors;
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
    35
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    36
import com.sun.source.tree.LambdaExpressionTree;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    37
import com.sun.source.tree.NewClassTree;
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    38
import com.sun.tools.javac.code.Flags;
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    39
import com.sun.tools.javac.code.Kinds.Kind;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    40
import com.sun.tools.javac.code.Source;
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
    41
import com.sun.tools.javac.code.Source.Feature;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    42
import com.sun.tools.javac.code.Symbol.ClassSymbol;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    43
import com.sun.tools.javac.code.Type;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    44
import com.sun.tools.javac.code.Types;
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
    45
import com.sun.tools.javac.comp.ArgumentAttr.LocalCacheContext;
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
    46
import com.sun.tools.javac.comp.DeferredAttr.AttributionMode;
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 44393
diff changeset
    47
import com.sun.tools.javac.resources.CompilerProperties.Warnings;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    48
import com.sun.tools.javac.tree.JCTree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    49
import com.sun.tools.javac.tree.JCTree.JCBlock;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    50
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    51
import com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    52
import com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    53
import com.sun.tools.javac.tree.JCTree.JCForLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    54
import com.sun.tools.javac.tree.JCTree.JCIf;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    55
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
    56
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
    57
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    58
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    59
import com.sun.tools.javac.tree.JCTree.JCNewClass;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    60
import com.sun.tools.javac.tree.JCTree.JCStatement;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    61
import com.sun.tools.javac.tree.JCTree.JCSwitch;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    62
import com.sun.tools.javac.tree.JCTree.JCTry;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    63
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    64
import com.sun.tools.javac.tree.JCTree.JCUnary;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    65
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    66
import com.sun.tools.javac.tree.JCTree.JCWhileLoop;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    67
import com.sun.tools.javac.tree.JCTree.Tag;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    68
import com.sun.tools.javac.tree.TreeCopier;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    69
import com.sun.tools.javac.tree.TreeInfo;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    70
import com.sun.tools.javac.tree.TreeMaker;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    71
import com.sun.tools.javac.tree.TreeScanner;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    72
import com.sun.tools.javac.util.Assert;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    73
import com.sun.tools.javac.util.Context;
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    74
import com.sun.tools.javac.util.DefinedBy;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
    75
import com.sun.tools.javac.util.DefinedBy.Api;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
    76
import com.sun.tools.javac.util.DiagnosticSource;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    77
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    78
import com.sun.tools.javac.util.List;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    79
import com.sun.tools.javac.util.ListBuffer;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    80
import com.sun.tools.javac.util.Log;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    81
import com.sun.tools.javac.util.Options;
47957
7175a92b6fd7 8191981: javac crash when detecting lambda candidates
jlahoda
parents: 47465
diff changeset
    82
import com.sun.tools.javac.util.Position;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    83
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    84
import static com.sun.tools.javac.code.Flags.GENERATEDCONSTR;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    85
import static com.sun.tools.javac.code.TypeTag.CLASS;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    86
import static com.sun.tools.javac.tree.JCTree.Tag.APPLY;
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
    87
import static com.sun.tools.javac.tree.JCTree.Tag.FOREACHLOOP;
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
    88
import static com.sun.tools.javac.tree.JCTree.Tag.LABELLED;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    89
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
    90
import static com.sun.tools.javac.tree.JCTree.Tag.NEWCLASS;
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
    91
import static com.sun.tools.javac.tree.JCTree.Tag.NULLCHK;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    92
import static com.sun.tools.javac.tree.JCTree.Tag.TYPEAPPLY;
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
    93
import static com.sun.tools.javac.tree.JCTree.Tag.VARDEF;
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
/**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    96
 * 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
    97
 * that can benefit from diamond syntax.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    98
 */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
    99
public class Analyzer {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   100
    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
   101
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   102
    final Types types;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   103
    final Log log;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   104
    final Attr attr;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   105
    final DeferredAttr deferredAttr;
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   106
    final ArgumentAttr argumentAttr;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   107
    final TreeMaker make;
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   108
    final AnalyzerCopier copier;
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
   109
    private final boolean allowDiamondWithAnonymousClassCreation;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   110
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   111
    final EnumSet<AnalyzerMode> analyzerModes;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   112
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   113
    public static Analyzer instance(Context context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   114
        Analyzer instance = context.get(analyzerKey);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   115
        if (instance == null)
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   116
            instance = new Analyzer(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   117
        return instance;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   118
    }
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
    protected Analyzer(Context context) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   121
        context.put(analyzerKey, this);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   122
        types = Types.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   123
        log = Log.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   124
        attr = Attr.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   125
        deferredAttr = DeferredAttr.instance(context);
32911
6ee3c12d2d18 8137269: Add better support for local caching in ArgumentAttr
mcimadamore
parents: 30404
diff changeset
   126
        argumentAttr = ArgumentAttr.instance(context);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   127
        make = TreeMaker.instance(context);
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   128
        copier = new AnalyzerCopier();
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   129
        Options options = Options.instance(context);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   130
        String findOpt = options.get("find");
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   131
        //parse modes
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   132
        Source source = Source.instance(context);
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   133
        allowDiamondWithAnonymousClassCreation = Feature.DIAMOND_WITH_ANONYMOUS_CLASS_CREATION.allowedInSource(source);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   134
        analyzerModes = AnalyzerMode.getAnalyzerModes(findOpt, source);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   135
    }
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
     * 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
   139
     * the {@code -XDfind} option.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   140
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   141
    enum AnalyzerMode {
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   142
        DIAMOND("diamond", Feature.DIAMOND),
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   143
        LAMBDA("lambda", Feature.LAMBDA),
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   144
        METHOD("method", Feature.GRAPH_INFERENCE),
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   145
        LOCAL("local", Feature.LOCAL_VARIABLE_TYPE_INFERENCE);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   146
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   147
        final String opt;
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   148
        final Feature feature;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   149
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   150
        AnalyzerMode(String opt, Feature feature) {
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   151
            this.opt = opt;
48054
702043a4cdeb 8189749: Devise strategy for making source level checks more uniform
mcimadamore
parents: 47957
diff changeset
   152
            this.feature = feature;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   153
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   154
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   155
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   156
         * 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
   157
         * 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
   158
         * 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
   159
         * add all modes to the resulting enum.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   160
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   161
        static EnumSet<AnalyzerMode> getAnalyzerModes(String opt, Source source) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   162
            if (opt == null) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   163
                return EnumSet.noneOf(AnalyzerMode.class);
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
            List<String> modes = List.from(opt.split(","));
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   166
            EnumSet<AnalyzerMode> res = EnumSet.noneOf(AnalyzerMode.class);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   167
            if (modes.contains("all")) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   168
                res = EnumSet.allOf(AnalyzerMode.class);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   169
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   170
            for (AnalyzerMode mode : values()) {
51897
eb3e72f181af 8211102: Crash with -XDfind=lambda and -source 7
jlahoda
parents: 51103
diff changeset
   171
                if (modes.contains("-" + mode.opt) || !mode.feature.allowedInSource(source)) {
eb3e72f181af 8211102: Crash with -XDfind=lambda and -source 7
jlahoda
parents: 51103
diff changeset
   172
                    res.remove(mode);
eb3e72f181af 8211102: Crash with -XDfind=lambda and -source 7
jlahoda
parents: 51103
diff changeset
   173
                } else if (modes.contains(mode.opt)) {
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   174
                    res.add(mode);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   175
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   176
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   177
            return res;
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
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
     * 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
   183
     * 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
   184
     * messages in case the analysis has been successful.
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
    abstract class StatementAnalyzer<S extends JCTree, T extends JCTree> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   187
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   188
        AnalyzerMode mode;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   189
        JCTree.Tag tag;
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
        StatementAnalyzer(AnalyzerMode mode, Tag tag) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   192
            this.mode = mode;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   193
            this.tag = tag;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   194
        }
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
         * Is this analyzer allowed to run?
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
        boolean isEnabled() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   200
            return analyzerModes.contains(mode);
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
         * Should this analyzer be rewriting the given tree?
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
        abstract boolean match(S tree);
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
        /**
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   209
         * Rewrite a given AST node into a new one(s)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   210
         */
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   211
        abstract List<T> rewrite(S oldTree);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   212
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   213
        /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   214
         * Entry-point for comparing results and generating diagnostics.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   215
         */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   216
        abstract void process(S oldTree, T newTree, boolean hasErrors);
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
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   220
     * 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
   221
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   222
    class DiamondInitializer extends StatementAnalyzer<JCNewClass, JCNewClass> {
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
        DiamondInitializer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   225
            super(AnalyzerMode.DIAMOND, NEWCLASS);
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
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   228
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   229
        boolean match(JCNewClass tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   230
            return tree.clazz.hasTag(TYPEAPPLY) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   231
                    !TreeInfo.isDiamond(tree) &&
29776
984a79b71cfe 8062373: Project Coin: diamond and anonymous classes
sadayapalam
parents: 28146
diff changeset
   232
                    (tree.def == null || allowDiamondWithAnonymousClassCreation);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   233
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   234
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   235
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   236
        List<JCNewClass> rewrite(JCNewClass oldTree) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   237
            if (oldTree.clazz.hasTag(TYPEAPPLY)) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   238
                JCNewClass nc = copier.copy(oldTree);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   239
                ((JCTypeApply)nc.clazz).arguments = List.nil();
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   240
                return List.of(nc);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   241
            } else {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   242
                return List.of(oldTree);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   243
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   244
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   245
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   246
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   247
        void process(JCNewClass oldTree, JCNewClass newTree, boolean hasErrors) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   248
            if (!hasErrors) {
30404
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   249
                List<Type> inferredArgs, explicitArgs;
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   250
                if (oldTree.def != null) {
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   251
                    inferredArgs = newTree.def.implementing.nonEmpty()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   252
                                      ? 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
   253
                                      : newTree.def.extending.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   254
                    explicitArgs = oldTree.def.implementing.nonEmpty()
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   255
                                      ? 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
   256
                                      : oldTree.def.extending.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   257
                } else {
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   258
                    inferredArgs = newTree.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   259
                    explicitArgs = oldTree.type.getTypeArguments();
952a476681b2 8078473: javac diamond finder crashes when used to build java.base module.
sadayapalam
parents: 29776
diff changeset
   260
                }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   261
                for (Type t : inferredArgs) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   262
                    if (!types.isSameType(t, explicitArgs.head)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   263
                        return;
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
                    explicitArgs = explicitArgs.tail;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   266
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   267
                //exact match
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 44393
diff changeset
   268
                log.warning(oldTree.clazz, Warnings.DiamondRedundantArgs);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   269
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   270
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   271
    }
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
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   274
     * 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
   275
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   276
    class LambdaAnalyzer extends StatementAnalyzer<JCNewClass, JCLambda> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   277
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   278
        LambdaAnalyzer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   279
            super(AnalyzerMode.LAMBDA, NEWCLASS);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   280
        }
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
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   283
        boolean match (JCNewClass tree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   284
            Type clazztype = tree.clazz.type;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   285
            return tree.def != null &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   286
                    clazztype.hasTag(CLASS) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   287
                    types.isFunctionalInterface(clazztype.tsym) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   288
                    decls(tree.def).length() == 1;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   289
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   290
        //where
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   291
            private List<JCTree> decls(JCClassDecl decl) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   292
                ListBuffer<JCTree> decls = new ListBuffer<>();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   293
                for (JCTree t : decl.defs) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   294
                    if (t.hasTag(METHODDEF)) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   295
                        JCMethodDecl md = (JCMethodDecl)t;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   296
                        if ((md.getModifiers().flags & GENERATEDCONSTR) == 0) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   297
                            decls.add(md);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   298
                        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   299
                    } else {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   300
                        decls.add(t);
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
                return decls.toList();
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
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   306
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   307
        List<JCLambda> rewrite(JCNewClass oldTree){
48932
9e3f2ec326ba 8198502: Exception at runtime due to lambda analyzer reattributes live AST
sdama
parents: 48054
diff changeset
   308
            JCMethodDecl md = (JCMethodDecl)copier.copy(decls(oldTree.def).head);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   309
            List<JCVariableDecl> params = md.params;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   310
            JCBlock body = md.body;
47957
7175a92b6fd7 8191981: javac crash when detecting lambda candidates
jlahoda
parents: 47465
diff changeset
   311
            JCLambda newTree = make.at(oldTree).Lambda(params, body);
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   312
            return List.of(newTree);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   313
        }
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   314
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   315
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   316
        void process (JCNewClass oldTree, JCLambda newTree, boolean hasErrors){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   317
            if (!hasErrors) {
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 44393
diff changeset
   318
                log.warning(oldTree.def, Warnings.PotentialLambdaFound);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   319
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   320
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   321
    }
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
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   324
     * 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
   325
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   326
    class RedundantTypeArgAnalyzer extends StatementAnalyzer<JCMethodInvocation, JCMethodInvocation> {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   327
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   328
        RedundantTypeArgAnalyzer() {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   329
            super(AnalyzerMode.METHOD, APPLY);
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
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   333
        boolean match (JCMethodInvocation tree){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   334
            return tree.typeargs != null &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   335
                    tree.typeargs.nonEmpty();
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   336
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   337
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   338
        List<JCMethodInvocation> rewrite(JCMethodInvocation oldTree){
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   339
            JCMethodInvocation app = copier.copy(oldTree);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   340
            app.typeargs = List.nil();
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   341
            return List.of(app);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   342
        }
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   343
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   344
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   345
        void process (JCMethodInvocation oldTree, JCMethodInvocation newTree, boolean hasErrors){
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   346
            if (!hasErrors) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   347
                //exact match
45504
ea7475564d07 8170326: Inconsistencies between code, compiler.properties and comments
jlahoda
parents: 44393
diff changeset
   348
                log.warning(oldTree, Warnings.MethodRedundantTypeargs);
28142
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
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   353
    /**
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   354
     * Base class for local variable inference analyzers.
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   355
     */
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   356
    abstract class RedundantLocalVarTypeAnalyzerBase<X extends JCStatement> extends StatementAnalyzer<X, X> {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   357
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   358
        RedundantLocalVarTypeAnalyzerBase(JCTree.Tag tag) {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   359
            super(AnalyzerMode.LOCAL, tag);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   360
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   361
49436
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   362
        boolean isImplicitlyTyped(JCVariableDecl decl) {
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   363
            return decl.vartype.pos == Position.NOPOS;
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   364
        }
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   365
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   366
        /**
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   367
         * Map a variable tree into a new declaration using implicit type.
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   368
         */
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   369
        JCVariableDecl rewriteVarType(JCVariableDecl oldTree) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   370
            JCVariableDecl newTree = copier.copy(oldTree);
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   371
            newTree.vartype = null;
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   372
            return newTree;
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   373
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   374
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   375
        /**
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   376
         * Analyze results of local variable inference.
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   377
         */
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   378
        void processVar(JCVariableDecl oldTree, JCVariableDecl newTree, boolean hasErrors) {
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   379
            if (!hasErrors) {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   380
                if (types.isSameType(oldTree.type, newTree.type)) {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   381
                    log.warning(oldTree, Warnings.LocalRedundantType);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   382
                }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   383
            }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   384
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   385
    }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   386
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   387
    /**
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   388
     * This analyzer checks if a local variable declaration has redundant type.
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   389
     */
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   390
    class RedundantLocalVarTypeAnalyzer extends RedundantLocalVarTypeAnalyzerBase<JCVariableDecl> {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   391
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   392
        RedundantLocalVarTypeAnalyzer() {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   393
            super(VARDEF);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   394
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   395
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   396
        boolean match(JCVariableDecl tree){
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   397
            return tree.sym.owner.kind == Kind.MTH &&
49436
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   398
                    tree.init != null && !isImplicitlyTyped(tree) &&
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   399
                    attr.canInferLocalVarType(tree) == null;
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   400
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   401
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   402
        List<JCVariableDecl> rewrite(JCVariableDecl oldTree) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   403
            return List.of(rewriteVarType(oldTree));
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   404
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   405
        @Override
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   406
        void process(JCVariableDecl oldTree, JCVariableDecl newTree, boolean hasErrors){
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   407
            processVar(oldTree, newTree, hasErrors);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   408
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   409
    }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   410
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   411
    /**
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   412
     * This analyzer checks if a for each variable declaration has redundant type.
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   413
     */
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   414
    class RedundantLocalVarTypeAnalyzerForEach extends RedundantLocalVarTypeAnalyzerBase<JCEnhancedForLoop> {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   415
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   416
        RedundantLocalVarTypeAnalyzerForEach() {
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   417
            super(FOREACHLOOP);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   418
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   419
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   420
        @Override
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   421
        boolean match(JCEnhancedForLoop tree){
49436
0fdb76741c56 8200199: javac suggests to use var even when var is used
mcimadamore
parents: 48932
diff changeset
   422
            return !isImplicitlyTyped(tree.var);
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   423
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   424
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   425
        List<JCEnhancedForLoop> rewrite(JCEnhancedForLoop oldTree) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   426
            JCEnhancedForLoop newTree = copier.copy(oldTree);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   427
            newTree.var = rewriteVarType(oldTree.var);
47957
7175a92b6fd7 8191981: javac crash when detecting lambda candidates
jlahoda
parents: 47465
diff changeset
   428
            newTree.body = make.at(oldTree.body).Block(0, List.nil());
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   429
            return List.of(newTree);
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   430
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   431
        @Override
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   432
        void process(JCEnhancedForLoop oldTree, JCEnhancedForLoop newTree, boolean hasErrors){
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   433
            processVar(oldTree.var, newTree.var, hasErrors);
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   434
        }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   435
    }
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   436
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   437
    @SuppressWarnings({"unchecked", "rawtypes"})
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   438
    StatementAnalyzer<JCTree, JCTree>[] analyzers = new StatementAnalyzer[] {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   439
            new DiamondInitializer(),
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   440
            new LambdaAnalyzer(),
47268
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   441
            new RedundantTypeArgAnalyzer(),
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   442
            new RedundantLocalVarTypeAnalyzer(),
48ec75306997 8177466: Add compiler support for local variable type-inference
mcimadamore
parents: 47216
diff changeset
   443
            new RedundantLocalVarTypeAnalyzerForEach()
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   444
    };
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   445
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   446
    /**
45605
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   447
     * Create a copy of Env if needed.
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   448
     */
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   449
    Env<AttrContext> copyEnvIfNeeded(JCTree tree, Env<AttrContext> env) {
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   450
        if (!analyzerModes.isEmpty() &&
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   451
                !env.info.attributionMode.isSpeculative &&
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   452
                TreeInfo.isStatement(tree) &&
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   453
                !tree.hasTag(LABELLED)) {
45605
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   454
            Env<AttrContext> analyzeEnv =
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   455
                    env.dup(env.tree, env.info.dup(env.info.scope.dupUnshared(env.info.scope.owner)));
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   456
            analyzeEnv.info.returnResult = analyzeEnv.info.returnResult != null ?
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   457
                    attr.new ResultInfo(analyzeEnv.info.returnResult.pkind,
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   458
                                        analyzeEnv.info.returnResult.pt) : null;
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   459
            return analyzeEnv;
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   460
        } else {
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   461
            return null;
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   462
        }
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   463
    }
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   464
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   465
    /**
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   466
     * Analyze an AST node if needed.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   467
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   468
    void analyzeIfNeeded(JCTree tree, Env<AttrContext> env) {
45605
8d019eee3515 8181911: Lambda Analyzer causes compile-time error
jlahoda
parents: 45504
diff changeset
   469
        if (env != null) {
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   470
            JCStatement stmt = (JCStatement)tree;
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   471
            analyze(stmt, env);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   472
        }
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
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   476
     * 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
   477
     * 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
   478
     */
51103
cecc2e10edf4 8207229: Trees.getScope crashes for broken lambda
jlahoda
parents: 51045
diff changeset
   479
    protected void analyze(JCStatement statement, Env<AttrContext> env) {
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   480
        StatementScanner statementScanner = new StatementScanner(statement, env);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   481
        statementScanner.scan();
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   482
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   483
        if (!statementScanner.rewritings.isEmpty()) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   484
            for (RewritingContext rewriting : statementScanner.rewritings) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   485
                deferredAnalysisHelper.queue(rewriting);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   486
            }
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   487
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   488
    }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   489
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   490
    /**
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   491
     * Helper interface to handle deferral of analysis tasks.
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   492
     */
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   493
    interface DeferredAnalysisHelper {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   494
        /**
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   495
         * Add a new analysis task to the queue.
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   496
         */
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   497
        void queue(RewritingContext rewriting);
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   498
        /**
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   499
         * Flush queue with given attribution env.
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   500
         */
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   501
        void flush(Env<AttrContext> flushEnv);
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   502
    }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   503
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   504
    /**
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   505
     * Dummy deferral handler.
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   506
     */
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   507
    DeferredAnalysisHelper flushDeferredHelper = new DeferredAnalysisHelper() {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   508
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   509
        public void queue(RewritingContext rewriting) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   510
            //do nothing
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   511
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   512
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   513
        @Override
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   514
        public void flush(Env<AttrContext> flushEnv) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   515
            //do nothing
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   516
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   517
    };
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   518
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   519
    /**
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   520
     * Simple deferral handler. All tasks belonging to the same outermost class are added to
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   521
     * the same queue. The queue is flushed after flow analysis (only if no error occurred).
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   522
     */
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   523
    DeferredAnalysisHelper queueDeferredHelper = new DeferredAnalysisHelper() {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   524
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
   525
        Map<ClassSymbol, Queue<RewritingContext>> Q = new HashMap<>();
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   526
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   527
        @Override
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   528
        public void queue(RewritingContext rewriting) {
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
   529
            Queue<RewritingContext> s = Q.computeIfAbsent(rewriting.env.enclClass.sym.outermostClass(), k -> new ArrayDeque<>());
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   530
            s.add(rewriting);
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   531
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   532
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   533
        @Override
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   534
        public void flush(Env<AttrContext> flushEnv) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   535
            if (!Q.isEmpty()) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   536
                DeferredAnalysisHelper prevHelper = deferredAnalysisHelper;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   537
                try {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   538
                    deferredAnalysisHelper = flushDeferredHelper;
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
   539
                    Queue<RewritingContext> rewritings = Q.get(flushEnv.enclClass.sym.outermostClass());
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   540
                    while (rewritings != null && !rewritings.isEmpty()) {
51045
215d1a5b097a 8206122: Use Queue in place of ArrayList when need to remove first element
igerasim
parents: 49436
diff changeset
   541
                        doAnalysis(rewritings.remove());
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   542
                    }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   543
                } finally {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   544
                    deferredAnalysisHelper = prevHelper;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   545
                }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   546
            }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   547
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   548
    };
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   549
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   550
    DeferredAnalysisHelper deferredAnalysisHelper = queueDeferredHelper;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   551
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   552
    void doAnalysis(RewritingContext rewriting) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   553
        DiagnosticSource prevSource = log.currentSource();
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   554
        LocalCacheContext localCacheContext = argumentAttr.withLocalCacheContext();
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   555
        try {
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   556
            log.useSource(rewriting.env.toplevel.getSourceFile());
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   557
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   558
            JCStatement treeToAnalyze = (JCStatement)rewriting.originalTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   559
            if (rewriting.env.info.scope.owner.kind == Kind.TYP) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   560
                //add a block to hoist potential dangling variable declarations
47957
7175a92b6fd7 8191981: javac crash when detecting lambda candidates
jlahoda
parents: 47465
diff changeset
   561
                treeToAnalyze = make.at(Position.NOPOS)
7175a92b6fd7 8191981: javac crash when detecting lambda candidates
jlahoda
parents: 47465
diff changeset
   562
                                    .Block(Flags.SYNTHETIC, List.of((JCStatement)rewriting.originalTree));
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   563
            }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   564
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   565
            //TODO: to further refine the analysis, try all rewriting combinations
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   566
            deferredAttr.attribSpeculative(treeToAnalyze, rewriting.env, attr.statInfo, new TreeRewriter(rewriting),
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   567
                    t -> rewriting.diagHandler(), AttributionMode.ANALYZER, argumentAttr.withLocalCacheContext());
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   568
            rewriting.analyzer.process(rewriting.oldTree, rewriting.replacement, rewriting.erroneous);
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   569
        } catch (Throwable ex) {
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   570
            Assert.error("Analyzer error when processing: " +
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   571
                         rewriting.originalTree + ":" + ex.toString() + "\n" +
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   572
                         Arrays.stream(ex.getStackTrace())
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   573
                               .map(se -> se.toString())
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   574
                               .collect(Collectors.joining("\n")));
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   575
        } finally {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   576
            log.useSource(prevSource.getFile());
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   577
            localCacheContext.leave();
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   578
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   579
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   580
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   581
    public void flush(Env<AttrContext> flushEnv) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   582
        deferredAnalysisHelper.flush(flushEnv);
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   583
    }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   584
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   585
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   586
     * 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
   587
     * statement boundaries.
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   588
     */
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   589
    class StatementScanner extends TreeScanner {
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   590
        /** Tree rewritings (generated by analyzers). */
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   591
        ListBuffer<RewritingContext> rewritings = new ListBuffer<>();
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   592
        JCTree originalTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   593
        Env<AttrContext> env;
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   594
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   595
        StatementScanner(JCTree originalTree, Env<AttrContext> env) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   596
            this.originalTree = originalTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   597
            this.env = attr.copyEnv(env);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   598
        }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   599
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   600
        public void scan() {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   601
            scan(originalTree);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   602
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   603
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   604
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   605
        @SuppressWarnings("unchecked")
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   606
        public void scan(JCTree tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   607
            if (tree != null) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   608
                for (StatementAnalyzer<JCTree, JCTree> analyzer : analyzers) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   609
                    if (analyzer.isEnabled() &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   610
                            tree.hasTag(analyzer.tag) &&
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   611
                            analyzer.match(tree)) {
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   612
                        for (JCTree t : analyzer.rewrite(tree)) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   613
                            rewritings.add(new RewritingContext(originalTree, tree, t, analyzer, env));
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   614
                        }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   615
                        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
   616
                    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   617
                }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   618
            }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   619
            super.scan(tree);
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   620
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   621
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   622
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   623
        public void visitClassDef(JCClassDecl tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   624
            //do nothing (prevents seeing same stuff twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   625
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   626
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   627
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   628
        public void visitMethodDef(JCMethodDecl tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   629
            //do nothing (prevents seeing same stuff twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   630
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   631
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   632
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   633
        public void visitBlock(JCBlock tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   634
            //do nothing (prevents seeing same stuff twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   635
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   636
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   637
        @Override
57963
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   638
        public void visitLambda(JCLambda tree) {
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   639
            //do nothing (prevents seeing same stuff in lambda expression twice)
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   640
        }
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   641
ed7eb20871c5 8230105: -XDfind=diamond crashes
jlahoda
parents: 51897
diff changeset
   642
        @Override
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   643
        public void visitSwitch(JCSwitch tree) {
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   644
            scan(tree.getExpression());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   645
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   646
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   647
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   648
        public void visitForLoop(JCForLoop tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   649
            //skip body and var decl (to prevents same statements to be analyzed twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   650
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   651
            scan(tree.getUpdate());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   652
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   653
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   654
        @Override
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   655
        public void visitTry(JCTry tree) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   656
            //skip resources (to prevents same statements to be analyzed twice)
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   657
            scan(tree.getBlock());
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   658
            scan(tree.getCatches());
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   659
            scan(tree.getFinallyBlock());
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   660
        }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   661
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   662
        @Override
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   663
        public void visitForeachLoop(JCEnhancedForLoop tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   664
            //skip body (to prevents same statements to be analyzed twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   665
            scan(tree.getExpression());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   666
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   667
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   668
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   669
        public void visitWhileLoop(JCWhileLoop tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   670
            //skip body (to prevents same statements to be analyzed twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   671
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   672
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   673
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   674
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   675
        public void visitDoLoop(JCDoWhileLoop tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   676
            //skip body (to prevents same statements to be analyzed twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   677
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   678
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   679
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   680
        @Override
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   681
        public void visitIf(JCIf tree) {
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   682
            //skip body (to prevents same statements to be analyzed twice)
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   683
            scan(tree.getCondition());
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   684
        }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   685
    }
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   686
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   687
    class RewritingContext {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   688
        // the whole tree being analyzed
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   689
        JCTree originalTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   690
        // a subtree, old tree, that will be rewritten
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   691
        JCTree oldTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   692
        // the replacement for the old tree
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   693
        JCTree replacement;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   694
        // did the compiler find any error
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   695
        boolean erroneous;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   696
        // the env
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   697
        Env<AttrContext> env;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   698
        // the corresponding analyzer
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   699
        StatementAnalyzer<JCTree, JCTree> analyzer;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   700
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   701
        RewritingContext(
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   702
                JCTree originalTree,
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   703
                JCTree oldTree,
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   704
                JCTree replacement,
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   705
                StatementAnalyzer<JCTree, JCTree> analyzer,
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   706
                Env<AttrContext> env) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   707
            this.originalTree = originalTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   708
            this.oldTree = oldTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   709
            this.replacement = replacement;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   710
            this.analyzer = analyzer;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   711
            this.env = attr.copyEnv(env);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   712
            /*  this is a temporary workaround that should be removed once we have a truly independent
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   713
             *  clone operation
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   714
             */
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   715
            if (originalTree.hasTag(VARDEF)) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   716
                // avoid redefinition clashes
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   717
                this.env.info.scope.remove(((JCVariableDecl)originalTree).sym);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   718
            }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   719
        }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   720
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   721
        /**
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   722
         * Simple deferred diagnostic handler which filters out all messages and keep track of errors.
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   723
         */
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   724
        Log.DeferredDiagnosticHandler diagHandler() {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   725
            return new Log.DeferredDiagnosticHandler(log, d -> {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   726
                if (d.getType() == DiagnosticType.ERROR) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   727
                    erroneous = true;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   728
                }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   729
                return true;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   730
            });
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   731
        }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   732
    }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   733
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   734
    /**
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   735
     * 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
   736
     */
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   737
    class AnalyzerCopier extends TreeCopier<Void> {
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   738
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   739
        public AnalyzerCopier() {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   740
            super(make);
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   741
        }
28146
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   742
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   743
        @Override @DefinedBy(Api.COMPILER_TREE)
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   744
        public JCTree visitLambdaExpression(LambdaExpressionTree node, Void _unused) {
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   745
            JCLambda oldLambda = (JCLambda)node;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   746
            JCLambda newLambda = (JCLambda)super.visitLambdaExpression(node, _unused);
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   747
            if (oldLambda.paramKind == ParameterKind.IMPLICIT) {
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   748
                //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
   749
                newLambda.paramKind = ParameterKind.IMPLICIT;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   750
                newLambda.params.forEach(p -> p.vartype = null);
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   751
            }
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   752
            return newLambda;
adf3a039cb7d 8067792: Javac crashes in finder mode with nested implicit lambdas
mcimadamore
parents: 28142
diff changeset
   753
        }
45862
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   754
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   755
        @Override @DefinedBy(Api.COMPILER_TREE)
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   756
        public JCTree visitNewClass(NewClassTree node, Void aVoid) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   757
            JCNewClass oldNewClazz = (JCNewClass)node;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   758
            JCNewClass newNewClazz = (JCNewClass)super.visitNewClass(node, aVoid);
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   759
            if (!oldNewClazz.args.isEmpty() && oldNewClazz.args.head.hasTag(NULLCHK)) {
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   760
                //workaround to Attr generating trees
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   761
                newNewClazz.encl = ((JCUnary)newNewClazz.args.head).arg;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   762
                newNewClazz.args = newNewClazz.args.tail;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   763
            }
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   764
            return newNewClazz;
c6827bac317d 8183126: port improvements to analyzers from lvti repo to jdk10
vromero
parents: 45605
diff changeset
   765
        }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   766
    }
47465
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   767
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   768
   class TreeRewriter extends AnalyzerCopier {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   769
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   770
        RewritingContext rewriting;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   771
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   772
        TreeRewriter(RewritingContext rewriting) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   773
            this.rewriting = rewriting;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   774
        }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   775
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   776
        @Override
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   777
        @SuppressWarnings("unchecked")
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   778
        public <Z extends JCTree> Z copy(Z tree, Void _unused) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   779
            Z newTree = super.copy(tree, null);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   780
            if (tree != null && tree == rewriting.oldTree) {
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   781
                Assert.checkNonNull(rewriting.replacement);
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   782
                newTree = (Z)rewriting.replacement;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   783
            }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   784
            return newTree;
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   785
        }
bc25e62f4794 8183896: improve analyzers to allow for the generation of multiple mutations of the same tree
vromero
parents: 47268
diff changeset
   786
    }
28142
32a6b1af81b1 8064365: Better support for finder capabilities in target-typing context
mcimadamore
parents:
diff changeset
   787
}