Java Code Examples for com.sun.tools.javac.tree.TreeMaker#NewArray
The following examples show how to use
com.sun.tools.javac.tree.TreeMaker#NewArray .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ExtensionTransformer.java From manifold with Apache License 2.0 | 4 votes |
private JCTree.JCMethodInvocation replaceWithReflection( JCTree.JCMethodInvocation tree ) { //## todo: maybe try to avoid reflection if the method is accessible -- at least check if the method and its enclosing nest of classes are all public Type type = tree.getMethodSelect().type; if( type instanceof Type.ErrorType ) { // No such field/method or wrong params return tree; } TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); JCExpression methodSelect = tree.getMethodSelect(); if( methodSelect instanceof JCTree.JCFieldAccess ) { JCTree.JCFieldAccess m = (JCTree.JCFieldAccess)methodSelect; boolean isStatic = m.sym.getModifiers().contains( javax.lang.model.element.Modifier.STATIC ); if( !(m.sym instanceof Symbol.MethodSymbol) ) { return tree; } Type returnType = ((Symbol.MethodSymbol)m.sym).getReturnType(); Symbol.MethodSymbol reflectMethodSym = findReflectUtilMethod( tree, returnType, isStatic ); List<Symbol.VarSymbol> parameters = ((Symbol.MethodSymbol)m.sym).getParameters(); ArrayList<JCExpression> paramTypes = new ArrayList<>(); for( Symbol.VarSymbol param: parameters ) { JCExpression classExpr = makeClassExpr( tree, param.type ); paramTypes.add( classExpr ); } Symtab symTab = _tp.getSymtab(); JCTree.JCNewArray paramTypesArray = make.NewArray( make.Type( symTab.classType ), List.nil(), List.from( paramTypes ) ); paramTypesArray.type = new Type.ArrayType( symTab.classType, symTab.arrayClass ); JCTree.JCNewArray argsArray = make.NewArray( make.Type( symTab.objectType ), List.nil(), tree.getArguments() ); argsArray.type = new Type.ArrayType( symTab.objectType, symTab.arrayClass ); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( isStatic ? makeClassExpr( tree, m.selected.type ) : m.selected ); // receiver or class newArgs.add( make.Literal( m.sym.flatName().toString() ) ); // method name newArgs.add( paramTypesArray ); // param types newArgs.add( argsArray ); // args 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 = returnType; reflectCall.pos = tree.pos; JCTree.JCFieldAccess newMethodSelect = (JCTree.JCFieldAccess)reflectCall.getMethodSelect(); newMethodSelect.sym = reflectMethodSym; newMethodSelect.type = reflectMethodSym.type; assignTypes( newMethodSelect.selected, reflectMethodClassSym ); newMethodSelect.pos = tree.pos; return reflectCall; } return tree; }
Example 2
Source File: ExtensionTransformer.java From manifold with Apache License 2.0 | 4 votes |
private JCTree replaceWithReflection( JCTree.JCNewClass tree ) { if( tree.constructor == null ) { return tree; } TreeMaker make = _tp.getTreeMaker(); JavacElements javacElems = _tp.getElementUtil(); Type type = ((JCTree.JCAnnotatedType)tree.clazz).underlyingType.type; if( tree.constructor instanceof Symbol.ClassSymbol ) { //assert tree.constructor.kind == com.sun.tools.javac.code.Kinds.ERR; return tree; } List<Symbol.VarSymbol> parameters = ((Symbol.MethodSymbol)tree.constructor).getParameters(); ArrayList<JCExpression> paramTypes = new ArrayList<>(); for( Symbol.VarSymbol param: parameters ) { paramTypes.add( makeClassExpr( tree, param.type ) ); } Symtab symTab = _tp.getSymtab(); JCTree.JCNewArray paramTypesArray = make.NewArray( make.Type( symTab.classType ), List.nil(), List.from( paramTypes ) ); paramTypesArray.type = new Type.ArrayType( symTab.classType, symTab.arrayClass ); JCTree.JCNewArray argsArray = make.NewArray( make.Type( symTab.objectType ), List.nil(), tree.getArguments() ); argsArray.type = new Type.ArrayType( symTab.objectType, symTab.arrayClass ); ArrayList<JCExpression> newArgs = new ArrayList<>(); newArgs.add( makeClassExpr( tree, type ) ); // the class newArgs.add( paramTypesArray ); // param types newArgs.add( argsArray ); // args Symbol.ClassSymbol reflectMethodClassSym = IDynamicJdk.instance().getTypeElement( _tp.getContext(), _tp.getCompilationUnit(), ReflectionRuntimeMethods.class.getName() ); Symbol.MethodSymbol reflectMethodSym = findReflectUtilConstructor( tree ); 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; }