< prev index next > src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ArgumentAttr.java
Print this page
/*
- * Copyright (c) 2015, 2022, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symtab;
import com.sun.tools.javac.code.Type;
+ import com.sun.tools.javac.code.Types;
import com.sun.tools.javac.code.Types.FunctionDescriptorLookupError;
import com.sun.tools.javac.comp.Attr.ResultInfo;
import com.sun.tools.javac.comp.Attr.TargetInfo;
import com.sun.tools.javac.comp.Check.CheckContext;
import com.sun.tools.javac.comp.DeferredAttr.AttrMode;
private final JCDiagnostic.Factory diags;
private final Attr attr;
private final Symtab syms;
private final Log log;
+ private final Types types;
+
/** Attribution environment to be used. */
private Env<AttrContext> env;
/** Result of method attribution. */
Type result;
deferredAttr = DeferredAttr.instance(context);
diags = JCDiagnostic.Factory.instance(context);
attr = Attr.instance(context);
syms = Symtab.instance(context);
log = Log.instance(context);
+ types = Types.instance(context);
}
/**
* Set the results of method attribution.
*/
});
}
@Override
Type overloadCheck(ResultInfo resultInfo, DeferredAttrContext deferredAttrContext) {
- try {
- //compute target-type; this logic could be shared with Attr
- TargetInfo targetInfo = attr.getTargetInfo(speculativeTree, resultInfo, argtypes());
- Type lambdaType = targetInfo.descriptor;
- Type currentTarget = targetInfo.target;
- //check compatibility
- checkLambdaCompatible(lambdaType, resultInfo);
- return currentTarget;
- } catch (FunctionDescriptorLookupError ex) {
- resultInfo.checkContext.report(null, ex.getDiagnostic());
- return null; //cannot get here
+ if (types.isQuoted(resultInfo.pt)) {
+ // quoted lambda - always correct
+ return resultInfo.pt;
+ } else {
+ try {
+ //compute target-type; this logic could be shared with Attr
+ TargetInfo targetInfo = attr.getTargetInfo(speculativeTree, resultInfo, argtypes());
+ Type lambdaType = targetInfo.descriptor;
+ Type currentTarget = targetInfo.target;
+ //check compatibility
+ checkLambdaCompatible(lambdaType, resultInfo);
+ return currentTarget;
+ } catch (FunctionDescriptorLookupError ex) {
+ resultInfo.checkContext.report(null, ex.getDiagnostic());
+ return null; //cannot get here
+ }
}
}
/** Check lambda against given target result */
private void checkLambdaCompatible(Type descriptor, ResultInfo resultInfo) {
< prev index next >