APIdia Launch Partner
Top Description Inners Fields Constructors Methods
com.sun.tools.javac.comp

public Class LambdaToMethod

extends TreeTranslator
Class Inheritance
Imports
com.sun.tools.javac.code.Attribute, .Flags, .Symbol, .Symbol.ClassSymbol, .Symbol.DynamicMethodSymbol, .Symbol.MethodHandleSymbol, .Symbol.MethodSymbol, .Symbol.VarSymbol, .Symtab, .Type, .Type.MethodType, .Types, .Types.SignatureGenerator.InvalidSignatureException, com.sun.tools.javac.jvm.PoolConstant.LoadableConstant, .Target, com.sun.tools.javac.main.Option, com.sun.tools.javac.resources.CompilerProperties.Errors, .CompilerProperties.Fragments, .CompilerProperties.Notes, com.sun.tools.javac.tree.JCTree, .JCTree.JCAnnotation, .JCTree.JCBinary, .JCTree.JCBlock, .JCTree.JCBreak, .JCTree.JCCase, .JCTree.JCClassDecl, .JCTree.JCExpression, .JCTree.JCFieldAccess, .JCTree.JCFunctionalExpression, .JCTree.JCIdent, .JCTree.JCLambda, .JCTree.JCMemberReference, .JCTree.JCMethodDecl, .JCTree.JCMethodInvocation, .JCTree.JCNewClass, .JCTree.JCReturn, .JCTree.JCStatement, .JCTree.JCSwitch, .JCTree.JCVariableDecl, .JCTree.Tag, .TreeInfo, .TreeMaker, .TreeTranslator, .JCTree.JCThrow, com.sun.tools.javac.util.Assert, .Context, .DiagnosticSource, .InvalidUtfException, .JCDiagnostic, .JCDiagnostic.DiagnosticPosition, .List, .ListBuffer, .Log, .Name, .Names, .Options, javax.lang.model.element.ElementKind, java.lang.invoke.LambdaMetafactory, java.util.HashMap, .HashSet, .Map, .Set, java.util.function.Consumer, .Supplier

This pass desugars lambda expressions into static methods

This is NOT part of any supported API. If you write code that depends on this, you do so at your own risk. This code and its internal interfaces are subject to change or deletion without notice.

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv class
pack-priv static record
LambdaToMethod.DeserializationCase

Deserialization statements for a given lambda implementation name, together with the (future) enclosing deserialization method.

private class
private class
pack-priv class
LambdaToMethod.LambdaTranslationContext

This class retains all the useful information about a lambda expression, and acts as a translation map that is used by the main translation routines in order to adjust references to captured locals/members, etc.

Field Summary

Modifier and TypeField and Description
private final Attr
private Env<AttrContext>
private final boolean
debugLinesOrVars

true if line or local variable debug info has been requested

private final boolean
deduplicateLambdas

deduplicate lambda implementation methods

private final JCDiagnostic.Factory
private final boolean
dumpLambdaDeserializationStats

dump statistics about lambda deserialization code generation

private final boolean
dumpLambdaToMethodStats

dump statistics about lambda code generation

public static final int
FLAG_BRIDGES

Flag for alternate metafactories indicating the lambda object requires multiple bridges

public static final int
FLAG_MARKERS

Flag for alternate metafactories indicating the lambda object has multiple targets

public static final int
FLAG_SERIALIZABLE

Flag for alternate metafactories indicating the lambda object is intended to be serializable

private final boolean
forceSerializable

force serializable representation, for stress testing

private LambdaToMethod.KlassInfo
kInfo

info about the current class being processed

private LambdaToMethod.LambdaTranslationContext
lambdaContext

translation context of the current lambda expression

private final Log
private final Lower
private TreeMaker
private final Names
private final Operators
private Symbol.VarSymbol
pendingVar

the variable whose initializer is pending

private final Resolve
private final Symtab
private final Target
private final TransTypes
private final Types
protected static final Context.Key<LambdaToMethod>
private final boolean
verboseDeduplication

dump statistics about lambda method deduplication

Inherited from com.sun.tools.javac.tree.TreeTranslator:
result

Constructor Summary

AccessConstructor and Description
private

Method Summary

Modifier and TypeMethod and Description
private void
private void
pack-priv List<Symbol>
private String
classSig(Type type)

private JCTree.JCMethodDecl
private JCTree.JCThrow
private JCTree.JCExpression
deserGetter(Symbol.VarSymbol deserParamSym, String func, Type type)

private JCTree.JCExpression
deserGetter(Symbol.VarSymbol deserParamSym, String func, Type type, List<Type> argTypes, List<JCTree.JCExpression> args)

private JCTree.JCExpression
deserTest(Symbol.VarSymbol deserParamSym, JCTree.JCExpression prev, String func, String lit)

pack-priv void
dumpStats(JCTree.JCFunctionalExpression tree, boolean needsAltMetafactory, Symbol sym)

private JCTree.JCExpression
public static LambdaToMethod
instance(Context context)

pack-priv boolean
isSerializable(JCTree.JCFunctionalExpression tree)

does this functional expression require serialization support?

private List<JCTree.JCMethodDecl>
private JCTree.JCExpression
makeIndyCall(JCDiagnostic.DiagnosticPosition pos, Type site, Name bsmName, List<PoolConstant.LoadableConstant> staticArgs, Type.MethodType indyType, List<JCTree.JCExpression> indyArgs, Name methName)

Generate an indy method call with given name, type and static bootstrap arguments types

private JCTree.JCBlock
private JCTree.JCBlock
private JCTree.JCBlock
makeLambdaStatementBody(JCTree.JCBlock block, final JCTree.JCMethodDecl lambdaMethodDecl, boolean completeNormally)

private JCTree.JCExpression
makeMetafactoryIndyCall(JCTree.JCFunctionalExpression tree, Symbol.MethodHandleSymbol refSym, Symbol.MethodSymbol nonDedupedRefSym, List<JCTree.JCExpression> indy_args)

Generate an indy method call to the meta factory

pack-priv JCTree.JCNewClass
makeNewClass(Type
The class type.
ctype
,
List<JCTree.JCExpression>
The constructor arguments.
args
,
Symbol
The constructor symbol
cons
)

Make an attributed class instance creation expression.

pack-priv JCTree.JCNewClass
makeNewClass(Type
The class type.
ctype
,
List<JCTree.JCExpression>
The constructor arguments.
args
)

Make an attributed class instance creation expression.

private Symbol.MethodSymbol
makePrivateSyntheticMethod(long flags, Name name, Type type, Symbol owner)

Create new synthetic method with given flags, name, type, owner

private JCTree.JCIdent
makeThis(Type type, Symbol owner)

public JCTree
private String
typeSig(Type type)

**************************************************************** Signature Generation ****************************************************************

private String
typeSig(Type type, boolean allowIllegalSignature)

private Type.MethodType
public void
public void
visitIdent(JCTree.JCIdent tree)

Overrides com.sun.tools.javac.tree.TreeTranslator.visitIdent.

Translate identifiers within a lambda to the mapped identifier

public void
visitLambda(JCTree.JCLambda tree)

Overrides com.sun.tools.javac.tree.TreeTranslator.visitLambda.

Translate a lambda into a method to be inserted into the class.

public void
visitReference(JCTree.JCMemberReference tree)

Overrides com.sun.tools.javac.tree.TreeTranslator.visitReference.

Translate a method reference into an invokedynamic call to the meta-factory.

public void
Inherited from com.sun.tools.javac.tree.TreeTranslator:
translatetranslatetranslateAnnotationstranslateCasestranslateCatcherstranslateTypeParamstranslateVarDefsvisitAnnotatedTypevisitAnnotationvisitAnyPatternvisitApplyvisitAssertvisitAssignvisitAssignopvisitBinaryvisitBindingPatternvisitBlockvisitBreakvisitCasevisitCatchvisitConditionalvisitConstantCaseLabelvisitContinuevisitDefaultCaseLabelvisitDoLoopvisitErroneousvisitExecvisitForeachLoopvisitForLoopvisitIfvisitImportvisitIndexedvisitLabelledvisitLetExprvisitLiteralvisitMethodDefvisitModifiersvisitModuleImportvisitNewArrayvisitNewClassvisitPackageDefvisitParensvisitPatternCaseLabelvisitRecordPatternvisitReturnvisitSelectvisitSkipvisitSwitchvisitSwitchExpressionvisitSynchronizedvisitThrowvisitTopLevelvisitTreevisitTryvisitTypeApplyvisitTypeArrayvisitTypeBoundKindvisitTypeCastvisitTypeIdentvisitTypeIntersectionvisitTypeParametervisitTypeTestvisitTypeUnionvisitUnaryvisitVarTypevisitWhileLoopvisitWildcardvisitYield