private JCTree replaceWithReflection( JCTree.JCAssign assignTree ) { JCTree.JCFieldAccess tree = (JCTree.JCFieldAccess)assignTree.lhs; TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); boolean isStatic = tree.sym.getModifiers().contains( javax.lang.model.element.Modifier.STATIC ); if( tree.sym instanceof Symbol.MethodSymbol ) { return assignTree; } Type type = tree.sym.type; Symbol.MethodSymbol reflectMethodSym = findFieldAccessReflectUtilMethod( tree, type, isStatic, true ); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( isStatic ? makeClassExpr( tree, tree.selected.type ) : tree.selected ); // receiver or class newArgs.add( make.Literal( tree.sym.flatName().toString() ) ); // field name newArgs.add( assignTree.rhs ); // field value Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), ReflectionRuntimeMethods.class.getName() ); JCTree.JCMethodInvocation reflectCall = make.Apply( List.nil(), memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect(); newMethodSelect.sym = reflectMethodSym; newMethodSelect.type = reflectMethodSym.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); return reflectCall; }
private JCTree replaceWithReflection( JCTree.JCAssign assignTree ) { JCTree.JCFieldAccess tree = (JCTree.JCFieldAccess)assignTree.lhs; TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); boolean isStatic = tree.sym.getModifiers().contains( javax.lang.model.element.Modifier.STATIC ); if( tree.sym instanceof Symbol.MethodSymbol ) { return assignTree; } Type type = tree.sym.type; Symbol.MethodSymbol reflectMethodSym = findFieldAccessReflectUtilMethod( tree, type, isStatic, true ); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( isStatic ? makeClassExpr( tree, tree.selected.type ) : tree.selected ); // receiver or class newArgs.add( make.Literal( tree.sym.flatName().toString() ) ); // field name newArgs.add( assignTree.rhs ); // field value Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), ReflectionRuntimeMethods.class.getName() ); JCTree.JCMethodInvocation reflectCall = make.Apply( List.nil(), memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect(); newMethodSelect.sym = reflectMethodSym; newMethodSelect.type = reflectMethodSym.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); return reflectCall; }
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = returnType; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
memberAccess( make, javacElems, extensionFqn ), List.from( newArgs ) ); extCall.setPos( tree.pos ); extCall.type = tree.type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)extCall.getMethodSelect();
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = returnType; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
memberAccess( make, javacElems, extensionFqn ), List.from( newArgs ) ); extCall.setPos( tree.pos ); extCall.type = tree.type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)extCall.getMethodSelect();
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
memberAccess( make, javacElems, ReflectionRuntimeMethods.class.getName() + "." + reflectMethodSym.flatName().toString() ), List.from( newArgs ) ); reflectCall.setPos( tree.pos ); reflectCall.type = type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect();
makeProxyCall.setPos( theCall.pos ); makeProxyCall.type = thisArg.type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)makeProxyCall.getMethodSelect();
makeProxyCall.setPos( theCall.pos ); makeProxyCall.type = thisArg.type; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)makeProxyCall.getMethodSelect();
private JCExpression replaceCastExpression( JCExpression expression, Type type ) { TreeMaker make = _tp.getTreeMaker(); Symtab symbols = _tp.getSymtab(); Names names = Names.instance( _tp.getContext() ); Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), RuntimeMethods.class.getName() ); Symbol.MethodSymbol makeInterfaceProxyMethod = resolveMethod( expression.pos(), names.fromString( "assignStructuralIdentity" ), reflectMethodClassSym.type, List.from( new Type[]{symbols.objectType, symbols.classType} ) ); JavacElements javacElems = _tp.getElementUtil(); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( expression ); JCTree.JCFieldAccess ifaceClassExpr = (JCTree.JCFieldAccess)memberAccess( make, javacElems, type.tsym.getQualifiedName().toString() + ".class" ); ifaceClassExpr.type = symbols.classType; ifaceClassExpr.sym = symbols.classType.tsym; assignTypes( ifaceClassExpr.selected, type.tsym ); newArgs.add( ifaceClassExpr ); JCTree.JCMethodInvocation makeProxyCall = make.Apply( List.nil(), memberAccess( make, javacElems, RuntimeMethods.class.getName() + ".assignStructuralIdentity" ), List.from( newArgs ) ); makeProxyCall.type = symbols.objectType; makeProxyCall.setPos( expression.pos ); JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)makeProxyCall.getMethodSelect(); newMethodSelect.sym = makeInterfaceProxyMethod; newMethodSelect.type = makeInterfaceProxyMethod.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); JCTypeCast castCall = make.TypeCast( symbols.objectType, makeProxyCall ); castCall.type = symbols.objectType; return castCall; }
private JCExpression replaceCastExpression( JCExpression expression, Type type ) { TreeMaker make = _tp.getTreeMaker(); Symtab symbols = _tp.getSymtab(); Names names = Names.instance( _tp.getContext() ); Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), RuntimeMethods.class.getName() ); Symbol.MethodSymbol makeInterfaceProxyMethod = resolveMethod( expression.pos(), names.fromString( "assignStructuralIdentity" ), reflectMethodClassSym.type, List.from( new Type[]{symbols.objectType, symbols.classType} ) ); JavacElements javacElems = _tp.getElementUtil(); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( expression ); JCTree.JCFieldAccess ifaceClassExpr = (JCTree.JCFieldAccess)memberAccess( make, javacElems, type.tsym.getQualifiedName().toString() + ".class" ); ifaceClassExpr.type = symbols.classType; ifaceClassExpr.sym = symbols.classType.tsym; assignTypes( ifaceClassExpr.selected, type.tsym ); newArgs.add( ifaceClassExpr ); JCTree.JCMethodInvocation makeProxyCall = make.Apply( List.nil(), memberAccess( make, javacElems, RuntimeMethods.class.getName() + ".assignStructuralIdentity" ), List.from( newArgs ) ); makeProxyCall.type = symbols.objectType; makeProxyCall.setPos( expression.pos ); JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)makeProxyCall.getMethodSelect(); newMethodSelect.sym = makeInterfaceProxyMethod; newMethodSelect.type = makeInterfaceProxyMethod.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); JCTypeCast castCall = make.TypeCast( symbols.objectType, makeProxyCall ); castCall.type = symbols.objectType; return castCall; }
private JCExpression classForNameCall( Type type, JCTree tree ) { TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); JCTree.JCMethodInvocation typeCall = make.Apply( List.nil(), memberAccess( make, javacElems, ReflectUtil.class.getName() + ".type" ), List.of( make.Literal( type.tsym.getQualifiedName().toString() ) ) ); typeCall.setPos( Position.NOPOS ); typeCall.type = _tp.getSymtab().classType; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)typeCall.getMethodSelect(); Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), ReflectUtil.class.getName() ); Symbol.MethodSymbol typeMethodSymbol = resolveMethod( tree.pos(), Names.instance( _tp.getContext() ).fromString( "type" ), reflectMethodClassSym.type, List.of( _tp.getSymtab().stringType ) ); newMethodSelect.sym = typeMethodSymbol; newMethodSelect.type = typeMethodSymbol.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); return typeCall; }
public JCTree.JCMethodInvocation makeCall( final Element e, final DiagnosticPosition pos, final int pos1, final JCTree.JCExpression left, final Type type, final Name name, final List<JCTree.JCExpression> args ) { assert type != null; final Symbol funcsym = lookupMethod( e, pos, name, type, TreeInfo.types( args ) ); final JCTree.JCExpression sel = make.Select( left, funcsym ); sel.setPos( pos1 ); final JCTree.JCMethodInvocation app = make.App( sel, args ); app.setPos( pos1 ); return app; }
private JCExpression classForNameCall( Type type, JCTree tree ) { TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); JCTree.JCMethodInvocation typeCall = make.Apply( List.nil(), memberAccess( make, javacElems, ReflectUtil.class.getName() + ".type" ), List.of( make.Literal( type.tsym.getQualifiedName().toString() ) ) ); typeCall.setPos( Position.NOPOS ); typeCall.type = _tp.getSymtab().classType; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)typeCall.getMethodSelect(); Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), ReflectUtil.class.getName() ); Symbol.MethodSymbol typeMethodSymbol = resolveMethod( tree.pos(), Names.instance( _tp.getContext() ).fromString( "type" ), reflectMethodClassSym.type, List.of( _tp.getSymtab().stringType ) ); newMethodSelect.sym = typeMethodSymbol; newMethodSelect.type = typeMethodSymbol.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); return typeCall; }